• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#===============================================================================
2# @brief    cmake sdk build
3# Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
4#===============================================================================
5
6# copy file or dir to the dest path in sdk
7function(install_dest_sdk src sdk_dest partern)
8    if (NOT DEFINED SDK_OUTPUT_PATH)
9        return()
10    endif()
11    string(REPLACE "*" "all" _partern ${partern})
12    string(REPLACE "/" "_" _name ${src}_${_partern})
13    string(REPLACE "@" "_" _name ${_name})
14    if(TARGET COPY${_name})
15        return()
16    endif()
17    string(REPLACE "${ROOT_DIR}" "${SDK_OUTPUT_PATH}" dest ${sdk_dest})
18    add_custom_target(COPY${_name} ALL
19        COMMENT "--Installing ${src} => ${dest}"
20        COMMAND ${Python3_EXECUTABLE} ${BUILD_UTILS} copy "${src}" "${dest}" ".srcrelease" '${partern}'
21    )
22    add_dependencies(COPY${_name} ${TARGET_NAME})
23endfunction()
24
25# copy file or dir to it's sdk path
26function(install_sdk src partern)
27    if (NOT DEFINED SDK_OUTPUT_PATH)
28        return()
29    endif()
30    string(REPLACE "/" "_" _name ${src})
31    string(REPLACE "@" "_" _name ${_name})
32    if(TARGET COPY${_name})
33        return()
34    endif()
35    string(REPLACE "${ROOT_DIR}" "${SDK_OUTPUT_PATH}" dest ${src})
36    add_custom_target(COPY${_name} ALL
37        COMMENT "--Installing ${src} => ${dest}"
38        COMMAND ${Python3_EXECUTABLE} ${BUILD_UTILS} copy "${src}" "${dest}" ".srcrelease" '${partern}'
39    )
40    add_dependencies(COPY${_name} ${TARGET_NAME})
41endfunction()
42
43function(install_sdk_local src partern)
44
45    string(REPLACE "/" "_" _name ${src})
46    string(REPLACE "@" "_" _name ${_name})
47    if (TARGET COPY${_name}_local)
48        return()
49    endif ()
50    set(dest ${src})
51    get_filename_component(FILE_NAME ${src} NAME)
52    add_custom_target(COPY${_name}_local ALL
53            COMMENT "--Installing ${src} => ${dest}"
54            COMMAND ${Python3_EXECUTABLE} ${BUILD_UTILS} copy "${FILE_NAME}" "${dest}" ".srcrelease" '${partern}'
55    )
56    add_dependencies(COPY${_name}_local ${TARGET_NAME})
57
58endfunction()
59
60function(install_sdk_local_dest src dest  partern)
61
62    string(REPLACE "/" "_" _name ${src})
63    string(REPLACE "@" "_" _name ${_name})
64    if (TARGET COPY${_name}_local)
65        return()
66    endif ()
67    get_filename_component(FILE_NAME ${src} NAME)
68    add_custom_target(COPY${_name}_local ALL
69            COMMENT "--Installing ${src} => ${dest}"
70            COMMAND ${Python3_EXECUTABLE} ${BUILD_UTILS} copy "${src}" "${dest}" ".srcrelease" '${partern}'
71    )
72    add_dependencies(COPY${_name}_local ${TARGET_NAME})
73
74endfunction()
75
76function(install_sdk_by_sh src partern)
77    if (NOT DEFINED SDK_OUTPUT_PATH)
78        return()
79    endif()
80    return_if_not_build()
81    string(REPLACE "*" "all" _partern ${partern})
82    string(REPLACE "/" "_" _name ${src}_${_partern})
83    string(REPLACE "@" "_" _name ${_name})
84    if(TARGET COPY${_name})
85        return()
86    endif()
87    string(REPLACE "${ROOT_DIR}" "${SDK_OUTPUT_PATH}" dest ${src})
88    add_custom_target(COPY${_name} ALL
89        COMMENT "--Installing ${src} => ${dest}"
90        COMMAND mkdir -p "${dest}"
91        COMMAND cp -rf "${src}/${partern}" "${dest}" || :
92    )
93    add_dependencies(COPY${_name} ${TARGET_NAME})
94endfunction()
95
96macro(install_lib_gen)
97    if (DEFINED SDK_OUTPUT_PATH AND DEFINED LIB_GEN_NAME AND ${COMPONENT_NAME} IN_LIST SDK_LIBGEN_COMPONENTS)
98        set(LIB_OUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/${LIB_GEN_NAME})
99        string(REPLACE "${ROOT_DIR}" "${SDK_OUTPUT_PATH}" LIB_OUT_PATH ${LIB_OUT_PATH})
100    endif()
101endmacro()
102
103macro(export_component_info)
104file(WRITE ${PROJECT_BINARY_DIR}/component_info/${COMPONENT_NAME} "SOURCES: ${SOURCES}\n")
105file(APPEND ${PROJECT_BINARY_DIR}/component_info/${COMPONENT_NAME} "HEADER: ${PRIVATE_HEADER}\n")
106file(APPEND ${PROJECT_BINARY_DIR}/component_info/${COMPONENT_NAME} "DEFINES: ${PRIVATE_DEFINES}\n")
107file(APPEND ${PROJECT_BINARY_DIR}/component_info/${COMPONENT_NAME} "COMPONENT_FLAGS: ${COMPONENT_FLAGS}\n")
108endmacro()
109
110macro(export_public_info)
111file(WRITE ${PROJECT_BINARY_DIR}/component_info/PUBLIC "PUBLIC_HEADER: ${ALL_PUBLIC_HEADER}\n")
112file(APPEND ${PROJECT_BINARY_DIR}/component_info/PUBLIC "PUBLIC_DEFINES: ${ALL_PUBLIC_DEFINES}\n")
113endmacro()
114
115macro(add_tooltrain)
116set(TOOLCHAIN_FILE ${PROJECT_BINARY_DIR}/toolchains/${TARGET_NAME}.json)
117file(WRITE ${TOOLCHAIN_FILE}
118"{
119    \"CC\": \"${CMAKE_C_COMPILER}\",
120    \"CXX\": \"${CMAKE_CXX_COMPILER}\",
121    \"AS\": \"${CMAKE_ASM_COMPILER}\",
122    \"LD\": \"${CMAKE_LINKER}\",
123    \"AR\": \"${CMAKE_AR}\",
124    \"RANLIB\": \"${CMAKE_RANLIB}\",
125    \"STRIP\": \"${CMAKE_STRIP}\",
126    \"NM\": \"${CMAKE_NM}\",
127    \"OBJCOPY\": \"${CMAKE_OBJCOPY}\",
128    \"READELF\": \"${CMAKE_READELF}\",
129    \"OBJDUMP\": \"${CMAKE_OBJDUMP}\"
130}")
131endmacro(add_tooltrain)
132
133macro(sdk_export_component type)
134if (DEFINED SDK_OUTPUT_PATH)
135    set(COMPONENT_INFO ${PROJECT_BINARY_DIR}/component_info/info.json)
136    if(${type} STREQUAL "start")
137        set(START_SYMBOL "" CACHE INTERNAL "" FORCE)
138        file(WRITE ${COMPONENT_INFO} "{\n")
139        file(APPEND ${COMPONENT_INFO}
140        "\"COMPONENTS\":{")
141    elseif(${type} STREQUAL "end")
142        set(PUBLIC_INCLUDES)
143        foreach(pub_header ${ALL_PUBLIC_HEADER})
144            get_filename_component(header ${pub_header} ABSOLUTE)
145            if (NOT ${header} IN_LIST PUBLIC_INCLUDES)
146                set(PUBLIC_INCLUDES ${PUBLIC_INCLUDES} ${header})
147            endif()
148        endforeach()
149        list(REMOVE_DUPLICATES ALL_PUBLIC_DEFINES)
150        list(REMOVE_DUPLICATES ALL_PUBLIC_CCFLAGS)
151        list(REMOVE_DUPLICATES LOG_DEF_LIST)
152        set(STD_LIB_DIR ${LIB_GCC} ${LIB_C} ${LIB_CXX})
153        file(APPEND ${COMPONENT_INFO} "},")
154        file(APPEND ${COMPONENT_INFO} "\"PUBLIC_INCLUDES\": \"${PUBLIC_INCLUDES}\",\n")
155        file(APPEND ${COMPONENT_INFO} "\"PUBLIC_DEFINES\": \"${ALL_PUBLIC_DEFINES}\",\n")
156        file(APPEND ${COMPONENT_INFO} "\"PUBLIC_CCFLAGS\": \"${ALL_PUBLIC_CCFLAGS}\",\n")
157        file(APPEND ${COMPONENT_INFO} "\"BIN_NAME\": \"${BIN_NAME}\",\n")
158        file(APPEND ${COMPONENT_INFO} "\"LINKFLAGS\": \"${LINKFLAGS}\",\n")
159        file(APPEND ${COMPONENT_INFO} "\"STD_LIB_DIR\": \"${STD_LIB_DIR}\",\n")
160        file(APPEND ${COMPONENT_INFO} "\"STD_LIBS\": \"${STD_LIBS}\",\n")
161        file(APPEND ${COMPONENT_INFO} "\"ARCH_FAMILY\": \"${ARCH_FAMILY}\",\n")
162        file(APPEND ${COMPONENT_INFO} "\"LINK_SCRIPT\": \"${LINK_SCRIPT}\",\n")
163        file(APPEND ${COMPONENT_INFO} "\"KERNEL\": \"${OS}\",\n")
164        file(APPEND ${COMPONENT_INFO} "\"LOS_ROOT\": \"${LOS_ROOT}\",\n")
165        file(APPEND ${COMPONENT_INFO} "\"LOS_PUB_CCFLAGS\": \"${LOS_PUB_CCFLAGS}\",\n")
166        file(APPEND ${COMPONENT_INFO} "\"LOG_DEF_LIST\": \"${LOG_DEF_LIST}\"\n")
167        file(APPEND ${COMPONENT_INFO} "}")
168    elseif(${type} STREQUAL "third_party")
169        if(DEFINED LIB_DIR)
170            set(LINK_LIB_DIR ${LIB_DIR})
171        else()
172            set(LINK_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR})
173        endif()
174        file(APPEND ${COMPONENT_INFO}
175            "${START_SYMBOL}
176            \"${COMPONENT_NAME}\":{
177            \"SOURCES\": \"${SOURCES}\",
178            \"THIRD_PARTY\": \"true\",
179            \"WHOLE_LINK\": \"${WHOLE_ARCHIV}\",
180            \"COMPONENT_CUSTOM_INCLUDE\": \"${COMPONENT_CUSTOM_INCLUDE}\",
181            \"LIB_DIR\":\"${LINK_LIB_DIR}\",
182            \"COMPONENT_CUSTOM_CCFLAGS\":\"${COMPONENT_CUSTOM_CCFLAGS}\",
183            \"COMPONENT_CUSTOM_DEFINES\":\"${COMPONENT_CUSTOM_DEFINES}\",
184            \"LIBS\":\"${LIBS}\"
185            }
186            ")
187        set(START_SYMBOL "," CACHE INTERNAL "" FORCE)
188    else()
189        if(DEFINED LIB_DIR)
190            set(LINK_LIB_DIR ${LIB_DIR})
191        else()
192            check_if_closed_component(${COMPONENT_NAME})
193            if (${COMPONENT_IS_CLOSED})
194                set(LINK_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_COMMAND})
195            else()
196                set(LINK_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR})
197            endif()
198        endif()
199
200        check_if_closed_component(${COMPONENT_NAME})
201        if (${COMPONENT_IS_CLOSED})
202            file(APPEND ${COMPONENT_INFO}
203            "${START_SYMBOL}
204            \"${COMPONENT_NAME}\":{
205            \"SOURCES\": \"\",
206            \"PRIVATE_INCLUDE\": \"\",
207            \"PRIVATE_DEFINES\": \"\",
208            \"PRIVATE_CCFLAGS\": \"\",
209            \"WHOLE_LINK\": \"${WHOLE_ARCHIV}\",
210            \"LIB_DIR\":\"${LINK_LIB_DIR}\",
211            \"LIBS\":\"${LIBS}\",
212            \"MODULE_NAME\":\"${${COMPONENT_NAME}_MODULE_NAME}\",
213            \"AUTO_DEF\":\"${${COMPONENT_NAME}_AUTO_DEF}\"
214            }
215            ")
216        else()
217            file(APPEND ${COMPONENT_INFO}
218            "${START_SYMBOL}
219            \"${COMPONENT_NAME}\":{
220            \"SOURCES\": \"${SOURCES}\",
221            \"PRIVATE_INCLUDE\": \"${PRIVATE_HEADER}\",
222            \"PRIVATE_DEFINES\": \"${PRIVATE_DEFINES}\",
223            \"PRIVATE_CCFLAGS\": \"${COMPONENT_CCFLAGS}\",
224            \"WHOLE_LINK\": \"${WHOLE_ARCHIV}\",
225            \"LIB_DIR\":\"${LINK_LIB_DIR}\",
226	        \"LIBS\":\"${LIBS}\",
227            \"MODULE_NAME\":\"${${COMPONENT_NAME}_MODULE_NAME}\",
228            \"AUTO_DEF\":\"${${COMPONENT_NAME}_AUTO_DEF}\"
229            }
230            ")
231        endif()
232        set(START_SYMBOL "," CACHE INTERNAL "" FORCE)
233    endif()
234endif()
235endmacro()
236
237function(generate_project_file)
238    if (NOT DEFINED SDK_OUTPUT_PATH)
239        return()
240    endif()
241    set(COMPONENT_INFO ${PROJECT_BINARY_DIR}/component_info/info.json)
242    add_tooltrain()
243    set(CC_JSON  "${PROJECT_BINARY_DIR}/compile_commands.json")
244    if("${SDK_PROJECT_FILE_DIR}" STREQUAL "" )
245    set(SDK_PROJECT_FILE_DIR  "${CMAKE_CURRENT_SOURCE_DIR}")
246    endif()
247    string(REPLACE "${PROJECT_SOURCE_DIR}" "${SDK_OUTPUT_PATH}" SDK_CURRENT_DIR ${SDK_PROJECT_FILE_DIR})
248    string(REPLACE "${PROJECT_SOURCE_DIR}" "${SDK_OUTPUT_PATH}" SDK_CURRENT_COMPILER_DIR ${COMPILER_ROOT})
249    list(JOIN SDK_TYPE "," SDK_TYPE_LIST)
250
251    add_custom_target(GEN_PROJECT ALL
252        COMMAND ${Python3_EXECUTABLE} ${PRO_GEN} "${SDK_TYPE_LIST}" "${MAIN_COMPONENT}" "${CC_JSON}" "${SDK_CURRENT_DIR}" "${PROJECT_SOURCE_DIR}" "${SDK_OUTPUT_PATH}" "${CHIP},${CORE},${BOARD},${ARCH},${OS},${PKG_TARGET_NAME}" "${TOOLCHAIN_FILE}" "${COMPONENT_INFO}"
253        WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
254        COMMENT "Generating project file..."
255    )
256
257    add_dependencies(GEN_PROJECT "${TARGET_NAME}")
258    if(NOT EXISTS ${SDK_CURRENT_COMPILER_DIR})
259        get_filename_component(SDK_CURRENT_COMPILER_DIR_ABS  "${SDK_CURRENT_COMPILER_DIR}/.." ABSOLUTE)
260        add_custom_target(GEN_COMPILER_LN ALL
261            WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
262            COMMAND mkdir -p ${SDK_CURRENT_COMPILER_DIR_ABS}
263            COMMAND ln -s ${COMPILER_ROOT} ${SDK_CURRENT_COMPILER_DIR}
264        )
265        if(DEFINED COMPILER_ROOT_WIN AND EXISTS ${COMPILER_ROOT_WIN})
266            add_custom_target(GEN_COMPILER_WIN_LN ALL
267                WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
268                COMMAND ln -s ${COMPILER_ROOT_WIN} ${SDK_CURRENT_COMPILER_DIR_ABS}
269                DEPENDS GEN_COMPILER_LN
270            )
271        endif()
272
273    endif()
274endfunction(generate_project_file)
275