1INCLUDE (CheckCSourceRuns)
2INCLUDE (ExternalProject)
3
4SET(WITH_PCRE "auto" CACHE STRING
5   "Which pcre to use (possible values are 'bundled', 'system', or 'auto')")
6
7MACRO(BUNDLE_PCRE2)
8  SET(dir "${CMAKE_BINARY_DIR}/extra/pcre2")
9  SET(PCRE_INCLUDES ${dir}/src/pcre2-build ${dir}/src/pcre2/src)
10  SET(byproducts)
11  FOREACH(lib pcre2-posix pcre2-8)
12    ADD_LIBRARY(${lib} STATIC IMPORTED GLOBAL)
13    ADD_DEPENDENCIES(${lib} pcre2)
14
15    GET_PROPERTY(MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
16    IF(MULTICONFIG)
17      SET(intdir "${CMAKE_CFG_INTDIR}/")
18    ELSE()
19      SET(intdir)
20    ENDIF()
21
22    # PCRE names static libraries differently depending on platform.
23    # On Windows, but not elsewhere, it adds "-static" to the library name,
24    # or "-staticd".
25    IF(WIN32)
26      SET(PCRE_STATIC "-static")
27    ELSE()
28      SET(PCRE_STATIC "")
29    ENDIF()
30
31    SET(file ${dir}/src/pcre2-build/${intdir}${CMAKE_STATIC_LIBRARY_PREFIX}${lib}${PCRE_STATIC}${CMAKE_STATIC_LIBRARY_SUFFIX})
32
33    IF(WIN32)
34      # Debug libary name.
35      # Same condition as in pcre2 CMakeLists.txt that adds "d"
36      SET(file_d ${dir}/src/pcre2-build/${intdir}${CMAKE_STATIC_LIBRARY_PREFIX}${lib}${PCRE_STATIC}d${CMAKE_STATIC_LIBRARY_SUFFIX})
37      SET_TARGET_PROPERTIES(${lib} PROPERTIES IMPORTED_LOCATION_DEBUG ${file_d})
38    ELSE()
39      SET(file_d)
40    ENDIF()
41    SET(byproducts ${byproducts} BUILD_BYPRODUCTS ${file} ${file_d})
42    SET_TARGET_PROPERTIES(${lib} PROPERTIES IMPORTED_LOCATION ${file})
43  ENDFOREACH()
44  FOREACH(v "" "_DEBUG" "_RELWITHDEBINFO" "_RELEASE" "_MINSIZEREL")
45    STRING(REPLACE "/WX" "" pcre2_flags${v} "${CMAKE_C_FLAGS${v}}")
46    IF(MSVC)
47      # Suppress a warning
48      STRING(APPEND pcre2_flags${v} " /wd4244 " )
49      # Disable asan support
50      STRING(REPLACE "-fsanitize=address" "" pcre2_flags${v} "${CMAKE_C_FLAGS${v}}")
51    ENDIF()
52  ENDFOREACH()
53  ExternalProject_Add(
54    pcre2
55    PREFIX   "${dir}"
56    URL "https://github.com/PhilipHazel/pcre2/releases/download/pcre2-10.39/pcre2-10.39.zip"
57    URL_MD5  e101c0ca9edb4b0af103bebe78ba52b0
58    INSTALL_COMMAND ""
59    CMAKE_ARGS
60      "-DCMAKE_WARN_DEPRECATED=FALSE"
61      "-DPCRE2_BUILD_TESTS=OFF"
62      "-DPCRE2_BUILD_PCRE2GREP=OFF"
63      "-DBUILD_SHARED_LIBS=OFF"
64      "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
65      "-DCMAKE_C_FLAGS=${pcre2_flags} ${PIC_FLAG}"
66      "-DCMAKE_C_FLAGS_DEBUG=${pcre2_flags_DEBUG}"
67      "-DCMAKE_C_FLAGS_RELWITHDEBINFO=${pcre2_flags_RELWITHDEBINFO}"
68      "-DCMAKE_C_FLAGS_RELEASE=${pcre2_flags_RELEASE}"
69      "-DCMAKE_C_FLAGS_MINSIZEREL=${pcre2_flags_MINSIZEREL}"
70      "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}"
71      ${stdlibs}
72      ${byproducts}
73  )
74SET_TARGET_PROPERTIES(pcre2 PROPERTIES EXCLUDE_FROM_ALL TRUE)
75ENDMACRO()
76
77MACRO (CHECK_PCRE)
78  IF(WITH_PCRE STREQUAL "system" OR WITH_PCRE STREQUAL "auto")
79    CHECK_LIBRARY_EXISTS(pcre2-8 pcre2_match_8 "" HAVE_PCRE2)
80  ENDIF()
81  IF(NOT HAVE_PCRE2 OR WITH_PCRE STREQUAL "bundled")
82    IF (WITH_PCRE STREQUAL "system")
83      MESSAGE(FATAL_ERROR "system pcre2-8 library is not found or unusable")
84    ENDIF()
85    BUNDLE_PCRE2()
86  ELSE()
87    CHECK_LIBRARY_EXISTS(pcre2-posix PCRE2regcomp "" NEEDS_PCRE2_DEBIAN_HACK)
88    IF(NEEDS_PCRE2_DEBIAN_HACK)
89      SET(PCRE2_DEBIAN_HACK "-Dregcomp=PCRE2regcomp -Dregexec=PCRE2regexec -Dregerror=PCRE2regerror -Dregfree=PCRE2regfree")
90    ENDIF()
91  ENDIF()
92ENDMACRO()
93
94