Rely on compiler intrinsics to identify regex engine. (#555)
Having the copts set on a per-target level can lead to ODR violations
in some cases. Avoid this by ensuring the regex engine is picked
through compiler intrinsics in the header directly.
diff --git a/BUILD.bazel b/BUILD.bazel
index 883ccc4..35605cc 100644
--- a/BUILD.bazel
+++ b/BUILD.bazel
@@ -1,7 +1,5 @@
licenses(["notice"])
-load("//bazel:have_regex.bzl", "have_regex_copts")
-
cc_library(
name = "benchmark",
srcs = glob([
@@ -9,7 +7,6 @@
"src/*.h",
]),
hdrs = ["include/benchmark/benchmark.h"],
- copts = have_regex_copts(),
strip_include_prefix = "include",
visibility = ["//visibility:public"],
)
diff --git a/bazel/BUILD b/bazel/BUILD
deleted file mode 100644
index dcbd437..0000000
--- a/bazel/BUILD
+++ /dev/null
@@ -1,16 +0,0 @@
-package(default_visibility = ["//:__subpackages__"])
-
-config_setting(
- name = "have_std_regex",
- values = {"define": "google_benchmark.have_regex=std"},
-)
-
-config_setting(
- name = "have_posix_regex",
- values = {"define": "google_benchmark.have_regex=posix"},
-)
-
-config_setting(
- name = "have_gnu_posix_regex",
- values = {"define": "google_benchmark.have_regex=gnu_posix"},
-)
diff --git a/bazel/have_regex.bzl b/bazel/have_regex.bzl
deleted file mode 100644
index 6ea5ba0..0000000
--- a/bazel/have_regex.bzl
+++ /dev/null
@@ -1,7 +0,0 @@
-def have_regex_copts():
- return select({
- "//bazel:have_std_regex": ["-DHAVE_STD_REGEX"],
- "//bazel:have_posix_regex": ["-DHAVE_POSIX_REGEX"],
- "//bazel:have_gnu_posix_regex": ["-DHAVE_GNU_POSIX_REGEX"],
- "//conditions:default": ["-DHAVE_STD_REGEX"],
- })
diff --git a/src/internal_macros.h b/src/internal_macros.h
index f299722..248ef26 100644
--- a/src/internal_macros.h
+++ b/src/internal_macros.h
@@ -39,6 +39,7 @@
#elif defined(_WIN32)
#define BENCHMARK_OS_WINDOWS 1
#elif defined(__APPLE__)
+ #define BENCHMARK_OS_APPLE 1
#include "TargetConditionals.h"
#if defined(TARGET_OS_MAC)
#define BENCHMARK_OS_MACOSX 1
diff --git a/src/re.h b/src/re.h
index 01e9736..924d2f0 100644
--- a/src/re.h
+++ b/src/re.h
@@ -17,19 +17,31 @@
#include "internal_macros.h"
+#if !defined(HAVE_STD_REGEX) && \
+ !defined(HAVE_GNU_POSIX_REGEX) && \
+ !defined(HAVE_POSIX_REGEX)
+ // No explicit regex selection; detect based on builtin hints.
+ #if defined(BENCHMARK_OS_LINUX) || defined(BENCHMARK_OS_APPLE)
+ #define HAVE_POSIX_REGEX 1
+ #elif __cplusplus >= 199711L
+ #define HAVE_STD_REGEX 1
+ #endif
+#endif
+
// Prefer C regex libraries when compiling w/o exceptions so that we can
// correctly report errors.
-#if defined(BENCHMARK_HAS_NO_EXCEPTIONS) && defined(HAVE_STD_REGEX) && \
+#if defined(BENCHMARK_HAS_NO_EXCEPTIONS) && \
+ defined(BENCHMARK_HAVE_STD_REGEX) && \
(defined(HAVE_GNU_POSIX_REGEX) || defined(HAVE_POSIX_REGEX))
-#undef HAVE_STD_REGEX
+ #undef HAVE_STD_REGEX
#endif
#if defined(HAVE_STD_REGEX)
-#include <regex>
+ #include <regex>
#elif defined(HAVE_GNU_POSIX_REGEX)
-#include <gnuregex.h>
+ #include <gnuregex.h>
#elif defined(HAVE_POSIX_REGEX)
-#include <regex.h>
+ #include <regex.h>
#else
#error No regular expression backend was found!
#endif
@@ -64,7 +76,7 @@
#elif defined(HAVE_POSIX_REGEX) || defined(HAVE_GNU_POSIX_REGEX)
regex_t re_;
#else
-#error No regular expression backend implementation available
+ #error No regular expression backend implementation available
#endif
};
diff --git a/test/BUILD b/test/BUILD
index 9e5d493..c268221 100644
--- a/test/BUILD
+++ b/test/BUILD
@@ -1,5 +1,3 @@
-load("//bazel:have_regex.bzl", "have_regex_copts")
-
NEEDS_GTEST_MAIN = [
"statistics_test.cc",
]
@@ -8,7 +6,7 @@
"-pedantic",
"-pedantic-errors",
"-std=c++11",
-] + have_regex_copts()
+]
TEST_ARGS = ["--benchmark_min_time=0.01"]