diff --git a/CMakeLists.txt b/CMakeLists.txt index e706ed4a4..599d5bfae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -101,7 +101,6 @@ # 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 3.5 to workaround deprecated backward compatibility @@ -144,7 +143,6 @@ INCLUDE(CheckFunctionExists) INCLUDE(CheckSymbolExists) INCLUDE(CheckIncludeFile) INCLUDE(CheckTypeSize) -INCLUDE(CMakePackageConfigHelpers) INCLUDE(GNUInstallDirs) # for CMAKE_INSTALL_LIBDIR CHECK_INCLUDE_FILE(dirent.h HAVE_DIRENT_H) @@ -697,9 +695,7 @@ 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 - $ - $) + TARGET_INCLUDE_DIRECTORIES(pcre2-8-static PUBLIC ${PROJECT_BINARY_DIR}) IF(REQUIRE_PTHREAD) TARGET_LINK_LIBRARIES(pcre2-8-static Threads::Threads) ENDIF(REQUIRE_PTHREAD) @@ -712,9 +708,7 @@ IF(PCRE2_BUILD_PCRE2_8) VERSION ${LIBPCRE2_POSIX_VERSION} SOVERSION ${LIBPCRE2_POSIX_SOVERSION}) TARGET_LINK_LIBRARIES(pcre2-posix-static pcre2-8-static) - TARGET_INCLUDE_DIRECTORIES(pcre2-posix-static PUBLIC - $ - $) + TARGET_INCLUDE_DIRECTORIES(pcre2-posix-static PUBLIC ${PROJECT_BINARY_DIR}) set(targets ${targets} pcre2-posix-static) IF(MSVC) @@ -731,9 +725,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 - $ - $) + TARGET_INCLUDE_DIRECTORIES(pcre2-8-shared PUBLIC ${PROJECT_BINARY_DIR}) SET_TARGET_PROPERTIES(pcre2-8-shared PROPERTIES COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=8 MACHO_COMPATIBILITY_VERSION "${LIBPCRE2_8_MACHO_COMPATIBILITY_VERSION}" @@ -747,9 +739,7 @@ IF(PCRE2_BUILD_PCRE2_8) set(targets ${targets} pcre2-8-shared) ADD_LIBRARY(pcre2-posix-shared SHARED ${PCRE2POSIX_HEADERS} ${PCRE2POSIX_SOURCES}) - TARGET_INCLUDE_DIRECTORIES(pcre2-posix-shared PUBLIC - $ - $) + TARGET_INCLUDE_DIRECTORIES(pcre2-posix-shared PUBLIC ${PROJECT_BINARY_DIR}) SET_TARGET_PROPERTIES(pcre2-posix-shared PROPERTIES COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=8 MACHO_COMPATIBILITY_VERSION "${LIBPCRE2_POSIX_MACHO_COMPATIBILITY_VERSION}" @@ -788,9 +778,7 @@ 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 - $ - $) + TARGET_INCLUDE_DIRECTORIES(pcre2-16-static PUBLIC ${PROJECT_BINARY_DIR}) SET_TARGET_PROPERTIES(pcre2-16-static PROPERTIES UNITY_BUILD OFF COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=16 MACHO_COMPATIBILITY_VERSION "${LIBPCRE2_32_MACHO_COMPATIBILITY_VERSION}" @@ -815,9 +803,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 - $ - $) + TARGET_INCLUDE_DIRECTORIES(pcre2-16-shared PUBLIC ${PROJECT_BINARY_DIR}) SET_TARGET_PROPERTIES(pcre2-16-shared PROPERTIES UNITY_BUILD OFF COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=16 MACHO_COMPATIBILITY_VERSION "${LIBPCRE2_32_MACHO_COMPATIBILITY_VERSION}" @@ -854,9 +840,7 @@ 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 - $ - $) + TARGET_INCLUDE_DIRECTORIES(pcre2-32-static PUBLIC ${PROJECT_BINARY_DIR}) SET_TARGET_PROPERTIES(pcre2-32-static PROPERTIES UNITY_BUILD OFF COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=32 MACHO_COMPATIBILITY_VERSION "${LIBPCRE2_32_MACHO_COMPATIBILITY_VERSION}" @@ -881,9 +865,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 - $ - $) + TARGET_INCLUDE_DIRECTORIES(pcre2-32-shared PUBLIC ${PROJECT_BINARY_DIR}) SET_TARGET_PROPERTIES(pcre2-32-shared PROPERTIES UNITY_BUILD OFF COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=32 MACHO_COMPATIBILITY_VERSION "${LIBPCRE2_32_MACHO_COMPATIBILITY_VERSION}" @@ -1124,13 +1106,9 @@ ENDIF(PCRE2_BUILD_TESTS) SET(CMAKE_INSTALL_ALWAYS 1) INSTALL(TARGETS ${targets} - EXPORT pcre2-targets - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + RUNTIME DESTINATION bin 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 @@ -1142,12 +1120,11 @@ 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_package_config_file(${PCRE2_CONFIG_IN} ${PCRE2_CONFIG_OUT} INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pcre2) +configure_file(${PCRE2_CONFIG_IN} ${PCRE2_CONFIG_OUT} @ONLY) +set(PCRE2_CONFIG_VERSION_IN ${CMAKE_CURRENT_SOURCE_DIR}/cmake/pcre2-config-version.cmake.in) set(PCRE2_CONFIG_VERSION_OUT ${CMAKE_CURRENT_BINARY_DIR}/cmake/pcre2-config-version.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) +configure_file(${PCRE2_CONFIG_VERSION_IN} ${PCRE2_CONFIG_VERSION_OUT} @ONLY) +install(FILES ${PCRE2_CONFIG_OUT} ${PCRE2_CONFIG_VERSION_OUT} DESTINATION cmake) FILE(GLOB html ${PROJECT_SOURCE_DIR}/doc/html/*.html) FILE(GLOB man1 ${PROJECT_SOURCE_DIR}/doc/*.1) diff --git a/ChangeLog b/ChangeLog index a42971ffe..dc57782f7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -95,11 +95,10 @@ string. default maximum length 255 characters (same as Perl) but with a function to adjust the limit. -25. Applied pull request #260, which modernizes the CMake files, also #262, -which updates the zig configuration, and #278 which fixes a bug with out-of- -source-tree CMake build testing. +25. Applied pull request #262, which updates the zig configuration, and #278 +which fixes a bug with out-of-source-tree CMake build testing. -26. Add support for LoongArch in JIT. +26. Add support for LoongArch to JIT. 27. Fixed a bug in pcre2_match() in the code for handling the vector of backtracking frames on the heap, which caused a heap overflow if *LIMIT_HEAP diff --git a/cmake/pcre2-config-version.cmake.in b/cmake/pcre2-config-version.cmake.in new file mode 100644 index 000000000..dac149eb9 --- /dev/null +++ b/cmake/pcre2-config-version.cmake.in @@ -0,0 +1,15 @@ +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 159669b63..b313d6df7 100644 --- a/cmake/pcre2-config.cmake.in +++ b/cmake/pcre2-config.cmake.in @@ -5,17 +5,11 @@ # # Static vs. shared # ----------------- -# To force using the static library instead of the shared one, one needs +# To make use of 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) +# find_package(PCRE2 CONFIG COMPONENTS 8BIT) # # This will define the following variables: # @@ -29,42 +23,70 @@ # PCRE2::32BIT - The 32 bit PCRE2 library. # PCRE2::POSIX - The POSIX PCRE2 library. -@PACKAGE_INIT@ +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 () -include(CMakeFindDependencyMacro) -if("@REQUIRE_PTHREAD@") # REQUIRE_PTHREAD - find_dependency(Threads) -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 () -include("${CMAKE_CURRENT_LIST_DIR}/pcre2-targets.cmake") + 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) # Set version -set(PCRE2_VERSION "@PCRE2_MAJOR@.@PCRE2_MINOR@.0") +if (PCRE2_INCLUDE_DIR) + set(PCRE2_VERSION "@PCRE2_MAJOR@.@PCRE2_MINOR@.0") +endif () -# 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) +# 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 () + +# 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) # When POSIX component has been specified make sure that also 8BIT component is specified. set(PCRE2_8BIT_COMPONENT FALSE) @@ -83,5 +105,41 @@ endif() unset(PCRE2_8BIT_COMPONENT) unset(PCRE2_POSIX_COMPONENT) -# Check for required components. -check_required_components("PCRE2") +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 +)