I am learning about creating and using CONFIG
I am creating a simple SDK which has one shared library and one static library
[SSL - Simple Single Library]
User of the SDK can choose to link with either one via their namespaced target SSL::SSL or SSL::SSL_static
cmake_minimum_required(VERSION 3.25)
project(sdk)
set(CMAKE_DEBUG_POSTFIX "d")
set(SDK_SOURCES
src/SSL.cpp)
set(SDK_PUBLIC_HEADERS
include/SSL.h)
set(SDK_HEADERS
${SDK_PUBLIC_HEADERS}
include/types.h)
include_directories(include)
if (WIN32)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
endif()
add_library(SSL_static STATIC
${SDK_SOURCES}
${SDK_HEADERS}
)
add_library(SSL SHARED
${SDK_SOURCES}
${SDK_HEADERS}
)
if (WIN32)
set_target_properties(SSL_static
PROPERTIES
OUTPUT_NAME libSSL)
else()
set_target_properties(SSL
PROPERTIES
PREFIX "")
set_target_properties(SSL_static
PROPERTIES
OUTPUT_NAME SSL)
endif()
message("value = ${CMAKE_PROJECT_NAME}_VERSION")
message("value = ${sdk_VERSION}")
# Config
set(CONFIG_NAME ${CMAKE_PROJECT_NAME})
set(CONFIG_NAME SSL)
set(CONFIG_CONFIG_NAME ${CONFIG_NAME}Config)
set(CONFIG_CONFIG_FILENAME ${CONFIG_CONFIG_NAME}.cmake)
set(CONFIG_CONFIG_IN_FILENAME ${CONFIG_CONFIG_NAME}.cmake.in)
set(CONFIG_TARGETS_NAME ${CONFIG_NAME}Targets)
set(CONFIG_TARGETS_FILENAME ${CONFIG_TARGETS_NAME}.cmake)
set(CONFIG_VERSION_NAME ${CONFIG_NAME}ConfigVersion)
set(CONFIG_VERSION_FILENAME ${CONFIG_VERSION_NAME}.cmake)
set(CONFIG_VERSION_VALUE ${CONFIG_NAME}_VERSION)
set(CONFIG_VERSION_VALUE 0.0.1) # Hard coding for this test
set(CONFIG_DESTINATION shared/cmake/${CONFIG_NAME})
set(CONFIG_NAMESPACE ${CONFIG_NAME}::)
install(TARGETS SSL SSL_static
EXPORT ${CONFIG_TARGETS_NAME}
FILE_SET HEADERS
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin
INCLUDES DESTINATION include)
message("CONFIG_TARGETS_FILENAME = ${CONFIG_TARGETS_FILENAME}")
message("CONFIG_VERSION_VALUE = ${CONFIG_VERSION_VALUE}")
install(EXPORT ${CONFIG_TARGETS_NAME}
FILE ${CONFIG_TARGETS_FILENAME}
NAMESPACE ${CONFIG_NAMESPACE}
DESTINATION ${CONFIG_DESTINATION})
include(CMakePackageConfigHelpers)
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_CONFIG_IN_FILENAME} "@PACKAGE_INIT@\n\n")
file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_CONFIG_IN_FILENAME} "check_required_components(${CONFIG_NAME})\n\n")
file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_CONFIG_IN_FILENAME} "include(\$\{CMAKE_CURRENT_LIST_DIR\}/${CONFIG_TARGETS_FILENAME})\n\n")
configure_package_config_file(${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_CONFIG_IN_FILENAME}
${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_CONFIG_FILENAME}
INSTALL_DESTINATION ${CONFIG_DESTINATION}
)
write_basic_package_version_file(
${CONFIG_VERSION_FILENAME}
VERSION ${CONFIG_VERSION_VALUE}
COMPATIBILITY AnyNewerVersion)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_CONFIG_FILENAME}"
"${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_VERSION_FILENAME}"
DESTINATION ${CONFIG_DESTINATION})
install(FILES
${SDK_PUBLIC_HEADERS}
DESTINATION
include)
#
#
I am also writing a simple console app to verify that I am able to create an installable package (*.msi, *.rpm) and hence will require including the SSL shared library
However, I can’t seems to be able to determine the location of the imported target’s shared library.
Is it something that needs to be setup in my sdk build (above) or something I need to query in the building of the app (below) ?
cmake_minimum_required(VERSION 3.25)
project(app)
find_package(SSL REQUIRED)
# https://dev.my-gate.net/2021/08/04/understanding-rpath-with-cmake/
# use, i.e. don't skip the full RPATH for the build tree
set(CMAKE_SKIP_BUILD_RPATH FALSE)
# when building, don't use the install RPATH already
# (but later on when installing)
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
# add the automatically determined parts of the RPATH
# which point to directories outside the build tree to the install RPATH
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
add_executable(app_static
main.cpp
)
target_link_libraries(app_static
SSL::SSL_static
)
add_executable(app_shared
main.cpp
)
target_link_libraries(app_shared
PRIVATE
SSL::SSL
)
# INTERFACE_LINK_DIRECTORIES
# LINK_DIRECTORIES
get_target_property(_ild SSL::SSL INTERFACE_LINK_DIRECTORIES)
get_target_property(_ld SSL::SSL LINK_DIRECTORIES)
get_target_property(_il SSL::SSL IMPORTED_LOCATION_<CONFIG>)
message("_ild = ${_ild}")
message("_ld = ${_ld}")
message("_il = ${_il}")
install(TARGETS
app_static
app_shared
DESTINATION
bin)
set(MY_DEPENDENCY_PATHS /tmp/SSL/sdk/lib)
install(CODE [[
file(GET_RUNTIME_DEPENDENCIES
EXECUTABLES $<TARGET_FILE:app_shared>
RESOLVED_DEPENDENCIES_VAR _r_deps
UNRESOLVED_DEPENDENCIES_VAR _u_deps
DIRECTORIES ${MY_DEPENDENCY_PATHS}
)
if (WIN32)
set(_regex "^/(lib|usr)")
elseif (APPLE)
set(_regex "^/(lib|usr)")
else ()
set(_regex "^/(lib|usr)")
endif ()
foreach(_file ${_r_deps})
#message("_file = ${_file}")
string(REGEX MATCH ${_regex} systems_libs "${_file}")
message("_file = ${_file}")
#message("systems_libs = ${systems_libs}")
if (systems_libs STREQUAL "")
#message("INSTALLING ${_file}")
file(INSTALL
DESTINATION "${CMAKE_INSTALL_PREFIX}/lib"
TYPE SHARED_LIBRARY
FOLLOW_SYMLINK_CHAIN
FILES "${_file}"
)
endif()
endforeach()
list(LENGTH _u_deps _u_length)
if("${_u_length}" GREATER 0)
message(WARNING "Unresolved dependencies detected!")
# message(WARNING "_u_deps : ${_u_deps}")
endif()
]])
include(CPack)