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