cmake_minimum_required(VERSION 3.20) project(GW LANGUAGES C ASM) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_EXTENSIONS OFF) set(GW_TARGET GW.elf) set(GW_LINKER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/Project_Settings/Linker_Files/linker_flash.ld") if(NOT EXISTS "${GW_LINKER_SCRIPT}") message(FATAL_ERROR "Linker script not found: ${GW_LINKER_SCRIPT}") endif() if(NOT DEFINED ENV{S32_SDK_PATH}) message(FATAL_ERROR "S32_SDK_PATH is not set. It must point to the PlatformSDK_S32K3_2021_03 directory.") endif() file(TO_CMAKE_PATH "$ENV{S32_SDK_PATH}" S32_SDK_PATH) set(S32_RTD_ROOT "${S32_SDK_PATH}/SW32K3_RTD_4_4_0_9_0_D2103") if(CMAKE_SYSROOT) set(GW_SYSROOT_FLAG "--sysroot=${CMAKE_SYSROOT}") else() set(GW_SYSROOT_FLAG "") endif() foreach(required_sdk_dir "${S32_RTD_ROOT}/Base_TS_T40D34M9I0R0/header" "${S32_RTD_ROOT}/Base_TS_T40D34M9I0R0/include" "${S32_RTD_ROOT}/Platform_TS_T40D34M9I0R0/include" "${S32_RTD_ROOT}/Platform_TS_T40D34M9I0R0/startup/include") if(NOT EXISTS "${required_sdk_dir}") message(FATAL_ERROR "Required SDK include directory not found: ${required_sdk_dir}") endif() endforeach() set(GW_SOURCE_ROOTS "${CMAKE_CURRENT_SOURCE_DIR}/Project_Settings/Startup_Code" "${CMAKE_CURRENT_SOURCE_DIR}/RTD/src" "${CMAKE_CURRENT_SOURCE_DIR}/board" "${CMAKE_CURRENT_SOURCE_DIR}/generate/include" "${CMAKE_CURRENT_SOURCE_DIR}/generate/src" "${CMAKE_CURRENT_SOURCE_DIR}/src" ) set(GW_DIRECT_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}" ) set(GW_RECURSIVE_INCLUDE_ROOTS "${CMAKE_CURRENT_SOURCE_DIR}/RTD/include" "${CMAKE_CURRENT_SOURCE_DIR}/board" "${CMAKE_CURRENT_SOURCE_DIR}/generate/include" "${CMAKE_CURRENT_SOURCE_DIR}/generate/src" "${CMAKE_CURRENT_SOURCE_DIR}/src" "${CMAKE_CURRENT_SOURCE_DIR}/src/HAL/watchdog_hal/inc" "${CMAKE_CURRENT_SOURCE_DIR}/src/uds" "${S32_RTD_ROOT}/Base_TS_T40D34M9I0R0/header" "${S32_RTD_ROOT}/Base_TS_T40D34M9I0R0/include" "${S32_RTD_ROOT}/Platform_TS_T40D34M9I0R0/include" "${S32_RTD_ROOT}/Platform_TS_T40D34M9I0R0/startup/include" ) function(gw_collect_directories out_var) set(result "") foreach(root IN LISTS ARGN) if(EXISTS "${root}") list(APPEND result "${root}") file(GLOB_RECURSE children LIST_DIRECTORIES true CONFIGURE_DEPENDS "${root}/*") foreach(child IN LISTS children) if(IS_DIRECTORY "${child}") list(APPEND result "${child}") endif() endforeach() endif() endforeach() list(REMOVE_DUPLICATES result) set(${out_var} "${result}" PARENT_SCOPE) endfunction() gw_collect_directories(GW_INCLUDE_DIRS ${GW_RECURSIVE_INCLUDE_ROOTS}) list(APPEND GW_INCLUDE_DIRS ${GW_DIRECT_INCLUDE_DIRS}) list(REMOVE_DUPLICATES GW_INCLUDE_DIRS) set(GW_SOURCES "") foreach(root IN LISTS GW_SOURCE_ROOTS) file(GLOB_RECURSE root_sources CONFIGURE_DEPENDS "${root}/*.c" "${root}/*.s" "${root}/*.S") list(APPEND GW_SOURCES ${root_sources}) endforeach() list(REMOVE_DUPLICATES GW_SOURCES) add_executable(${GW_TARGET} ${GW_SOURCES}) target_include_directories(${GW_TARGET} PRIVATE ${GW_INCLUDE_DIRS}) target_compile_definitions(${GW_TARGET} PRIVATE D_CACHE_ENABLE I_CACHE_ENABLE GCC S32K3XX CPU_S32K344 ) target_compile_options(${GW_TARGET} PRIVATE $<$:-x$assembler-with-cpp> $<$:-std=c99> -Os -fshort-enums -funsigned-char -fstack-usage -fdump-ipa-all -fomit-frame-pointer -fno-zero-initialized-in-bss -ggdb3 -pedantic -Wall -Wextra -fmessage-length=0 -funsigned-bitfields -fno-common -Wunused -Wstrict-prototypes -Wsign-compare -Werror=implicit-function-declaration -Wundef -mcpu=cortex-m7 -mthumb -mlittle-endian -mfloat-abi=soft -specs=nano.specs -specs=nosys.specs ${GW_SYSROOT_FLAG} ) target_link_options(${GW_TARGET} PRIVATE -nostartfiles --entry=Reset_Handler -Wl,-Map,${CMAKE_CURRENT_BINARY_DIR}/GW.map -Wl,--gc-sections -Wl,-u,_printf_float -Wl,-u,_scanf_float -n -mcpu=cortex-m7 -mthumb -mlittle-endian -mfloat-abi=soft -specs=nano.specs -specs=nosys.specs ${GW_SYSROOT_FLAG} -T${GW_LINKER_SCRIPT} ) target_link_libraries(${GW_TARGET} PRIVATE c m gcc) set_property(TARGET ${GW_TARGET} PROPERTY LINK_DEPENDS "${GW_LINKER_SCRIPT}") if(CMAKE_OBJCOPY) set(ARM_OBJCOPY "${CMAKE_OBJCOPY}") else() find_program(ARM_OBJCOPY arm-none-eabi-objcopy REQUIRED) endif() if(CMAKE_SIZE) set(ARM_SIZE "${CMAKE_SIZE}") else() find_program(ARM_SIZE arm-none-eabi-size REQUIRED) endif() add_custom_command( TARGET ${GW_TARGET} POST_BUILD COMMAND ${ARM_OBJCOPY} -O srec $ "${CMAKE_CURRENT_BINARY_DIR}/GW.srec" COMMAND ${ARM_SIZE} --format=berkeley $ BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/GW.srec" COMMENT "Generating SREC and size report" )