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