Stop generating the export header and just check it in (#1435)
* Stop generating the export header and just check it in
* format the new header
* support windows
* format the header again
* avoid depending on internal macro
* ensure we define the right thing for windows static builds
* support older cmake
* and for tests
diff --git a/BUILD.bazel b/BUILD.bazel
index 872adb0..1621504 100644
--- a/BUILD.bazel
+++ b/BUILD.bazel
@@ -1,14 +1,5 @@
licenses(["notice"])
-load("//:config/generate_export_header.bzl", "generate_export_header")
-
-# Generate header to provide ABI export symbols
-generate_export_header(
- out = "include/benchmark/export.h",
- lib = "benchmark",
- static_define = "BENCHMARK_STATIC_DEFINE",
-)
-
config_setting(
name = "qnx",
constraint_values = ["@platforms//os:qnx"],
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f8c86c3..a44613e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -130,7 +130,6 @@
include(CheckCXXCompilerFlag)
include(CheckLibraryExists)
include(CXXFeatureCheck)
-include(GenerateExportHeader)
check_library_exists(rt shm_open "" HAVE_LIB_RT)
diff --git a/LICENSE b/LICENSE
index a5c40b3..d645695 100644
--- a/LICENSE
+++ b/LICENSE
@@ -200,35 +200,3 @@
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-
-
-Only benchmark/config/generate_export_header.bzl depends on the following licence:
-
- BSD 3-Clause License
-
-Copyright (c) [year], [fullname]
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-3. Neither the name of the copyright holder nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/config/generate_export_header.bzl b/config/generate_export_header.bzl
deleted file mode 100644
index bf98092..0000000
--- a/config/generate_export_header.bzl
+++ /dev/null
@@ -1,168 +0,0 @@
-#
-# Original file is located at:
-# https://github.com/RobotLocomotion/drake/blob/bad032aeb09b13c7f8c87ed64b624c8d1e9adb30/tools/workspace/generate_export_header.bzl
-#
-# All components of Drake are licensed under the BSD 3-Clause License
-# shown below. Where noted in the source code, some portions may
-# be subject to other permissive, non-viral licenses.
-#
-# Copyright 2012-2016 Robot Locomotion Group @ CSAIL
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-# Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer. Redistributions
-# in binary form must reproduce the above copyright notice, this list of
-# conditions and the following disclaimer in the documentation and/or
-# other materials provided with the distribution. Neither the name of
-# the Massachusetts Institute of Technology nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# -*- python -*-
-
-# Defines the implementation actions to generate_export_header.
-def _generate_export_header_impl(ctx):
- windows_constraint = ctx.attr._windows_constraint[platform_common.ConstraintValueInfo]
- output = ctx.outputs.out
-
- if ctx.target_platform_has_constraint(windows_constraint):
- export_attr = "__declspec(dllexport)"
- import_attr = "__declspec(dllimport)"
- no_export_attr = ""
- deprecated_attr = "__declspec(deprecated)"
- else:
- export_attr = "__attribute__((visibility(\"default\")))"
- import_attr = "__attribute__((visibility(\"default\")))"
- no_export_attr = "__attribute__((visibility(\"hidden\")))"
- deprecated_attr = "__attribute__((__deprecated__))"
-
- content = [
- "#ifndef %s_H" % ctx.attr.export_macro_name,
- "#define %s_H" % ctx.attr.export_macro_name,
- "",
- "#ifdef %s" % ctx.attr.static_define,
- "# define %s" % ctx.attr.export_macro_name,
- "# define %s" % ctx.attr.no_export_macro_name,
- "#else",
- "# ifndef %s" % ctx.attr.export_macro_name,
- "# ifdef %s" % ctx.attr.export_import_condition,
- "# define %s %s" % (ctx.attr.export_macro_name, export_attr),
- "# else",
- "# define %s %s" % (ctx.attr.export_macro_name, import_attr),
- "# endif",
- "# endif",
- "# ifndef %s" % ctx.attr.no_export_macro_name,
- "# define %s %s" % (ctx.attr.no_export_macro_name, no_export_attr),
- "# endif",
- "#endif",
- "",
- "#ifndef %s" % ctx.attr.deprecated_macro_name,
- "# define %s %s" % (ctx.attr.deprecated_macro_name, deprecated_attr),
- "#endif",
- "",
- "#ifndef %s" % ctx.attr.export_deprecated_macro_name,
- "# define %s %s %s" % (ctx.attr.export_deprecated_macro_name, ctx.attr.export_macro_name, ctx.attr.deprecated_macro_name), # noqa
- "#endif",
- "",
- "#ifndef %s" % ctx.attr.no_export_deprecated_macro_name,
- "# define %s %s %s" % (ctx.attr.no_export_deprecated_macro_name, ctx.attr.no_export_macro_name, ctx.attr.deprecated_macro_name), # noqa
- "#endif",
- "",
- "#endif",
- ]
-
- ctx.actions.write(output = output, content = "\n".join(content) + "\n")
-
-# Defines the rule to generate_export_header.
-_generate_export_header_gen = rule(
- attrs = {
- "out": attr.output(mandatory = True),
- "export_import_condition": attr.string(),
- "export_macro_name": attr.string(),
- "deprecated_macro_name": attr.string(),
- "export_deprecated_macro_name": attr.string(),
- "no_export_macro_name": attr.string(),
- "no_export_deprecated_macro_name": attr.string(),
- "static_define": attr.string(),
- "_windows_constraint": attr.label(default = "@platforms//os:windows"),
- },
- output_to_genfiles = True,
- implementation = _generate_export_header_impl,
-)
-
-def generate_export_header(
- lib = None,
- name = None,
- out = None,
- export_import_condition = None,
- export_macro_name = None,
- deprecated_macro_name = None,
- export_deprecated_macro_name = None,
- no_export_macro_name = None,
- no_export_deprecated_macro_name = None,
- static_define = None,
- **kwargs):
- """
- Creates a rule to generate an export header for a named library.
-
- This is an incomplete implementation of CMake's generate_export_header. (In
- particular, it assumes a platform that uses
- __attribute__((visibility("default"))) to decorate exports.)
-
- By default, the rule will have a mangled name related to the library name,
- and will produce "<lib>_export.h".
-
- The CMake documentation of the generate_export_header macro is:
- https://cmake.org/cmake/help/latest/module/GenerateExportHeader.html
-
- """
-
- if name == None:
- name = "__%s_export_h" % lib
- if out == None:
- out = "%s_export.h" % lib
- if export_import_condition == None:
- # CMake does not uppercase the <lib>_EXPORTS define.
- export_import_condition = "%s_EXPORTS" % lib
- if export_macro_name == None:
- export_macro_name = "%s_EXPORT" % lib.upper()
- if deprecated_macro_name == None:
- deprecated_macro_name = "%s_DEPRECATED" % lib.upper()
- if export_deprecated_macro_name == None:
- export_deprecated_macro_name = "%s_DEPRECATED_EXPORT" % lib.upper()
- if no_export_macro_name == None:
- no_export_macro_name = "%s_NO_EXPORT" % lib.upper()
- if no_export_deprecated_macro_name == None:
- no_export_deprecated_macro_name = \
- "%s_DEPRECATED_NO_EXPORT" % lib.upper()
- if static_define == None:
- static_define = "%s_STATIC_DEFINE" % lib.upper()
-
- _generate_export_header_gen(
- name = name,
- out = out,
- export_import_condition = export_import_condition,
- export_macro_name = export_macro_name,
- deprecated_macro_name = deprecated_macro_name,
- export_deprecated_macro_name = export_deprecated_macro_name,
- no_export_macro_name = no_export_macro_name,
- no_export_deprecated_macro_name = no_export_deprecated_macro_name,
- static_define = static_define,
- **kwargs
- )
diff --git a/include/benchmark/export.h b/include/benchmark/export.h
new file mode 100644
index 0000000..f96f859
--- /dev/null
+++ b/include/benchmark/export.h
@@ -0,0 +1,47 @@
+#ifndef BENCHMARK_EXPORT_H
+#define BENCHMARK_EXPORT_H
+
+#if defined(_WIN32)
+#define EXPORT_ATTR __declspec(dllexport)
+#define IMPORT_ATTR __declspec(dllimport)
+#define NO_EXPORT_ATTR
+#define DEPRECATED_ATTR __declspec(deprecated)
+#else // _WIN32
+#define EXPORT_ATTR __attribute__((visibility("default")))
+#define IMPORT_ATTR __attribute__((visibility("default")))
+#define NO_EXPORT_ATTR __attribute__((visibility("hidden")))
+#define DEPRECATE_ATTR __attribute__((__deprecated__))
+#endif // _WIN32
+
+#ifdef BENCHMARK_STATIC_DEFINE
+#define BENCHMARK_EXPORT
+#define BENCHMARK_NO_EXPORT
+#else // BENCHMARK_STATIC_DEFINE
+#ifndef BENCHMARK_EXPORT
+#ifdef benchmark_EXPORTS
+/* We are building this library */
+#define BENCHMARK_EXPORT EXPORT_ATTR
+#else // benchmark_EXPORTS
+/* We are using this library */
+#define BENCHMARK_EXPORT IMPORT_ATTR
+#endif // benchmark_EXPORTS
+#endif // !BENCHMARK_EXPORT
+
+#ifndef BENCHMARK_NO_EXPORT
+#define BENCHMARK_NO_EXPORT NO_EXPORT_ATTR
+#endif // !BENCHMARK_NO_EXPORT
+#endif // BENCHMARK_STATIC_DEFINE
+
+#ifndef BENCHMARK_DEPRECATED
+#define BENCHMARK_DEPRECATED DEPRECATE_ATTR
+#endif // BENCHMARK_DEPRECATED
+
+#ifndef BENCHMARK_DEPRECATED_EXPORT
+#define BENCHMARK_DEPRECATED_EXPORT BENCHMARK_EXPORT BENCHMARK_DEPRECATED
+#endif // BENCHMARK_DEPRECATED_EXPORT
+
+#ifndef BENCHMARK_DEPRECATED_NO_EXPORT
+#define BENCHMARK_DEPRECATED_NO_EXPORT BENCHMARK_NO_EXPORT BENCHMARK_DEPRECATED
+#endif // BENCHMARK_DEPRECATED_EXPORT
+
+#endif /* BENCHMARK_EXPORT_H */
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 05ea023..3961f81 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -29,9 +29,6 @@
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include>
)
-generate_export_header(benchmark
- EXPORT_FILE_NAME ${PROJECT_BINARY_DIR}/include/benchmark/export.h)
-
# libpfm, if available
if (HAVE_LIBPFM)
target_link_libraries(benchmark PRIVATE pfm)
@@ -58,6 +55,10 @@
target_link_libraries(benchmark PRIVATE kstat)
endif()
+if (NOT BUILD_SHARED_LIBS)
+ add_definitions(-DBENCHMARK_STATIC_DEFINE)
+endif()
+
# Benchmark main library
add_library(benchmark_main "benchmark_main.cc")
add_library(benchmark::benchmark_main ALIAS benchmark_main)
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index d528ee9..a49ab19 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -24,6 +24,10 @@
endforeach()
endif()
+if (NOT BUILD_SHARED_LIBS)
+ add_definitions(-DBENCHMARK_STATIC_DEFINE)
+endif()
+
check_cxx_compiler_flag(-O3 BENCHMARK_HAS_O3_FLAG)
set(BENCHMARK_O3_FLAG "")
if (BENCHMARK_HAS_O3_FLAG)