Commit 085ed2c6 by Patrick Steinhardt

cmake: correctly detect if system provides `regcomp`

We assume that if we are on Win32, Amiga OS, Solaris or SunOS,
that the regcomp(3P) function cannot be provided by the system.
Thus we will in these cases always include our own, bundled regex
sources to make a regcomp implementation available. This test is
obviously very fragile, and we have seen it fail on MSYS2/MinGW
systems, which do in fact provide the regcomp symbol. The effect
is that during compilation, we will use the "regex.h" header
provided by MinGW, but use symbols provided by ourselves. This
in fact may cause subtle memory layout issues, as the structure
made available via MinGW doesn't match what our bundled code
expects.

There's one more problem with our regex detection: on the listed
platforms, we will incorrectly include the bundled regex code
even in case where the system provides regcomp_l(3), but it will
never be used for anything.

Fix the issue by improving our regcomp detection code. Instead of
relying on a fragile listing of platforms, we can just use
`CHECK_FUNCTION_EXISTS` instead. This will not in fact avoid the
header-ordering problem. But we can assume that as soon as a
system-provided "regex.h" header is provided, that
`CHECK_FUNCTION_EXISTS` will now correctly find the desired
symbol and thus not include our bundled regex code.

(cherry picked from commit 13cb9f7a)
parent 4ec32d36
...@@ -48,11 +48,23 @@ IF (ENABLE_TRACE STREQUAL "ON") ...@@ -48,11 +48,23 @@ IF (ENABLE_TRACE STREQUAL "ON")
ENDIF() ENDIF()
ADD_FEATURE_INFO(tracing GIT_TRACE "tracing support") ADD_FEATURE_INFO(tracing GIT_TRACE "tracing support")
# Use `regcomp_l` if available
CHECK_SYMBOL_EXISTS(regcomp_l "regex.h;xlocale.h" HAVE_REGCOMP_L) CHECK_SYMBOL_EXISTS(regcomp_l "regex.h;xlocale.h" HAVE_REGCOMP_L)
IF (HAVE_REGCOMP_L) IF (HAVE_REGCOMP_L)
SET(GIT_USE_REGCOMP_L 1) SET(GIT_USE_REGCOMP_L 1)
ENDIF () ENDIF ()
# Otherwise, we either want to use system's `regcomp` or our
# bundled regcomp code, if system doesn't provide `regcomp`.
IF(NOT HAVE_REGCOMP_L)
CHECK_FUNCTION_EXISTS(regcomp HAVE_REGCOMP)
IF(NOT HAVE_REGCOMP)
ADD_SUBDIRECTORY("${libgit2_SOURCE_DIR}/deps/regex" "${libgit2_BINARY_DIR}/deps/regex")
LIST(APPEND LIBGIT2_SYSTEM_INCLUDES "${libgit2_SOURCE_DIR}/deps/regex")
LIST(APPEND LIBGIT2_OBJECTS $<TARGET_OBJECTS:regex>)
ENDIF()
ENDIF()
CHECK_FUNCTION_EXISTS(futimens HAVE_FUTIMENS) CHECK_FUNCTION_EXISTS(futimens HAVE_FUTIMENS)
IF (HAVE_FUTIMENS) IF (HAVE_FUTIMENS)
SET(GIT_USE_FUTIMENS 1) SET(GIT_USE_FUTIMENS 1)
...@@ -294,13 +306,6 @@ ELSE() ...@@ -294,13 +306,6 @@ ELSE()
MESSAGE(FATAL_ERROR "Asked for unknown SHA1 backend ${SHA1_BACKEND}") MESSAGE(FATAL_ERROR "Asked for unknown SHA1 backend ${SHA1_BACKEND}")
ENDIF() ENDIF()
# Include POSIX regex when it is required
IF(WIN32 OR AMIGA OR CMAKE_SYSTEM_NAME MATCHES "(Solaris|SunOS)")
ADD_SUBDIRECTORY("${libgit2_SOURCE_DIR}/deps/regex" "${libgit2_BINARY_DIR}/deps/regex")
LIST(APPEND LIBGIT2_SYSTEM_INCLUDES "${libgit2_SOURCE_DIR}/deps/regex")
LIST(APPEND LIBGIT2_OBJECTS $<TARGET_OBJECTS:regex>)
ENDIF()
# Optional external dependency: http-parser # Optional external dependency: http-parser
FIND_PACKAGE(HTTP_Parser) FIND_PACKAGE(HTTP_Parser)
IF (USE_EXT_HTTP_PARSER AND HTTP_PARSER_FOUND AND HTTP_PARSER_VERSION_MAJOR EQUAL 2) IF (USE_EXT_HTTP_PARSER AND HTTP_PARSER_FOUND AND HTTP_PARSER_VERSION_MAJOR EQUAL 2)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment