diff --git a/cmake/modules/3rdParty.cmake b/cmake/modules/3rdParty.cmake index 053016e..9fbcfe7 100644 --- a/cmake/modules/3rdParty.cmake +++ b/cmake/modules/3rdParty.cmake @@ -47,12 +47,24 @@ if(NOT DEFINED THIRD_PARTY_MODULE_LOADED) set(USE_${NAME} ON) set(USE_STATIC_${NAME} ON) list(APPEND LIBRARIES ${${NAME}_STATIC_LIB}) + message(STATUS "Linking ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX} statically against external library ${NAME} (${${NAME}_STATIC_LIB}).") + if(${NAME}_STATIC_INCLUDE_DIR) + list(APPEND ADDITIONAL_STATIC_INCLUDE_DIRS ${${NAME}_STATIC_INCLUDE_DIR}) + message(STATUS "Adding include path for ${NAME} to ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}: ${${NAME}_STATIC_INCLUDE_DIR}") + endif() + if(${${NAME}_STATIC_LIB} IN_LIST META_PUBLIC_STATIC_LIB_DEPENDS) list(APPEND ${PUBLIC_LIBRARIES_VARNAME} ${${NAME}_STATIC_LIB}) + if(${NAME}_STATIC_INCLUDE_DIR) + list(APPEND PRIVATE_STATIC_INCLUDE_DIRS ${${NAME}_STATIC_INCLUDE_DIR}) + endif() else() list(APPEND ${PRIVATE_LIBRARIES_VARNAME} ${${NAME}_STATIC_LIB}) + if(${NAME}_STATIC_INCLUDE_DIR) + list(APPEND PRIVATE_STATIC_INCLUDE_DIRS ${${NAME}_STATIC_INCLUDE_DIR}) + endif() endif() - message(STATUS "Linking ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX} statically against external library ${NAME} (${${NAME}_STATIC_LIB}).") + elseif((${NAME}_DYNAMIC_LIB OR ${NAME}_SHARED_LIB) AND (("${LINKAGE}" STREQUAL "AUTO_LINKAGE") OR ("${LINKAGE}" STREQUAL "SHARED"))) set(USE_${NAME} ON) set(USE_SHARED_${NAME} ON) @@ -60,12 +72,23 @@ if(NOT DEFINED THIRD_PARTY_MODULE_LOADED) set(${NAME}_DYNAMIC_LIB ${${NAME}_SHARED_LIB}) endif() list(APPEND LIBRARIES ${${NAME}_DYNAMIC_LIB}) + message(STATUS "Linking ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX} dynamically against external library ${NAME} (${${NAME}_DYNAMIC_LIB}).") + if(${NAME}_DYNAMIC_INCLUDE_DIR) + list(APPEND ADDITIONAL_SHARED_INCLUDE_DIRS ${${NAME}_DYNAMIC_INCLUDE_DIR}) + message(STATUS "Adding include path for ${NAME} to ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}: ${${NAME}_DYNAMIC_INCLUDE_DIR}") + endif() + if(${${NAME}_DYNAMIC_LIB} IN_LIST META_PUBLIC_SHARED_LIB_DEPENDS) list(APPEND ${PUBLIC_LIBRARIES_VARNAME} ${${NAME}_DYNAMIC_LIB}) + if(${NAME}_DYNAMIC_INCLUDE_DIR) + list(APPEND PUBLIC_SHARED_INCLUDE_DIRS ${${NAME}_DYNAMIC_INCLUDE_DIR}) + endif() else() list(APPEND ${PRIVATE_LIBRARIES_VARNAME} ${${NAME}_DYNAMIC_LIB}) + if(${NAME}_DYNAMIC_INCLUDE_DIR) + list(APPEND PRIVATE_SHARED_INCLUDE_DIRS ${${NAME}_DYNAMIC_INCLUDE_DIR}) + endif() endif() - message(STATUS "Linking ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX} dynamically against external library ${NAME} (${${NAME}_DYNAMIC_LIB}).") else() if(${NAME}_REQUIRED) message(FATAL_ERROR "External library ${NAME} required by ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX} is not available for the specified linkage ${LINKAGE}.") @@ -77,12 +100,24 @@ if(NOT DEFINED THIRD_PARTY_MODULE_LOADED) # add library to list of libraries to be provided as transitive dependencies when building static libraries if(${NAME}_STATIC_LIB) list(APPEND STATIC_LIBRARIES ${${NAME}_STATIC_LIB}) + message(STATUS "Adding ${${NAME}_STATIC_LIB} to static library dependencies of ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}.") + if(${NAME}_STATIC_INCLUDE_DIR) + list(APPEND ADDITIONAL_STATIC_INCLUDE_DIRS ${${NAME}_STATIC_INCLUDE_DIR}) + message(STATUS "Adding include path for ${NAME} to static include directories of ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}: ${${NAME}_STATIC_INCLUDE_DIR}") + endif() + if(${${NAME}_STATIC_LIB} IN_LIST META_PUBLIC_STATIC_LIB_DEPENDS) list(APPEND ${PUBLIC_STATIC_LIBRARIES_VARNAME} ${${NAME}_STATIC_LIB}) + if(${NAME}_STATIC_INCLUDE_DIR) + list(APPEND PUBLIC_STATIC_INCLUDE_DIRS ${${NAME}_STATIC_INCLUDE_DIR}) + endif() else() list(APPEND ${PRIVATE_STATIC_LIBRARIES_VARNAME} ${${NAME}_STATIC_LIB}) + if(${NAME}_STATIC_INCLUDE_DIR) + list(APPEND PRIVATE_STATIC_INCLUDE_DIRS ${${NAME}_STATIC_INCLUDE_DIR}) + endif() endif() - message(STATUS "Adding ${${NAME}_STATIC_LIB} to static library dependencies of ${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}.") + endif() endmacro() @@ -99,11 +134,25 @@ if(NOT DEFINED THIRD_PARTY_MODULE_LOADED) endmacro() macro(find_external_library NAME LINKAGE REQUIRED) + set(${NAME}_DYNAMIC_INCLUDE_DIR NOTFOUND CACHE PATH "${NAME} include dir (dynamic)") + set(${NAME}_DYNAMIC_LIB NOTFOUND CACHE FILEPATH "${NAME} lib (dynamic)") + set(${NAME}_STATIC_INCLUDE_DIR NOTFOUND CACHE PATH "${NAME} include dir (static)") + set(${NAME}_STATIC_LIB NOTFOUND CACHE FILEPATH "${NAME} lib (static)") + save_default_library_suffixes() - configure_dynamic_library_suffixes() - find_library(${NAME}_DYNAMIC_LIB ${NAME}) - configure_static_library_suffixes() - find_library(${NAME}_STATIC_LIB ${NAME}) + + if(NOT ${NAME}_DYNAMIC_LIB) + configure_dynamic_library_suffixes() + find_library(DETECTED_${NAME}_DYNAMIC_LIB ${NAME}) + set(${NAME}_DYNAMIC_LIB ${DETECTED_${NAME}_DYNAMIC_LIB} CACHE FILEPATH "${NAME} lib (dynamic)") + endif() + + if(NOT ${NAME}_SHARED_LIB) + configure_static_library_suffixes() + find_library(${NAME}_STATIC_LIB ${NAME}) + set(${NAME}_STATIC_LIB ${DETECTED_${NAME}_STATIC_LIB} CACHE FILEPATH "${NAME} lib (static)") + endif() + restore_default_library_suffixes() endmacro() @@ -116,21 +165,19 @@ if(NOT DEFINED THIRD_PARTY_MODULE_LOADED) # internally used by use_external_library_from_package to find dynamic libraries configure_dynamic_library_suffixes() find_package(${PKGNAME} ${COMPAT_VERSION}) - set(${NAME}_DYNAMIC_INCLUDE_DIR ${${INCLUDE_VAR}} PARENT_SCOPE) - set(${NAME}_DYNAMIC_LIB ${${LIBRARY_VAR}} PARENT_SCOPE) + set(${NAME}_DYNAMIC_INCLUDE_DIR ${${INCLUDE_VAR}} CACHE PATH "${NAME} include dir (dynamic)") + set(${NAME}_DYNAMIC_LIB ${${LIBRARY_VAR}} CACHE FILEPATH "${NAME} lib (dynamic)") endfunction() function(use_external_library_from_package_static NAME PKGNAME INCLUDE_VAR LIBRARY_VAR COMPAT_VERSION) # internally used by use_external_library_from_package to find static libraries configure_static_library_suffixes() find_package(${PKGNAME} ${COMPAT_VERSION}) - set(${NAME}_STATIC_INCLUDE_DIR ${${INCLUDE_VAR}} PARENT_SCOPE) - set(${NAME}_STATIC_LIB ${${LIBRARY_VAR}} PARENT_SCOPE) + set(${NAME}_STATIC_INCLUDE_DIR ${${INCLUDE_VAR}} CACHE PATH "${NAME} include dir (static)") + set(${NAME}_STATIC_LIB ${${LIBRARY_VAR}} CACHE FILEPATH "${NAME} lib (static)") endfunction() macro(find_external_library_from_package NAME PKGNAME VERSION INCLUDE_VAR LIBRARY_VAR LINKAGE REQUIRED) - save_default_library_suffixes() - # handle specified VERSION if("${VERSION}" STREQUAL "ANY_VERSION") set(${NAME}_COMPATIBLE_VERSION "") @@ -139,20 +186,17 @@ if(NOT DEFINED THIRD_PARTY_MODULE_LOADED) endif() # use the find_library approach first because it is less buggy when trying to detect static libraries - configure_dynamic_library_suffixes() - find_library(${NAME}_DYNAMIC_LIB ${NAME}) - configure_static_library_suffixes() - find_library(${NAME}_STATIC_LIB ${NAME}) + find_external_library("${NAME}" "${LINKAGE}" OPTIONAL) # fall back to actual use of find_package # use separate functions to get a new scope + save_default_library_suffixes() if(NOT ${NAME}_DYNAMIC_LIB) use_external_library_from_package_dynamic(${NAME} ${PKGNAME} ${INCLUDE_VAR} "${LIBRARY_VAR}" "${${NAME}_COMPATIBLE_VERSION}") endif() if(NOT ${NAME}_STATIC_LIB) use_external_library_from_package_static(${NAME} ${PKGNAME} ${INCLUDE_VAR} "${LIBRARY_VAR}" "${${NAME}_COMPATIBLE_VERSION}") endif() - restore_default_library_suffixes() endmacro() diff --git a/cmake/modules/AppTarget.cmake b/cmake/modules/AppTarget.cmake index 74b890f..a874a9e 100644 --- a/cmake/modules/AppTarget.cmake +++ b/cmake/modules/AppTarget.cmake @@ -39,6 +39,10 @@ target_link_libraries(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX} PUBLIC ${ACTUAL_ADDITIONAL_LINK_FLAGS} "${PUBLIC_LIBRARIES}" PRIVATE "${PRIVATE_LIBRARIES}" ) +target_include_directories(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX} + PUBLIC "${PUBLIC_SHARED_INCLUDE_DIRS}" + PRIVATE "${PRIVATE_SHARED_INCLUDE_DIRS}" +) target_compile_definitions(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX} PUBLIC "${META_PUBLIC_SHARED_LIB_COMPILE_DEFINITIONS}" PRIVATE "${META_PRIVATE_SHARED_LIB_COMPILE_DEFINITIONS}" diff --git a/cmake/modules/LibraryTarget.cmake b/cmake/modules/LibraryTarget.cmake index ea1939c..ef2dcca 100644 --- a/cmake/modules/LibraryTarget.cmake +++ b/cmake/modules/LibraryTarget.cmake @@ -120,6 +120,9 @@ if(BUILD_SHARED_LIBS) target_link_libraries(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX} INTERFACE ${ACTUAL_ADDITIONAL_LINK_FLAGS} "${PUBLIC_LIBRARIES}" "${PRIVATE_LIBRARIES}" ) + target_include_directories(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX} + INTERFACE "${PUBLIC_SHARED_INCLUDE_DIRS}" "${PRIVATE_SHARED_INCLUDE_DIRS}" + ) target_compile_definitions(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX} INTERFACE "${META_PUBLIC_SHARED_LIB_COMPILE_DEFINITIONS}" "${META_PRIVATE_SHARED_LIB_COMPILE_DEFINITIONS}" ) @@ -132,6 +135,10 @@ if(BUILD_SHARED_LIBS) PUBLIC ${ACTUAL_ADDITIONAL_LINK_FLAGS} "${PUBLIC_LIBRARIES}" PRIVATE "${PRIVATE_LIBRARIES}" ) + target_include_directories(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX} + PUBLIC "${PUBLIC_SHARED_INCLUDE_DIRS}" + PRIVATE "${PRIVATE_SHARED_INCLUDE_DIRS}" + ) target_compile_definitions(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX} PUBLIC "${META_PUBLIC_SHARED_LIB_COMPILE_DEFINITIONS}" PRIVATE "${META_PRIVATE_SHARED_LIB_COMPILE_DEFINITIONS}" @@ -164,6 +171,9 @@ if(BUILD_STATIC_LIBS) target_link_libraries(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_static INTERFACE ${ACTUAL_ADDITIONAL_LINK_FLAGS} "${PUBLIC_STATIC_LIBRARIES}" "${PRIVATE_STATIC_LIBRARIES}" ) + target_include_directories(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_static + INTERFACE "${PUBLIC_STATIC_INCLUDE_DIRS}" "${PRIVATE_STATIC_INCLUDE_DIRS}" + ) target_compile_definitions(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_static INTERFACE "${META_PUBLIC_STATIC_LIB_COMPILE_DEFINITIONS}" "${META_PRIVATE_STATIC_LIB_COMPILE_DEFINITIONS}" ) @@ -176,6 +186,10 @@ if(BUILD_STATIC_LIBS) PUBLIC "${PUBLIC_STATIC_LIBRARIES}" PRIVATE "${PRIVATE_STATIC_LIBRARIES}" ) + target_include_directories(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_static + PUBLIC "${PUBLIC_STATIC_INCLUDE_DIRS}" + PRIVATE "${PRIVATE_STATIC_INCLUDE_DIRS}" + ) target_compile_definitions(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_static PUBLIC "${META_PUBLIC_STATIC_LIB_COMPILE_DEFINITIONS}" PRIVATE "${META_PRIVATE_STATIC_LIB_COMPILE_DEFINITIONS}" diff --git a/cmake/modules/TestTarget.cmake b/cmake/modules/TestTarget.cmake index 9dfba97..5b0c16e 100644 --- a/cmake/modules/TestTarget.cmake +++ b/cmake/modules/TestTarget.cmake @@ -108,6 +108,10 @@ if(CPP_UNIT_LIB OR META_NO_CPP_UNIT) PUBLIC ${ACTUAL_ADDITIONAL_LINK_FLAGS} "${PUBLIC_LIBRARIES}" PRIVATE "${TEST_LIBRARIES}" "${PRIVATE_LIBRARIES}" ) + target_include_directories(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests + PUBLIC "${PUBLIC_SHARED_INCLUDE_DIRS}" + PRIVATE "${PRIVATE_SHARED_INCLUDE_DIRS}" + ) target_compile_definitions(${TARGET_PREFIX}${META_PROJECT_NAME}${TARGET_SUFFIX}_tests PUBLIC "${META_PUBLIC_SHARED_LIB_COMPILE_DEFINITIONS}" PRIVATE "${META_PRIVATE_SHARED_LIB_COMPILE_DEFINITIONS}"