diff --git a/CMakeLists.txt b/CMakeLists.txt index 1888c14..41fcfda 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -150,6 +150,7 @@ include(CheckFunctionExists) include(CheckSymbolExists) include(CheckIncludeFile) include(CheckTypeSize) +INCLUDE(CMakePackageConfigHelpers) include(GNUInstallDirs) # for CMAKE_INSTALL_LIBDIR check_include_file(assert.h HAVE_ASSERT_H) @@ -792,7 +793,7 @@ if(PCRE2_BUILD_PCRE2_8) SOVERSION ${LIBPCRE2_8_SOVERSION} ) target_compile_definitions(pcre2-8-static PUBLIC PCRE2_STATIC) - target_include_directories(pcre2-8-static PUBLIC ${PROJECT_BINARY_DIR}) + target_include_directories(pcre2-8-static PUBLIC $ $) if(REQUIRE_PTHREAD) target_link_libraries(pcre2-8-static Threads::Threads) endif() @@ -808,7 +809,7 @@ if(PCRE2_BUILD_PCRE2_8) SOVERSION ${LIBPCRE2_POSIX_SOVERSION} ) target_link_libraries(pcre2-posix-static pcre2-8-static) - target_include_directories(pcre2-posix-static PUBLIC ${PROJECT_SOURCE_DIR}/src) + target_include_directories(pcre2-posix-static PUBLIC $ $) set(TARGETS ${TARGETS} pcre2-posix-static) if(MSVC) @@ -825,7 +826,7 @@ if(PCRE2_BUILD_PCRE2_8) if(BUILD_SHARED_LIBS) add_library(pcre2-8-shared SHARED ${PCRE2_HEADERS} ${PCRE2_SOURCES} ${PROJECT_BINARY_DIR}/config.h) - target_include_directories(pcre2-8-shared PUBLIC ${PROJECT_BINARY_DIR}) + target_include_directories(pcre2-8-shared PUBLIC $ $) set_target_properties( pcre2-8-shared PROPERTIES @@ -844,7 +845,7 @@ if(PCRE2_BUILD_PCRE2_8) set(DLL_PDB_DEBUG_FILES $/pcre2-8d.pdb ${DLL_PDB_DEBUG_FILES}) add_library(pcre2-posix-shared SHARED ${PCRE2POSIX_HEADERS} ${PCRE2POSIX_SOURCES}) - target_include_directories(pcre2-posix-shared PUBLIC ${PROJECT_SOURCE_DIR}/src) + target_include_directories(pcre2-posix-shared PUBLIC $ $) set_target_properties( pcre2-posix-shared PROPERTIES @@ -886,7 +887,7 @@ endif() if(PCRE2_BUILD_PCRE2_16) if(BUILD_STATIC_LIBS) add_library(pcre2-16-static STATIC ${PCRE2_HEADERS} ${PCRE2_SOURCES} ${PROJECT_BINARY_DIR}/config.h) - target_include_directories(pcre2-16-static PUBLIC ${PROJECT_BINARY_DIR}) + target_include_directories(pcre2-16-static PUBLIC $ $) set_target_properties( pcre2-16-static PROPERTIES @@ -915,7 +916,7 @@ if(PCRE2_BUILD_PCRE2_16) if(BUILD_SHARED_LIBS) add_library(pcre2-16-shared SHARED ${PCRE2_HEADERS} ${PCRE2_SOURCES} ${PROJECT_BINARY_DIR}/config.h) - target_include_directories(pcre2-16-shared PUBLIC ${PROJECT_BINARY_DIR}) + target_include_directories(pcre2-16-shared PUBLIC $ $) set_target_properties( pcre2-16-shared PROPERTIES @@ -956,7 +957,7 @@ endif() if(PCRE2_BUILD_PCRE2_32) if(BUILD_STATIC_LIBS) add_library(pcre2-32-static STATIC ${PCRE2_HEADERS} ${PCRE2_SOURCES} ${PROJECT_BINARY_DIR}/config.h) - target_include_directories(pcre2-32-static PUBLIC ${PROJECT_BINARY_DIR}) + target_include_directories(pcre2-32-static PUBLIC $ $) set_target_properties( pcre2-32-static PROPERTIES @@ -985,7 +986,7 @@ if(PCRE2_BUILD_PCRE2_32) if(BUILD_SHARED_LIBS) add_library(pcre2-32-shared SHARED ${PCRE2_HEADERS} ${PCRE2_SOURCES} ${PROJECT_BINARY_DIR}/config.h) - target_include_directories(pcre2-32-shared PUBLIC ${PROJECT_BINARY_DIR}) + target_include_directories(pcre2-32-shared PUBLIC $ $) set_target_properties( pcre2-32-shared PROPERTIES @@ -1244,10 +1245,14 @@ set(CMAKE_INSTALL_ALWAYS 1) install( TARGETS ${TARGETS} - RUNTIME DESTINATION bin + EXPORT pcre2-targets + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) +INSTALL(EXPORT pcre2-targets + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pcre2 + NAMESPACE pcre2::) install(FILES ${pkg_config_files} DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) install( FILES "${CMAKE_CURRENT_BINARY_DIR}/pcre2-config" @@ -1261,11 +1266,12 @@ install(FILES ${PCRE2_HEADERS} ${PCRE2POSIX_HEADERS} DESTINATION include) # CMake config files. set(PCRE2_CONFIG_IN ${CMAKE_CURRENT_SOURCE_DIR}/cmake/pcre2-config.cmake.in) set(PCRE2_CONFIG_OUT ${CMAKE_CURRENT_BINARY_DIR}/cmake/pcre2-config.cmake) -configure_file(${PCRE2_CONFIG_IN} ${PCRE2_CONFIG_OUT} @ONLY) -set(PCRE2_CONFIG_VERSION_IN ${CMAKE_CURRENT_SOURCE_DIR}/cmake/pcre2-config-version.cmake.in) +configure_package_config_file(${PCRE2_CONFIG_IN} ${PCRE2_CONFIG_OUT} INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pcre2) set(PCRE2_CONFIG_VERSION_OUT ${CMAKE_CURRENT_BINARY_DIR}/cmake/pcre2-config-version.cmake) -configure_file(${PCRE2_CONFIG_VERSION_IN} ${PCRE2_CONFIG_VERSION_OUT} @ONLY) -install(FILES ${PCRE2_CONFIG_OUT} ${PCRE2_CONFIG_VERSION_OUT} DESTINATION "${PCRE2_INSTALL_CMAKEDIR}") +write_basic_package_version_file(${PCRE2_CONFIG_VERSION_OUT} + VERSION ${PCRE2_MAJOR}.${PCRE2_MINOR}.0 + COMPATIBILITY SameMajorVersion) +install(FILES ${PCRE2_CONFIG_OUT} ${PCRE2_CONFIG_VERSION_OUT} DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pcre2) file(GLOB html ${PROJECT_SOURCE_DIR}/doc/html/*.html ${PROJECT_SOURCE_DIR}/doc/html/*.txt) file( diff --git a/cmake/pcre2-config-version.cmake.in b/cmake/pcre2-config-version.cmake.in index db00606..e69de29 100644 --- a/cmake/pcre2-config-version.cmake.in +++ b/cmake/pcre2-config-version.cmake.in @@ -1,14 +0,0 @@ -set(PACKAGE_VERSION_MAJOR @PCRE2_MAJOR@) -set(PACKAGE_VERSION_MINOR @PCRE2_MINOR@) -set(PACKAGE_VERSION_PATCH 0) -set(PACKAGE_VERSION @PCRE2_MAJOR@.@PCRE2_MINOR@.0) - -# Check whether the requested PACKAGE_FIND_VERSION is compatible -if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION OR PACKAGE_VERSION_MAJOR GREATER PACKAGE_FIND_VERSION_MAJOR) - set(PACKAGE_VERSION_COMPATIBLE FALSE) -else() - set(PACKAGE_VERSION_COMPATIBLE TRUE) - if(PACKAGE_VERSION VERSION_EQUAL PACKAGE_FIND_VERSION) - set(PACKAGE_VERSION_EXACT TRUE) - endif() -endif() diff --git a/cmake/pcre2-config.cmake.in b/cmake/pcre2-config.cmake.in index 082dc19..545f4de 100644 --- a/cmake/pcre2-config.cmake.in +++ b/cmake/pcre2-config.cmake.in @@ -5,11 +5,17 @@ # # Static vs. shared # ----------------- -# To make use of the static library instead of the shared one, one needs +# To force using the static library instead of the shared one, one needs # to set the variable PCRE2_USE_STATIC_LIBS to ON before calling find_package. +# If the variable is not set, the static library will be used if only that has +# been built, otherwise the shared library will be used. +# +# The following components are supported: 8BIT, 16BIT, 32BIT and POSIX. +# They used to be required but not anymore; all available targets will +# be defined regardless of the requested components. # Example: # set(PCRE2_USE_STATIC_LIBS ON) -# find_package(PCRE2 CONFIG COMPONENTS 8BIT) +# find_package(PCRE2 CONFIG) # # This will define the following variables: # @@ -23,88 +29,42 @@ # PCRE2::32BIT - The 32 bit PCRE2 library. # PCRE2::POSIX - The POSIX PCRE2 library. -set(PCRE2_NON_STANDARD_LIB_PREFIX @NON_STANDARD_LIB_PREFIX@) -set(PCRE2_NON_STANDARD_LIB_SUFFIX @NON_STANDARD_LIB_SUFFIX@) -set(PCRE2_8BIT_NAME pcre2-8) -set(PCRE2_16BIT_NAME pcre2-16) -set(PCRE2_32BIT_NAME pcre2-32) -set(PCRE2_POSIX_NAME pcre2-posix) -find_path(PCRE2_INCLUDE_DIR NAMES pcre2.h DOC "PCRE2 include directory") -if(PCRE2_USE_STATIC_LIBS) - if(MSVC) - set(PCRE2_8BIT_NAME pcre2-8-static) - set(PCRE2_16BIT_NAME pcre2-16-static) - set(PCRE2_32BIT_NAME pcre2-32-static) - set(PCRE2_POSIX_NAME pcre2-posix-static) - endif() - - set(PCRE2_PREFIX ${CMAKE_STATIC_LIBRARY_PREFIX}) - set(PCRE2_SUFFIX ${CMAKE_STATIC_LIBRARY_SUFFIX}) -else() - set(PCRE2_PREFIX ${CMAKE_SHARED_LIBRARY_PREFIX}) - if(MINGW AND PCRE2_NON_STANDARD_LIB_PREFIX) - set(PCRE2_PREFIX "") - endif() +@PACKAGE_INIT@ - set(PCRE2_SUFFIX ${CMAKE_SHARED_LIBRARY_SUFFIX}) - if(MINGW AND PCRE2_NON_STANDARD_LIB_SUFFIX) - set(PCRE2_SUFFIX "-0.dll") - elseif(MSVC) - set(PCRE2_SUFFIX ${CMAKE_STATIC_LIBRARY_SUFFIX}) - endif() +include(CMakeFindDependencyMacro) +if("@REQUIRE_PTHREAD@") # REQUIRE_PTHREAD + find_dependency(Threads) endif() -find_library( - PCRE2_8BIT_LIBRARY - NAMES ${PCRE2_PREFIX}${PCRE2_8BIT_NAME}${PCRE2_SUFFIX} ${PCRE2_PREFIX}${PCRE2_8BIT_NAME}d${PCRE2_SUFFIX} - DOC "8 bit PCRE2 library" -) -find_library( - PCRE2_16BIT_LIBRARY - NAMES ${PCRE2_PREFIX}${PCRE2_16BIT_NAME}${PCRE2_SUFFIX} ${PCRE2_PREFIX}${PCRE2_16BIT_NAME}d${PCRE2_SUFFIX} - DOC "16 bit PCRE2 library" -) -find_library( - PCRE2_32BIT_LIBRARY - NAMES ${PCRE2_PREFIX}${PCRE2_32BIT_NAME}${PCRE2_SUFFIX} ${PCRE2_PREFIX}${PCRE2_32BIT_NAME}d${PCRE2_SUFFIX} - DOC "32 bit PCRE2 library" -) -find_library( - PCRE2_POSIX_LIBRARY - NAMES ${PCRE2_PREFIX}${PCRE2_POSIX_NAME}${PCRE2_SUFFIX} ${PCRE2_PREFIX}${PCRE2_POSIX_NAME}d${PCRE2_SUFFIX} - DOC "8 bit POSIX PCRE2 library" -) -unset(PCRE2_NON_STANDARD_LIB_PREFIX) -unset(PCRE2_NON_STANDARD_LIB_SUFFIX) -unset(PCRE2_8BIT_NAME) -unset(PCRE2_16BIT_NAME) -unset(PCRE2_32BIT_NAME) -unset(PCRE2_POSIX_NAME) -# Set version -if(PCRE2_INCLUDE_DIR) - set(PCRE2_VERSION "@PCRE2_MAJOR@.@PCRE2_MINOR@.0") -endif() +include("${CMAKE_CURRENT_LIST_DIR}/pcre2-targets.cmake") -# Which components have been found. -if(PCRE2_8BIT_LIBRARY) - set(PCRE2_8BIT_FOUND TRUE) -endif() -if(PCRE2_16BIT_LIBRARY) - set(PCRE2_16BIT_FOUND TRUE) -endif() -if(PCRE2_32BIT_LIBRARY) - set(PCRE2_32BIT_FOUND TRUE) -endif() -if(PCRE2_POSIX_LIBRARY) - set(PCRE2_POSIX_FOUND TRUE) -endif() +# Set version +set(PCRE2_VERSION "@PCRE2_MAJOR@.@PCRE2_MINOR@.0") -# Check if at least one component has been specified. -list(LENGTH PCRE2_FIND_COMPONENTS PCRE2_NCOMPONENTS) -if(PCRE2_NCOMPONENTS LESS 1) - message(FATAL_ERROR "No components have been specified. This is not allowed. Please, specify at least one component.") -endif() -unset(PCRE2_NCOMPONENTS) +# Chooses the linkage of the library to expose in the +# unsuffixed edition of the target. +macro(_pcre2_add_component_target component target) + # If the static library exists and either PCRE2_USE_STATIC_LIBS + # is defined, or the dynamic library does not exist, use the static library. + if(NOT TARGET PCRE2::${component}) + if(TARGET pcre2::pcre2-${target}-static AND (PCRE2_USE_STATIC_LIBS OR NOT TARGET pcre2::pcre2-${target}-shared)) + add_library(PCRE2::${component} ALIAS pcre2::pcre2-${target}-static) + set(PCRE2_${component}_FOUND TRUE) + # Otherwise use the dynamic library if it exists. + elseif(TARGET pcre2::pcre2-${target}-shared AND NOT PCRE2_USE_STATIC_LIBS) + add_library(PCRE2::${component} ALIAS pcre2::pcre2-${target}-shared) + set(PCRE2_${component}_FOUND TRUE) + endif() + if(PCRE2_${component}_FOUND) + get_target_property(PCRE2_${component}_LIBRARY PCRE2::${component} IMPORTED_LOCATION) + set(PCRE2_LIBRARIES ${PCRE2_LIBRARIES} ${PCRE2_${component}_LIBRARY}) + endif() + endif() +endmacro() +_pcre2_add_component_target(8BIT 8) +_pcre2_add_component_target(16BIT 16) +_pcre2_add_component_target(32BIT 32) +_pcre2_add_component_target(POSIX posix) # When POSIX component has been specified make sure that also 8BIT component is specified. set(PCRE2_8BIT_COMPONENT FALSE) @@ -126,43 +86,5 @@ endif() unset(PCRE2_8BIT_COMPONENT) unset(PCRE2_POSIX_COMPONENT) -include(FindPackageHandleStandardArgs) -set(${CMAKE_FIND_PACKAGE_NAME}_CONFIG "${CMAKE_CURRENT_LIST_FILE}") -find_package_handle_standard_args( - PCRE2 - FOUND_VAR PCRE2_FOUND - REQUIRED_VARS PCRE2_INCLUDE_DIR - HANDLE_COMPONENTS - VERSION_VAR PCRE2_VERSION - CONFIG_MODE -) - -set(PCRE2_LIBRARIES) -if(PCRE2_FOUND) - foreach(component ${PCRE2_FIND_COMPONENTS}) - if(PCRE2_USE_STATIC_LIBS) - add_library(PCRE2::${component} STATIC IMPORTED) - target_compile_definitions(PCRE2::${component} INTERFACE PCRE2_STATIC) - else() - add_library(PCRE2::${component} SHARED IMPORTED) - endif() - set_target_properties( - PCRE2::${component} - PROPERTIES - IMPORTED_LOCATION "${PCRE2_${component}_LIBRARY}" - IMPORTED_IMPLIB "${PCRE2_${component}_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${PCRE2_INCLUDE_DIR}" - ) - if(component STREQUAL "POSIX") - set_target_properties( - PCRE2::${component} - PROPERTIES INTERFACE_LINK_LIBRARIES "PCRE2::8BIT" LINK_LIBRARIES "PCRE2::8BIT" - ) - endif() - - set(PCRE2_LIBRARIES ${PCRE2_LIBRARIES} ${PCRE2_${component}_LIBRARY}) - mark_as_advanced(PCRE2_${component}_LIBRARY) - endforeach() -endif() - -mark_as_advanced(PCRE2_INCLUDE_DIR) +# Check for required components. +check_required_components("PCRE2")