# armino_build_get_property # # @brief Retrieve the value of the specified property related to BEKEN-ARMINO build. # # @param[out] var the variable to store the value in # @param[in] property the property to get the value of # # @param[in, optional] GENERATOR_EXPRESSION (option) retrieve the generator expression for the property # instead of actual value function(armino_build_get_property var property) cmake_parse_arguments(_ "GENERATOR_EXPRESSION" "" "" ${ARGN}) if(__GENERATOR_EXPRESSION) set(val "$") else() get_property(val TARGET __armino_build_target PROPERTY ${property}) endif() set(${var} ${val} PARENT_SCOPE) endfunction() # armino_build_set_property # # @brief Set the value of the specified property related to BEKEN-ARMINO build. The property is # also added to the internal list of build properties if it isn't there already. # # @param[in] property the property to set the value of # @param[out] value value of the property # # @param[in, optional] APPEND (option) append the value to the current value of the # property instead of replacing it function(armino_build_set_property property value) cmake_parse_arguments(_ "APPEND" "" "" ${ARGN}) #unset(__armino_build_target) if(__APPEND) set_property(TARGET __armino_build_target APPEND PROPERTY ${property} ${value}) else() set_property(TARGET __armino_build_target PROPERTY ${property} ${value}) armino_build_get_property(target BKD_TARGET) endif() # Keep track of set build properties so that they can be exported to a file that # will be included in early expansion script. armino_build_get_property(build_properties __BUILD_PROPERTIES) if(NOT property IN_LIST build_properties) armino_build_set_property(__BUILD_PROPERTIES "${property}" APPEND) endif() endfunction() # armino_build_unset_property # # @brief Unset the value of the specified property related to BEKEN-ARMINO build. Equivalent # to setting the property to an empty string; though it also removes the property # from the internal list of build properties. # # @param[in] property the property to unset the value of function(armino_build_unset_property property) armino_build_set_property(${property} "") # set to an empty value armino_build_get_property(build_properties __BUILD_PROPERTIES) # remove from tracked properties list(REMOVE_ITEM build_properties ${property}) armino_build_set_property(__BUILD_PROPERTIES "${build_properties}") endfunction() # # Retrieve the ARMINO_PATH repository's version, either using a version # file or Git revision. Sets the ARMINO_VER build property. # function(__build_get_armino_git_revision) armino_build_get_property(armino_path ARMINO_PATH) git_describe(armino_ver_git "${armino_path}") if(EXISTS "${armino_path}/version.txt") file(STRINGS "${armino_path}/version.txt" armino_ver_t) set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${armino_path}/version.txt") else() set(armino_ver_t ${armino_ver_git}) endif() # cut ARMINO_VER to required 32 characters. string(SUBSTRING "${armino_ver_t}" 0 31 armino_ver) armino_build_set_property(COMPILE_DEFINITIONS "-DARMINO_VER=\"${armino_ver}\"" APPEND) armino_build_set_property(COMPILE_DEFINITIONS "-DARMINO_INTERNAL_LIB_VER=\"${armino_ver}\"" APPEND) git_submodule_check("${armino_path}") armino_build_set_property(ARMINO_VER ${armino_ver}) endfunction() # # Sets initial list of build specifications (compile options, definitions, etc.) common across # all library targets built under the BEKEN-ARMINO build system. These build specifications are added # privately using the directory-level CMake commands (add_compile_options, include_directories, etc.) # during component registration. # function(__build_set_default_build_specifications) unset(compile_definitions) unset(compile_options) unset(c_compile_options) unset(cxx_compile_options) unset(link_options) set(armino_target $ENV{ARMINO_SOC}) if(NOT armino_target) if(ARMINO_SOC) set(armino_target ${ARMINO_SOC}) else() set(armino_target bk7231n) LOGI("ARMINO_SOC not set, using default target: ${armino_target}") endif() endif() list(APPEND compile_definitions "-D_GNU_SOURCE") list(APPEND compile_options "-g" "-Os" "-nostdlib" "-Wall" "-Werror" "-Wno-address" "-Wno-array-bounds" "-Wno-format" "-Wno-unknown-pragmas" "-Wno-address-of-packed-member" # gcc 5 don't recognize no-address-of-packed-member "-Wno-deprecated-declarations" # prefer to use -Wno-error=deprecated-declarations "-Wno-unused-value" # ignore statement with no effect warning "-Wno-unused-function" # ignore unused function warning "-ffunction-sections" "-fsigned-char" "-fdata-sections" "-fno-strict-aliasing" #"-x assembler-with-cpp" #TODO fix it "-ggdb") list(APPEND c_compile_options "-std=gnu99" "-Wno-old-style-declaration" "-nostdlib" "-ffunction-sections" "-Wl, --gc-sections" ) list(APPEND cxx_compile_options "-std=gnu++11" "-nostdlib" ) if(EXISTS "${armino_path}/properties/modules/wifi/ip_ax") list(APPEND compile_definitions "-DCONFIG_DEBUG_FIRMWARE=1") # list(APPEND compile_definitions "-DCFG_LOG_LEVEL=3") else() list(APPEND compile_definitions "-DCONFIG_RELEASE_VERSION=1") list(APPEND compile_definitions "-DCFG_LOG_LEVEL=2") endif() armino_build_get_property(soc_path SOC_PATH) if (EXISTS ${soc_path}/${armino_target}/compile-options.cmake) include (${soc_path}/${armino_target}/compile-options.cmake) if (DEFINED OVERRIDE_COMPILE_OPTIONS) list(APPEND compile_options ${OVERRIDE_COMPILE_OPTIONS}) endif() if (DEFINED OVERRIDE_LINK_OPTIONS) list(APPEND link_options ${OVERRIDE_LINK_OPTIONS}) endif() endif() armino_build_set_property(COMPILE_DEFINITIONS "${compile_definitions}" APPEND) armino_build_set_property(COMPILE_OPTIONS "${compile_options}" APPEND) armino_build_set_property(C_COMPILE_OPTIONS "${c_compile_options}" APPEND) armino_build_set_property(CXX_COMPILE_OPTIONS "${cxx_compile_options}" APPEND) armino_build_set_property(LINK_OPTIONS "${link_options}" APPEND) endfunction() function(__build_add_components components_path) armino_build_get_property(prefix __PREFIX) file(GLOB property_dirs ${components_path}/*) foreach(property_dir ${property_dirs}) get_filename_component(property_dir ${property_dir} ABSOLUTE) __component_dir_quick_check(is_component ${property_dir}) if(is_component) __component_add(${property_dir} ${prefix}) endif() __component_loop_sub_dirs(is_loop_sub_dirs ${property_dir}) if(is_loop_sub_dirs) execute_process(COMMAND find ${property_dir} -maxdepth 8 -name "CMakeLists.txt" -exec dirname {} \; OUTPUT_VARIABLE sub_property_dirs RESULT_VARIABLE result ) string(REPLACE "\n" ";" sub_dirs_list ${sub_property_dirs}) foreach(sub_dir ${sub_dirs_list}) if(EXISTS ${sub_dir}/CMakeLists.txt) get_filename_component(base_dir ${sub_dir} NAME) __component_dir_quick_check(is_component ${sub_dir}) if(is_component) armino_build_component(${sub_dir}) endif() endif() endforeach() endif() endforeach() endfunction() # # Initialize the build. This gets called upon inclusion of armino.cmake to set internal # properties used for the processing phase of the build. # function(__build_init armino_path) # Create the build target, to which the BEKEN-ARMINO build properties, dependencies are attached to. # Must be global so as to be accessible from any subdirectory in custom projects. add_library(__armino_build_target STATIC IMPORTED GLOBAL) set_default(python "python3") armino_build_set_property(PYTHON ${python}) armino_build_set_property(ARMINO_PATH ${armino_path}) armino_build_set_property(__PREFIX armino) armino_build_set_property(__INCLUDE_PREFIX inc) armino_build_set_property(__CHECK_PYTHON 1) armino_build_set_property(SOC_PATH ${SOC_PATH}) __build_set_default_build_specifications() # Add internal components to the build armino_build_get_property(armino_path ARMINO_PATH) armino_build_get_property(prefix __PREFIX) __build_add_components(${armino_path}/components) __build_add_components(${armino_path}/middleware) __build_add_components(${armino_path}/middleware/boards/${ARMINO_SOC}) __component_add(${armino_path}/include ${prefix}) # Set components required by all other components in the build set(requires_common include bk_common common part_table) armino_build_set_property(__COMPONENT_REQUIRES_COMMON "${requires_common}") armino_build_set_property(COMPILE_DEFINITIONS "-DAPP_VERSION=\"$ENV{APP_VERSION}\"" APPEND) if("$ENV{LIB_HASH}" STREQUAL "NULL") LOGI("LIB_HASH IS NULL") else() armino_build_set_property(COMPILE_DEFINITIONS "-DLIB_HASH=\"$ENV{LIB_HASH}\"" APPEND) armino_build_set_property(COMPILE_DEFINITIONS "-DARMINO_SOC=${ARMINO_SOC}" APPEND) LOGI("LIB_HASH IS \"$ENV{LIB_HASH}\"") endif() #__build_get_armino_git_revision() __kconfig_init() endfunction() function(__build_check_config) if (NOT BUILD_PROPERTIES_LIB) set(config_check_tool ${armino_path}/components/bk_libs/config_checking.py) set(lib_sdkconfig ${armino_path}/components/bk_libs/${ARMINO_SOC}/config/sdkconfig) set(armino_sdkconfig ${CMAKE_BINARY_DIR}/sdkconfig) #execute_process( #COMMAND ${config_check_tool} --lib_sdkconfig ${lib_sdkconfig} --armino_sdkconfig ${armino_sdkconfig} #RESULT_VARIABLE result #) #if ("${result}" EQUAL "0") #LOGI("sdkconfig checking passed") #else() #TODO fix it after optimze bk_private! #LOGI("!!!sdkconfig checking failed") #LOGE("sdkconfig checking failed") #endif() endif() endfunction() # armino_build_component # # @brief Present a directory that contains a component to the build system. # Relative paths are converted to absolute paths with respect to current directory. # All calls to this command must be performed before armino_build_process. # # @note This command does not guarantee that the component will be processed # during build (see the COMPONENTS argument description for command armino_build_process) # # @param[in] component_dir directory of the component function(armino_build_component component_dir) armino_build_get_property(prefix __PREFIX) __component_add(${component_dir} ${prefix} 0) endfunction() # # Resolve the requirement component to the component target created for that component. # function(__build_resolve_and_add_req var component_target req type) __component_get_target(_component_target ${req}) __component_get_property(_component_registered ${component_target} __COMPONENT_REGISTERED) if(NOT _component_target OR NOT _component_registered) __component_get_property(_component_name ${component_target} COMPONENT_NAME) __component_get_property(_component_dir ${component_target} COMPONENT_DIR) LOGE("Component '${_component_name}' depends on component '${req}', but '${req}' is not registered by armino_component_register()! See ${_component_dir}/CMakeLists.txt") endif() __component_get_property(tmp_property ${component_target} ${type} ${_component_target}) if (NOT ${_component_target} IN_LIST tmp_property) __component_set_property(${component_target} ${type} ${_component_target} APPEND) endif() set(${var} ${_component_target} PARENT_SCOPE) endfunction() # # Build a list of components (in the form of component targets) to be added to the build # based on public and private requirements. This list is saved in an internal property, # __BUILD_COMPONENT_TARGETS. # function(__build_expand_requirements component_target) # Since there are circular dependencies, make sure that we do not infinitely # expand requirements for each component. armino_build_get_property(component_targets_seen __COMPONENT_TARGETS_SEEN) __component_get_property(component_registered ${component_target} __COMPONENT_REGISTERED) if(component_target IN_LIST component_targets_seen OR NOT component_registered) return() endif() armino_build_set_property(__COMPONENT_TARGETS_SEEN ${component_target} APPEND) get_property(reqs TARGET ${component_target} PROPERTY REQUIRES) get_property(priv_reqs TARGET ${component_target} PROPERTY PRIV_REQUIRES) foreach(req ${reqs}) __build_resolve_and_add_req(_component_target ${component_target} ${req} __REQUIRES) __build_expand_requirements(${_component_target}) endforeach() foreach(req ${priv_reqs}) __build_resolve_and_add_req(_component_target ${component_target} ${req} __PRIV_REQUIRES) __build_expand_requirements(${_component_target}) endforeach() armino_build_get_property(build_component_targets __BUILD_COMPONENT_TARGETS) if(NOT component_target IN_LIST build_component_targets) armino_build_set_property(__BUILD_COMPONENT_TARGETS ${component_target} APPEND) __component_get_property(component_lib ${component_target} COMPONENT_LIB) armino_build_set_property(__BUILD_COMPONENTS ${component_lib} APPEND) armino_build_get_property(prefix __PREFIX) armino_build_get_property(inc_prefix __INCLUDE_PREFIX) __component_get_property(component_prefix ${component_target} __PREFIX) __component_get_property(component_alias ${component_target} COMPONENT_ALIAS) armino_build_set_property(BUILD_COMPONENT_ALIASES ${component_alias} APPEND) # Only put in the prefix in the name if it is not the default one if(component_prefix STREQUAL prefix OR component_prefix STREQUAL inc_prefix) __component_get_property(component_name ${component_target} COMPONENT_NAME) armino_build_set_property(BUILD_COMPONENTS ${component_name} APPEND) else() armino_build_set_property(BUILD_COMPONENTS ${component_alias} APPEND) endif() endif() endfunction() # # Write a CMake file containing set build properties, owing to the fact that an internal # list of properties is maintained in armino_build_set_property() call. This is used to convert # those set properties to variables in the scope the output file is included in. # function(__build_write_properties output_file) armino_build_get_property(build_properties __BUILD_PROPERTIES) foreach(property ${build_properties}) armino_build_get_property(val ${property}) set(build_properties_text "${build_properties_text}\nset(${property} ${val})") endforeach() file(WRITE ${output_file} "${build_properties_text}") endfunction() # # Check if the Python interpreter used for the build has all the required modules. # function(__build_check_python) armino_build_get_property(check __CHECK_PYTHON) if(check) armino_build_get_property(python PYTHON) armino_build_get_property(armino_path ARMINO_PATH) LOGI("Checking Python dependencies...") execute_process(COMMAND "${python}" "${armino_path}/tools/build_tools/check_python_dependencies.py" RESULT_VARIABLE result) if(NOT result EQUAL 0) LOGE("Some Python dependencies must be installed. Check above message for details.") endif() endif() endfunction() # # Prepare for component processing expanding each component's project include # macro(__build_process_project_includes) # Include the sdkconfig cmake file, since the following operations require # knowledge of config values. armino_build_get_property(sdkconfig_cmake SDKCONFIG_CMAKE) include(${sdkconfig_cmake}) # Make each build property available as a read-only variable armino_build_get_property(build_properties __BUILD_PROPERTIES) foreach(build_property ${build_properties}) armino_build_get_property(val ${build_property}) set(${build_property} "${val}") endforeach() # Check that the CMake target value matches the Kconfig target value. __target_check() armino_build_get_property(build_component_targets __BUILD_COMPONENT_TARGETS) # Include each component's project_include.cmake foreach(component_target ${build_component_targets}) __component_get_property(dir ${component_target} COMPONENT_DIR) __component_get_property(_name ${component_target} COMPONENT_NAME) set(COMPONENT_NAME ${_name}) set(COMPONENT_DIR ${dir}) set(COMPONENT_PATH ${dir}) # this is deprecated, users are encouraged to use COMPONENT_DIR; # retained for compatibility if(EXISTS ${COMPONENT_DIR}/project_include.cmake) include(${COMPONENT_DIR}/project_include.cmake) endif() endforeach() endmacro() # # Utility macro for setting default property value if argument is not specified # for armino_build_process(). # macro(__build_set_default var default) set(_var __${var}) if(NOT "${${_var}}" STREQUAL "") armino_build_set_property(${var} "${${_var}}") else() armino_build_set_property(${var} "${default}") endif() unset(_var) endmacro() # # Import configs as build instance properties so that they are accessible # using armino_build_get_config(). Config has to have been generated before calling # this command. # function(__build_import_configs) # Include the sdkconfig cmake file, since the following operations require # knowledge of config values. armino_build_get_property(sdkconfig_cmake SDKCONFIG_CMAKE) include(${sdkconfig_cmake}) armino_build_set_property(__CONFIG_VARIABLES "${CONFIGS_LIST}") foreach(config ${CONFIGS_LIST}) set_property(TARGET __armino_build_target PROPERTY ${config} "${${config}}") endforeach() endfunction() # armino_build_process # # @brief Main processing step for BEKEN-ARMINO build: config generation, adding components to the build, # dependency resolution, etc. # # @param[in] target BEKEN-ARMINO target # # @param[in, optional] PROJECT_DIR (single value) directory of the main project the buildsystem # is processed for; defaults to CMAKE_SOURCE_DIR # @param[in, optional] PROJECT_VER (single value) version string of the main project; defaults # to 1 # @param[in, optional] PROJECT_NAME (single value) main project name, defaults to CMAKE_PROJECT_NAME # @param[in, optional] SDKCONFIG (single value) sdkconfig output path, defaults to PROJECT_DIR/sdkconfig # if PROJECT_DIR is set and CMAKE_SOURCE_DIR/sdkconfig if not # @param[in, optional] SDKCONFIG_DEFAULTS (single value) config defaults file to use for the build; defaults # to none (Kconfig defaults or previously generated config are used) # @param[in, optional] BUILD_DIR (single value) directory for build artifacts; defautls to CMAKE_BINARY_DIR # @param[in, optional] COMPONENTS (multivalue) select components to process among the components # known by the build system # (added via `armino_build_component`). This argument is used to trim the build. # Other components are automatically added if they are required # in the dependency chain, i.e. # the public and private requirements of the components in this list # are automatically added, and in # turn the public and private requirements of those requirements, # so on and so forth. If not specified, all components known to the build system # are processed. macro(armino_build_process target) set(options) set(single_value PROJECT_DIR PROJECT_VER PROJECT_NAME BUILD_DIR SDKCONFIG SDKCONFIG_DEFAULT_SOC) set(multi_value COMPONENTS SDKCONFIG_DEFAULTS) cmake_parse_arguments(_ "${options}" "${single_value}" "${multi_value}" ${ARGN}) armino_build_set_property(BOOTLOADER_BUILD "${BOOTLOADER_BUILD}") # Check build target is specified. Since this target corresponds to a component # name, the target component is automatically added to the list of common component # requirements. if(target STREQUAL "") LOGE("Build target not specified.") endif() armino_build_set_property(ARMINO_SOC ${target}) __build_set_default(PROJECT_DIR ${CMAKE_SOURCE_DIR}) __build_set_default(PROJECT_NAME ${CMAKE_PROJECT_NAME}) __build_set_default(PROJECT_VER 1) __build_set_default(BUILD_DIR ${CMAKE_BINARY_DIR}) armino_build_get_property(project_dir PROJECT_DIR) __build_set_default(SDKCONFIG "${project_dir}/sdkconfig") __build_set_default(SDKCONFIG_DEFAULTS "") __build_set_default(SDKCONFIG_DEFAULT_SOC "") # Check for required Python modules __build_check_python() #armino_build_set_property(__COMPONENT_REQUIRES_COMMON ${target} APPEND) # Perform early expansion of component CMakeLists.txt in CMake scripting mode. # It is here we retrieve the public and private requirements of each component. # It is also here we add the common component requirements to each component's # own requirements. __component_get_requirements() armino_build_get_property(component_targets __COMPONENT_TARGETS) # Finally, do component expansion. In this case it simply means getting a final list # of build component targets given the requirements set by each component. # Check if we need to trim the components first, and build initial components list # from that. if(__COMPONENTS) unset(component_targets) foreach(component ${__COMPONENTS}) __component_get_target(component_target ${component}) if(NOT component_target) LOGE("Failed to resolve component '${component}'.") endif() list(APPEND component_targets ${component_target}) endforeach() endif() foreach(component_target ${component_targets}) __build_expand_requirements(${component_target}) endforeach() armino_build_unset_property(__COMPONENT_TARGETS_SEEN) # Get a list of common component requirements in component targets form (previously # we just have a list of component names) armino_build_get_property(common_reqs __COMPONENT_REQUIRES_COMMON) foreach(common_req ${common_reqs}) __component_get_target(component_target ${common_req}) __component_get_property(lib ${component_target} COMPONENT_LIB) armino_build_set_property(___COMPONENT_REQUIRES_COMMON ${lib} APPEND) endforeach() # Generate config values in different formats armino_build_get_property(sdkconfig SDKCONFIG) armino_build_get_property(sdkconfig_defaults SDKCONFIG_DEFAULTS) armino_build_get_property(sdkconfig_default_soc SDKCONFIG_DEFAULT_SOC) __kconfig_generate_config("${sdkconfig}" "${sdkconfig_defaults}" "${sdkconfig_default_soc}") __build_import_configs() __build_check_config() # All targets built under this scope is with the BEKEN-ARMINO build system set(BEKEN_PLATFORM 1) armino_build_set_property(COMPILE_DEFINITIONS "-DBEKEN_PLATFORM" APPEND) # Perform component processing (inclusion of project_include.cmake, adding component # subdirectories, creating library targets, linking libraries, etc.) __build_process_project_includes() #Secondary loading components start __component_get_requirements() #Secondary loading components end armino_build_get_property(armino_path ARMINO_PATH) armino_build_get_property(build_dir BUILD_DIR) add_subdirectory(${armino_path} ${build_dir}/armino) unset(BEKEN_PLATFORM) endmacro() # armino_build_executable # # @brief Specify the executable the build system can attach dependencies to (for generating # files used for linking, targets which should execute before creating the specified executable, # generating additional binary files, generating files related to flashing, etc.) function(armino_build_executable bin) # Set additional link flags for the executable armino_build_get_property(link_options LINK_OPTIONS) armino_build_get_property(link_libs LINK_LIBRARIES) # Using LINK_LIBRARIES here instead of LINK_OPTIONS, as the latter is not in CMake 3.5. set_property(TARGET ${bin} APPEND PROPERTY LINK_LIBRARIES "${link_options}") # Propagate link dependencies from component library targets to the executable armino_build_get_property(link_depends __LINK_DEPENDS) set_property(TARGET ${bin} APPEND PROPERTY LINK_DEPENDS "${link_depends}") # Set the EXECUTABLE_NAME and EXECUTABLE properties since there are generator expression # from components that depend on it get_filename_component(bin_name ${bin} NAME_WE) get_target_property(bin_dir ${bin} BINARY_DIR) armino_build_set_property(EXECUTABLE_NAME ${bin_name}) armino_build_set_property(EXECUTABLE ${bin}) armino_build_set_property(EXECUTABLE_DIR "${bin_dir}") # Add dependency of the build target to the executable add_dependencies(${bin} __armino_build_target) if (EXISTS "$ENV{ARMINO_PATH}/middleware/boards/${ARMINO_SOC}/${ARMINO_SOC}.wrapper") set(armino_pack "$ENV{ARMINO_PATH}/middleware/boards/${ARMINO_SOC}/${ARMINO_SOC}.wrapper") else() set(armino_pack "$ENV{ARMINO_PATH}/tools/env_tools/beken_packager/cmake_packager_wrapper") endif() set(target ${ARMINO_SOC}) armino_build_get_property(build_dir BUILD_DIR) set(config_dir ${build_dir}/config) set(sdkconfig_header ${config_dir}/sdkconfig.h) foreach(config_file ${sdkconfig_header}) file(STRINGS ${config_file} objdump) string(REGEX MATCH "CONFIG_OBJDUMP 1" match_string "${objdump}") if(match_string) set(objdump_config 1) else() set(objdump_config 0) endif() endforeach() set(wrapper_cmd COMMAND python3 ${armino_pack} -n all-${bin_name}.bin -f ${bin_name}.bin -c ${ARMINO_SOC}) if (("${target}" STREQUAL "bk7236") OR ("${target}" STREQUAL "bk7239") OR ("${target}" STREQUAL "bk7286") OR ("${target}" STREQUAL "bk7258") OR ("${target}" STREQUAL "bk7234") OR ("${target}" STREQUAL "bk723L")) set(wrapper_cmd COMMAND python3 ${armino_pack} pack) elseif (("${target}" STREQUAL "bk7236_cp1") OR ("${target}" STREQUAL "bk7258_cp1") OR ("${target}" STREQUAL "bk7258_cp2")) set(wrapper_cmd) endif() set(objdump_cmd) if(objdump_config EQUAL 1) set(objdump_cmd COMMAND ${armino_objdump} -d ${bin_dir}/${bin} > ${bin_dir}/${bin_name}.lst) endif() add_custom_command(OUTPUT "${bin_dir}/bin_tmp" COMMAND "${armino_objcopy}" -O binary "${bin_dir}/${bin}" "${bin_dir}/${bin_name}.bin" COMMAND "${armino_readelf}" -a -h -l -S -g -s "${bin_dir}/${bin}" > "${bin_dir}/${bin_name}.txt" COMMAND "${armino_nm}" -n -l -C -a -A -g "${bin_dir}/${bin}" > "${bin_dir}/${bin_name}.nm" COMMAND ${objdump_cmd} COMMAND ${wrapper_cmd} DEPENDS ${bin} VERBATIM WORKING_DIRECTORY ${bin_dir} COMMENT "Generating binary image from built executable" ) set(armino_size_statistic ${python} ${armino_path}/tools/build_tools/armino_size_statistic.py) set(armino_size_parse_map ${python} ${armino_path}/tools/build_tools/map_helper.py) add_custom_target(gen_project_binary DEPENDS "${bin_dir}/bin_tmp") add_custom_target(app ALL DEPENDS gen_project_binary) armino_build_get_property(armino_target ARMINO_SOC) add_custom_target(size-statistic ALL DEPENDS gen_project_binary #COMMAND ${armino_size_statistic} --size "${armino_toolchain_size}" --dirs "${armino_path}/components/bk_libs/${armino_target}" --outfile "${build_dir}/size_map.txt" COMMAND ${armino_size_parse_map} "${build_dir}/app.map" ) endfunction() # armino_build_get_config # # @brief Get value of specified config variable function(armino_build_get_config var config) cmake_parse_arguments(_ "GENERATOR_EXPRESSION" "" "" ${ARGN}) if(__GENERATOR_EXPRESSION) set(val "$") else() get_property(val TARGET __armino_build_target PROPERTY ${config}) endif() set(${var} ${val} PARENT_SCOPE) endfunction() function(armino_build_parse_config_file_list) set(_sdkconfig_defaults "$ENV{SDKCONFIG_DEFAULTS}") armino_build_get_property(armino_path ARMINO_PATH) armino_build_get_property(soc_path SOC_PATH) if(NOT _sdkconfig_defaults) set(_sdkconfig_defaults "") if(EXISTS "${CMAKE_SOURCE_DIR}/config/common/config") list(APPEND _sdkconfig_defaults "${CMAKE_SOURCE_DIR}/config/common/config") elseif(EXISTS "${CMAKE_SOURCE_DIR}/config/common.config") list(APPEND _sdkconfig_defaults "${CMAKE_SOURCE_DIR}/config/common.config") endif() if(EXISTS "${CMAKE_SOURCE_DIR}/config/${ARMINO_SOC}/config") list(APPEND _sdkconfig_defaults "${CMAKE_SOURCE_DIR}/config/${ARMINO_SOC}/config") elseif(EXISTS "${CMAKE_SOURCE_DIR}/config/${ARMINO_SOC}.config") list(APPEND _sdkconfig_defaults "${CMAKE_SOURCE_DIR}/config/${ARMINO_SOC}.config") endif() string(FIND ${CMAKE_SOURCE_DIR} "properties_libs" str_index) set(build_bklibs 0) if(NOT str_index EQUAL -1) set(build_bklibs 1) endif() if(EXISTS "${soc_path}/${ARMINO_SOC}/${ARMINO_SOC}.defconfig") if(build_bklibs EQUAL 0 AND EXISTS "$ENV{MODULE_DIR}/${ARMINO_SOC}/$ENV{MODULE}.defconfig") set(_sdkconfig_default_soc "$ENV{MODULE_DIR}/${ARMINO_SOC}/$ENV{MODULE}.defconfig") else() set(_sdkconfig_default_soc "${soc_path}/${ARMINO_SOC}/${ARMINO_SOC}.defconfig") endif() get_filename_component(sdkconfig_default_soc "${_sdkconfig_default_soc}" ABSOLUTE) else() set(sdkconfig_default_soc "") endif() endif() if(SDKCONFIG_DEFAULTS) set(_sdkconfig_defaults "${SDKCONFIG_DEFAULTS}") set(_sdkconfig_defaults_soc "") endif() foreach(sdkconfig_default ${_sdkconfig_defaults}) get_filename_component(sdkconfig_default "${sdkconfig_default}" ABSOLUTE) if(NOT EXISTS "${sdkconfig_default}") LOGE("SDKCONFIG_DEFAULTS '${sdkconfig_default}' does not exist.") endif() list(APPEND sdkconfig_defaults ${sdkconfig_default}) endforeach() if(SDKCONFIG) get_filename_component(sdkconfig "${SDKCONFIG}" ABSOLUTE) else() set(sdkconfig "${CMAKE_BINARY_DIR}/sdkconfig") endif() armino_build_set_property(SDKCONFIG_DEFAULTS "${sdkconfig_defaults}") armino_build_set_property(SDKCONFIG_DEFAULT_SOC "${sdkconfig_default_soc}") armino_build_set_property(SDKCONFIG "${sdkconfig}") endfunction() function(armino_build_parse_toolchain_dir) set(default_toolchain_dir "/opt/gcc-arm-none-eabi-10.3-2021.10/bin") armino_build_get_property(armino_path ARMINO_PATH) armino_build_get_property(sdkconfig_defaults SDKCONFIG_DEFAULTS) armino_build_get_property(sdkconfig_default_soc SDKCONFIG_DEFAULT_SOC) set(user_configed_toolchain_dir "") foreach(config_file ${sdkconfig_default_soc}) file(STRINGS ${config_file} toolchain_dir_line REGEX ^CONFIG_TOOLCHAIN_PATH=) if(NOT "${toolchain_dir_line}" STREQUAL "") set(user_configed_toolchain_dir ${toolchain_dir_line}) endif() endforeach() foreach(config_file ${sdkconfig_defaults}) file(STRINGS ${config_file} toolchain_dir_line REGEX ^CONFIG_TOOLCHAIN_PATH=) if(NOT "${toolchain_dir_line}" STREQUAL "") set(user_configed_toolchain_dir ${toolchain_dir_line}) endif() endforeach() if("${user_configed_toolchain_dir}" STREQUAL "") set(toolchain_dir ${default_toolchain_dir}) LOGI("use default toolchain path: ${toolchain_dir}") else() string(REPLACE "CONFIG_TOOLCHAIN_PATH=" "" toolchain_dir_temp ${user_configed_toolchain_dir}) string(REPLACE "\"" "" toolchain_dir ${toolchain_dir_temp}) LOGI("use configured toolchain path: ${toolchain_dir}") endif() if(NOT IS_ABSOLUTE ${toolchain_dir}) set(toolchain_dir ${armino_path}/${toolchain_dir}) endif() if(NOT EXISTS ${toolchain_dir}) LOGE("toolchain PATH ${toolchain_dir} doesn't exist!") endif() armino_build_set_property(TOOLCHAIN_DIR ${toolchain_dir}) set(ENV{TOOLCHAIN_DIR} ${toolchain_dir}) endfunction()