CMake has several prototypes/signatures for the function 'target_link_libraries'. This commit migrates the usage of 'target_link_libraries' on Zephyr CMake libraries from the old 'plain' signature to the new '<PRIVATE|PUBLIC|INTERFACE>' signature. For technical reasons the two signatures can not be mixed. Each library must exclusively use either the old or new signature. The 'old' plain signature is equivalent to using the PUBLIC signature. Migrating to use 'PUBLIC' is therefore expected to be a safe change. After the migration it will be possible to use the PRIVATE and INTERFACE signatures on Zephyr CMake libraries. This is useful for instance to fix issue 8438. Signed-off-by: Sebastian Bøe <sebastian.boe@nordicsemi.no>
59 lines
2.2 KiB
CMake
59 lines
2.2 KiB
CMake
include($ENV{ZEPHYR_BASE}/cmake/app/boilerplate.cmake NO_POLICY_SCOPE)
|
|
project(NONE)
|
|
|
|
target_sources(app PRIVATE src/main.c)
|
|
|
|
# The external static library that we are linking with does not know
|
|
# how to build for this platform so we export all the flags used in
|
|
# this zephyr build to the external build system.
|
|
#
|
|
# Other external build systems may be self-contained enough that they
|
|
# do not need any build information from zephyr. Or they may be
|
|
# incompatible with certain zephyr options and need them to be
|
|
# filtered out.
|
|
zephyr_get_include_directories_for_lang_as_string( C includes)
|
|
zephyr_get_system_include_directories_for_lang_as_string(C system_includes)
|
|
zephyr_get_compile_definitions_for_lang_as_string( C definitions)
|
|
zephyr_get_compile_options_for_lang_as_string( C options)
|
|
|
|
set(external_project_cflags
|
|
"${includes} ${definitions} ${options} ${system_includes}"
|
|
)
|
|
|
|
include(ExternalProject)
|
|
|
|
# Add an external project to be able download and build the third
|
|
# party library. In this case downloading is not necessary as it has
|
|
# been committed to the repository.
|
|
set(mylib_src_dir ${CMAKE_CURRENT_SOURCE_DIR}/mylib)
|
|
set(mylib_build_dir ${CMAKE_CURRENT_BINARY_DIR}/mylib)
|
|
|
|
set(MYLIB_LIB_DIR ${mylib_build_dir}/lib)
|
|
set(MYLIB_INCLUDE_DIR ${mylib_src_dir}/include)
|
|
|
|
ExternalProject_Add(
|
|
mylib_project # Name for custom target
|
|
PREFIX ${mylib_build_dir} # Root dir for entire project
|
|
SOURCE_DIR ${mylib_src_dir}
|
|
BINARY_DIR ${mylib_src_dir} # This particular build system is invoked from the root
|
|
CONFIGURE_COMMAND "" # Skip configuring the project, e.g. with autoconf
|
|
BUILD_COMMAND
|
|
make
|
|
PREFIX=${mylib_build_dir}
|
|
CC=${CMAKE_C_COMPILER}
|
|
CFLAGS=${external_project_cflags}
|
|
INSTALL_COMMAND "" # This particular build system has no install command
|
|
BUILD_BYPRODUCTS ${MYLIB_LIB_DIR}/libmylib.a
|
|
)
|
|
|
|
# Create a wrapper CMake library that our app can link with
|
|
add_library(mylib_lib STATIC IMPORTED GLOBAL)
|
|
add_dependencies(
|
|
mylib_lib
|
|
mylib_project
|
|
)
|
|
set_target_properties(mylib_lib PROPERTIES IMPORTED_LOCATION ${MYLIB_LIB_DIR}/libmylib.a)
|
|
set_target_properties(mylib_lib PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${MYLIB_INCLUDE_DIR})
|
|
|
|
target_link_libraries(app PUBLIC mylib_lib)
|