mirror of
https://github.com/google/benchmark.git
synced 2025-03-27 12:30:25 +08:00
Make generate_export_header.bzl work for Windows. (#1355)
* Make generate_export_header.bzl work for Windows. While I'm here, bring the generated code slightly closer to what CMake would generate nowadays. Fixes #1351. * Fix define. * Fix export_import_condition. * Fix guard.
This commit is contained in:
parent
e82a6ed704
commit
e057a7cee2
@ -55,6 +55,10 @@ cc_library(
|
|||||||
":windows": [],
|
":windows": [],
|
||||||
"//conditions:default": posix_copts,
|
"//conditions:default": posix_copts,
|
||||||
}),
|
}),
|
||||||
|
local_defines = select({
|
||||||
|
":windows": ["benchmark_EXPORTS"],
|
||||||
|
"//conditions:default": [],
|
||||||
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
cc_library(
|
cc_library(
|
||||||
|
@ -3,6 +3,15 @@ workspace(name = "com_github_google_benchmark")
|
|||||||
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
|
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
|
||||||
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
|
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "platforms",
|
||||||
|
sha256 = "379113459b0feaf6bfbb584a91874c065078aa673222846ac765f86661c27407",
|
||||||
|
urls = [
|
||||||
|
"https://mirror.bazel.build/github.com/bazelbuild/platforms/releases/download/0.0.5/platforms-0.0.5.tar.gz",
|
||||||
|
"https://github.com/bazelbuild/platforms/releases/download/0.0.5/platforms-0.0.5.tar.gz",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
http_archive(
|
http_archive(
|
||||||
name = "com_google_absl",
|
name = "com_google_absl",
|
||||||
sha256 = "f41868f7a938605c92936230081175d1eae87f6ea2c248f41077c8f88316f111",
|
sha256 = "f41868f7a938605c92936230081175d1eae87f6ea2c248f41077c8f88316f111",
|
||||||
|
@ -36,33 +36,44 @@
|
|||||||
#
|
#
|
||||||
# -*- python -*-
|
# -*- python -*-
|
||||||
|
|
||||||
def _make_identifier(s):
|
|
||||||
result = ""
|
|
||||||
for i in range(len(s)):
|
|
||||||
result += s[i] if s[i].isalnum() else "_"
|
|
||||||
|
|
||||||
return result
|
|
||||||
|
|
||||||
# Defines the implementation actions to generate_export_header.
|
# Defines the implementation actions to generate_export_header.
|
||||||
def _generate_export_header_impl(ctx):
|
def _generate_export_header_impl(ctx):
|
||||||
|
windows_constraint = ctx.attr._windows_constraint[platform_common.ConstraintValueInfo]
|
||||||
output = ctx.outputs.out
|
output = ctx.outputs.out
|
||||||
|
|
||||||
guard = _make_identifier(output.basename.upper())
|
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 = [
|
content = [
|
||||||
"#ifndef %s" % guard,
|
"#ifndef %s_H" % ctx.attr.export_macro_name,
|
||||||
"#define %s" % guard,
|
"#define %s_H" % ctx.attr.export_macro_name,
|
||||||
"",
|
"",
|
||||||
"#ifdef %s" % ctx.attr.static_define,
|
"#ifdef %s" % ctx.attr.static_define,
|
||||||
"# define %s" % ctx.attr.export_macro_name,
|
"# define %s" % ctx.attr.export_macro_name,
|
||||||
"# define %s" % ctx.attr.no_export_macro_name,
|
"# define %s" % ctx.attr.no_export_macro_name,
|
||||||
"#else",
|
"#else",
|
||||||
"# define %s __attribute__((visibility(\"default\")))" % ctx.attr.export_macro_name, # noqa
|
"# ifndef %s" % ctx.attr.export_macro_name,
|
||||||
"# define %s __attribute__((visibility(\"hidden\")))" % ctx.attr.no_export_macro_name, # noqa
|
"# 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",
|
"#endif",
|
||||||
"",
|
"",
|
||||||
"#ifndef %s" % ctx.attr.deprecated_macro_name,
|
"#ifndef %s" % ctx.attr.deprecated_macro_name,
|
||||||
"# define %s __attribute__ ((__deprecated__))" % ctx.attr.deprecated_macro_name, # noqa
|
"# define %s %s" % (ctx.attr.deprecated_macro_name, deprecated_attr),
|
||||||
"#endif",
|
"#endif",
|
||||||
"",
|
"",
|
||||||
"#ifndef %s" % ctx.attr.export_deprecated_macro_name,
|
"#ifndef %s" % ctx.attr.export_deprecated_macro_name,
|
||||||
@ -82,12 +93,14 @@ def _generate_export_header_impl(ctx):
|
|||||||
_generate_export_header_gen = rule(
|
_generate_export_header_gen = rule(
|
||||||
attrs = {
|
attrs = {
|
||||||
"out": attr.output(mandatory = True),
|
"out": attr.output(mandatory = True),
|
||||||
|
"export_import_condition": attr.string(),
|
||||||
"export_macro_name": attr.string(),
|
"export_macro_name": attr.string(),
|
||||||
"deprecated_macro_name": attr.string(),
|
"deprecated_macro_name": attr.string(),
|
||||||
"export_deprecated_macro_name": attr.string(),
|
"export_deprecated_macro_name": attr.string(),
|
||||||
"no_export_macro_name": attr.string(),
|
"no_export_macro_name": attr.string(),
|
||||||
"no_export_deprecated_macro_name": attr.string(),
|
"no_export_deprecated_macro_name": attr.string(),
|
||||||
"static_define": attr.string(),
|
"static_define": attr.string(),
|
||||||
|
"_windows_constraint": attr.label(default = "@platforms//os:windows"),
|
||||||
},
|
},
|
||||||
output_to_genfiles = True,
|
output_to_genfiles = True,
|
||||||
implementation = _generate_export_header_impl,
|
implementation = _generate_export_header_impl,
|
||||||
@ -97,6 +110,7 @@ def generate_export_header(
|
|||||||
lib = None,
|
lib = None,
|
||||||
name = None,
|
name = None,
|
||||||
out = None,
|
out = None,
|
||||||
|
export_import_condition = None,
|
||||||
export_macro_name = None,
|
export_macro_name = None,
|
||||||
deprecated_macro_name = None,
|
deprecated_macro_name = None,
|
||||||
export_deprecated_macro_name = None,
|
export_deprecated_macro_name = None,
|
||||||
@ -121,6 +135,9 @@ def generate_export_header(
|
|||||||
name = "__%s_export_h" % lib
|
name = "__%s_export_h" % lib
|
||||||
if out == None:
|
if out == None:
|
||||||
out = "%s_export.h" % lib
|
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:
|
if export_macro_name == None:
|
||||||
export_macro_name = "%s_EXPORT" % lib.upper()
|
export_macro_name = "%s_EXPORT" % lib.upper()
|
||||||
if deprecated_macro_name == None:
|
if deprecated_macro_name == None:
|
||||||
@ -138,6 +155,7 @@ def generate_export_header(
|
|||||||
_generate_export_header_gen(
|
_generate_export_header_gen(
|
||||||
name = name,
|
name = name,
|
||||||
out = out,
|
out = out,
|
||||||
|
export_import_condition = export_import_condition,
|
||||||
export_macro_name = export_macro_name,
|
export_macro_name = export_macro_name,
|
||||||
deprecated_macro_name = deprecated_macro_name,
|
deprecated_macro_name = deprecated_macro_name,
|
||||||
export_deprecated_macro_name = export_deprecated_macro_name,
|
export_deprecated_macro_name = export_deprecated_macro_name,
|
||||||
|
Loading…
Reference in New Issue
Block a user