How to build and link a shared library from another project using ExternalProject_Add
I had some headache using ExternalProject_Add
to build and link a shared library from another project. Which is a useful feature when you build an Android project.
I googled a lot... and discovered I have to hack the include directory and the shared library.
Surprisingly, I also have to create a fake shared library .so file !!! ???
It looks like it only works if we download a binary. But why the hell, it can build something ???
Either the documentation is missing, either it is a voodoo hack feature.
See also #15052
################################################################################
set(PROJECT_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/local")
ExternalProject_Add(ext_project_build
DEPENDS ...
SOURCE_DIR ...
CMAKE_ARGS ...
-DCMAKE_INSTALL_PREFIX=${PROJECT_PREFIX}
BUILD_COMMAND ninja -v
)
# https://cmake.org/cmake/help/latest/module/ExternalProject.html#obtaining-project-properties
# ExternalProject_Get_Property(ext_project_build INSTALL_DIR)
#
# see also ${EXT_PROJECT_PREFIX}/${CMAKE_INSTALL_LIBDIR}/cmake/proj-targets.cmake
add_library(ext_project_lib SHARED IMPORTED)
# useful ???
add_dependencies(ext_project_lib ext_project_build)
# cf. https://gitlab.kitware.com/cmake/cmake/-/issues/15052
set(EXT_PROJECT_INCLUDE_DIRECTORY "${PROJECT_PREFIX}/include")
set(EXT_PROJECT_LIB_PATH "${EXT_PROJECT_PREFIX}/${CMAKE_INSTALL_LIBDIR}/libfoo.so")
file(MAKE_DIRECTORY ${EXT_PROJECT_INCLUDE_DIRECTORY}) # else INTERFACE_INCLUDE_DIRECTORIES will complain...
file(WRITE ${EXT_PROJECT_LIB_PATH} "") # else target_link_libraries will complain...
set_target_properties(proj_lib PROPERTIES
IMPORTED_LOCATION ${EXT_PROJECT_LIB_PATH}
INTERFACE_INCLUDE_DIRECTORIES ${EXT_PROJECT_INCLUDE_DIRECTORY}
)
target_link_libraries(ext_project_lib INTERFACE ...)
################################################################################
add_executable(test test.c)
target_link_libraries(test ext_project_lib)
################################################################################