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)