From 3a291da164e0f3bfe774d6334f1af94e6658ef27 Mon Sep 17 00:00:00 2001 From: Renz Christian Bagaporo Date: Thu, 9 May 2019 17:39:11 +0800 Subject: [PATCH] cmake: fix variable scope issues --- CMakeLists.txt | 118 +------------------------------- tools/cmake/idf_functions.cmake | 115 ++++++++++++++++++++++++++++++- 2 files changed, 113 insertions(+), 120 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2c6ef7621f..cb7956db4d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,108 +1,6 @@ cmake_minimum_required(VERSION 3.5) project(esp-idf C CXX ASM) -if(NOT IDF_PATH) - set(IDF_PATH ${CMAKE_CURRENT_LIST_DIR}) -endif() - -include(tools/cmake/idf_functions.cmake) - -# -# Set variables that control the build configuration and the build itself -# -idf_set_variables() - -kconfig_set_variables() - -# -# Generate a component dependencies file, enumerating components to be included in the build -# as well as their dependencies. -# -execute_process(COMMAND "${CMAKE_COMMAND}" - -D "COMPONENTS=${IDF_COMPONENTS}" - -D "COMPONENT_REQUIRES_COMMON=${IDF_COMPONENT_REQUIRES_COMMON}" - -D "EXCLUDE_COMPONENTS=${IDF_EXCLUDE_COMPONENTS}" - -D "TEST_COMPONENTS=${IDF_TEST_COMPONENTS}" - -D "TEST_EXCLUDE_COMPONENTS=${IDF_TEST_EXCLUDE_COMPONENTS}" - -D "BUILD_TESTS=${IDF_BUILD_TESTS}" - -D "DEPENDENCIES_FILE=${CMAKE_BINARY_DIR}/component_depends.cmake" - -D "COMPONENT_DIRS=${IDF_COMPONENT_DIRS}" - -D "BOOTLOADER_BUILD=${BOOTLOADER_BUILD}" - -D "IDF_TARGET=${IDF_TARGET}" - -D "IDF_PATH=${IDF_PATH}" - -D "DEBUG=${DEBUG}" - -P "${IDF_PATH}/tools/cmake/scripts/expand_requirements.cmake" - WORKING_DIRECTORY "${PROJECT_PATH}" - RESULT_VARIABLE expand_requirements_result) - -if(expand_requirements_result) - message(FATAL_ERROR "Failed to expand component requirements") -endif() - -include("${CMAKE_BINARY_DIR}/component_depends.cmake") - -# -# We now have the following component-related variables: -# -# IDF_COMPONENTS is the list of initial components set by the user -# (or empty to include all components in the build). -# BUILD_COMPONENTS is the list of components to include in the build. -# BUILD_COMPONENT_PATHS is the paths to all of these components, obtained from the component dependencies file. -# -# Print the list of found components and test components -# -string(REPLACE ";" " " BUILD_COMPONENTS_SPACES "${BUILD_COMPONENTS}") -message(STATUS "Component names: ${BUILD_COMPONENTS_SPACES}") -unset(BUILD_COMPONENTS_SPACES) -message(STATUS "Component paths: ${BUILD_COMPONENT_PATHS}") - -# Print list of test components -if(TESTS_ALL EQUAL 1 OR TEST_COMPONENTS) - string(REPLACE ";" " " BUILD_TEST_COMPONENTS_SPACES "${BUILD_TEST_COMPONENTS}") - message(STATUS "Test component names: ${BUILD_TEST_COMPONENTS_SPACES}") - unset(BUILD_TEST_COMPONENTS_SPACES) - message(STATUS "Test component paths: ${BUILD_TEST_COMPONENT_PATHS}") -endif() - -# Generate project configuration -kconfig_process_config() - -# Include sdkconfig.cmake so rest of the build knows the configuration -include(${SDKCONFIG_CMAKE}) - -# Verify the environment is configured correctly -idf_verify_environment() - -# Check git revision (may trigger reruns of cmake) -## sets IDF_VER to IDF git revision -idf_get_git_revision() - -# Check that the targets set in cache, sdkconfig, and in environment all match -idf_check_config_target() - -## get PROJECT_VER -if(NOT BOOTLOADER_BUILD) - app_get_revision("${CMAKE_SOURCE_DIR}") -endif() - -# Add some idf-wide definitions -idf_set_global_compile_options() - -# generate compile_commands.json (needs to come after project) -set(CMAKE_EXPORT_COMPILE_COMMANDS 1) - -# -# Setup variables for linker script generation -# -ldgen_set_variables() - -# Include any top-level project_include.cmake files from components -foreach(component ${BUILD_COMPONENT_PATHS}) - set(COMPONENT_PATH "${component}") - include_if_exists("${component}/project_include.cmake") - unset(COMPONENT_PATH) -endforeach() - # # Add each component to the build as a library # @@ -144,18 +42,4 @@ foreach(component ${BUILD_COMPONENTS}) add_component_dependencies(${component_target} ${dep_target} PRIVATE) endforeach() endif() -endforeach() - -if(IDF_BUILD_ARTIFACTS) - # Write project description JSON file - make_json_list("${BUILD_COMPONENTS}" build_components_json) - make_json_list("${BUILD_COMPONENT_PATHS}" build_component_paths_json) - configure_file("${IDF_PATH}/tools/cmake/project_description.json.in" - "${IDF_BUILD_ARTIFACTS_DIR}/project_description.json") - unset(build_components_json) - unset(build_component_paths_json) -endif() - -set(BUILD_COMPONENTS ${BUILD_COMPONENTS} PARENT_SCOPE) - -ldgen_add_dependencies() +endforeach() \ No newline at end of file diff --git a/tools/cmake/idf_functions.cmake b/tools/cmake/idf_functions.cmake index 01035a0b17..bc32ac2173 100644 --- a/tools/cmake/idf_functions.cmake +++ b/tools/cmake/idf_functions.cmake @@ -305,7 +305,116 @@ endfunction() # idf_import_components # # Adds ESP-IDF as a subdirectory to the current project and imports the components -function(idf_import_components var idf_path build_path) +macro(idf_import_components var idf_path build_path) + # + # Set variables that control the build configuration and the build itself + # + idf_set_variables() + + kconfig_set_variables() + + # + # Generate a component dependencies file, enumerating components to be included in the build + # as well as their dependencies. + # + execute_process(COMMAND "${CMAKE_COMMAND}" + -D "COMPONENTS=${IDF_COMPONENTS}" + -D "COMPONENT_REQUIRES_COMMON=${IDF_COMPONENT_REQUIRES_COMMON}" + -D "EXCLUDE_COMPONENTS=${IDF_EXCLUDE_COMPONENTS}" + -D "TEST_COMPONENTS=${IDF_TEST_COMPONENTS}" + -D "TEST_EXCLUDE_COMPONENTS=${IDF_TEST_EXCLUDE_COMPONENTS}" + -D "BUILD_TESTS=${IDF_BUILD_TESTS}" + -D "DEPENDENCIES_FILE=${CMAKE_BINARY_DIR}/component_depends.cmake" + -D "COMPONENT_DIRS=${IDF_COMPONENT_DIRS}" + -D "BOOTLOADER_BUILD=${BOOTLOADER_BUILD}" + -D "IDF_TARGET=${IDF_TARGET}" + -D "IDF_PATH=${IDF_PATH}" + -D "DEBUG=${DEBUG}" + -P "${IDF_PATH}/tools/cmake/scripts/expand_requirements.cmake" + WORKING_DIRECTORY "${PROJECT_PATH}" + RESULT_VARIABLE expand_requirements_result) + + if(expand_requirements_result) + message(FATAL_ERROR "Failed to expand component requirements") + endif() + + include("${CMAKE_BINARY_DIR}/component_depends.cmake") + + # + # We now have the following component-related variables: + # + # IDF_COMPONENTS is the list of initial components set by the user + # (or empty to include all components in the build). + # BUILD_COMPONENTS is the list of components to include in the build. + # BUILD_COMPONENT_PATHS is the paths to all of these components, obtained from the component dependencies file. + # + # Print the list of found components and test components + # + string(REPLACE ";" " " BUILD_COMPONENTS_SPACES "${BUILD_COMPONENTS}") + message(STATUS "Component names: ${BUILD_COMPONENTS_SPACES}") + unset(BUILD_COMPONENTS_SPACES) + message(STATUS "Component paths: ${BUILD_COMPONENT_PATHS}") + + # Print list of test components + if(TESTS_ALL EQUAL 1 OR TEST_COMPONENTS) + string(REPLACE ";" " " BUILD_TEST_COMPONENTS_SPACES "${BUILD_TEST_COMPONENTS}") + message(STATUS "Test component names: ${BUILD_TEST_COMPONENTS_SPACES}") + unset(BUILD_TEST_COMPONENTS_SPACES) + message(STATUS "Test component paths: ${BUILD_TEST_COMPONENT_PATHS}") + endif() + + # Generate project configuration + kconfig_process_config() + + # Include sdkconfig.cmake so rest of the build knows the configuration + include(${SDKCONFIG_CMAKE}) + + # Verify the environment is configured correctly + idf_verify_environment() + + # Check git revision (may trigger reruns of cmake) + ## sets IDF_VER to IDF git revision + idf_get_git_revision() + + # Check that the targets set in cache, sdkconfig, and in environment all match + idf_check_config_target() + + ## get PROJECT_VER + if(NOT BOOTLOADER_BUILD) + app_get_revision("${CMAKE_SOURCE_DIR}") + endif() + + # Add some idf-wide definitions + idf_set_global_compile_options() + + # generate compile_commands.json (needs to come after project) + set(CMAKE_EXPORT_COMPILE_COMMANDS 1) + + # + # Setup variables for linker script generation + # + ldgen_set_variables() + + # Include any top-level project_include.cmake files from components + foreach(component ${BUILD_COMPONENT_PATHS}) + set(COMPONENT_PATH "${component}") + include_if_exists("${component}/project_include.cmake") + unset(COMPONENT_PATH) + endforeach() + add_subdirectory(${idf_path} ${build_path}) - set(${var} ${BUILD_COMPONENTS} PARENT_SCOPE) -endfunction() + + if(IDF_BUILD_ARTIFACTS) + # Write project description JSON file + make_json_list("${BUILD_COMPONENTS}" build_components_json) + make_json_list("${BUILD_COMPONENT_PATHS}" build_component_paths_json) + configure_file("${IDF_PATH}/tools/cmake/project_description.json.in" + "${IDF_BUILD_ARTIFACTS_DIR}/project_description.json") + unset(build_components_json) + unset(build_component_paths_json) + endif() + + ldgen_add_dependencies() + + set(${var} ${BUILD_COMPONENTS}) +endmacro()