# SPDX-License-Identifier: Apache-2.0 find_program(CMAKE_LINKER ${CROSS_COMPILE}ld PATH ${TOOLCHAIN_HOME} NO_DEFAULT_PATH) set_ifndef(LINKERFLAGPREFIX -Wl) # Run $LINKER_SCRIPT file through the C preprocessor, producing ${linker_script_gen} # NOTE: ${linker_script_gen} will be produced at build-time; not at configure-time macro(configure_linker_script linker_script_gen linker_pass_define) set(extra_dependencies ${ARGN}) # Different generators deal with depfiles differently. if(CMAKE_GENERATOR STREQUAL "Unix Makefiles") # Note that the IMPLICIT_DEPENDS option is currently supported only # for Makefile generators and will be ignored by other generators. set(linker_script_dep IMPLICIT_DEPENDS C ${LINKER_SCRIPT}) elseif(CMAKE_GENERATOR STREQUAL "Ninja") # Using DEPFILE with other generators than Ninja is an error. set(linker_script_dep DEPFILE ${PROJECT_BINARY_DIR}/${linker_script_gen}.dep) else() # TODO: How would the linker script dependencies work for non-linker # script generators. message(STATUS "Warning; this generator is not well supported. The Linker script may not be regenerated when it should.") set(linker_script_dep "") endif() zephyr_get_include_directories_for_lang(C current_includes) get_filename_component(base_name ${CMAKE_CURRENT_BINARY_DIR} NAME) get_property(current_defines GLOBAL PROPERTY PROPERTY_LINKER_SCRIPT_DEFINES) add_custom_command( OUTPUT ${linker_script_gen} DEPENDS ${LINKER_SCRIPT} ${extra_dependencies} # NB: 'linker_script_dep' will use a keyword that ends 'DEPENDS' ${linker_script_dep} COMMAND ${CMAKE_C_COMPILER} -x assembler-with-cpp ${NOSYSDEF_CFLAG} -MD -MF ${linker_script_gen}.dep -MT ${base_name}/${linker_script_gen} ${current_includes} ${current_defines} ${linker_pass_define} -E ${LINKER_SCRIPT} -P # Prevent generation of debug `#line' directives. -o ${linker_script_gen} VERBATIM WORKING_DIRECTORY ${PROJECT_BINARY_DIR} ) endmacro() # Force symbols to be entered in the output file as undefined symbols function(toolchain_ld_force_undefined_symbols) foreach(symbol ${ARGN}) zephyr_link_libraries(-u${symbol}) endforeach() endfunction() # Link a target to given libraries with toolchain-specific argument order # # Usage: # toolchain_ld_link_elf( # TARGET_ELF # OUTPUT_MAP # LIBRARIES_PRE_SCRIPT [libraries_pre_script] # LINKER_SCRIPT # LIBRARIES_POST_SCRIPT [libraries_post_script] # DEPENDENCIES [dependencies] # ) function(toolchain_ld_link_elf) cmake_parse_arguments( TOOLCHAIN_LD_LINK_ELF # prefix of output variables "" # list of names of the boolean arguments "TARGET_ELF;OUTPUT_MAP;LINKER_SCRIPT" # list of names of scalar arguments "LIBRARIES_PRE_SCRIPT;LIBRARIES_POST_SCRIPT;DEPENDENCIES" # list of names of list arguments ${ARGN} # input args to parse ) target_link_libraries( ${TOOLCHAIN_LD_LINK_ELF_TARGET_ELF} ${TOOLCHAIN_LD_LINK_ELF_LIBRARIES_PRE_SCRIPT} ${TOPT} ${TOOLCHAIN_LD_LINK_ELF_LINKER_SCRIPT} ${TOOLCHAIN_LD_LINK_ELF_LIBRARIES_POST_SCRIPT} ${LINKERFLAGPREFIX},-Map=${TOOLCHAIN_LD_LINK_ELF_OUTPUT_MAP} ${LINKERFLAGPREFIX},--whole-archive ${ZEPHYR_LIBS_PROPERTY} ${LINKERFLAGPREFIX},--no-whole-archive kernel $ ${LIB_INCLUDE_DIR} -L${PROJECT_BINARY_DIR} ${TOOLCHAIN_LIBS} ${TOOLCHAIN_LD_LINK_ELF_DEPENDENCIES} ) endfunction(toolchain_ld_link_elf) # Load toolchain_ld-family macros include(${ZEPHYR_BASE}/cmake/linker/${LINKER}/target_base.cmake) include(${ZEPHYR_BASE}/cmake/linker/${LINKER}/target_baremetal.cmake) include(${ZEPHYR_BASE}/cmake/linker/${LINKER}/target_cpp.cmake) include(${ZEPHYR_BASE}/cmake/linker/${LINKER}/target_relocation.cmake) include(${ZEPHYR_BASE}/cmake/linker/${LINKER}/target_configure.cmake)