diff options
author | Edward Thomson <ethomson@edwardthomson.com> | 2019-05-19 10:09:55 +0100 |
---|---|---|
committer | Edward Thomson <ethomson@edwardthomson.com> | 2019-05-19 11:12:13 +0100 |
commit | 69ecdad5a494957afcf2447cc6edac6934f2b1b6 (patch) | |
tree | fdf4e7fd67ef9af2aefbe488a0453a3f9aaf31af | |
parent | 622166c446f25db02b31ce6059fae96cf0b6eeb2 (diff) | |
download | libgit2-69ecdad5a494957afcf2447cc6edac6934f2b1b6.tar.gz |
regex: use system PCRE if available
Attempt to locate a system-installed version of PCRE and use its POSIX
compatibility layer, if possible.
-rw-r--r-- | cmake/Modules/FindPCRE.cmake | 38 | ||||
-rw-r--r-- | src/CMakeLists.txt | 8 | ||||
-rw-r--r-- | src/posix_regex.h | 12 |
3 files changed, 54 insertions, 4 deletions
diff --git a/cmake/Modules/FindPCRE.cmake b/cmake/Modules/FindPCRE.cmake new file mode 100644 index 000000000..74ed61e53 --- /dev/null +++ b/cmake/Modules/FindPCRE.cmake @@ -0,0 +1,38 @@ +# Copyright (C) 2007-2009 LuaDist. +# Created by Peter Kapec <kapecp@gmail.com> +# Redistribution and use of this file is allowed according to the terms of the MIT license. +# For details see the COPYRIGHT file distributed with LuaDist. +# Note: +# Searching headers and libraries is very simple and is NOT as powerful as scripts +# distributed with CMake, because LuaDist defines directories to search for. +# Everyone is encouraged to contact the author with improvements. Maybe this file +# becomes part of CMake distribution sometimes. + +# - Find pcre +# Find the native PCRE headers and libraries. +# +# PCRE_INCLUDE_DIRS - where to find pcre.h, etc. +# PCRE_LIBRARIES - List of libraries when using pcre. +# PCRE_FOUND - True if pcre found. + +# Look for the header file. +FIND_PATH(PCRE_INCLUDE_DIR NAMES pcreposix.h) + +# Look for the library. +FIND_LIBRARY(PCRE_LIBRARY NAMES pcre) +FIND_LIBRARY(PCRE_POSIX_LIBRARY NAMES pcreposix) + +# Handle the QUIETLY and REQUIRED arguments and set PCRE_FOUND to TRUE if all listed variables are TRUE. +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(PCRE DEFAULT_MSG PCRE_LIBRARY PCRE_POSIX_LIBRARY PCRE_INCLUDE_DIR) + +# Copy the results to the output variables. +IF(PCRE_FOUND) + SET(PCRE_LIBRARIES ${PCRE_LIBRARY} ${PCRE_POSIX_LIBRARY}) + SET(PCRE_INCLUDE_DIRS ${PCRE_INCLUDE_DIR}) +ELSE(PCRE_FOUND) + SET(PCRE_LIBRARIES) + SET(PCRE_INCLUDE_DIRS) +ENDIF(PCRE_FOUND) + +MARK_AS_ADVANCED(PCRE_INCLUDE_DIRS PCRE_LIBRARIES) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 79d7b55f2..852a2af24 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -290,13 +290,14 @@ ELSE() ENDIF() # Specify regular expression implementation +FIND_PACKAGE(PCRE) + IF(REGEX STREQUAL "") CHECK_SYMBOL_EXISTS(regcomp_l "regex.h;xlocale.h" HAVE_REGCOMP_L) - CHECK_SYMBOL_EXISTS(pcre_regcomp "pcreposix.h" HAVE_PCRE) IF(HAVE_REGCOMP_L) SET(REGEX "regcomp_l") - ELSEIF(HAVE_PCRE) + ELSEIF(PCRE_FOUND) SET(REGEX "pcre") ELSE() SET(REGEX "builtin") @@ -309,6 +310,9 @@ IF(REGEX STREQUAL "regcomp_l") ELSEIF(REGEX STREQUAL "pcre") ADD_FEATURE_INFO(regex ON "using system PCRE") SET(GIT_REGEX_PCRE 1) + + LIST(APPEND LIBGIT2_SYSTEM_INCLUDES ${PCRE_INCLUDE_DIRS}) + LIST(APPEND LIBGIT2_LIBS ${PCRE_LIBRARIES}) ELSEIF(REGEX STREQUAL "regcomp") ADD_FEATURE_INFO(regex ON "using system regcomp") SET(GIT_REGEX_REGCOMP 1) diff --git a/src/posix_regex.h b/src/posix_regex.h index a0482c915..e76f69c8f 100644 --- a/src/posix_regex.h +++ b/src/posix_regex.h @@ -30,10 +30,18 @@ # define p_regexec pcre_regexec # define p_regfree pcre_regfree -/* Otherwise, use regcomp_l if available, or regcomp if not. */ +/* + * Use the system-provided `regex` routines, whether that's via the + * PCRE emulation layer, or libc, preferring `regcomp_l` it's available. + */ + #else -# include <regex.h> +# ifdef GIT_REGEX_PCRE +# include <pcreposix.h> +# else +# include <regex.h> +# endif # define P_REG_EXTENDED REG_EXTENDED # define P_REG_ICASE REG_ICASE |