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