diff --git a/CMakeLists.txt b/CMakeLists.txt index 8b5081e..ba2e993 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -100,6 +100,9 @@ # 2021-08-28 PH increased minimum version # 2021-08-28 PH added test for realpath() # 2022-12-10 PH added support for pcre2posix_test +# 2023-01-15 Carlo added C99 as the minimum required +# 2023-06-03 Theodore used standard CMake constructs to export the library's targets. +# 2023-08-06 PH added support for setting variable length lookbehind maximum # Increased minimum to 2.8.5 to support GNUInstallDirs. # Increased minimum to 3.1 to support imported targets. @@ -136,6 +139,7 @@ INCLUDE(CheckFunctionExists) INCLUDE(CheckSymbolExists) INCLUDE(CheckIncludeFile) INCLUDE(CheckTypeSize) +INCLUDE(CMakePackageConfigHelpers) INCLUDE(GNUInstallDirs) # for CMAKE_INSTALL_LIBDIR CHECK_INCLUDE_FILE(dirent.h HAVE_DIRENT_H) @@ -706,7 +710,9 @@ IF(PCRE2_BUILD_PCRE2_8) VERSION ${LIBPCRE2_8_VERSION} 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(REQUIRE_PTHREAD) @@ -719,8 +725,9 @@ IF(PCRE2_BUILD_PCRE2_8) VERSION ${LIBPCRE2_POSIX_VERSION} SOVERSION ${LIBPCRE2_POSIX_SOVERSION}) TARGET_LINK_LIBRARIES(pcre2-posix-static pcre2-8-static) - TARGET_COMPILE_DEFINITIONS(pcre2-posix-static PUBLIC PCRE2_STATIC) - TARGET_INCLUDE_DIRECTORIES(pcre2-posix-static PUBLIC ${PROJECT_BINARY_DIR}) + TARGET_INCLUDE_DIRECTORIES(pcre2-posix-static PUBLIC + $ + $) SET(targets ${targets} pcre2-posix-static) IF(MSVC) @@ -737,7 +744,9 @@ 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 COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=8 MACHO_COMPATIBILITY_VERSION "${LIBPCRE2_8_MACHO_COMPATIBILITY_VERSION}" @@ -750,7 +759,9 @@ IF(PCRE2_BUILD_PCRE2_8) ENDIF(REQUIRE_PTHREAD) SET(targets ${targets} pcre2-8-shared) ADD_LIBRARY(pcre2-posix-shared SHARED ${PCRE2POSIX_HEADERS} ${PCRE2POSIX_SOURCES}) - TARGET_INCLUDE_DIRECTORIES(pcre2-posix-shared PUBLIC ${PROJECT_BINARY_DIR}) + TARGET_INCLUDE_DIRECTORIES(pcre2-posix-shared PUBLIC + $ + $) SET_TARGET_PROPERTIES(pcre2-posix-shared PROPERTIES COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=8 MACHO_COMPATIBILITY_VERSION "${LIBPCRE2_POSIX_MACHO_COMPATIBILITY_VERSION}" @@ -787,7 +798,9 @@ ENDIF(PCRE2_BUILD_PCRE2_8) 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 COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=16 MACHO_COMPATIBILITY_VERSION "${LIBPCRE2_32_MACHO_COMPATIBILITY_VERSION}" @@ -812,7 +825,9 @@ 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 COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=16 MACHO_COMPATIBILITY_VERSION "${LIBPCRE2_32_MACHO_COMPATIBILITY_VERSION}" @@ -849,7 +864,9 @@ ENDIF(PCRE2_BUILD_PCRE2_16) 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 COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=32 MACHO_COMPATIBILITY_VERSION "${LIBPCRE2_32_MACHO_COMPATIBILITY_VERSION}" @@ -874,7 +891,9 @@ 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 COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=32 MACHO_COMPATIBILITY_VERSION "${LIBPCRE2_32_MACHO_COMPATIBILITY_VERSION}" @@ -1076,9 +1095,13 @@ ENDIF(PCRE2_BUILD_TESTS) 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" DESTINATION bin @@ -1090,11 +1113,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 cmake) +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) FILE(GLOB man1 ${PROJECT_SOURCE_DIR}/doc/*.1) diff --git a/cmake/pcre2-config-version.cmake.in b/cmake/pcre2-config-version.cmake.in deleted file mode 100644 index dac149e..0000000 --- a/cmake/pcre2-config-version.cmake.in +++ /dev/null @@ -1,15 +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 b313d6d..5b2aafa 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,70 +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 () +@PACKAGE_INIT@ - 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 () +include(CMakeFindDependencyMacro) +if("@REQUIRE_PTHREAD@") # REQUIRE_PTHREAD + find_dependency(Threads) +endif() - set(PCRE2_SUFFIX ${CMAKE_SHARED_LIBRARY_SUFFIX}) - if (MINGW AND PCRE2_NON_STANDARD_LIB_SUFFIX) - set(PCRE2_SUFFIX "-0.dll") - endif () -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_8BIT_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_8BIT_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_8BIT_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) +include("${CMAKE_CURRENT_LIST_DIR}/pcre2-targets.cmake") # Set version -if (PCRE2_INCLUDE_DIR) - set(PCRE2_VERSION "@PCRE2_MAJOR@.@PCRE2_MINOR@.0") -endif () - -# 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(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) @@ -105,41 +83,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}" - 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")