• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#===============================================================================
2# @brief    cmake toolchains
3# Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
4#===============================================================================
5macro(return_if_not_build)
6    if(NOT ${COMPONENT_NAME} IN_LIST TARGET_COMPONENT)
7        return()
8    endif()
9endmacro()
10
11macro(add_subdirectory_if_exist _path)
12    if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${_path}/CMakeLists.txt)
13        add_subdirectory(${_path})
14    endif()
15endmacro()
16
17macro(add_subdirectory_with_alias_if_exist _path _path_alias)
18    if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${_path}/CMakeLists.txt)
19        add_subdirectory(${_path} ${_path_alias})
20    endif()
21endmacro()
22
23function(add_path_with_alias_if_exist _path _name)
24    if(EXISTS ${_path}/CMakeLists.txt)
25        add_subdirectory(${_path} ${_name})
26    endif()
27endfunction()
28
29function(add_path_if_exist _path)
30    if(EXISTS ${_path}/CMakeLists.txt)
31        add_subdirectory(${_path})
32    endif()
33endfunction()
34
35function(KCONFIG_GET_PARAMS KCONFIG_PATH)
36    file(STRINGS ${KCONFIG_PATH} LOS_CONFIG_LIST ENCODING "UTF-8")
37
38    foreach (CONFIG ${LOS_CONFIG_LIST})
39        # CONFIG maybe: CONFIG_CC_STACKPROTECTOR_STRONG=y
40
41        # The first: variable name
42        string(REGEX MATCH "[^=]+" CONFIG_VAR_NAME ${CONFIG})
43
44        # The second: variable value
45        string(REGEX MATCH "=(.+$)" CONFIG_VAR_VAL ${CONFIG})
46        set(CONFIG_VAR_VAL ${CMAKE_MATCH_1})
47        if(CONFIG_VAR_VAL MATCHES "^y$" OR CONFIG_VAR_VAL MATCHES "^\".*\"$")
48            string(REPLACE "\"" "" CONFIG_VAR_VAL ${CONFIG_VAR_VAL})
49            set(${CONFIG_VAR_NAME} ${CONFIG_VAR_VAL} PARENT_SCOPE)
50        endif()
51    endforeach()
52endfunction()
53
54macro(check_if_closed_component component_name)
55    set(COMPONENT_IS_CLOSED false)
56    if("${component_name}" IN_LIST CLOSED_COMPONENTS)
57        set(COMPONENT_IS_CLOSED true)
58    endif()
59    if(DEFINED OPEN_COMPONENTS AND NOT ("${component_name}" IN_LIST OPEN_COMPONENTS))
60        set(COMPONENT_IS_CLOSED true)
61    endif()
62endmacro()
63
64macro(add_glob_include_path INCLUDE_PATHS)
65    get_property(GLOB_TARGET_INCLUDE GLOBAL PROPERTY TARGET_INCLUDE)
66    list(APPEND GLOB_TARGET_INCLUDE "${INCLUDE_PATHS}")
67    list(REMOVE_DUPLICATES GLOB_TARGET_INCLUDE)
68    set_property(GLOBAL PROPERTY TARGET_INCLUDE ${GLOB_TARGET_INCLUDE})
69endmacro(add_glob_include_path)
70
71macro(add_fsm_msgdef_headers MSGDEF_HEADERS)
72    get_property(GLOB_MSGDEF_HEADERS GLOBAL PROPERTY TARGET_MSGDEF_HEADERS)
73    list(APPEND GLOB_MSGDEF_HEADERS "${MSGDEF_HEADERS}")
74    list(REMOVE_DUPLICATES GLOB_MSGDEF_HEADERS)
75    set_property(GLOBAL PROPERTY TARGET_MSGDEF_HEADERS ${GLOB_MSGDEF_HEADERS})
76endmacro()
77
78macro(ut_autogen_fsms FSM_FILES AUTOGEN_SOURCES AUTOGEN_INCLUDE_PATH)
79    set(FSM_AUTOGEN_INCLUDE_PATH)
80    foreach(FILE_PATH ${FSM_FILES})
81        if(EXISTS ${CMAKE_SOURCE_DIR}/../../../../../../protocol/cat1/lte/${FILE_PATH})
82            get_filename_component(FILE_REL_PATH ${FILE_PATH} ABSOLUTE BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
83            get_filename_component(FILE_DIRECTORY ${FILE_REL_PATH} DIRECTORY)
84            string(REGEX MATCH "${CMAKE_CURRENT_SOURCE_DIR}/" MATCH_RES ${FILE_DIRECTORY})
85            if(MATCH_RES STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}/")
86                set(AUTOGEN_PATH ${CMAKE_CURRENT_SOURCE_DIR}/stub/fsm_autogen)
87                file(MAKE_DIRECTORY ${AUTOGEN_PATH})
88                file(RELATIVE_PATH FILE_RELATIVE_PATH ${CMAKE_SOURCE_DIR} ${FILE_REL_PATH})
89                set(FSM_FILE_ABSOLUTE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../protocol/cat1/lte/${FSM_FILES})
90                execute_process(
91                    COMMAND python ${CMAKE_SOURCE_DIR}/../../../../../../tools/fsmgen/fsmgen.py ${FSM_FILE_ABSOLUTE_PATH} --out_dir ${AUTOGEN_PATH}
92                    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
93                    )
94                list(APPEND FSM_AUTOGEN_INCLUDE_PATH ${AUTOGEN_PATH})
95            endif()
96        endif()
97    endforeach()
98
99    list(REMOVE_DUPLICATES FSM_AUTOGEN_INCLUDE_PATH)
100    foreach(FSM_GEN_PATCH ${FSM_AUTOGEN_INCLUDE_PATH})
101        aux_source_directory(${FSM_GEN_PATCH} FSM_SOURCES)
102        list(APPEND ${AUTOGEN_SOURCES} ${FSM_SOURCES})
103        file(GLOB FSM_MSGDEF_PUB_HEADERS "${FSM_AUTOGEN_INCLUDE_PATH}/*public.h")
104        file(GLOB FSM_MSGDEF_PRV_HEADERS "${FSM_AUTOGEN_INCLUDE_PATH}/*private.h")
105        foreach(FSM_MSGDEF_PRV_HEADER ${FSM_MSGDEF_PRV_HEADERS})
106            string(REPLACE "${FSM_AUTOGEN_INCLUDE_PATH}" "${CMAKE_CURRENT_SOURCE_DIR}/private" RET "${FSM_MSGDEF_PRV_HEADER}")
107            string(REPLACE "fsm_gen_private.h" "fsm_private.h" FSM_SRC_PRV_HEADER "${RET}")
108            string(REPLACE "fsm_gen_private.h" "fsm.h" FSM_SRC_HEADER "${RET}")
109            file(GLOB FSM_SRC_PRV_HEADERS "${FSM_SRC_PRV_HEADER}")
110            file(GLOB FSM_SRC_HEADERS "${FSM_SRC_HEADER}")
111            add_fsm_msgdef_headers("${FSM_SRC_PRV_HEADERS}")
112            add_fsm_msgdef_headers("${FSM_SRC_HEADERS}")
113        endforeach()
114        add_fsm_msgdef_headers("${FSM_MSGDEF_PUB_HEADERS}")
115        add_fsm_msgdef_headers("${FSM_MSGDEF_PRV_HEADERS}")
116    endforeach(FSM_GEN_PATCH)
117    set(${AUTOGEN_INCLUDE_PATH} ${FSM_AUTOGEN_INCLUDE_PATH})
118endmacro(ut_autogen_fsms)
119
120macro(autogen_fsms FSM_FILES AUTOGEN_SOURCES AUTOGEN_INCLUDE_PATH)
121    set(FSM_AUTOGEN_INCLUDE_PATH)
122    foreach(FILE_PATH ${FSM_FILES})
123        if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE_PATH})
124            get_filename_component(FILE_REL_PATH ${FILE_PATH} ABSOLUTE BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
125            get_filename_component(FILE_DIRECTORY ${FILE_REL_PATH} DIRECTORY)
126            string(REGEX MATCH "${CMAKE_CURRENT_SOURCE_DIR}/" MATCH_RES ${FILE_DIRECTORY})
127            if(MATCH_RES STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}/")
128                set(AUTOGEN_PATH ${CMAKE_CURRENT_BINARY_DIR}/private)
129                file(MAKE_DIRECTORY ${AUTOGEN_PATH})
130                # message(STATUS "Autogen fsm code form ${FILE_PATH}")
131                file(RELATIVE_PATH FILE_RELATIVE_PATH ${CMAKE_SOURCE_DIR} ${FILE_REL_PATH})
132                execute_process(
133                    COMMAND python ${CMAKE_SOURCE_DIR}/tools/fsmgen/fsmgen.py ${FILE_RELATIVE_PATH} --out_dir ${AUTOGEN_PATH}
134                    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
135                    )
136                list(APPEND FSM_AUTOGEN_INCLUDE_PATH ${AUTOGEN_PATH})
137            endif()
138        endif()
139    endforeach()
140
141    list(REMOVE_DUPLICATES FSM_AUTOGEN_INCLUDE_PATH)
142    foreach(FSM_GEN_PATCH ${FSM_AUTOGEN_INCLUDE_PATH})
143        aux_source_directory(${FSM_GEN_PATCH} FSM_SOURCES)
144        list(APPEND ${AUTOGEN_SOURCES} ${FSM_SOURCES})
145        file(GLOB FSM_MSGDEF_PUB_HEADERS "${FSM_AUTOGEN_INCLUDE_PATH}/*public.h")
146        file(GLOB FSM_MSGDEF_PRV_HEADERS "${FSM_AUTOGEN_INCLUDE_PATH}/*private.h")
147        foreach(FSM_MSGDEF_PRV_HEADER ${FSM_MSGDEF_PRV_HEADERS})
148            string(REPLACE "${FSM_AUTOGEN_INCLUDE_PATH}" "${CMAKE_CURRENT_SOURCE_DIR}/private" RET "${FSM_MSGDEF_PRV_HEADER}")
149            string(REPLACE "fsm_gen_private.h" "fsm_private.h" FSM_SRC_PRV_HEADER "${RET}")
150            string(REPLACE "fsm_gen_private.h" "fsm.h" FSM_SRC_HEADER "${RET}")
151            file(GLOB FSM_SRC_PRV_HEADERS "${FSM_SRC_PRV_HEADER}")
152            file(GLOB FSM_SRC_HEADERS "${FSM_SRC_HEADER}")
153            add_fsm_msgdef_headers("${FSM_SRC_PRV_HEADERS}")
154            add_fsm_msgdef_headers("${FSM_SRC_HEADERS}")
155        endforeach()
156        add_fsm_msgdef_headers("${FSM_MSGDEF_PUB_HEADERS}")
157        add_fsm_msgdef_headers("${FSM_MSGDEF_PRV_HEADERS}")
158    endforeach(FSM_GEN_PATCH)
159    set(${AUTOGEN_INCLUDE_PATH} ${FSM_AUTOGEN_INCLUDE_PATH})
160endmacro(autogen_fsms)
161
162macro(autogen_rpc_code RPC_JSON_PATH)
163    if(${CORE} STREQUAL "protocol_core")
164        set(RPC_CORE "protocol")
165    elseif(${CORE} STREQUAL "acore")
166        set(RPC_CORE "application")
167    endif()
168    if(DEFINED RPC_CORE)
169        string(REPLACE "_" "-" TARGET_DIR ${BUILD_TARGET_NAME})
170        set(RPC_BASE_PATH ${CMAKE_SOURCE_DIR}/output/${CHIP}/${CORE}/${TARGET_DIR}/rpc_autogen)
171        set(PRC_INCLUDE_DIR_PATH ${RPC_BASE_PATH}/public/${RPC_CORE})
172        set(PRC_INCLUDE_FILE_PATH ${PRC_INCLUDE_DIR_PATH}/rpc_auto_generated.h)
173        set(RPC_SOURCE_FILE_PATH ${RPC_BASE_PATH}/private/${RPC_CORE}/rpc_auto_generated_${RPC_CORE}.c)
174        set(RPC_OPT_FILE_PATH ${RPC_BASE_PATH}/public/${RPC_CORE}/rpc_auto_generated_call_tree.opt)
175        set(RPC_SCRIPT_PATH ${CMAKE_SOURCE_DIR}/tools/fsmgen/autogen/rpc/json_to_rpc_code.py)
176        execute_process(
177            COMMAND python3 ${RPC_SCRIPT_PATH} ${RPC_CORE} ${RPC_SOURCE_FILE_PATH} ${PRC_INCLUDE_FILE_PATH} ${RPC_OPT_FILE_PATH} ${RPC_JSON_PATH}
178            WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
179        )
180    endif()
181endmacro(autogen_rpc_code)
182
183macro(autogen_at_json_code)
184    string(REPLACE "_" "-" TARGET_DIR ${BUILD_TARGET_NAME})
185    set(AT_GEN_DIR ${CMAKE_SOURCE_DIR}/output/${CHIP}/${CORE}/${TARGET_DIR}/at_autogen)
186    set(AT_GEN_TOOL ${CMAKE_SOURCE_DIR}/tools/fsmgen/autogen/at/json_to_at_code.py)
187    if((DEFINED TARGET_AT_JSON_FILES) AND (DEFINED AT_GEN_DIR))
188        if(NOT EXISTS ${AT_GEN_DIR})
189            file(MAKE_DIRECTORY ${AT_GEN_DIR})
190        endif()
191        foreach(json_path ${TARGET_AT_JSON_FILES})
192            execute_process(COMMAND python3 ${AT_GEN_TOOL} --outdir ${AT_GEN_DIR} --inputfile  ${json_path})
193        endforeach()
194    endif()
195endmacro(autogen_at_json_code)
196