You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
2.7 KiB
73 lines
2.7 KiB
# SPDX-License-Identifier: Apache-2.0 |
|
|
|
cmake_minimum_required(VERSION 3.20.0) |
|
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) |
|
project(external_lib) |
|
|
|
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) |
|
|
|
if(DEFINED CMAKE_C_COMPILER_TARGET) |
|
set(target_flag "--target=${CMAKE_C_COMPILER_TARGET}") |
|
endif() |
|
|
|
set(external_project_cflags |
|
"${target_flag} ${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) |
|
|
|
if(CMAKE_GENERATOR STREQUAL "Unix Makefiles") |
|
# https://www.gnu.org/software/make/manual/html_node/MAKE-Variable.html |
|
set(submake "$(MAKE)") |
|
else() # Obviously no MAKEFLAGS. Let's hope a "make" can be found somewhere. |
|
set(submake "make") |
|
endif() |
|
|
|
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 |
|
${submake} |
|
PREFIX=${mylib_build_dir} |
|
CC=${CMAKE_C_COMPILER} |
|
AR=${CMAKE_AR} |
|
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)
|
|
|