mirror of
https://github.com/espressif/esp-idf
synced 2025-03-12 10:39:11 -04:00
Merge branch 'bugfix/miscellaneous_cmake_fixes' into 'release/v4.0'
CMake bugfixes See merge request espressif/esp-idf!6654
This commit is contained in:
commit
99fb9a3f7c
@ -1,9 +1,17 @@
|
||||
idf_component_register(SRCS "cxx_exception_stubs.cpp"
|
||||
"cxx_guards.cpp")
|
||||
"cxx_guards.cpp"
|
||||
# Make sure that pthread is in component list
|
||||
PRIV_REQUIRES pthread)
|
||||
|
||||
target_link_libraries(${COMPONENT_LIB} PUBLIC stdc++ gcc)
|
||||
target_link_libraries(${COMPONENT_LIB} INTERFACE "-u __cxa_guard_dummy")
|
||||
|
||||
# Force pthread to also appear later than stdc++ in link line
|
||||
add_library(stdcpp_pthread INTERFACE)
|
||||
idf_component_get_property(pthread pthread COMPONENT_LIB)
|
||||
target_link_libraries(stdcpp_pthread INTERFACE stdc++ $<TARGET_FILE:${pthread}>)
|
||||
target_link_libraries(${COMPONENT_LIB} PUBLIC stdcpp_pthread)
|
||||
|
||||
if(NOT CONFIG_COMPILER_CXX_EXCEPTIONS)
|
||||
target_link_libraries(${COMPONENT_LIB} INTERFACE "-u __cxx_fatal_exception")
|
||||
endif()
|
||||
|
18
components/esptool_py/get_port_args.cmake
Normal file
18
components/esptool_py/get_port_args.cmake
Normal file
@ -0,0 +1,18 @@
|
||||
# Note: we can't expand these environment variables in the main IDF CMake build,
|
||||
# because we want to expand them at flashing time not at CMake runtime (so they can change
|
||||
# without needing a CMake re-run)
|
||||
set(ESPPORT $ENV{ESPPORT})
|
||||
if(NOT ESPPORT)
|
||||
message("Note: ${TOOL} will search for a serial port. To specify a port, set the ESPPORT environment variable.")
|
||||
else()
|
||||
set(port_arg "-p ${ESPPORT}")
|
||||
endif()
|
||||
|
||||
set(ESPBAUD $ENV{ESPBAUD})
|
||||
if(NOT ESPBAUD)
|
||||
message("Note: ${TOOL} will attempt to set baud rate automatically. "
|
||||
"To specify a baud rate, set the ESPBAUD environment variable.")
|
||||
else()
|
||||
set(baud_arg "-b ${ESPBAUD}")
|
||||
endif()
|
||||
|
@ -138,13 +138,34 @@ function(esptool_py_custom_target target_name flasher_filename dependencies)
|
||||
-D IDF_PATH="${idf_path}"
|
||||
-D ESPTOOLPY="${ESPTOOLPY}"
|
||||
-D ESPTOOL_ARGS="write_flash;@flash_${flasher_filename}_args"
|
||||
-D ESPTOOL_WORKING_DIR="${build_dir}"
|
||||
-D WORKING_DIRECTORY="${build_dir}"
|
||||
-P run_esptool.cmake
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
|
||||
USES_TERMINAL
|
||||
)
|
||||
endfunction()
|
||||
|
||||
add_custom_target(erase_flash
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
-D IDF_PATH="${idf_path}"
|
||||
-D ESPTOOLPY="${ESPTOOLPY}"
|
||||
-D ESPTOOL_ARGS="erase_flash"
|
||||
-P run_esptool.cmake
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
|
||||
USES_TERMINAL
|
||||
)
|
||||
|
||||
add_custom_target(monitor
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
-D IDF_PATH="${idf_path}"
|
||||
-D IDF_MONITOR="${idf_path}/tools/idf_monitor.py"
|
||||
-D ELF_FILE="${elf}"
|
||||
-D WORKING_DIRECTORY="${build_dir}"
|
||||
-P run_idf_monitor.cmake
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
|
||||
USES_TERMINAL
|
||||
)
|
||||
|
||||
esptool_py_custom_target(flash project "app;partition_table;bootloader")
|
||||
esptool_py_custom_target(app-flash app "app")
|
||||
|
||||
|
15
components/esptool_py/run_cmd.cmake
Normal file
15
components/esptool_py/run_cmd.cmake
Normal file
@ -0,0 +1,15 @@
|
||||
if(NOT IDF_PATH)
|
||||
message(FATAL_ERROR "IDF_PATH not set.")
|
||||
endif()
|
||||
include("${IDF_PATH}/tools/cmake/utilities.cmake")
|
||||
spaces2list(CMD)
|
||||
|
||||
execute_process(COMMAND ${CMD}
|
||||
WORKING_DIRECTORY "${WORKING_DIRECTORY}"
|
||||
RESULT_VARIABLE result
|
||||
)
|
||||
|
||||
if(${result})
|
||||
# No way to have CMake silently fail, unfortunately
|
||||
message(FATAL_ERROR "${TOOL} failed")
|
||||
endif()
|
@ -8,39 +8,14 @@
|
||||
#
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
if(NOT IDF_PATH OR NOT ESPTOOLPY OR NOT ESPTOOL_ARGS OR NOT ESPTOOL_WORKING_DIR)
|
||||
message(FATAL_ERROR "IDF_PATH, ESPTOOLPY, ESPTOOL_ARGS, and ESPTOOL_WORKING_DIR must "
|
||||
"be specified on the CMake command line. For direct esptool execution, it is "
|
||||
"strongly recommended to run esptool.py directly.")
|
||||
set(TOOL "esptool.py")
|
||||
|
||||
if(NOT ESPTOOLPY OR NOT ESPTOOL_ARGS)
|
||||
message(FATAL_ERROR "ESPTOOLPY and ESPTOOL_ARGS must "
|
||||
"be specified on the CMake command line. For direct execution, it is "
|
||||
"strongly recommended to run ${TOOL} directly.")
|
||||
endif()
|
||||
|
||||
# Note: we can't expand these environment variables in the main IDF CMake build,
|
||||
# because we want to expand them at flashing time not at CMake runtime (so they can change
|
||||
# without needing a CMake re-run)
|
||||
set(ESPPORT $ENV{ESPPORT})
|
||||
if(NOT ESPPORT)
|
||||
message("Note: esptool.py will search for a serial port. To specify a port, set the ESPPORT environment variable.")
|
||||
else()
|
||||
set(port_arg "-p ${ESPPORT}")
|
||||
endif()
|
||||
|
||||
set(ESPBAUD $ENV{ESPBAUD})
|
||||
if(NOT ESPBAUD)
|
||||
message("Note: Using default baud rate 460800. To modify, set ESPBAUD environment variable.")
|
||||
set(ESPBAUD 460800)
|
||||
endif()
|
||||
|
||||
include("${IDF_PATH}/tools/cmake/utilities.cmake")
|
||||
|
||||
set(cmd "${ESPTOOLPY} ${port_arg} -b ${ESPBAUD} ${ESPTOOL_ARGS}")
|
||||
spaces2list(cmd)
|
||||
|
||||
execute_process(COMMAND ${cmd}
|
||||
WORKING_DIRECTORY "${ESPTOOL_WORKING_DIR}"
|
||||
RESULT_VARIABLE result
|
||||
)
|
||||
|
||||
if(${result})
|
||||
# No way to have CMake silently fail, unfortunately
|
||||
message(FATAL_ERROR "esptool.py failed")
|
||||
endif()
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/get_port_args.cmake")
|
||||
set(CMD "${ESPTOOLPY} ${port_arg} ${baud_arg} ${ESPTOOL_ARGS}")
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/run_cmd.cmake")
|
21
components/esptool_py/run_idf_monitor.cmake
Normal file
21
components/esptool_py/run_idf_monitor.cmake
Normal file
@ -0,0 +1,21 @@
|
||||
# A CMake script to run idf_monitor from within ninja or make
|
||||
# or another cmake-based build runner
|
||||
#
|
||||
# (Needed to expand environment variables, for backwards compatibility.)
|
||||
#
|
||||
# It is recommended to NOT USE this CMake script if you have the option of
|
||||
# running idf_monitor.py directly. This script exists only for use inside CMake builds.
|
||||
#
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
set(TOOL "idf_monitor.py")
|
||||
|
||||
if(NOT IDF_MONITOR OR NOT ELF_FILE)
|
||||
message(FATAL_ERROR "IDF_MONITOR and ELF_FILE must "
|
||||
"be specified on the CMake command line. For direct execution, it is "
|
||||
"strongly recommended to run ${TOOL} directly.")
|
||||
endif()
|
||||
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/get_port_args.cmake")
|
||||
set(CMD "${IDF_MONITOR} ${port_arg} ${baud_arg} ${ELF_FILE}")
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/run_cmd.cmake")
|
@ -15,6 +15,16 @@ function(spiffs_create_partition_image partition base_dir)
|
||||
partition_table_get_partition_info(size "--partition-name ${partition}" "size")
|
||||
partition_table_get_partition_info(offset "--partition-name ${partition}" "offset")
|
||||
|
||||
if(NOT "${size}")
|
||||
message(WARNING "spiffsgen: Unable to resolve size of partition '${partition}'. "
|
||||
"Check config if using correct partition table.")
|
||||
endif()
|
||||
|
||||
if(NOT "${offset}")
|
||||
message(WARNING "spiffsgen: Unable to resolve offset of partition '${partition}'. "
|
||||
"Check config if using correct partition table.")
|
||||
endif()
|
||||
|
||||
set(image_file ${CMAKE_BINARY_DIR}/${partition}.bin)
|
||||
|
||||
if(CONFIG_SPIFFS_USE_MAGIC)
|
||||
@ -42,8 +52,8 @@ function(spiffs_create_partition_image partition base_dir)
|
||||
${image_file})
|
||||
|
||||
if(arg_FLASH_IN_PROJECT)
|
||||
esptool_py_flash_project_args(${partition} ${offset} ${image_file} FLASH_IN_PROJECT)
|
||||
esptool_py_flash_project_args("${partition}" "${offset}" "${image_file}" FLASH_IN_PROJECT)
|
||||
else()
|
||||
esptool_py_flash_project_args(${partition} ${offset} ${image_file})
|
||||
esptool_py_flash_project_args("${partition}" "${offset}" "${image_file}")
|
||||
endif()
|
||||
endfunction()
|
@ -702,12 +702,15 @@ depending on the options selected in the project configuration.
|
||||
|
||||
``CMakeLists.txt``::
|
||||
|
||||
set(COMPONENT_SRCS "foo.c" "more_foo.c")
|
||||
set(srcs "foo.c" "more_foo.c")
|
||||
|
||||
if(CONFIG_FOO_ENABLE_BAR)
|
||||
list(APPEND COMPONENT_SRCS "bar.c")
|
||||
list(APPEND srcs "bar.c")
|
||||
endif()
|
||||
|
||||
idf_component_register(SRCS "${srcs}"
|
||||
...)
|
||||
|
||||
This example makes use of the CMake `if <cmake if_>`_ function and `list APPEND <cmake list_>`_ function.
|
||||
|
||||
This can also be used to select or stub out an implementation, as such:
|
||||
@ -736,16 +739,18 @@ This can also be used to select or stub out an implementation, as such:
|
||||
``CMakeLists.txt``::
|
||||
|
||||
if(CONFIG_ENABLE_LCD_OUTPUT)
|
||||
set(COMPONENT_SRCS lcd-real.c lcd-spi.c)
|
||||
set(srcs lcd-real.c lcd-spi.c)
|
||||
else()
|
||||
set(COMPONENT_SRCS lcd-dummy.c)
|
||||
set(srcs lcd-dummy.c)
|
||||
endif()
|
||||
|
||||
# We need font if either console or plot is enabled
|
||||
if(CONFIG_ENABLE_LCD_CONSOLE OR CONFIG_ENABLE_LCD_PLOT)
|
||||
list(APPEND COMPONENT_SRCS "font.c")
|
||||
list(APPEND srcs "font.c")
|
||||
endif()
|
||||
|
||||
idf_component_register(SRCS "${srcs}"
|
||||
...)
|
||||
|
||||
Conditions which depend on the target
|
||||
-------------------------------------
|
||||
@ -800,13 +805,13 @@ Embedding Binary Data
|
||||
|
||||
Sometimes you have a file with some binary or text data that you'd like to make available to your component - but you don't want to reformat the file as C source.
|
||||
|
||||
You can specify argument ``COMPONENT_EMBED_FILES`` in the component registration, giving space-delimited names of the files to embed::
|
||||
You can specify argument ``EMBED_FILES`` in the component registration, giving space-delimited names of the files to embed::
|
||||
|
||||
idf_component_register(...
|
||||
EMBED_FILES server_root_cert.der)
|
||||
|
||||
|
||||
Or if the file is a string, you can use the variable ``COMPONENT_EMBED_TXTFILES``. This will embed the contents of the text file as a null-terminated string::
|
||||
Or if the file is a string, you can use the variable ``EMBED_TXTFILES``. This will embed the contents of the text file as a null-terminated string::
|
||||
|
||||
idf_component_register(...
|
||||
EMBED_TXTFILES server_root_cert.pem)
|
||||
@ -818,7 +823,7 @@ The file's contents will be added to the .rodata section in flash, and are avail
|
||||
extern const uint8_t server_root_cert_pem_start[] asm("_binary_server_root_cert_pem_start");
|
||||
extern const uint8_t server_root_cert_pem_end[] asm("_binary_server_root_cert_pem_end");
|
||||
|
||||
The names are generated from the full name of the file, as given in ``COMPONENT_EMBED_FILES``. Characters /, ., etc. are replaced with underscores. The _binary prefix in the symbol name is added by objcopy and is the same for both text and binary files.
|
||||
The names are generated from the full name of the file, as given in ``EMBED_FILES``. Characters /, ., etc. are replaced with underscores. The _binary prefix in the symbol name is added by objcopy and is the same for both text and binary files.
|
||||
|
||||
.. highlight:: cmake
|
||||
|
||||
@ -994,7 +999,7 @@ not yet be provided by a component, or use another library for the same function
|
||||
Importing a library might look like this for a hypothetical library ``foo`` to be used in the ``main`` component::
|
||||
|
||||
# Register the component
|
||||
idf_component_register()
|
||||
idf_component_register(...)
|
||||
|
||||
# Set values of hypothetical variables that control the build of `foo`
|
||||
set(FOO_BUILD_STATIC OFF)
|
||||
@ -1003,8 +1008,8 @@ Importing a library might look like this for a hypothetical library ``foo`` to b
|
||||
# Create and import the library targets
|
||||
add_subdirectory(foo)
|
||||
|
||||
# Link `foo` to `main` component
|
||||
target_link_libraries(main foo)
|
||||
# Publicly link `foo` to `main` component
|
||||
target_link_libraries(main PUBLIC foo)
|
||||
|
||||
For an actual example, take a look at :example:`build_system/cmake/import_lib`. Take note that what needs to be done in order to import
|
||||
the library may vary. It is recommended to read up on the library's documentation for instructions on how to
|
||||
@ -1142,7 +1147,8 @@ For example, to get the Python interpreter used for the build:
|
||||
message(STATUS "The Python intepreter is: ${python}")
|
||||
|
||||
- BUILD_DIR - build directory; set from ``idf_build_process`` BUILD_DIR argument
|
||||
- BUILD_COMPONENTS - list of components (more specifically, component aliases) included in the build; set by ``idf_build_process``
|
||||
- BUILD_COMPONENTS - list of components included in the build; set by ``idf_build_process``
|
||||
- BUILD_COMPONENT_ALIASES - list of library alias of components included in the build; set by ``idf_build_process``
|
||||
- C_COMPILE_OPTIONS - compile options applied to all components' C source files
|
||||
- COMPILE_OPTIONS - compile options applied to all components' source files, regardless of it being C or C++
|
||||
- COMPILE_DEFINITIONS - compile definitions applied to all component source files
|
||||
@ -1289,7 +1295,7 @@ For project components (not part of ESP-IDF), there are a few different options:
|
||||
- If keeping your project file in Git, ESP-IDF will automatically track the Git revision and re-run CMake if the revision changes.
|
||||
- If some components are kept in a third git repository (not the project repository or ESP-IDF repository), you can add a call to the ``git_describe`` function in a component CMakeLists file in order to automatically trigger re-runs of CMake when the Git revision changes.
|
||||
- If not using Git, remember to manually run ``idf.py reconfigure`` whenever a source file may change.
|
||||
- To avoid this problem entirely, use ``COMPONENT_SRCS`` to list all source files in project components.
|
||||
- To avoid this problem entirely, use ``SRCS`` argument to ``idf_component_register`` to list all source files in project components.
|
||||
|
||||
The best option will depend on your particular project and its users.
|
||||
|
||||
@ -1361,7 +1367,10 @@ Any combination of "load", "set", and "save" can be sent in a single command and
|
||||
Migrating from ESP-IDF GNU Make System
|
||||
======================================
|
||||
|
||||
Some aspects of the CMake-based ESP-IDF build system are very similar to the older GNU Make-based system. For example, to adapt a ``component.mk`` file to ``CMakeLists.txt`` variables like ``COMPONENT_ADD_INCLUDEDIRS`` and ``COMPONENT_SRCDIRS`` can stay the same and the syntax only needs changing to CMake syntax.
|
||||
Some aspects of the CMake-based ESP-IDF build system are very similar to the older GNU Make-based system. The developer needs to provide values
|
||||
the include directories, source files etc. There is a syntactical difference, however, as the developer needs to pass these as arguments
|
||||
to the registration command, `idf_component_register`.
|
||||
|
||||
|
||||
Automatic Conversion Tool
|
||||
-------------------------
|
||||
@ -1392,27 +1401,28 @@ Some features are significantly different or removed in the CMake-based system.
|
||||
- ``COMPONENT_ADD_LDFLAGS``: Used to override linker flags. Use the CMake `target_link_libraries`_ command instead.
|
||||
- ``COMPONENT_ADD_LINKER_DEPS``: List of files that linking should depend on. `target_link_libraries`_ will usually infer these dependencies automatically. For linker scripts, use the provided custom CMake function ``target_linker_scripts``.
|
||||
- ``COMPONENT_SUBMODULES``: No longer used, the build system will automatically enumerate all submodules in the ESP-IDF repository.
|
||||
- ``COMPONENT_EXTRA_INCLUDES``: Used to be an alternative to ``COMPONENT_PRIV_INCLUDEDIRS`` for absolute paths. Use ``COMPONENT_PRIV_INCLUDEDIRS`` for all cases now (can be relative or absolute).
|
||||
- ``COMPONENT_OBJS``: Previously, component sources could be specified as a list of object files. Now they can be specified as an list of source files via ``COMPONENT_SRCS``.
|
||||
- ``COMPONENT_OBJEXCLUDE``: Has been replaced with ``COMPONENT_SRCEXCLUDE``. Specify source files (as absolute paths or relative to component directory), instead.
|
||||
- ``COMPONENT_EXTRA_INCLUDES``: Used to be an alternative to ``COMPONENT_PRIV_INCLUDEDIRS`` for absolute paths. Use ``PRIV_INCLUDE_DIRS`` argument to ``idf_component_register`` for all cases now (can be relative or absolute).
|
||||
- ``COMPONENT_OBJS``: Previously, component sources could be specified as a list of object files. Now they can be specified as a list of source files via ``SRCS`` argument to `idf_component_register`.
|
||||
- ``COMPONENT_OBJEXCLUDE``: Has been replaced with ``EXCLUDE_SRCS`` argument to ``idf_component_register``. Specify source files (as absolute paths or relative to component directory), instead.
|
||||
- ``COMPONENT_EXTRA_CLEAN``: Set property ``ADDITIONAL_MAKE_CLEAN_FILES`` instead but note :ref:`CMake has some restrictions around this functionality <ADDITIONAL_MAKE_CLEAN_FILES_note>`.
|
||||
- ``COMPONENT_OWNBUILDTARGET`` & ``COMPONENT_OWNCLEANTARGET``: Use CMake `ExternalProject`_ instead. See :ref:`component-build-full-override` for full details.
|
||||
- ``COMPONENT_CONFIG_ONLY``: Call ``register_config_only_component()`` instead. See `Configuration-Only Components`_.
|
||||
- ``COMPONENT_CONFIG_ONLY``: Call ``idf_component_register`` without any arguments instead. See `Configuration-Only Components`_.
|
||||
- ``CFLAGS``, ``CPPFLAGS``, ``CXXFLAGS``: Use equivalent CMake commands instead. See `Controlling Component Compilation`_.
|
||||
|
||||
|
||||
No Default Values
|
||||
-----------------
|
||||
|
||||
The following variables no longer have default values:
|
||||
Unlike in the legacy Make-based build system, the following have no default values:
|
||||
|
||||
- ``COMPONENT_SRCDIRS``
|
||||
- ``COMPONENT_ADD_INCLUDEDIRS``
|
||||
- Source directories (``COMPONENT_SRCDIRS`` variable in Make, ``SRC_DIRS`` argument to ``idf_component_register`` in CMake)
|
||||
- Include directories (``COMPONENT_ADD_INCLUDEDIRS`` variable in Make, ``INCLUDE_DIRS`` argument to ``idf_component_register`` in CMake)
|
||||
|
||||
No Longer Necessary
|
||||
-------------------
|
||||
|
||||
It is no longer necessary to set ``COMPONENT_SRCDIRS`` if setting ``COMPONENT_SRCS`` (in fact, in the CMake-based system ``COMPONENT_SRCS`` is ignored if ``COMPONENT_SRCDIRS`` is set).
|
||||
- In the legacy Make-based build system, it is required to also set ``COMPONENT_SRCDIRS`` if ``COMPONENT_SRCS`` is set. In CMake, the equivalent is not necessary i.e. specifying ``SRC_DIRS`` to ``idf_component_register`` if ``SRCS`` is also specified (in fact, ``SRCS`` is ignored if ``SRC_DIRS`` is specified).
|
||||
|
||||
|
||||
Flashing from make
|
||||
------------------
|
||||
|
@ -28,12 +28,12 @@ To compile ULP code as part of a component, the following steps must be taken:
|
||||
|
||||
1. ULP code, written in assembly, must be added to one or more files with `.S` extension. These files must be placed into a separate directory inside component directory, for instance `ulp/`.
|
||||
|
||||
.. note: This directory should not be added to the ``COMPONENT_SRCDIRS`` environment variable. The logic behind this is that the ESP-IDF build system will compile files found in ``COMPONENT_SRCDIRS`` based on their extensions. For ``.S`` files, ``xtensa-esp32-elf-as`` assembler is used. This is not desirable for ULP assembly files, so the easiest way to achieve the distinction is by placing ULP assembly files into a separate directory. The ULP assembly source files should also **not** be added to ``COMPONENT_SRCS`` for the same reason. See the step below for how to properly add ULP assembly source files.
|
||||
.. note: When registering the component (via ``idf_component_register``), this directory should not be added to the ``SRC_DIRS`` argument. The logic behind this is that the ESP-IDF build system will compile files found in ``SRC_DIRS`` based on their extensions. For ``.S`` files, ``xtensa-esp32-elf-as`` assembler is used. This is not desirable for ULP assembly files, so the easiest way to achieve the distinction is by placing ULP assembly files into a separate directory. The ULP assembly source files should also **not** be added to ``SRCS`` for the same reason. See the step below for how to properly add ULP assembly source files.
|
||||
|
||||
2. Call ``ulp_embed_binary`` from the component CMakeLists.txt after registration. For example::
|
||||
|
||||
...
|
||||
register_component()
|
||||
idf_component_register()
|
||||
|
||||
set(ulp_app_name ulp_${COMPONENT_NAME})
|
||||
set(ulp_s_sources ulp/ulp_assembly_source_file.S)
|
||||
|
@ -29,7 +29,7 @@ There is no need to add a main function with ``UNITY_BEGIN()`` and ``UNITY_EN
|
||||
The ``test`` subdirectory should contain a :ref:`component CMakeLists.txt <component-directories>`, since they are themselves,
|
||||
components. ESP-IDF uses the test framework ``unity`` and should be specified as a requirement for the component. Normally, components
|
||||
:ref:`should list their sources manually <cmake-file-globbing>`; for component tests however, this requirement is relaxed and the
|
||||
use of ``COMPONENT_SRCDIRS`` is advised.
|
||||
use of ``SRC_DIRS`` argument to ``idf_component_register`` is advised.
|
||||
|
||||
Overall, the minimal ``test`` subdirectory CMakeLists.txt file may look like as follows:
|
||||
|
||||
|
@ -2,5 +2,4 @@ add_library(stub_esp32 STATIC system_api.c flash_ops.c cpu_start.c)
|
||||
target_include_directories(stub_esp32 PUBLIC .)
|
||||
add_library(stub::esp32 ALIAS stub_esp32)
|
||||
|
||||
target_link_libraries(stub_esp32 "-u app_main")
|
||||
target_link_libraries(stub_esp32 stub::spi_flash)
|
@ -554,6 +554,14 @@ endmenu\n" >> ${IDF_PATH}/Kconfig;
|
||||
mv CMakeLists.txt.bak CMakeLists.txt
|
||||
rm -rf CMakeLists.txt.bak
|
||||
|
||||
print_status "Supports git worktree"
|
||||
clean_build_dir
|
||||
git branch test_build_system
|
||||
git worktree add ../esp-idf-template-test test_build_system
|
||||
diff <(idf.py reconfigure | grep "Project version") <(cd ../esp-idf-template-test && idf.py reconfigure | grep "Project version") \
|
||||
|| failure "Version on worktree should have been properly resolved"
|
||||
git worktree remove ../esp-idf-template-test
|
||||
|
||||
print_status "All tests completed"
|
||||
if [ -n "${FAILURES}" ]; then
|
||||
echo "Some failures were detected:"
|
||||
|
@ -128,7 +128,7 @@ endfunction()
|
||||
#
|
||||
function(__build_init idf_path)
|
||||
# Create the build target, to which the ESP-IDF build properties, dependencies are attached to
|
||||
add_custom_target(__idf_build_target)
|
||||
add_library(__idf_build_target STATIC IMPORTED)
|
||||
|
||||
set_default(python "python")
|
||||
|
||||
@ -180,7 +180,8 @@ endfunction()
|
||||
#
|
||||
function(__build_resolve_and_add_req var component_target req type)
|
||||
__component_get_target(_component_target ${req})
|
||||
if(NOT _component_target)
|
||||
__component_get_property(_component_registered ${component_target} __COMPONENT_REGISTERED)
|
||||
if(NOT _component_target OR NOT _component_registered)
|
||||
message(FATAL_ERROR "Failed to resolve component '${req}'.")
|
||||
endif()
|
||||
__component_set_property(${component_target} ${type} ${_component_target} APPEND)
|
||||
@ -219,6 +220,24 @@ function(__build_expand_requirements component_target)
|
||||
idf_build_get_property(build_component_targets __BUILD_COMPONENT_TARGETS)
|
||||
if(NOT component_target IN_LIST build_component_targets)
|
||||
idf_build_set_property(__BUILD_COMPONENT_TARGETS ${component_target} APPEND)
|
||||
|
||||
__component_get_property(component_lib ${component_target} COMPONENT_LIB)
|
||||
idf_build_set_property(__BUILD_COMPONENTS ${component_lib} APPEND)
|
||||
|
||||
idf_build_get_property(prefix __PREFIX)
|
||||
__component_get_property(component_prefix ${component_target} __PREFIX)
|
||||
|
||||
__component_get_property(component_alias ${component_target} COMPONENT_ALIAS)
|
||||
|
||||
idf_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)
|
||||
__component_get_property(component_name ${component_target} COMPONENT_NAME)
|
||||
idf_build_set_property(BUILD_COMPONENTS ${component_name} APPEND)
|
||||
else()
|
||||
idf_build_set_property(BUILD_COMPONENTS ${component_alias} APPEND)
|
||||
endif()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
|
@ -56,13 +56,8 @@ function(__component_get_target var name_or_alias)
|
||||
foreach(component_target ${component_targets})
|
||||
__component_get_property(_component_name ${component_target} COMPONENT_NAME)
|
||||
if(name_or_alias STREQUAL _component_name)
|
||||
# There should only be one component of the same name
|
||||
if(NOT target)
|
||||
set(target ${component_target})
|
||||
else()
|
||||
message(FATAL_ERROR "Multiple components with name '${name_or_alias}' found.")
|
||||
return()
|
||||
endif()
|
||||
break()
|
||||
endif()
|
||||
endforeach()
|
||||
set(${var} ${target} PARENT_SCOPE)
|
||||
@ -173,7 +168,7 @@ function(__component_add component_dir prefix)
|
||||
# 'override' components added earlier.
|
||||
if(NOT component_target IN_LIST component_targets)
|
||||
if(NOT TARGET ${component_target})
|
||||
add_custom_target(${component_target} EXCLUDE_FROM_ALL)
|
||||
add_library(${component_target} STATIC IMPORTED)
|
||||
endif()
|
||||
idf_build_set_property(__COMPONENT_TARGETS ${component_target} APPEND)
|
||||
endif()
|
||||
@ -191,6 +186,7 @@ function(__component_add component_dir prefix)
|
||||
__component_set_property(${component_target} COMPONENT_NAME ${component_name})
|
||||
__component_set_property(${component_target} COMPONENT_DIR ${component_dir})
|
||||
__component_set_property(${component_target} COMPONENT_ALIAS ${component_alias})
|
||||
|
||||
__component_set_property(${component_target} __PREFIX ${prefix})
|
||||
|
||||
# Set Kconfig related properties on the component
|
||||
@ -482,10 +478,6 @@ function(idf_component_register)
|
||||
# Set dependencies
|
||||
__component_set_all_dependencies()
|
||||
|
||||
# Add the component to built components
|
||||
idf_build_set_property(__BUILD_COMPONENTS ${component_lib} APPEND)
|
||||
idf_build_set_property(BUILD_COMPONENTS ${component_alias} APPEND)
|
||||
|
||||
# Make the COMPONENT_LIB variable available in the component CMakeLists.txt
|
||||
set(COMPONENT_LIB ${component_lib} PARENT_SCOPE)
|
||||
# COMPONENT_TARGET is deprecated but is made available with same function
|
||||
|
@ -317,10 +317,6 @@ macro(project project_name)
|
||||
|
||||
if(SDKCONFIG)
|
||||
get_filename_component(sdkconfig "${SDKCONFIG}" ABSOLUTE)
|
||||
if(NOT EXISTS "${sdkconfig}")
|
||||
message(FATAL_ERROR "SDKCONFIG '${sdkconfig}' does not exist.")
|
||||
endif()
|
||||
set(sdkconfig ${SDKCONFIG})
|
||||
else()
|
||||
set(sdkconfig "${CMAKE_CURRENT_LIST_DIR}/sdkconfig")
|
||||
endif()
|
||||
@ -353,13 +349,16 @@ macro(project project_name)
|
||||
# so that it treats components equally.
|
||||
#
|
||||
# This behavior should only be when user did not set REQUIRES/PRIV_REQUIRES manually.
|
||||
idf_build_get_property(build_components BUILD_COMPONENTS)
|
||||
idf_build_get_property(build_components BUILD_COMPONENT_ALIASES)
|
||||
if(idf::main IN_LIST build_components)
|
||||
__component_get_target(main_target idf::main)
|
||||
__component_get_property(reqs ${main_target} REQUIRES)
|
||||
__component_get_property(priv_reqs ${main_target} PRIV_REQUIRES)
|
||||
idf_build_get_property(common_reqs __COMPONENT_REQUIRES_COMMON)
|
||||
if(reqs STREQUAL common_reqs AND NOT priv_reqs) #if user has not set any requirements
|
||||
if(test_components)
|
||||
list(REMOVE_ITEM build_components ${test_components})
|
||||
endif()
|
||||
list(REMOVE_ITEM build_components idf::main)
|
||||
__component_get_property(lib ${main_target} COMPONENT_LIB)
|
||||
set_property(TARGET ${lib} APPEND PROPERTY INTERFACE_LINK_LIBRARIES "${build_components}")
|
||||
@ -392,7 +391,7 @@ macro(project project_name)
|
||||
target_link_libraries(${project_elf} "-Wl,--no-whole-archive")
|
||||
endif()
|
||||
|
||||
idf_build_get_property(build_components BUILD_COMPONENTS)
|
||||
idf_build_get_property(build_components BUILD_COMPONENT_ALIASES)
|
||||
if(test_components)
|
||||
list(REMOVE_ITEM build_components ${test_components})
|
||||
endif()
|
||||
|
@ -43,26 +43,25 @@ set(__get_git_revision_description YES)
|
||||
get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH)
|
||||
|
||||
function(get_git_head_revision _refspecvar _hashvar _repo_dir)
|
||||
set(GIT_PARENT_DIR "${_repo_dir}")
|
||||
set(GIT_DIR "${GIT_PARENT_DIR}/.git")
|
||||
while(NOT EXISTS "${GIT_DIR}") # .git dir not found, search parent directories
|
||||
set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}")
|
||||
get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH)
|
||||
if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT)
|
||||
# We have reached the root directory, we are not in git
|
||||
set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE)
|
||||
set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE)
|
||||
execute_process(COMMAND
|
||||
"${GIT_EXECUTABLE}"
|
||||
rev-parse
|
||||
--git-dir
|
||||
WORKING_DIRECTORY
|
||||
${_repo_dir}
|
||||
RESULT_VARIABLE
|
||||
res
|
||||
OUTPUT_VARIABLE
|
||||
GIT_DIR
|
||||
ERROR_QUIET
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
|
||||
if(NOT res EQUAL 0)
|
||||
return()
|
||||
endif()
|
||||
set(GIT_DIR "${GIT_PARENT_DIR}/.git")
|
||||
endwhile()
|
||||
# check if this is a submodule
|
||||
if(NOT IS_DIRECTORY ${GIT_DIR})
|
||||
file(READ ${GIT_DIR} submodule)
|
||||
string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule})
|
||||
get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH)
|
||||
get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE)
|
||||
endif()
|
||||
|
||||
get_filename_component(GIT_DIR "${GIT_DIR}" ABSOLUTE BASE_DIR "${_repo_dir}")
|
||||
|
||||
set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data")
|
||||
if(NOT EXISTS "${GIT_DATA}")
|
||||
file(MAKE_DIRECTORY "${GIT_DATA}")
|
||||
@ -71,6 +70,7 @@ function(get_git_head_revision _refspecvar _hashvar _repo_dir)
|
||||
if(NOT EXISTS "${GIT_DIR}/HEAD")
|
||||
return()
|
||||
endif()
|
||||
|
||||
set(HEAD_FILE "${GIT_DATA}/HEAD")
|
||||
configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY)
|
||||
|
||||
@ -95,6 +95,7 @@ function(git_describe _var _repo_dir)
|
||||
if(NOT hash)
|
||||
set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE)
|
||||
return()
|
||||
|
||||
endif()
|
||||
|
||||
# TODO sanitize
|
||||
|
Loading…
x
Reference in New Issue
Block a user