summaryrefslogtreecommitdiffstats
path: root/cmake/modules/FindPCRE.cmake
blob: b2707ab0c21e35f5d9ec67b80dd5f7fcca76395b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#.rst:
# FindPCRE
# --------
# Finds the PCRECPP library
#
# This will define the following variables::
#
# PCRE_FOUND - system has libpcrecpp
# PCRE_INCLUDE_DIRS - the libpcrecpp include directory
# PCRE_LIBRARIES - the libpcrecpp libraries
# PCRE_DEFINITIONS - the libpcrecpp definitions
#
# and the following imported targets::
#
#   PCRE::PCRECPP - The PCRECPP library
#   PCRE::PCRE    - The PCRE library

if(NOT PCRE::PCRE)
  if(ENABLE_INTERNAL_PCRE)
    include(cmake/scripts/common/ModuleHelpers.cmake)

    set(MODULE_LC pcre)

    SETUP_BUILD_VARS()

    # Check for existing PCRE. If version >= PCRE-VERSION file version, dont build
    find_package(PCRE CONFIG QUIET)

    if(PCRE_VERSION VERSION_LESS ${${MODULE}_VER})

      set(PCRE_VERSION ${${MODULE}_VER})
      set(PCRE_DEBUG_POSTFIX d)

      set(patches "${CORE_SOURCE_DIR}/tools/depends/target/${MODULE_LC}/001-all-cmakeconfig.patch"
                  "${CORE_SOURCE_DIR}/tools/depends/target/${MODULE_LC}/002-all-enable_docs_pc.patch"
                  "${CORE_SOURCE_DIR}/tools/depends/target/${MODULE_LC}/003-all-postfix.patch"
                  "${CORE_SOURCE_DIR}/tools/depends/target/${MODULE_LC}/004-win-pdb.patch"
                  "${CORE_SOURCE_DIR}/tools/depends/target/${MODULE_LC}/jit_aarch64.patch")

      if(CORE_SYSTEM_NAME STREQUAL darwin_embedded)
        list(APPEND patches "${CORE_SOURCE_DIR}/tools/depends/target/${MODULE_LC}/tvos-bitcode-fix.patch"
                            "${CORE_SOURCE_DIR}/tools/depends/target/${MODULE_LC}/ios-clear_cache.patch")
      endif()

      generate_patchcommand("${patches}")

      set(CMAKE_ARGS -DPCRE_NEWLINE=ANYCRLF
                     -DPCRE_NO_RECURSE=ON
                     -DPCRE_MATCH_LIMIT_RECURSION=1500
                     -DPCRE_SUPPORT_JIT=ON
                     -DPCRE_SUPPORT_PCREGREP_JIT=ON
                     -DPCRE_SUPPORT_UTF=ON
                     -DPCRE_SUPPORT_UNICODE_PROPERTIES=ON
                     -DPCRE_SUPPORT_LIBZ=OFF
                     -DPCRE_SUPPORT_LIBBZ2=OFF
                     -DPCRE_BUILD_PCREGREP=OFF
                     -DPCRE_BUILD_TESTS=OFF)

      if(WIN32 OR WINDOWS_STORE)
        list(APPEND CMAKE_ARGS -DINSTALL_MSVC_PDB=ON)
      elseif(CORE_SYSTEM_NAME STREQUAL android)
        # CMake CheckFunctionExists incorrectly detects strtoq for android
        list(APPEND CMAKE_ARGS -DHAVE_STRTOQ=0)
      endif()

      # populate PCRECPP lib without a separate module
      if(NOT CORE_SYSTEM_NAME MATCHES windows)
        # Non windows platforms have a lib prefix for the lib artifact
        set(_libprefix "lib")
      endif()
      # regex used to get platform extension (eg lib for windows, .a for unix)
      string(REGEX REPLACE "^.*\\." "" _LIBEXT ${${MODULE}_BYPRODUCT})
      set(PCRECPP_LIBRARY_DEBUG ${DEP_LOCATION}/lib/${_libprefix}pcrecpp${${MODULE}_DEBUG_POSTFIX}.${_LIBEXT})
      set(PCRECPP_LIBRARY_RELEASE ${DEP_LOCATION}/lib/${_libprefix}pcrecpp.${_LIBEXT})

      BUILD_DEP_TARGET()

    else()
      # Populate paths for find_package_handle_standard_args
      find_path(PCRE_INCLUDE_DIR pcre.h)

      find_library(PCRECPP_LIBRARY_RELEASE NAMES pcrecpp)
      find_library(PCRECPP_LIBRARY_DEBUG NAMES pcrecppd)

      find_library(PCRE_LIBRARY_RELEASE NAMES pcre)
      find_library(PCRE_LIBRARY_DEBUG NAMES pcred)
    endif()
  else()

    if(PKG_CONFIG_FOUND)
      pkg_check_modules(PC_PCRE libpcrecpp QUIET)
    endif()

    find_path(PCRE_INCLUDE_DIR pcrecpp.h
                               PATHS ${PC_PCRE_INCLUDEDIR})
    find_library(PCRECPP_LIBRARY_RELEASE NAMES pcrecpp
                                         PATHS ${PC_PCRE_LIBDIR})
    find_library(PCRE_LIBRARY_RELEASE NAMES pcre
                                      PATHS ${PC_PCRE_LIBDIR})
    find_library(PCRECPP_LIBRARY_DEBUG NAMES pcrecppd
                                       PATHS ${PC_PCRE_LIBDIR})
    find_library(PCRE_LIBRARY_DEBUG NAMES pcred
                                       PATHS ${PC_PCRE_LIBDIR})
    set(PCRE_VERSION ${PC_PCRE_VERSION})

  endif()

  include(SelectLibraryConfigurations)
  select_library_configurations(PCRECPP)
  select_library_configurations(PCRE)

  include(FindPackageHandleStandardArgs)
  find_package_handle_standard_args(PCRE
                                    REQUIRED_VARS PCRECPP_LIBRARY PCRE_LIBRARY PCRE_INCLUDE_DIR
                                    VERSION_VAR PCRE_VERSION)

  if(PCRE_FOUND)
    set(PCRE_LIBRARIES ${PCRECPP_LIBRARY} ${PCRE_LIBRARY})
    set(PCRE_INCLUDE_DIRS ${PCRE_INCLUDE_DIR})
    if(WIN32)
      set(PCRE_DEFINITIONS -DPCRE_STATIC=1)
    endif()

    if(NOT TARGET PCRE::PCRE)
      add_library(PCRE::PCRE UNKNOWN IMPORTED)
      if(PCRE_LIBRARY_RELEASE)
        set_target_properties(PCRE::PCRE PROPERTIES
                                         IMPORTED_CONFIGURATIONS RELEASE
                                         IMPORTED_LOCATION "${PCRE_LIBRARY_RELEASE}")
      endif()
      if(PCRE_LIBRARY_DEBUG)
        set_target_properties(PCRE::PCRE PROPERTIES
                                         IMPORTED_CONFIGURATIONS DEBUG
                                         IMPORTED_LOCATION "${PCRE_LIBRARY_DEBUG}")
      endif()
      set_target_properties(PCRE::PCRE PROPERTIES
                                       INTERFACE_INCLUDE_DIRECTORIES "${PCRE_INCLUDE_DIR}")
      if(WIN32)
        set_target_properties(PCRE::PCRE PROPERTIES
                                         INTERFACE_COMPILE_DEFINITIONS PCRE_STATIC=1)
      endif()

    endif()
    if(NOT TARGET PCRE::PCRECPP)
      add_library(PCRE::PCRECPP UNKNOWN IMPORTED)
      if(PCRE_LIBRARY_RELEASE)
        set_target_properties(PCRE::PCRECPP PROPERTIES
                                            IMPORTED_CONFIGURATIONS RELEASE
                                            IMPORTED_LOCATION "${PCRECPP_LIBRARY_RELEASE}")
      endif()
      if(PCRE_LIBRARY_DEBUG)
        set_target_properties(PCRE::PCRECPP PROPERTIES
                                            IMPORTED_CONFIGURATIONS DEBUG
                                            IMPORTED_LOCATION "${PCRECPP_LIBRARY_DEBUG}")
      endif()
      set_target_properties(PCRE::PCRECPP PROPERTIES
                                          INTERFACE_LINK_LIBRARIES PCRE::PCRE)
    endif()
    if(TARGET pcre)
      add_dependencies(PCRE::PCRE pcre)
    endif()
    set_property(GLOBAL APPEND PROPERTY INTERNAL_DEPS_PROP PCRE::PCRE)
  else()
    if(PCRE_FIND_REQUIRED)
      message(FATAL_ERROR "PCRE not found. Possibly use -DENABLE_INTERNAL_PCRE=ON to build PCRE")
    endif()
  endif()

  mark_as_advanced(PCRE_INCLUDE_DIR PCRECPP_LIBRARY PCRE_LIBRARY)
endif()