| # 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() |
| |
| |
| # 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) |