examples: import_lib: demonstrate ExternalProject_Add

Many of the more complicated CMake projects can't be added to the IDF
build system simply by calling add_subdirectory.
"add_subdirectory" also cannot be used with projects which use build
systems other than CMake (for example GNU Make or cargo).
This commit changes the example to use ExternalProject_Add, instead,
which is a more general way of adding subprojects.
As part of this change, tinyxml2 is now downloaded from the Internet,
which allows removing one submodule.
This commit is contained in:
Ivan Grokhotkov
2022-06-29 20:14:37 +02:00
parent 258585f50a
commit b2e129fe4f
4 changed files with 76 additions and 26 deletions

View File

@@ -0,0 +1,67 @@
# This component demonstrates how to add an existing third-party library as a component
# to ESP-IDF build system.
#
# Since we are wrapping the library inside a component,
# the component has to be registered first:
idf_component_register()
# To build a third-party library, ExternalProject CMake module can be used.
# ExternalProject offers many features which are impossible to demonstrate
# in a single example. Please refer to its documentation for more info:
# https://cmake.org/cmake/help/latest/module/ExternalProject.html
include(ExternalProject)
# Define the location where tinyxml2 will be installed:
set(TINYXML2_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/tinyxml2_install)
# This function downloads the project, calls CMake to configure it,
# builds the project and installs it to the specified location:
externalproject_add(tinyxml2_proj
# Download the source code of the third party project from the following URL.
# (Two URLs are provided, the 2nd one is the mirror for Chinese users)
URL https://github.com/leethomason/tinyxml2/archive/refs/tags/9.0.0.zip
https://gitcode.net/mirrors/leethomason/tinyxml2/-/archive/9.0.0/tinyxml2-9.0.0.zip
# (Downloading is not the only option; the library can also be located in your source tree.
# Consult ExternalProject_Add function documentation for other options.)
# Specify arguments to be passed when running CMake for this subproject.
# Note that ExternalProject_Add also works with non-CMake projects, so this
# is just an example.
CMAKE_ARGS
# Use the same CMake toolchain file as for the main project.
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
# tinyxml2-specific settings: disable building everything except for the static library
-Dtinyxml2_BUILD_TESTING=FALSE
-Dtinyxml2_SHARED_LIBS=FALSE
# Pass the install directory to the subproject.
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
# These options are set so that Ninja immediately outputs
# the subproject build to the terminal. Otherwise it looks like the
# build process "hangs" while the subproject is being built.
USES_TERMINAL_DOWNLOAD TRUE
USES_TERMINAL_CONFIGURE TRUE
USES_TERMINAL_BUILD TRUE
# Specify the installation directory for the subproject
INSTALL_DIR ${TINYXML2_INSTALL_DIR}
# Let CMake know that the library is generated by the subproject build step.
BUILD_BYPRODUCTS "${TINYXML2_INSTALL_DIR}/lib/libtinyxml2.a"
)
# Now that the subproject build is set up, we need to consume the results
# of the build: the header file and the static library.
# To do this, define an imported CMake library:
add_prebuilt_library(tinyxml2_lib "${TINYXML2_INSTALL_DIR}/lib/libtinyxml2.a"
# tinyxml calls certain C++ support library functions (_Unwind_Resume and similar)
# so a dependency on IDF's cxx component is added here:
PRIV_REQUIRES cxx)
target_include_directories(tinyxml2_lib INTERFACE "${TINYXML2_INSTALL_DIR}/include")
add_dependencies(tinyxml2_lib tinyxml2_proj)
# Link the imported library to the current component.
target_link_libraries(${COMPONENT_LIB} INTERFACE tinyxml2_lib)
# To use tinyxml2 in another component, add 'tinyxml2' (the name of this component)
# to PRIV_REQUIRES or REQUIRES list its idf_component_register call.
# See ../../main/CMakeLists.txt for an example.