target.cmake 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. # SPDX-License-Identifier: Apache-2.0
  2. set_property(TARGET linker PROPERTY devices_start_symbol "__device_start")
  3. find_program(CMAKE_LINKER ld.lld )
  4. set_ifndef(LINKERFLAGPREFIX -Wl)
  5. # Run $LINKER_SCRIPT file through the C preprocessor, producing ${linker_script_gen}
  6. # NOTE: ${linker_script_gen} will be produced at build-time; not at configure-time
  7. macro(configure_linker_script linker_script_gen linker_pass_define)
  8. set(extra_dependencies ${ARGN})
  9. # Different generators deal with depfiles differently.
  10. if(CMAKE_GENERATOR STREQUAL "Unix Makefiles")
  11. # Note that the IMPLICIT_DEPENDS option is currently supported only
  12. # for Makefile generators and will be ignored by other generators.
  13. set(linker_script_dep IMPLICIT_DEPENDS C ${LINKER_SCRIPT})
  14. elseif(CMAKE_GENERATOR STREQUAL "Ninja")
  15. # Using DEPFILE with other generators than Ninja is an error.
  16. set(linker_script_dep DEPFILE ${PROJECT_BINARY_DIR}/${linker_script_gen}.dep)
  17. else()
  18. # TODO: How would the linker script dependencies work for non-linker
  19. # script generators.
  20. message(WARNING "This generator is not well supported. The
  21. Linker script may not be regenerated when it should.")
  22. set(linker_script_dep "")
  23. endif()
  24. zephyr_get_include_directories_for_lang(C current_includes)
  25. get_filename_component(base_name ${CMAKE_CURRENT_BINARY_DIR} NAME)
  26. get_property(current_defines GLOBAL PROPERTY PROPERTY_LINKER_SCRIPT_DEFINES)
  27. add_custom_command(
  28. OUTPUT ${linker_script_gen}
  29. DEPENDS
  30. ${LINKER_SCRIPT}
  31. ${extra_dependencies}
  32. # NB: 'linker_script_dep' will use a keyword that ends 'DEPENDS'
  33. ${linker_script_dep}
  34. COMMAND ${CMAKE_C_COMPILER}
  35. -x assembler-with-cpp
  36. ${NOSYSDEF_CFLAG}
  37. -MD -MF ${linker_script_gen}.dep -MT ${base_name}/${linker_script_gen}
  38. -D_LINKER
  39. -D_ASMLANGUAGE
  40. ${current_includes}
  41. ${current_defines}
  42. ${linker_pass_define}
  43. -E ${LINKER_SCRIPT}
  44. -P # Prevent generation of debug `#line' directives.
  45. -o ${linker_script_gen}
  46. VERBATIM
  47. WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
  48. COMMAND_EXPAND_LISTS
  49. )
  50. endmacro()
  51. # Force symbols to be entered in the output file as undefined symbols
  52. function(toolchain_ld_force_undefined_symbols)
  53. foreach(symbol ${ARGN})
  54. zephyr_link_libraries(${LINKERFLAGPREFIX},-u,${symbol})
  55. endforeach()
  56. endfunction()
  57. # Link a target to given libraries with toolchain-specific argument order
  58. #
  59. # Usage:
  60. # toolchain_ld_link_elf(
  61. # TARGET_ELF <target_elf>
  62. # OUTPUT_MAP <output_map_file_of_target>
  63. # LIBRARIES_PRE_SCRIPT [libraries_pre_script]
  64. # LINKER_SCRIPT <linker_script>
  65. # LIBRARIES_POST_SCRIPT [libraries_post_script]
  66. # DEPENDENCIES [dependencies]
  67. # )
  68. function(toolchain_ld_link_elf)
  69. cmake_parse_arguments(
  70. TOOLCHAIN_LD_LINK_ELF # prefix of output variables
  71. "" # list of names of the boolean arguments
  72. "TARGET_ELF;OUTPUT_MAP;LINKER_SCRIPT" # list of names of scalar arguments
  73. "LIBRARIES_PRE_SCRIPT;LIBRARIES_POST_SCRIPT;DEPENDENCIES" # list of names of list arguments
  74. ${ARGN} # input args to parse
  75. )
  76. target_link_libraries(
  77. ${TOOLCHAIN_LD_LINK_ELF_TARGET_ELF}
  78. ${TOOLCHAIN_LD_LINK_ELF_LIBRARIES_PRE_SCRIPT}
  79. ${TOPT}
  80. ${TOOLCHAIN_LD_LINK_ELF_LINKER_SCRIPT}
  81. ${TOOLCHAIN_LD_LINK_ELF_LIBRARIES_POST_SCRIPT}
  82. ${LINKERFLAGPREFIX},-Map=${TOOLCHAIN_LD_LINK_ELF_OUTPUT_MAP}
  83. ${LINKERFLAGPREFIX},--whole-archive
  84. ${ZEPHYR_LIBS_PROPERTY}
  85. ${LINKERFLAGPREFIX},--no-whole-archive
  86. kernel
  87. $<TARGET_OBJECTS:${OFFSETS_LIB}>
  88. ${LIB_INCLUDE_DIR}
  89. -L${PROJECT_BINARY_DIR}
  90. ${TOOLCHAIN_LIBS}
  91. ${TOOLCHAIN_LD_LINK_ELF_DEPENDENCIES}
  92. )
  93. endfunction(toolchain_ld_link_elf)
  94. # Load toolchain_ld-family macros
  95. include(${ZEPHYR_BASE}/cmake/linker/ld/target_base.cmake)
  96. include(${ZEPHYR_BASE}/cmake/linker/${LINKER}/target_baremetal.cmake)
  97. include(${ZEPHYR_BASE}/cmake/linker/ld/target_cpp.cmake)
  98. include(${ZEPHYR_BASE}/cmake/linker/ld/target_relocation.cmake)
  99. include(${ZEPHYR_BASE}/cmake/linker/ld/target_configure.cmake)