From 2410fbe3869cab403f02b94caa9ab37ee9f5854b Mon Sep 17 00:00:00 2001 From: "Philip.Hazel" Date: Sun, 11 Jul 2021 15:15:24 +0000 Subject: [PATCH] Apply Jan-Willem Blokland's CMake patches to build both static and shared libraries, plus some other CMake extensions. --- CMakeLists.txt | 317 +++++++++++++++++++--------- ChangeLog | 26 +++ Makefile.am | 4 +- cmake/pcre2-config-version.cmake.in | 15 ++ cmake/pcre2-config.cmake.in | 145 +++++++++++++ config-cmake.h.in | 2 - 6 files changed, 406 insertions(+), 103 deletions(-) create mode 100644 cmake/pcre2-config-version.cmake.in create mode 100644 cmake/pcre2-config.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 71ba693..91d1741 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -94,6 +94,9 @@ # 2020-04-28 PH added function check for memfd_create based on Carlo's patch # 2020-05-25 PH added a check for Intel CET # 2020-12-03 PH altered the definition of pcre2test as suggested by Daniel +# 2021-06-29 JWSB added the option to build static library with PIC. +# 2021-07-05 JWSB modified such both the static and shared library can be +# build in one go. PROJECT(PCRE2 C) @@ -172,8 +175,9 @@ ENDIF(INTEL_CET_ENABLED) # Note: CMakeSetup displays these in alphabetical order, regardless of # the order we use here. -SET(BUILD_SHARED_LIBS OFF CACHE BOOL - "Build shared libraries instead of static ones.") +SET(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared libraries.") + +OPTION(BUILD_STATIC_LIBS "Build static libraries." ON) OPTION(PCRE2_BUILD_PCRE2_8 "Build 8 bit PCRE2 library" ON) @@ -181,6 +185,8 @@ OPTION(PCRE2_BUILD_PCRE2_16 "Build 16 bit PCRE2 library" OFF) OPTION(PCRE2_BUILD_PCRE2_32 "Build 32 bit PCRE2 library" OFF) +OPTION(PCRE2_STATIC_PIC "Build the static library with the option position independent code enabled." OFF) + OPTION(PCRE2_DEBUG "Include debugging code" OFF) OPTION(PCRE2_DISABLE_PERCENT_ZT "Disable the use of %zu and %td (rarely needed)" OFF) @@ -306,9 +312,9 @@ ENDIF(PCRE2_SUPPORT_LIBREADLINE) # Prepare build configuration -IF(NOT BUILD_SHARED_LIBS) - SET(PCRE2_STATIC 1) -ENDIF(NOT BUILD_SHARED_LIBS) +IF(NOT BUILD_SHARED_LIBS AND NOT BUILD_STATIC_LIBS) + MESSAGE(FATAL_ERROR "At least one of BUILD_SHARED_LIBS or BUILD_STATIC_LIBS must be enabled.") +ENDIF(NOT BUILD_SHARED_LIBS AND NOT BUILD_STATIC_LIBS) IF(NOT PCRE2_BUILD_PCRE2_8 AND NOT PCRE2_BUILD_PCRE2_16 AND NOT PCRE2_BUILD_PCRE2_32) MESSAGE(FATAL_ERROR "At least one of PCRE2_BUILD_PCRE2_8, PCRE2_BUILD_PCRE2_16 or PCRE2_BUILD_PCRE2_32 must be enabled") @@ -597,39 +603,35 @@ SET(PCRE2_SOURCES SET(PCRE2POSIX_HEADERS src/pcre2posix.h) SET(PCRE2POSIX_SOURCES src/pcre2posix.c) -IF(MINGW AND NOT PCRE2_STATIC) -IF (EXISTS ${PROJECT_SOURCE_DIR}/pcre2.rc) -ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_SOURCE_DIR}/pcre2.o -PRE-LINK -COMMAND windres ARGS pcre2.rc pcre2.o -WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} -COMMENT Using pcre2 coff info in mingw build) -SET(PCRE2_SOURCES - ${PCRE2_SOURCES} ${PROJECT_SOURCE_DIR}/pcre2.o -) -ENDIF(EXISTS ${PROJECT_SOURCE_DIR}/pcre2.rc) -IF (EXISTS ${PROJECT_SOURCE_DIR}/pcre2posix.rc) -ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_SOURCE_DIR}/pcre2posix.o -PRE-LINK -COMMAND windres ARGS pcre2posix.rc pcre2posix.o -WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} -COMMENT Using pcre2posix coff info in mingw build) -SET(PCRE2POSIX_SOURCES - ${PCRE2POSIX_SOURCES} ${PROJECT_SOURCE_DIR}/pcre2posix.o -) -ENDIF(EXISTS ${PROJECT_SOURCE_DIR}/pcre2posix.rc) -ENDIF(MINGW AND NOT PCRE2_STATIC) +IF(MINGW AND BUILD_SHARED_LIBS) + IF (EXISTS ${PROJECT_SOURCE_DIR}/pcre2.rc) + ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_SOURCE_DIR}/pcre2.o + PRE-LINK + COMMAND windres ARGS pcre2.rc pcre2.o + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + COMMENT Using pcre2 coff info in mingw build) + SET(PCRE2_SOURCES ${PCRE2_SOURCES} ${PROJECT_SOURCE_DIR}/pcre2.o) + ENDIF(EXISTS ${PROJECT_SOURCE_DIR}/pcre2.rc) -IF(MSVC AND NOT PCRE2_STATIC) -IF (EXISTS ${PROJECT_SOURCE_DIR}/pcre2.rc) -SET(PCRE2_SOURCES - ${PCRE2_SOURCES} pcre2.rc) -ENDIF(EXISTS ${PROJECT_SOURCE_DIR}/pcre2.rc) -IF (EXISTS ${PROJECT_SOURCE_DIR}/pcre2posix.rc) -SET(PCRE2POSIX_SOURCES - ${PCRE2POSIX_SOURCES} pcre2posix.rc) -ENDIF (EXISTS ${PROJECT_SOURCE_DIR}/pcre2posix.rc) -ENDIF(MSVC AND NOT PCRE2_STATIC) + IF (EXISTS ${PROJECT_SOURCE_DIR}/pcre2posix.rc) + ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_SOURCE_DIR}/pcre2posix.o + PRE-LINK + COMMAND windres ARGS pcre2posix.rc pcre2posix.o + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + COMMENT Using pcre2posix coff info in mingw build) + SET(PCRE2POSIX_SOURCES ${PCRE2POSIX_SOURCES} ${PROJECT_SOURCE_DIR}/pcre2posix.o) + ENDIF(EXISTS ${PROJECT_SOURCE_DIR}/pcre2posix.rc) +ENDIF(MINGW AND BUILD_SHARED_LIBS) + +IF(MSVC AND BUILD_SHARED_LIBS) + IF (EXISTS ${PROJECT_SOURCE_DIR}/pcre2.rc) + SET(PCRE2_SOURCES ${PCRE2_SOURCES} pcre2.rc) + ENDIF(EXISTS ${PROJECT_SOURCE_DIR}/pcre2.rc) + + IF (EXISTS ${PROJECT_SOURCE_DIR}/pcre2posix.rc) + SET(PCRE2POSIX_SOURCES ${PCRE2POSIX_SOURCES} pcre2posix.rc) + ENDIF (EXISTS ${PROJECT_SOURCE_DIR}/pcre2posix.rc) +ENDIF(MSVC AND BUILD_SHARED_LIBS) # Fix static compilation with MSVC: https://bugs.exim.org/show_bug.cgi?id=1681 # This code was taken from the CMake wiki, not from WebM. @@ -658,76 +660,181 @@ SET(targets) # 8-bit library IF(PCRE2_BUILD_PCRE2_8) -ADD_LIBRARY(pcre2-8 ${PCRE2_HEADERS} ${PCRE2_SOURCES} ${PROJECT_BINARY_DIR}/config.h) -SET_TARGET_PROPERTIES(pcre2-8 PROPERTIES - COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=8 - MACHO_COMPATIBILITY_VERSION "${LIBPCRE2_8_MACHO_COMPATIBILITY_VERSION}" - MACHO_CURRENT_VERSION "${LIBPCRE2_8_MACHO_CURRENT_VERSION}" - VERSION ${LIBPCRE2_8_VERSION} - SOVERSION ${LIBPCRE2_8_SOVERSION}) -SET(targets ${targets} pcre2-8) -ADD_LIBRARY(pcre2-posix ${PCRE2POSIX_HEADERS} ${PCRE2POSIX_SOURCES}) -SET_TARGET_PROPERTIES(pcre2-posix PROPERTIES - COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=8 - MACHO_COMPATIBILITY_VERSION "${LIBPCRE2_POSIX_MACHO_COMPATIBILITY_VERSION}" - MACHO_CURRENT_VERSION "${LIBPCRE2_POSIX_MACHO_CURRENT_VERSION}" - VERSION ${LIBPCRE2_POSIX_VERSION} - SOVERSION ${LIBPCRE2_POSIX_SOVERSION}) -SET(targets ${targets} pcre2-posix) -TARGET_LINK_LIBRARIES(pcre2-posix pcre2-8) + IF(BUILD_STATIC_LIBS) + ADD_LIBRARY(pcre2-8-static STATIC ${PCRE2_HEADERS} ${PCRE2_SOURCES} ${PROJECT_BINARY_DIR}/config.h) + SET_TARGET_PROPERTIES(pcre2-8-static PROPERTIES + COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=8 + MACHO_COMPATIBILITY_VERSION "${LIBPCRE2_8_MACHO_COMPATIBILITY_VERSION}" + MACHO_CURRENT_VERSION "${LIBPCRE2_8_MACHO_CURRENT_VERSION}" + VERSION ${LIBPCRE2_8_VERSION} + SOVERSION ${LIBPCRE2_8_SOVERSION}) + TARGET_COMPILE_DEFINITIONS(pcre2-8-static PUBLIC PCRE2_STATIC) + SET(targets ${targets} pcre2-8-static) + ADD_LIBRARY(pcre2-posix-static STATIC ${PCRE2POSIX_HEADERS} ${PCRE2POSIX_SOURCES}) + SET_TARGET_PROPERTIES(pcre2-posix-static PROPERTIES + COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=8 + MACHO_COMPATIBILITY_VERSION "${LIBPCRE2_POSIX_MACHO_COMPATIBILITY_VERSION}" + MACHO_CURRENT_VERSION "${LIBPCRE2_POSIX_MACHO_CURRENT_VERSION}" + 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) + SET(targets ${targets} pcre2-posix-static) -IF(MINGW AND NOT PCRE2_STATIC) - IF(NON_STANDARD_LIB_PREFIX) - SET_TARGET_PROPERTIES(pcre2-8 pcre2-posix PROPERTIES PREFIX "") - ENDIF(NON_STANDARD_LIB_PREFIX) - IF(NON_STANDARD_LIB_SUFFIX) - SET_TARGET_PROPERTIES(pcre2-8 pcre2-posix PROPERTIES SUFFIX "-0.dll") - ENDIF(NON_STANDARD_LIB_SUFFIX) -ENDIF(MINGW AND NOT PCRE2_STATIC) + IF(MSVC) + SET_TARGET_PROPERTIES(pcre2-8-static PROPERTIES OUTPUT_NAME pcre2-8-static) + SET_TARGET_PROPERTIES(pcre2-posix-static PROPERTIES OUTPUT_NAME pcre2-posix-static) + ELSE(MSVC) + SET_TARGET_PROPERTIES(pcre2-8-static PROPERTIES OUTPUT_NAME pcre2-8) + SET_TARGET_PROPERTIES(pcre2-posix-static PROPERTIES OUTPUT_NAME pcre2-posix) + ENDIF(MSVC) + IF(PCRE2_STATIC_PIC) + SET_TARGET_PROPERTIES(pcre2-8-static pcre2-posix-static PROPERTIES POSITION_INDEPENDENT_CODE 1) + ENDIF(PCRE2_STATIC_PIC) + ENDIF(BUILD_STATIC_LIBS) + + IF(BUILD_SHARED_LIBS) + ADD_LIBRARY(pcre2-8-shared SHARED ${PCRE2_HEADERS} ${PCRE2_SOURCES} ${PROJECT_BINARY_DIR}/config.h) + SET_TARGET_PROPERTIES(pcre2-8-shared PROPERTIES + COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=8 + MACHO_COMPATIBILITY_VERSION "${LIBPCRE2_8_MACHO_COMPATIBILITY_VERSION}" + MACHO_CURRENT_VERSION "${LIBPCRE2_8_MACHO_CURRENT_VERSION}" + VERSION ${LIBPCRE2_8_VERSION} + SOVERSION ${LIBPCRE2_8_SOVERSION} + OUTPUT_NAME pcre2-8) + SET(targets ${targets} pcre2-8-shared) + ADD_LIBRARY(pcre2-posix-shared SHARED ${PCRE2POSIX_HEADERS} ${PCRE2POSIX_SOURCES}) + SET_TARGET_PROPERTIES(pcre2-posix-shared PROPERTIES + COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=8 + MACHO_COMPATIBILITY_VERSION "${LIBPCRE2_POSIX_MACHO_COMPATIBILITY_VERSION}" + MACHO_CURRENT_VERSION "${LIBPCRE2_POSIX_MACHO_CURRENT_VERSION}" + VERSION ${LIBPCRE2_POSIX_VERSION} + SOVERSION ${LIBPCRE2_POSIX_SOVERSION} + OUTPUT_NAME pcre2-posix) + TARGET_LINK_LIBRARIES(pcre2-posix-shared pcre2-8-shared) + SET(targets ${targets} pcre2-posix-shared) + + IF(MINGW) + IF(NON_STANDARD_LIB_PREFIX) + SET_TARGET_PROPERTIES(pcre2-8-shared pcre2-posix-shared PROPERTIES PREFIX "") + ENDIF(NON_STANDARD_LIB_PREFIX) + IF(NON_STANDARD_LIB_SUFFIX) + SET_TARGET_PROPERTIES(pcre2-8-shared pcre2-posix-shared PROPERTIES SUFFIX "-0.dll") + ENDIF(NON_STANDARD_LIB_SUFFIX) + ENDIF(MINGW) + ENDIF(BUILD_SHARED_LIBS) + + IF(BUILD_STATIC_LIBS) + ADD_LIBRARY(pcre2-8 ALIAS pcre2-8-static) + ADD_LIBRARY(pcre2-posix ALIAS pcre2-posix-static) + ELSE(BUILD_STATIC_LIBS) + ADD_LIBRARY(pcre2-8 ALIAS pcre2-8-shared) + ADD_LIBRARY(pcre2-posix ALIAS pcre2-posix-shared) + ENDIF(BUILD_STATIC_LIBS) ENDIF(PCRE2_BUILD_PCRE2_8) # 16-bit library IF(PCRE2_BUILD_PCRE2_16) -ADD_LIBRARY(pcre2-16 ${PCRE2_HEADERS} ${PCRE2_SOURCES} ${PROJECT_BINARY_DIR}/config.h) -SET_TARGET_PROPERTIES(pcre2-16 PROPERTIES - COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=16 - MACHO_COMPATIBILITY_VERSION "${LIBPCRE2_32_MACHO_COMPATIBILITY_VERSION}" - MACHO_CURRENT_VERSION "${LIBPCRE2_32_MACHO_CURRENT_VERSION}" - VERSION ${LIBPCRE2_16_VERSION} - SOVERSION ${LIBPCRE2_16_SOVERSION}) -SET(targets ${targets} pcre2-16) + IF(BUILD_STATIC_LIBS) + ADD_LIBRARY(pcre2-16-static STATIC ${PCRE2_HEADERS} ${PCRE2_SOURCES} ${PROJECT_BINARY_DIR}/config.h) + SET_TARGET_PROPERTIES(pcre2-16-static PROPERTIES + COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=16 + MACHO_COMPATIBILITY_VERSION "${LIBPCRE2_32_MACHO_COMPATIBILITY_VERSION}" + MACHO_CURRENT_VERSION "${LIBPCRE2_32_MACHO_CURRENT_VERSION}" + VERSION ${LIBPCRE2_16_VERSION} + SOVERSION ${LIBPCRE2_16_SOVERSION}) + TARGET_COMPILE_DEFINITIONS(pcre2-16-static PUBLIC PCRE2_STATIC) + SET(targets ${targets} pcre2-16-static) -IF(MINGW AND NOT PCRE2_STATIC) - IF(NON_STANDARD_LIB_PREFIX) - SET_TARGET_PROPERTIES(pcre2-16 PROPERTIES PREFIX "") - ENDIF(NON_STANDARD_LIB_PREFIX) - IF(NON_STANDARD_LIB_SUFFIX) - SET_TARGET_PROPERTIES(pcre2-16 PROPERTIES SUFFIX "-0.dll") - ENDIF(NON_STANDARD_LIB_SUFFIX) -ENDIF(MINGW AND NOT PCRE2_STATIC) + IF(MSVC) + SET_TARGET_PROPERTIES(pcre2-16-static PROPERTIES OUTPUT_NAME pcre2-16-static) + ELSE(MSVC) + SET_TARGET_PROPERTIES(pcre2-16-static PROPERTIES OUTPUT_NAME pcre2-16) + ENDIF(MSVC) + IF(PCRE2_STATIC_PIC) + SET_TARGET_PROPERTIES(pcre2-16-static PROPERTIES POSITION_INDEPENDENT_CODE 1) + ENDIF(PCRE2_STATIC_PIC) + ENDIF(BUILD_STATIC_LIBS) + + IF(BUILD_SHARED_LIBS) + ADD_LIBRARY(pcre2-16-shared SHARED ${PCRE2_HEADERS} ${PCRE2_SOURCES} ${PROJECT_BINARY_DIR}/config.h) + SET_TARGET_PROPERTIES(pcre2-16-shared PROPERTIES + COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=16 + MACHO_COMPATIBILITY_VERSION "${LIBPCRE2_32_MACHO_COMPATIBILITY_VERSION}" + MACHO_CURRENT_VERSION "${LIBPCRE2_32_MACHO_CURRENT_VERSION}" + VERSION ${LIBPCRE2_16_VERSION} + SOVERSION ${LIBPCRE2_16_SOVERSION} + OUTPUT_NAME pcre2-16) + SET(targets ${targets} pcre2-16-shared) + + IF(MINGW) + IF(NON_STANDARD_LIB_PREFIX) + SET_TARGET_PROPERTIES(pcre2-16-shared PROPERTIES PREFIX "") + ENDIF(NON_STANDARD_LIB_PREFIX) + IF(NON_STANDARD_LIB_SUFFIX) + SET_TARGET_PROPERTIES(pcre2-16-shared PROPERTIES SUFFIX "-0.dll") + ENDIF(NON_STANDARD_LIB_SUFFIX) + ENDIF(MINGW) + ENDIF(BUILD_SHARED_LIBS) + + IF(BUILD_STATIC_LIBS) + ADD_LIBRARY(pcre2-16 ALIAS pcre2-16-static) + ELSE(BUILD_STATIC_LIBS) + ADD_LIBRARY(pcre2-16 ALIAS pcre2-16-shared) + ENDIF(BUILD_STATIC_LIBS) ENDIF(PCRE2_BUILD_PCRE2_16) # 32-bit library IF(PCRE2_BUILD_PCRE2_32) -ADD_LIBRARY(pcre2-32 ${PCRE2_HEADERS} ${PCRE2_SOURCES} ${PROJECT_BINARY_DIR}/config.h) -SET_TARGET_PROPERTIES(pcre2-32 PROPERTIES - COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=32 - MACHO_COMPATIBILITY_VERSION "${LIBPCRE2_32_MACHO_COMPATIBILITY_VERSION}" - MACHO_CURRENT_VERSION "${LIBPCRE2_32_MACHO_CURRENT_VERSION}" - VERSION ${LIBPCRE2_32_VERSION} - SOVERSION ${LIBPCRE2_32_SOVERSION}) -SET(targets ${targets} pcre2-32) + IF(BUILD_STATIC_LIBS) + ADD_LIBRARY(pcre2-32-static STATIC ${PCRE2_HEADERS} ${PCRE2_SOURCES} ${PROJECT_BINARY_DIR}/config.h) + SET_TARGET_PROPERTIES(pcre2-32-static PROPERTIES + COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=32 + MACHO_COMPATIBILITY_VERSION "${LIBPCRE2_32_MACHO_COMPATIBILITY_VERSION}" + MACHO_CURRENT_VERSION "${LIBPCRE2_32_MACHO_CURRENT_VERSION}" + VERSION ${LIBPCRE2_32_VERSION} + SOVERSION ${LIBPCRE2_32_SOVERSION}) + TARGET_COMPILE_DEFINITIONS(pcre2-32-static PUBLIC PCRE2_STATIC) + SET(targets ${targets} pcre2-32-static) -IF(MINGW AND NOT PCRE2_STATIC) - IF(NON_STANDARD_LIB_PREFIX) - SET_TARGET_PROPERTIES(pcre2-32 PROPERTIES PREFIX "") - ENDIF(NON_STANDARD_LIB_PREFIX) - IF(NON_STANDARD_LIB_SUFFIX) - SET_TARGET_PROPERTIES(pcre2-32 PROPERTIES SUFFIX "-0.dll") - ENDIF(NON_STANDARD_LIB_SUFFIX) -ENDIF(MINGW AND NOT PCRE2_STATIC) + IF(MSVC) + SET_TARGET_PROPERTIES(pcre2-32-static PROPERTIES OUTPUT_NAME pcre2-32-static) + ELSE(MSVC) + SET_TARGET_PROPERTIES(pcre2-32-static PROPERTIES OUTPUT_NAME pcre2-32) + ENDIF(MSVC) + IF(PCRE2_STATIC_PIC) + SET_TARGET_PROPERTIES(pcre2-32-static PROPERTIES POSITION_INDEPENDENT_CODE 1) + ENDIF(PCRE2_STATIC_PIC) + ENDIF(BUILD_STATIC_LIBS) + + IF(BUILD_SHARED_LIBS) + ADD_LIBRARY(pcre2-32-shared SHARED ${PCRE2_HEADERS} ${PCRE2_SOURCES} ${PROJECT_BINARY_DIR}/config.h) + SET_TARGET_PROPERTIES(pcre2-32-shared PROPERTIES + COMPILE_DEFINITIONS PCRE2_CODE_UNIT_WIDTH=32 + MACHO_COMPATIBILITY_VERSION "${LIBPCRE2_32_MACHO_COMPATIBILITY_VERSION}" + MACHO_CURRENT_VERSION "${LIBPCRE2_32_MACHO_CURRENT_VERSION}" + VERSION ${LIBPCRE2_32_VERSION} + SOVERSION ${LIBPCRE2_32_SOVERSION} + OUTPUT_NAME pcre2-32) + SET(targets ${targets} pcre2-32-shared) + + IF(MINGW) + IF(NON_STANDARD_LIB_PREFIX) + SET_TARGET_PROPERTIES(pcre2-32-shared PROPERTIES PREFIX "") + ENDIF(NON_STANDARD_LIB_PREFIX) + IF(NON_STANDARD_LIB_SUFFIX) + SET_TARGET_PROPERTIES(pcre2-32-shared PROPERTIES SUFFIX "-0.dll") + ENDIF(NON_STANDARD_LIB_SUFFIX) + ENDIF(MINGW) + ENDIF(BUILD_SHARED_LIBS) + + IF(BUILD_STATIC_LIBS) + ADD_LIBRARY(pcre2-32 ALIAS pcre2-32-static) + ELSE(BUILD_STATIC_LIBS) + ADD_LIBRARY(pcre2-32 ALIAS pcre2-32-shared) + ENDIF(BUILD_STATIC_LIBS) ENDIF(PCRE2_BUILD_PCRE2_32) # Executables @@ -900,6 +1007,15 @@ INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/pcre2-config" 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) +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) + FILE(GLOB html ${PROJECT_SOURCE_DIR}/doc/html/*.html) FILE(GLOB man1 ${PROJECT_SOURCE_DIR}/doc/*.1) FILE(GLOB man3 ${PROJECT_SOURCE_DIR}/doc/*.3) @@ -926,11 +1042,11 @@ IF(MSVC AND INSTALL_MSVC_PDB) ENDIF(MSVC AND INSTALL_MSVC_PDB) # Help, only for nice output -IF(BUILD_SHARED_LIBS) - SET(BUILD_STATIC_LIBS OFF) -ELSE(BUILD_SHARED_LIBS) +IF(BUILD_STATIC_LIBS) SET(BUILD_STATIC_LIBS ON) -ENDIF(BUILD_SHARED_LIBS) +ELSE(BUILD_STATIC_LIBS) + SET(BUILD_STATIC_LIBS OFF) +ENDIF(BUILD_STATIC_LIBS) IF(PCRE2_HEAP_MATCH_RECURSE) MESSAGE(WARNING "HEAP_MATCH_RECURSE is obsolete and does nothing.") @@ -968,6 +1084,7 @@ IF(PCRE2_SHOW_REPORT) MESSAGE(STATUS " Match depth limit ............... : ${PCRE2_MATCH_LIMIT_DEPTH}") MESSAGE(STATUS " Build shared libs ............... : ${BUILD_SHARED_LIBS}") MESSAGE(STATUS " Build static libs ............... : ${BUILD_STATIC_LIBS}") + MESSAGE(STATUS " with PIC enabled ............. : ${PCRE2_STATIC_PIC}") MESSAGE(STATUS " Build pcre2grep ................. : ${PCRE2_BUILD_PCRE2GREP}") MESSAGE(STATUS " Enable JIT in pcre2grep ......... : ${PCRE2GREP_SUPPORT_JIT}") MESSAGE(STATUS " Enable callouts in pcre2grep .... : ${PCRE2GREP_SUPPORT_CALLOUT}") @@ -1002,10 +1119,10 @@ IF(PCRE2_SHOW_REPORT) MESSAGE(STATUS " Use %zu and %td ..................: AUTO" ) ENDIF(PCRE2_DISABLE_PERCENT_ZT) - IF(MINGW AND NOT PCRE2_STATIC) + IF(MINGW AND BUILD_SHARED_LIBS) MESSAGE(STATUS " Non-standard dll names (prefix) . : ${NON_STANDARD_LIB_PREFIX}") MESSAGE(STATUS " Non-standard dll names (suffix) . : ${NON_STANDARD_LIB_SUFFIX}") - ENDIF(MINGW AND NOT PCRE2_STATIC) + ENDIF(MINGW AND BUILD_SHARED_LIBS) IF(MSVC) MESSAGE(STATUS " Install MSVC .pdb files ..........: ${INSTALL_MSVC_PDB}") diff --git a/ChangeLog b/ChangeLog index af561a7..96a85da 100644 --- a/ChangeLog +++ b/ChangeLog @@ -8,6 +8,32 @@ Version 10.38-RC1 xx-xxx-2021 is inside a capturing bracket and the bracket is preceeded by character literals. +2. Installed revised CMake configuration files provided by Jan-Willem Blokland. +This extends the CMake build system to build both static and shared libraries +in one go, builds the static library with PIC, and exposes PCRE2 libraries +using the CMake config files. JWB provided these notes: + +- Introduced CMake variable BUILD_STATIC_LIBS to build the static library. + +- Make a small modification to config-cmake.h.in by removing the PCRE2_STATIC + variable. Added PCRE2_STATIC variable to the static build using the + target_compile_definitions() function. + +- Extended the CMake config files. + + - Introduced CMake variable PCRE2_USE_STATIC_LIBS to easily switch between + the static and shared libraries. + + - Added the PCRE_STATIC variable to the target compile definitions for the + import of the static library. + +Building static and shared libraries using MSVC results in a name clash of +the libraries. Both static and shared library builds create, for example, the +file pcre2-8.lib. Therefore, I decided to change the static library names by +adding "-static". For example, pcre2-8.lib has become pcre2-8-static.lib. +[Comment by PH: this seems to be MSVC-specific. It doesn't happen on Linux.] + + Version 10.37 26-May-2021 ------------------------- diff --git a/Makefile.am b/Makefile.am index bd8e6f0..9a23465 100644 --- a/Makefile.am +++ b/Makefile.am @@ -859,9 +859,11 @@ endif # WITH_GCOV EXTRA_DIST += \ cmake/COPYING-CMAKE-SCRIPTS \ + cmake/FindEditline.cmake \ cmake/FindPackageHandleStandardArgs.cmake \ cmake/FindReadline.cmake \ - cmake/FindEditline.cmake \ + cmake/pcre2-config-version.cmake.in \ + cmake/pcre2-config.cmake.in \ CMakeLists.txt \ config-cmake.h.in diff --git a/cmake/pcre2-config-version.cmake.in b/cmake/pcre2-config-version.cmake.in new file mode 100644 index 0000000..dac149e --- /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 new file mode 100644 index 0000000..b313d6d --- /dev/null +++ b/cmake/pcre2-config.cmake.in @@ -0,0 +1,145 @@ +# pcre2-config.cmake +# ---------------- +# +# Finds the PCRE2 library, specify the starting search path in PCRE2_ROOT. +# +# Static vs. shared +# ----------------- +# 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. +# Example: +# set(PCRE2_USE_STATIC_LIBS ON) +# find_package(PCRE2 CONFIG COMPONENTS 8BIT) +# +# This will define the following variables: +# +# PCRE2_FOUND - True if the system has the PCRE2 library. +# PCRE2_VERSION - The version of the PCRE2 library which was found. +# +# and the following imported targets: +# +# PCRE2::8BIT - The 8 bit PCRE2 library. +# PCRE2::16BIT - The 16 bit PCRE2 library. +# 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 () + + 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 +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 () + +# 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) +set(PCRE2_POSIX_COMPONENT FALSE) +foreach(component ${PCRE2_FIND_COMPONENTS}) + if (component STREQUAL "8BIT") + set(PCRE2_8BIT_COMPONENT TRUE) + elseif (component STREQUAL "POSIX") + set(PCRE2_POSIX_COMPONENT TRUE) + endif () +endforeach() + +if (PCRE2_POSIX_COMPONENT AND NOT PCRE2_8BIT_COMPONENT) + message(FATAL_ERROR "The component POSIX is specified while the 8BIT one is not. This is not allowed. Please, also specify the 8BIT component.") +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 +) diff --git a/config-cmake.h.in b/config-cmake.h.in index 7766dd7..3adf756 100644 --- a/config-cmake.h.in +++ b/config-cmake.h.in @@ -16,8 +16,6 @@ #cmakedefine HAVE_SECURE_GETENV 1 #cmakedefine HAVE_STRERROR 1 -#cmakedefine PCRE2_STATIC 1 - #cmakedefine SUPPORT_PCRE2_8 1 #cmakedefine SUPPORT_PCRE2_16 1 #cmakedefine SUPPORT_PCRE2_32 1