LPT26x-HSF-4MB-Hilink_14.2..../build/cmake/build_component.cmake

336 lines
12 KiB
CMake
Raw Normal View History

2025-05-13 22:00:58 +08:00
#===============================================================================
# @brief cmake component build
# Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2022. All rights reserved.
#===============================================================================
macro(get_obj_path output obj_root)
set(ret)
foreach(src ${REGD_SOURCES})
# filter full path
string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" relpath ${src})
# make suffix to be .o
list(APPEND ret ${obj_root}/${relpath}.o)
endforeach()
set(${output} ${ret})
endmacro()
macro(register_component)
set(${COMPONENT_NAME}_MODULE_NAME ${MODULE_NAME} CACHE INTERNAL "" FORCE)
set(${COMPONENT_NAME}_AUTO_DEF ${AUTO_DEF_FILE_ID} CACHE INTERNAL "" FORCE)
set(${COMPONENT_NAME}_SOURCES ${SOURCES} CACHE INTERNAL "" FORCE)
endmacro(register_component)
macro(component_on_rom)
if(${COMPONENT_NAME} IN_LIST RAM_COMPONENT)
set(COMPONENT_ON_ROM false)
elseif(${COMPONENT_NAME} IN_LIST ROM_COMPONENT)
set(COMPONENT_ON_ROM true)
else()
unset(COMPONENT_ON_ROM)
endif()
endmacro()
macro(need_whole_archiv)
set(WHOLE_ARCHIV false)
if (COMPONENT_ON_ROM STREQUAL true)
set(WHOLE_ARCHIV true)
endif()
if(DEFINED WHOLE_LINK AND WHOLE_LINK STREQUAL true)
set(WHOLE_ARCHIV true)
endif()
unset(WHOLE_LINK)
endmacro()
macro(replace_lib_output_path)
install_lib_gen()
if(DEFINED LIB)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIB})
endif()
if(DEFINED LIB_OUT_PATH)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIB_OUT_PATH})
endif()
if(DEFINED CMAKE_ARCHIVE_OUTPUT_DIRECTORY AND ${BUILD_ROM_CALLBACK} AND ${COMPONENT_ON_ROM})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}-prerom)
endif()
endmacro()
macro(build_library)
set(lib_type STATIC)
if(DEFINED BUILD_AS_OBJ AND BUILD_AS_OBJ STREQUAL true)
set(lib_type OBJECT)
endif()
list(GET SOURCES 0 SOURCES0)
get_filename_component(SOURCES0 "${SOURCES0}" ABSOLUTE)
if(EXISTS ${SOURCES0})
replace_lib_output_path()
add_library(${COMPONENT_NAME}
${lib_type}
"${SOURCES}"
)
target_compile_definitions(${COMPONENT_NAME}
PRIVATE
${DEFINES}
${PRIVATE_DEFINES}
${PUBLIC_DEFINES}
)
target_include_directories(${COMPONENT_NAME}
PRIVATE
${PRIVATE_HEADER}
${PUBLIC_HEADER}
$<$<COMPILE_LANGUAGE:CXX>:${CXX_HEADERS}>
)
target_compile_options(${COMPONENT_NAME}
PRIVATE
${COMPILE_CCFLAGS}
$<$<BOOL:${USE_KCONFIG}>:-include${PROJECT_BINARY_DIR}/mconfig.h>
)
set(LINK_LIB_${COMPONENT_NAME} ${COMPONENT_NAME})
register_component()
target_link_libraries(${COMPONENT_NAME} PRIVATE ${TARGETS_INTERFACES})
else()
if(DEFINED LIB)
else()
# message(STATUS "[HSF HiLink NOTE] ${SOURCES0} is not found, finding lib${COMPONENT_NAME}.a in ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_COMMAND}")
find_library(LINK_LIB_${COMPONENT_NAME} "lib${COMPONENT_NAME}.a" ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_COMMAND})
if(NOT LINK_LIB_${COMPONENT_NAME})
find_library(LINK_LIB_${COMPONENT_NAME} "lib${COMPONENT_NAME}.a" ${ROOT_DIR}/application/ws63/hsf)
if(NOT LINK_LIB_${COMPONENT_NAME})
message(FATAL_ERROR "${SOURCES0} is not found && lib${COMPONENT_NAME}.a not find")
endif()
endif()
install_sdk(${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_COMMAND}/lib${COMPONENT_NAME}.a "*")
endif()
endif()
if(WHOLE_ARCHIV STREQUAL false)
# treat as a non-rom component
target_link_libraries(${TARGET_NAME}
PRIVATE
${LINK_LIB_${COMPONENT_NAME}}
)
else()
# one on rom.
target_link_libraries(${TARGET_NAME}
PRIVATE
-Wl,--whole-archive ${LINK_LIB_${COMPONENT_NAME}} -Wl,--no-whole-archive
)
endif()
endmacro()
macro(link_libs)
if(DEFINED LIBS)
if(WHOLE_ARCHIV STREQUAL false)
target_link_libraries(${TARGET_NAME}
PRIVATE
${LIBS}
)
else()
target_link_libraries(${TARGET_NAME}
PRIVATE
-Wl,--whole-archive ${LIBS} -Wl,--no-whole-archive
)
endif()
endif()
endmacro(link_libs)
macro(main_component)
if(DEFINED MAIN_COMPONENT AND MAIN_COMPONENT STREQUAL true)
set(SDK_PROJECT_FILE_DIR "${CMAKE_CURRENT_SOURCE_DIR}" CACHE INTERNAL "" FORCE)
set(MAIN_COMPONENT "${COMPONENT_NAME}" CACHE INTERNAL "" FORCE)
endif()
endmacro()
macro(add_to_logdef)
if(DEFINED LOG_DEF)
set(LOG_DEF_LIST "${LOG_DEF_LIST}" "${LOG_DEF}" CACHE INTERNAL "" FORCE)
endif()
endmacro(add_to_logdef)
macro(install_file)
if (DEFINED SDK_OUTPUT_PATH)
check_if_closed_component(${COMPONENT_NAME})
if (${COMPONENT_IS_CLOSED})
if (TARGET ${COMPONENT_NAME})
get_property(LIB_PATH TARGET ${COMPONENT_NAME} PROPERTY BINARY_DIR)
endif()
if(DEFINED LIB)
install_sdk(${LIB}/ "*")
elseif(DEFINED LIB_OUT_PATH)
install_dest_sdk(${LIB_OUT_PATH}/lib${COMPONENT_NAME}.a ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_COMMAND}/lib${COMPONENT_NAME}.a "*.a")
elseif(LIB_PATH)
install_dest_sdk(${LIB_PATH}/lib${COMPONENT_NAME}.a ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_COMMAND}/lib${COMPONENT_NAME}.a "*.a")
endif()
else()
foreach(src ${SOURCES})
install_sdk(${src} "*")
endforeach()
foreach(header ${PRIVATE_HEADER} ${PUBLIC_HEADER})
install_sdk(${header} "*.h")
endforeach()
endif()
foreach(lib ${LIBS})
install_sdk(${lib} "*")
endforeach()
endif()
endmacro(install_file)
macro(define_this_module_and_file_id)
foreach(filename ${SOURCES})
if(filename STREQUAL "")
continue()
endif()
if(${AUTO_DEF_FILE_ID})
string(STRIP ${filename} filename)
get_filename_component(barename ${filename} NAME)
string(REPLACE "." "_" barename ${barename})
string(TOUPPER ${barename} barename)
string(STRIP ${barename} barename)
set_property(
SOURCE ${filename}
APPEND
PROPERTY COMPILE_DEFINITIONS
THIS_FILE_ID=${barename})
endif()
if(${AUTO_DEF_MODULE_ID})
set(prefix "LOG_")
set(suffix "MODULE")
string(TOUPPER ${MODULE_NAME} mod_name)
string(JOIN ${mod_name} mod_name ${prefix} ${suffix})
set_property(
SOURCE ${filename}
APPEND
PROPERTY COMPILE_DEFINITIONS
THIS_MOD_ID=${mod_name})
endif()
endforeach()
endmacro(define_this_module_and_file_id)
macro(unset_var)
UNSET(COMPONENT_NAME)
UNSET(SOURCES)
UNSET(PRIVATE_HEADER)
UNSET(PUBLIC_HEADER)
UNSET(PRIVATE_DEFINES)
UNSET(PUBLIC_DEFINES)
UNSET(COMPONENT_CCFLAGS)
UNSET(COMPONENT_PUBLIC_CCFLAGS)
UNSET(BUILD_AS_OBJ)
UNSET(LOG_DEF)
UNSET(WHOLE_LINK)
UNSET(LINK_LIB_${COMPONENT_NAME})
UNSET(LIB_OUT_PATH)
UNSET(LIB_DIR)
UNSET(LIBS)
UNSET(LIB)
UNSET(REWRITE_CCFLAGS)
UNSET(COMPONENT_IS_CLOSED)
endmacro(unset_var)
macro(build_component)
component_on_rom()
if(DEFINED ROM_SYM_PATH AND COMPONENT_ON_ROM)
add_library(${COMPONENT_NAME}_interface INTERFACE)
target_include_directories(${COMPONENT_NAME}_interface INTERFACE ${PUBLIC_HEADER})
target_compile_definitions(${COMPONENT_NAME}_interface INTERFACE ${PUBLIC_DEFINES})
list(GET SOURCES 0 SOURCES0)
get_filename_component(SOURCES0 "${SOURCES0}" ABSOLUTE)
if(EXISTS ${SOURCES0})
register_component()
endif()
elseif(DEFINED COMPONENT_ON_ROM)
need_whole_archiv()
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/private)
set(PRIVATE_HEADER ${PRIVATE_HEADER} ${CMAKE_CURRENT_SOURCE_DIR}/private)
endif()
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/public)
set(PUBLIC_HEADER ${PUBLIC_HEADER} ${CMAKE_CURRENT_SOURCE_DIR}/public)
endif()
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/include)
set(PUBLIC_HEADER ${PUBLIC_HEADER} ${CMAKE_CURRENT_SOURCE_DIR}/include)
endif()
if(COMPONENT_ON_ROM STREQUAL false)
if(REWRITE_CCFLAGS STREQUAL true)
set(COMPILE_CCFLAGS ${COMPONENT_CCFLAGS})
else()
# treat as a non-rom component
set(COMPILE_CCFLAGS ${CCFLAGS} ${COMPONENT_CCFLAGS})
endif()
else()
# one on rom.
set(COMPILE_CCFLAGS ${ROM_CCFLAGS})
endif()
check_if_closed_component(${COMPONENT_NAME})
if (RELEASE OR ${COMPONENT_IS_CLOSED})
list(REMOVE_ITEM COMPILE_CCFLAGS "-g")
endif()
add_library(${COMPONENT_NAME}_interface INTERFACE)
target_include_directories(${COMPONENT_NAME}_interface INTERFACE ${PUBLIC_HEADER})
target_compile_definitions(${COMPONENT_NAME}_interface INTERFACE ${PUBLIC_DEFINES})
target_compile_options(${COMPONENT_NAME}_interface INTERFACE ${COMPONENT_PUBLIC_CCFLAGS})
set(TARGETS_INTERFACES ${RAM_COMPONENT} ${ROM_COMPONENT})
list(TRANSFORM TARGETS_INTERFACES APPEND "_interface")
list(LENGTH PUBLIC_HEADER PUBLIC_HEADER_NUM)
if(NOT ${PUBLIC_HEADER_NUM} EQUAL 0)
set(ALL_PUBLIC_HEADER "${ALL_PUBLIC_HEADER}" "${PUBLIC_HEADER}" CACHE INTERNAL "" FORCE)
endif()
if(DEFINED LOG_CUSTOM_ENABLE)
if(${LOG_CUSTOM_ENABLE} STREQUAL True)
if(NOT ${PUBLIC_HEADER_NUM} EQUAL 0)
set(ALL_HEADER_DIRS "${ALL_HEADER_DIRS}" "${PUBLIC_HEADER}" CACHE INTERNAL "" FORCE)
endif()
list(LENGTH PRIVATE_HEADER PRIVATE_HEADER_NUM)
if(NOT ${PRIVATE_HEADER_NUM} EQUAL 0)
set(ALL_HEADER_DIRS "${ALL_HEADER_DIRS}" "${PRIVATE_HEADER}" CACHE INTERNAL "" FORCE)
endif()
list(LENGTH PUBLIC_DEFINES PUBLIC_DEFINES_NUM)
if(NOT ${PUBLIC_DEFINES_NUM} EQUAL 0)
set(ALL_DEFINES "${ALL_DEFINES}" "${PUBLIC_DEFINES}" CACHE INTERNAL "" FORCE)
endif()
list(LENGTH PRIVATE_DEFINES PRIVATE_DEFINES_NUM)
if(NOT ${PRIVATE_DEFINES_NUM} EQUAL 0)
set(ALL_DEFINES "${ALL_DEFINES}" "${PRIVATE_DEFINES}" CACHE INTERNAL "" FORCE)
endif()
list(LENGTH DEFINES DEFINES_NUM)
if(NOT ${DEFINES_NUM} EQUAL 0)
set(ALL_DEFINES "${ALL_DEFINES}" "${DEFINES}" CACHE INTERNAL "" FORCE)
endif()
endif()
endif()
set(ALL_PUBLIC_DEFINES "${ALL_PUBLIC_DEFINES}" "${PUBLIC_DEFINES}" CACHE INTERNAL "" FORCE)
set(ALL_PUBLIC_CCFLAGS "${ALL_PUBLIC_CCFLAGS}" "${COMPONENT_PUBLIC_CCFLAGS}" CACHE INTERNAL "" FORCE)
link_libs()
list(LENGTH SOURCES SOURCES_NUM)
if(NOT ${SOURCES_NUM} EQUAL 0)
build_library()
endif()
if(${BUILD_ROM_CALLBACK} AND ${COMPONENT_ON_ROM})
reg_rom_callback()
endif()
define_this_module_and_file_id()
sdk_export_component("component")
install_file()
add_to_logdef()
main_component()
endif()
unset_var()
endmacro()