• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#===============================================================================
2# @brief    cmake component build
3# Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
4#===============================================================================
5macro(get_obj_path output obj_root)
6    set(ret)
7    foreach(src ${REGD_SOURCES})
8        # filter full path
9        string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" relpath ${src})
10        # make suffix to be .o
11        list(APPEND ret ${obj_root}/${relpath}.o)
12    endforeach()
13    set(${output} ${ret})
14endmacro()
15
16macro(register_component)
17    set(${COMPONENT_NAME}_MODULE_NAME ${MODULE_NAME} CACHE INTERNAL "" FORCE)
18    set(${COMPONENT_NAME}_AUTO_DEF ${AUTO_DEF_FILE_ID} CACHE INTERNAL "" FORCE)
19    set(${COMPONENT_NAME}_SOURCES ${SOURCES} CACHE INTERNAL "" FORCE)
20endmacro(register_component)
21
22macro(component_on_rom)
23    if(${COMPONENT_NAME} IN_LIST RAM_COMPONENT)
24        set(COMPONENT_ON_ROM false)
25    elseif(${COMPONENT_NAME} IN_LIST ROM_COMPONENT)
26        set(COMPONENT_ON_ROM true)
27    else()
28        unset(COMPONENT_ON_ROM)
29    endif()
30endmacro()
31
32macro(need_whole_archiv)
33    set(WHOLE_ARCHIV false)
34    if (COMPONENT_ON_ROM STREQUAL true)
35        set(WHOLE_ARCHIV true)
36    endif()
37    if(DEFINED WHOLE_LINK AND WHOLE_LINK STREQUAL true)
38        set(WHOLE_ARCHIV true)
39    endif()
40    unset(WHOLE_LINK)
41endmacro()
42
43macro(replace_lib_output_path)
44    install_lib_gen()
45    if(DEFINED LIB)
46        set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIB})
47    endif()
48    if(DEFINED LIB_OUT_PATH)
49        set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIB_OUT_PATH})
50    endif()
51    if(DEFINED CMAKE_ARCHIVE_OUTPUT_DIRECTORY AND ${BUILD_ROM_CALLBACK} AND ${COMPONENT_ON_ROM})
52        set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}-prerom)
53    endif()
54endmacro()
55
56macro(build_library)
57    set(lib_type STATIC)
58    if(DEFINED BUILD_AS_OBJ AND BUILD_AS_OBJ STREQUAL true)
59        set(lib_type OBJECT)
60    endif()
61
62    list(GET SOURCES 0 SOURCES0)
63    get_filename_component(SOURCES0  "${SOURCES0}" ABSOLUTE)
64    if(EXISTS ${SOURCES0})
65        replace_lib_output_path()
66        add_library(${COMPONENT_NAME}
67            ${lib_type}
68            "${SOURCES}"
69        )
70
71        target_compile_definitions(${COMPONENT_NAME}
72            PRIVATE
73            ${DEFINES}
74            ${PRIVATE_DEFINES}
75            ${PUBLIC_DEFINES}
76        )
77
78        target_include_directories(${COMPONENT_NAME}
79            PRIVATE
80            ${PRIVATE_HEADER}
81            ${PUBLIC_HEADER}
82	        $<$<COMPILE_LANGUAGE:CXX>:${CXX_HEADERS}>
83        )
84
85        target_compile_options(${COMPONENT_NAME}
86            PRIVATE
87            ${COMPILE_CCFLAGS}
88            $<$<BOOL:${USE_KCONFIG}>:-include${PROJECT_BINARY_DIR}/mconfig.h>
89        )
90
91        set(LINK_LIB_${COMPONENT_NAME} ${COMPONENT_NAME})
92        register_component()
93        target_link_libraries(${COMPONENT_NAME} PRIVATE ${TARGETS_INTERFACES})
94    else()
95        if(DEFINED LIB)
96        else()
97            message(STATUS "${SOURCES0} is not found, finding lib${COMPONENT_NAME}.a in ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_COMMAND}")
98            find_library(LINK_LIB_${COMPONENT_NAME} "lib${COMPONENT_NAME}.a" ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_COMMAND})
99            if(NOT LINK_LIB_${COMPONENT_NAME})
100                message(FATAL_ERROR "${SOURCES0} is not found && lib${COMPONENT_NAME}.a not find")
101            endif()
102            install_sdk(${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_COMMAND}/lib${COMPONENT_NAME}.a "*")
103        endif()
104
105    endif()
106
107    if(WHOLE_ARCHIV STREQUAL false)
108        # treat as a non-rom component
109        target_link_libraries(${TARGET_NAME}
110            PRIVATE
111            ${LINK_LIB_${COMPONENT_NAME}}
112        )
113    else()
114        # one on rom.
115        target_link_libraries(${TARGET_NAME}
116            PRIVATE
117            -Wl,--whole-archive ${LINK_LIB_${COMPONENT_NAME}} -Wl,--no-whole-archive
118        )
119    endif()
120endmacro()
121
122macro(link_libs)
123    if(DEFINED LIBS)
124        if(WHOLE_ARCHIV STREQUAL false)
125            target_link_libraries(${TARGET_NAME}
126                PRIVATE
127                ${LIBS}
128            )
129        else()
130            target_link_libraries(${TARGET_NAME}
131                PRIVATE
132                -Wl,--whole-archive ${LIBS} -Wl,--no-whole-archive
133            )
134        endif()
135    endif()
136endmacro(link_libs)
137
138macro(main_component)
139    if(DEFINED MAIN_COMPONENT AND MAIN_COMPONENT STREQUAL true)
140        set(SDK_PROJECT_FILE_DIR  "${CMAKE_CURRENT_SOURCE_DIR}" CACHE INTERNAL "" FORCE)
141        set(MAIN_COMPONENT "${COMPONENT_NAME}" CACHE INTERNAL "" FORCE)
142    endif()
143endmacro()
144
145macro(add_to_logdef)
146    if(DEFINED LOG_DEF)
147        set(LOG_DEF_LIST  "${LOG_DEF_LIST}" "${LOG_DEF}" CACHE INTERNAL "" FORCE)
148    endif()
149endmacro(add_to_logdef)
150
151macro(install_file)
152    if (DEFINED SDK_OUTPUT_PATH)
153        check_if_closed_component(${COMPONENT_NAME})
154        if (${COMPONENT_IS_CLOSED})
155            if (TARGET ${COMPONENT_NAME})
156                get_property(LIB_PATH TARGET ${COMPONENT_NAME} PROPERTY BINARY_DIR)
157            endif()
158
159            if(DEFINED LIB)
160                install_sdk(${LIB}/ "*")
161            elseif(DEFINED LIB_OUT_PATH)
162                install_dest_sdk(${LIB_OUT_PATH}/lib${COMPONENT_NAME}.a ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_COMMAND}/lib${COMPONENT_NAME}.a "*.a")
163            elseif(LIB_PATH)
164                install_dest_sdk(${LIB_PATH}/lib${COMPONENT_NAME}.a ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_COMMAND}/lib${COMPONENT_NAME}.a "*.a")
165            endif()
166        else()
167            foreach(src ${SOURCES})
168                install_sdk(${src} "*")
169            endforeach()
170            foreach(header ${PRIVATE_HEADER} ${PUBLIC_HEADER})
171                install_sdk(${header} "*.h")
172            endforeach()
173        endif()
174
175        foreach(lib ${LIBS})
176            install_sdk(${lib} "*")
177        endforeach()
178    endif()
179endmacro(install_file)
180
181macro(define_this_module_and_file_id)
182    foreach(filename ${SOURCES})
183        if(filename STREQUAL  "")
184            continue()
185        endif()
186        if(${AUTO_DEF_FILE_ID})
187            string(STRIP ${filename} filename)
188            get_filename_component(barename ${filename} NAME)
189            string(REPLACE "." "_" barename ${barename})
190            string(TOUPPER ${barename} barename)
191            string(STRIP ${barename} barename)
192            set_property(
193                SOURCE ${filename}
194                APPEND
195                PROPERTY COMPILE_DEFINITIONS
196                THIS_FILE_ID=${barename})
197        endif()
198
199        if(${AUTO_DEF_MODULE_ID})
200            set(prefix "LOG_")
201            set(suffix "MODULE")
202            string(TOUPPER ${MODULE_NAME} mod_name)
203            string(JOIN ${mod_name} mod_name ${prefix} ${suffix})
204            set_property(
205                SOURCE ${filename}
206                APPEND
207                PROPERTY COMPILE_DEFINITIONS
208                THIS_MOD_ID=${mod_name})
209        endif()
210    endforeach()
211endmacro(define_this_module_and_file_id)
212
213macro(unset_var)
214    UNSET(COMPONENT_NAME)
215    UNSET(SOURCES)
216    UNSET(PRIVATE_HEADER)
217    UNSET(PUBLIC_HEADER)
218    UNSET(PRIVATE_DEFINES)
219    UNSET(PUBLIC_DEFINES)
220    UNSET(COMPONENT_CCFLAGS)
221    UNSET(COMPONENT_PUBLIC_CCFLAGS)
222    UNSET(BUILD_AS_OBJ)
223    UNSET(LOG_DEF)
224    UNSET(WHOLE_LINK)
225    UNSET(LINK_LIB_${COMPONENT_NAME})
226    UNSET(LIB_OUT_PATH)
227    UNSET(LIB_DIR)
228    UNSET(LIBS)
229    UNSET(LIB)
230    UNSET(REWRITE_CCFLAGS)
231    UNSET(COMPONENT_IS_CLOSED)
232endmacro(unset_var)
233
234
235macro(build_component)
236    # check this component whether on the rom.
237    # set(one_value ONROM)
238    # set(multi_value SOURCES PRIVATE_HEADER PUBLIC_HEADER PRIVATE_DEFINES PUBLIC_DEFINES CCFLAGS)
239    # cmake_parse_arguments(REGD "${option}" "${one_value}" "${multi_value}" ${ARGN})
240    component_on_rom()
241    if(DEFINED ROM_SYM_PATH AND COMPONENT_ON_ROM)
242        add_library(${COMPONENT_NAME}_interface INTERFACE)
243        target_include_directories(${COMPONENT_NAME}_interface INTERFACE ${PUBLIC_HEADER})
244        target_compile_definitions(${COMPONENT_NAME}_interface INTERFACE ${PUBLIC_DEFINES})
245        list(GET SOURCES 0 SOURCES0)
246        get_filename_component(SOURCES0  "${SOURCES0}" ABSOLUTE)
247        if(EXISTS ${SOURCES0})
248            register_component()
249        endif()
250    elseif(DEFINED COMPONENT_ON_ROM)
251        need_whole_archiv()
252        if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/private)
253            set(PRIVATE_HEADER ${PRIVATE_HEADER} ${CMAKE_CURRENT_SOURCE_DIR}/private)
254        endif()
255        if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/public)
256            set(PUBLIC_HEADER ${PUBLIC_HEADER} ${CMAKE_CURRENT_SOURCE_DIR}/public)
257        endif()
258        if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/include)
259            set(PUBLIC_HEADER ${PUBLIC_HEADER} ${CMAKE_CURRENT_SOURCE_DIR}/include)
260        endif()
261        if(COMPONENT_ON_ROM STREQUAL false)
262            if(REWRITE_CCFLAGS STREQUAL true)
263                set(COMPILE_CCFLAGS ${COMPONENT_CCFLAGS})
264            else()
265                # treat as a non-rom component
266                set(COMPILE_CCFLAGS ${CCFLAGS} ${COMPONENT_CCFLAGS})
267            endif()
268        else()
269            # one on rom.
270
271            set(COMPILE_CCFLAGS ${ROM_CCFLAGS})
272        endif()
273
274        check_if_closed_component(${COMPONENT_NAME})
275        if (RELEASE OR ${COMPONENT_IS_CLOSED})
276            list(REMOVE_ITEM COMPILE_CCFLAGS "-g")
277        endif()
278
279        add_library(${COMPONENT_NAME}_interface INTERFACE)
280        target_include_directories(${COMPONENT_NAME}_interface INTERFACE ${PUBLIC_HEADER})
281        target_compile_definitions(${COMPONENT_NAME}_interface INTERFACE ${PUBLIC_DEFINES})
282        target_compile_options(${COMPONENT_NAME}_interface INTERFACE ${COMPONENT_PUBLIC_CCFLAGS})
283        set(TARGETS_INTERFACES ${RAM_COMPONENT} ${ROM_COMPONENT})
284        list(TRANSFORM TARGETS_INTERFACES APPEND "_interface")
285
286        list(LENGTH PUBLIC_HEADER PUBLIC_HEADER_NUM)
287        if(NOT ${PUBLIC_HEADER_NUM} EQUAL 0)
288            set(ALL_PUBLIC_HEADER "${ALL_PUBLIC_HEADER}" "${PUBLIC_HEADER}" CACHE INTERNAL "" FORCE)
289        endif()
290
291        if(DEFINED LOG_CUSTOM_ENABLE)
292            if(${LOG_CUSTOM_ENABLE} STREQUAL True)
293                if(NOT ${PUBLIC_HEADER_NUM} EQUAL 0)
294                    set(ALL_HEADER_DIRS "${ALL_HEADER_DIRS}" "${PUBLIC_HEADER}" CACHE INTERNAL "" FORCE)
295                endif()
296
297                list(LENGTH PRIVATE_HEADER PRIVATE_HEADER_NUM)
298                if(NOT ${PRIVATE_HEADER_NUM} EQUAL 0)
299                    set(ALL_HEADER_DIRS "${ALL_HEADER_DIRS}" "${PRIVATE_HEADER}" CACHE INTERNAL "" FORCE)
300                endif()
301
302                list(LENGTH PUBLIC_DEFINES PUBLIC_DEFINES_NUM)
303                if(NOT ${PUBLIC_DEFINES_NUM} EQUAL 0)
304                    set(ALL_DEFINES "${ALL_DEFINES}" "${PUBLIC_DEFINES}" CACHE INTERNAL "" FORCE)
305                endif()
306
307                list(LENGTH PRIVATE_DEFINES PRIVATE_DEFINES_NUM)
308                if(NOT ${PRIVATE_DEFINES_NUM} EQUAL 0)
309                    set(ALL_DEFINES "${ALL_DEFINES}" "${PRIVATE_DEFINES}" CACHE INTERNAL "" FORCE)
310                endif()
311
312                list(LENGTH DEFINES DEFINES_NUM)
313                if(NOT ${DEFINES_NUM} EQUAL 0)
314                    set(ALL_DEFINES "${ALL_DEFINES}" "${DEFINES}" CACHE INTERNAL "" FORCE)
315                endif()
316            endif()
317        endif()
318
319        set(ALL_PUBLIC_DEFINES "${ALL_PUBLIC_DEFINES}" "${PUBLIC_DEFINES}" CACHE INTERNAL "" FORCE)
320        set(ALL_PUBLIC_CCFLAGS "${ALL_PUBLIC_CCFLAGS}" "${COMPONENT_PUBLIC_CCFLAGS}" CACHE INTERNAL "" FORCE)
321        link_libs()
322        list(LENGTH SOURCES SOURCES_NUM)
323        if(NOT ${SOURCES_NUM} EQUAL 0)
324            build_library()
325        endif()
326        if(${BUILD_ROM_CALLBACK} AND ${COMPONENT_ON_ROM})
327            reg_rom_callback()
328        endif()
329        define_this_module_and_file_id()
330        sdk_export_component("component")
331        install_file()
332        add_to_logdef()
333        main_component()
334    endif()
335    unset_var()
336endmacro()
337