find_package CONFIG - cross platform shared library location set/query ?

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)

Hello, did you try to use the GNUInstallDirs() CMake module? It has good defaults for most POSIX systems.