1function(set_library LIBRARY_TYPE LANGUAGE)
2set(EXTRADEFINES " -fstack-usage ")
3
4if(${LIBRARY_TYPE} STREQUAL "REDLIB")
5    set(SPECS "-specs=redlib.specs" PARENT_SCOPE)
6    set(EXTRADEFINES "${EXTRADEFINES} -D__REDLIB__")
7    set(TARGET_LINK_SYSTEM_LIBRARIES "-lcr_c -lcr_eabihelpers -lgcc" PARENT_SCOPE)
8elseif(${LIBRARY_TYPE} STREQUAL "NEWLIB")
9    set(EXTRADEFINES "${EXTRADEFINES} -D__NEWLIB__")
10    if(${LANGUAGE} STREQUAL "CPP")
11        set(TARGET_LINK_SYSTEM_LIBRARIES "-lstdc++ crti.o crtn.o crtbegin.o crtend.o" PARENT_SCOPE)
12    else()
13        set(TARGET_LINK_SYSTEM_LIBRARIES "-lgcc -lc -lm" PARENT_SCOPE)
14    endif()
15elseif(${LIBRARY_TYPE} STREQUAL "NEWLIB_NANO")
16    set(SPECS "--specs=nano.specs" PARENT_SCOPE)
17    set(EXTRADEFINES "${EXTRADEFINES} -D__NEWLIB__")
18    if(${LANGUAGE} STREQUAL "CPP")
19        set(TARGET_LINK_SYSTEM_LIBRARIES "-lstdc++_nano crti.o crtn.o crtbegin.o crtend.o" PARENT_SCOPE)
20    else()
21        set(TARGET_LINK_SYSTEM_LIBRARIES "-lgcc -lc_nano -lm" PARENT_SCOPE)
22    endif()
23endif()
24
25set(CMAKE_ASM_FLAGS " ${CMAKE_ASM_FLAGS} ${EXTRADEFINES}" PARENT_SCOPE)
26set(CMAKE_C_FLAGS " ${CMAKE_C_FLAGS} ${EXTRADEFINES}" PARENT_SCOPE)
27set(CMAKE_CXX_FLAGS " ${CMAKE_CXX_FLAGS} ${EXTRADEFINES}" PARENT_SCOPE)
28endfunction()
29
30function(set_floating_point FPU_TYPE FPU_ABI)
31if(${FPU_TYPE} MATCHES "FPV4-SP-D16")
32    set(FPU "-mfpu=fpv4-sp-d16")
33elseif(${FPU_TYPE} MATCHES "FPV5-D16")
34    set(FPU "-mfpu=fpv5-d16")
35elseif(${FPU_TYPE} MATCHES "FPV5-SP-D16")
36    set(FPU "-mfpu=fpv5-sp-d16")
37endif()
38if(${FPU_ABI} MATCHES "HARD")
39    set(FPU "${FPU} -mfloat-abi=hard" PARENT_SCOPE)
40elseif(${FPU_ABI} MATCHES "SOFT")
41    set(FPU "${FPU} -mfloat-abi=softfp" PARENT_SCOPE)
42else()
43    set(FPU "${FPU}" PARENT_SCOPE)
44endif()
45endfunction()
46
47function(set_debug_console DEBUG_CONSOLE LIBRARY_TYPE)
48if(${DEBUG_CONSOLE} MATCHES "SEMIHOST")
49    set(DEBUG_CONSOLE_CONFIG "-DSDK_DEBUGCONSOLE=0 -DSDK_USE_SYSCALL_STUB=0" PARENT_SCOPE)
50else()
51    set(DEBUG_CONSOLE_CONFIG "-DSDK_DEBUGCONSOLE=1" PARENT_SCOPE)
52endif()
53
54if(${LIBRARY_TYPE} STREQUAL "NEWLIB" OR ${LIBRARY_TYPE} STREQUAL "NEWLIB_NANO")
55    if(${DEBUG_CONSOLE} STREQUAL "SEMIHOST")
56        set(TARGET_LINK_SYSTEM_LIBRARIES "${TARGET_LINK_SYSTEM_LIBRARIES} -lcr_newlib_semihost" PARENT_SCOPE)
57    elseif(${DEBUG_CONSOLE} STREQUAL "UART" OR ${DEBUG_CONSOLE} STREQUAL "NOHOST")
58        set(TARGET_LINK_SYSTEM_LIBRARIES "${TARGET_LINK_SYSTEM_LIBRARIES} -lcr_newlib_nohost" PARENT_SCOPE)
59    elseif(${DEBUG_CONSOLE} STREQUAL "NONE")
60        set(TARGET_LINK_SYSTEM_LIBRARIES "${TARGET_LINK_SYSTEM_LIBRARIES} -lcr_newlib_none" PARENT_SCOPE)
61    endif()
62elseif(${LIBRARY_TYPE} STREQUAL "REDLIB")
63    if(${DEBUG_CONSOLE} STREQUAL "SEMIHOST")
64        set(TARGET_LINK_SYSTEM_LIBRARIES "${TARGET_LINK_SYSTEM_LIBRARIES} -lcr_semihost" PARENT_SCOPE)
65    elseif(${DEBUG_CONSOLE} STREQUAL "SEMIHOST_NF")
66        set(TARGET_LINK_SYSTEM_LIBRARIES "${TARGET_LINK_SYSTEM_LIBRARIES} -lcr_semihost_nf" PARENT_SCOPE)
67    elseif(${DEBUG_CONSOLE} STREQUAL "SEMIHOST_MB")
68        set(TARGET_LINK_SYSTEM_LIBRARIES "${TARGET_LINK_SYSTEM_LIBRARIES} -lcr_semihost_mb" PARENT_SCOPE)
69    elseif(${DEBUG_CONSOLE} STREQUAL "SEMIHOST_MB_NF")
70        set(TARGET_LINK_SYSTEM_LIBRARIES "${TARGET_LINK_SYSTEM_LIBRARIES} -lcr_semihost_mb_nf" PARENT_SCOPE)
71    elseif(${DEBUG_CONSOLE} STREQUAL "UART" OR ${DEBUG_CONSOLE} STREQUAL "NOHOST_NF" OR ${DEBUG_CONSOLE} STREQUAL "NOHOST")
72        set(TARGET_LINK_SYSTEM_LIBRARIES "${TARGET_LINK_SYSTEM_LIBRARIES} -lcr_nohost_nf" PARENT_SCOPE)
73    endif()
74endif()
75endfunction()
76
77function(include_if_use module)
78    set(MATCHED false)
79    if(${CONFIG_USE_${module}})
80        set(MATCHED true)
81    endif()
82    # In case that module file name has device/board/kit suffix
83    if(NOT MATCHED)
84        string(REGEX REPLACE ".${CONFIG_DEVICE}$" "" replVar ${module})
85        if(${CONFIG_USE_${replVar}})
86            set(MATCHED true)
87        endif()
88    endif()
89    if(NOT MATCHED)
90        string(REGEX REPLACE ".${CONFIG_BOARD}$" "" replVar ${module})
91        if(${CONFIG_USE_${replVar}})
92            set(MATCHED true)
93        endif()
94    endif()
95    if(NOT MATCHED)
96        string(REGEX REPLACE ".${CONFIG_KIT}$" "" replVar ${module})
97        if(${CONFIG_USE_${replVar}})
98            set(MATCHED true)
99        endif()
100    endif()
101
102    if(MATCHED)
103        include(${module} OPTIONAL RESULT_VARIABLE loaded_file)
104        if(EXISTS ${loaded_file})
105            return()
106        else()
107            message(SEND_ERROR "${module}.cmake does not exist.")
108        endif()
109    endif()
110endfunction()
111
112function(add_config_file CONFIG_FILE INCLUDE_PATH MODULE_NAME)
113    get_target_property(PROJECT_SOURCES ${MCUX_SDK_PROJECT_NAME} SOURCES)
114    get_filename_component(BASE_NAME ${CONFIG_FILE} NAME)
115
116    foreach(PROJ_FILE ${PROJECT_SOURCES})
117        string(FIND "${PROJ_FILE}" "${BASE_NAME}" CONFIG_FILE_INDEX)
118        if(${CONFIG_FILE_INDEX} GREATER -1)
119            get_source_file_property(CONFIG_FILE_PROPERTY "${PROJ_FILE}" COMPONENT_CONFIG_FILE)
120            if(${CONFIG_FILE_PROPERTY} MATCHES "(^${MODULE_NAME}$)|(^${MODULE_NAME} )|( ${MODULE_NAME} )|( ${MODULE_NAME}$)")
121                message("Skip ${CONFIG_FILE} in ${MODULE_NAME} because user-defined file ${PROJ_FILE} has been added into project.")
122                return()
123            endif()
124        endif()
125    endforeach()
126
127    message("Use ${CONFIG_FILE} in ${MODULE_NAME}.")
128    target_sources(${MCUX_SDK_PROJECT_NAME} PRIVATE ${CONFIG_FILE})
129    if(NOT ${INCLUDE_PATH} STREQUAL "")
130      target_include_directories(${MCUX_SDK_PROJECT_NAME} PUBLIC ${INCLUDE_PATH})
131    endif()
132endfunction()
133