• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#===============================================================================
2# @brief    cmake deal with link script
3# Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
4#===============================================================================
5
6if("${LINK_SCRIPT}" STREQUAL "")
7    MESSAGE(FATAL_ERROR "linkscript is not found!")
8endif()
9
10function(auto_gen_lds macro_name lib_list)
11    file(APPEND ${CMAKE_BINARY_DIR}/auto_gen_libfunc.lds "#define ${macro_name}(func) \\\n")
12    set(LIB_FUNC "${${lib_list}}")
13    list(TRANSFORM LIB_FUNC PREPEND "    func(*lib")
14    list(TRANSFORM LIB_FUNC APPEND ".a:*.o) \\\n")
15    file(APPEND ${CMAKE_BINARY_DIR}/auto_gen_libfunc.lds ${LIB_FUNC} "\n")
16endfunction()
17
18# 添加用于处理链接脚本用的编译宏
19set(LDS_DEFINES ${DEFINES})
20list(TRANSFORM LDS_DEFINES PREPEND "-D")
21
22# 添加用于处理链接脚本用的编译头文件
23if(DEFINED LDS_HEADER)
24    list(REMOVE_ITEM LDS_HEADER "")
25    list(TRANSFORM LDS_HEADER PREPEND "-I")
26else()
27    set(LDS_HEADER ${ALL_PUBLIC_HEADER})
28    list(REMOVE_DUPLICATES LDS_HEADER)
29    list(REMOVE_ITEM LDS_HEADER "")
30    list(TRANSFORM LDS_HEADER PREPEND "-I")
31endif()
32list(APPEND LDS_HEADER -I${CMAKE_BINARY_DIR})
33if(DEFINED ROM_RAM_CHECK)
34    list(APPEND LDSDEFINES -DROM_BIN_CHECK)
35endif()
36list(TRANSFORM LDS_HEADER PREPEND "\"")
37list(TRANSFORM LDS_HEADER APPEND "\"")
38string(JOIN " " LDS_HEADER_STR ${LDS_HEADER})
39file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/linker_header.srp "${LDS_HEADER_STR}")
40auto_gen_lds("LIB_RAM_FUNC" RAM_COMPONENT)
41auto_gen_lds("LIB_ROM_FUNC" ROM_COMPONENT)
42auto_gen_lds("LIB_LOS_FUNC" LOS_LIB)
43
44if(DEFINED SDK_OUTPUT_PATH)
45    string(REPLACE "${PROJECT_SOURCE_DIR}" "${SDK_OUTPUT_PATH}" dest ${LINK_SCRIPT})
46    get_filename_component(dest ${dest} DIRECTORY)
47    install(FILES ${LINK_SCRIPT} DESTINATION ${dest})
48    install_sdk(${LINK_SCRIPT} "*.prelds")
49endif()
50
51if(NOT DEFINED ROM_CHECK)
52    set(ROM_CHECK False)
53endif()
54
55if(${ROM_CHECK})
56    list(APPEND LDS_DEFINES "-DROM_CHECK")
57endif()
58
59add_custom_command(TARGET ${TARGET_NAME} PRE_BUILD
60    COMMAND ${CMAKE_C_COMPILER} -P -xc -E -o linker.lds @${CMAKE_CURRENT_BINARY_DIR}/linker_header.srp ${LDS_DEFINES} ${LINK_SCRIPT}
61    COMMENT "Generating ${LINK_SCRIPT} -> ${CMAKE_BINARY_DIR}/linker.lds"
62    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
63    VERBATIM
64)
65
66target_link_directories(${TARGET_NAME}
67    PRIVATE
68    ${LIB_GCC}
69    ${LIB_C}
70    ${LIB_CXX}
71)
72
73target_link_libraries(${TARGET_NAME}
74PRIVATE
75    -Wl,--start-group "${STD_LIBS}" -Wl,--end-group
76)
77
78target_link_options(${TARGET_NAME}
79    PRIVATE
80    ${LINKFLAGS}
81    -Wl,-T${CMAKE_BINARY_DIR}/linker.lds -nostartfiles
82    -Wl,--gc-sections -Wl,-Map=${CMAKE_BINARY_DIR}/${BIN_NAME}.map
83    -Wl,--print-memory-usage
84)
85