Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add windows support for bazel build #488

Merged
merged 3 commits into from
Nov 20, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .bazelci/presubmit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,11 @@ platforms:
- "..."
test_targets:
- "..."
windows:
# Optional: use VS 2017 instead of 2015.
environment:
BAZEL_VC: "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\BuildTools\\VC"
build_targets:
- "..."
test_targets:
- "..."
246 changes: 142 additions & 104 deletions bazel/glog.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -7,95 +7,142 @@
# https://github.com/google/glog/issues/61
# https://github.com/google/glog/files/393474/BUILD.txt

def glog_library(namespace='google', with_gflags=1, **kwargs):
if native.repository_name() != '@':
gendir = '$(GENDIR)/external/' + native.repository_name().lstrip('@')
def glog_library(namespace = "google", with_gflags = 1, **kwargs):
if native.repository_name() != "@":
gendir = "$(GENDIR)/external/" + native.repository_name().lstrip("@")
else:
gendir = '$(GENDIR)'
gendir = "$(GENDIR)"

common_copts = [
"-DGLOG_BAZEL_BUILD",
"-DHAVE_STDINT_H",
"-DHAVE_STRING_H",
"-DHAVE_UNWIND_H",
] + (["-DHAVE_LIB_GFLAGS"] if with_gflags else [])

linux_or_darwin_copts = [
# Disable warnings that exists in glog.
"-Wno-sign-compare",
"-Wno-unused-function",
"-Wno-unused-local-typedefs",
"-Wno-unused-variable",
# Inject a C++ namespace.
"-DGOOGLE_NAMESPACE='%s'" % namespace,
# Allows src/base/mutex.h to include pthread.h.
"-DHAVE_PTHREAD",
# Allows src/logging.cc to determine the host name.
"-DHAVE_SYS_UTSNAME_H",
# For src/utilities.cc.
"-DHAVE_SYS_SYSCALL_H",
"-DHAVE_SYS_TIME_H",
# Enable dumping stacktrace upon sigaction.
"-DHAVE_SIGACTION",
# For logging.cc.
"-DHAVE_PREAD",
"-DHAVE___ATTRIBUTE__",
"-I%s/glog_internal" % gendir,
]

darwin_only_copts = [
# For stacktrace.
"-DHAVE_DLADDR",
]

windows_only_copts = [
"-DHAVE_SNPRINTF",
]

gflags_deps = ["@com_github_gflags_gflags//:gflags"] if with_gflags else []

native.cc_library(
name = 'glog',
visibility = [ '//visibility:public' ],
name = "glog",
visibility = ["//visibility:public"],
srcs = [
':config_h',
'src/base/commandlineflags.h',
'src/base/googleinit.h',
'src/base/mutex.h',
'src/demangle.cc',
'src/demangle.h',
'src/logging.cc',
'src/raw_logging.cc',
'src/signalhandler.cc',
'src/stacktrace.h',
'src/stacktrace_generic-inl.h',
'src/stacktrace_libunwind-inl.h',
'src/stacktrace_powerpc-inl.h',
'src/stacktrace_windows-inl.h',
'src/stacktrace_x86-inl.h',
'src/stacktrace_x86_64-inl.h',
'src/symbolize.cc',
'src/symbolize.h',
'src/utilities.cc',
'src/utilities.h',
'src/vlog_is_on.cc',
],
hdrs = [
':logging_h',
':raw_logging_h',
':stl_logging_h',
':vlog_is_on_h',
'src/glog/log_severity.h',
],
strip_include_prefix = 'src',
copts = [
# Disable warnings that exists in glog.
'-Wno-sign-compare',
'-Wno-unused-function',
'-Wno-unused-local-typedefs',
'-Wno-unused-variable',
"-DGLOG_BAZEL_BUILD",
# Inject a C++ namespace.
"-DGOOGLE_NAMESPACE='%s'" % namespace,
# Allows src/base/mutex.h to include pthread.h.
'-DHAVE_PTHREAD',
# Allows src/logging.cc to determine the host name.
'-DHAVE_SYS_UTSNAME_H',
# For src/utilities.cc.
'-DHAVE_SYS_SYSCALL_H',
'-DHAVE_SYS_TIME_H',
'-DHAVE_STDINT_H',
'-DHAVE_STRING_H',
# Enable dumping stacktrace upon sigaction.
'-DHAVE_SIGACTION',
# For logging.cc.
'-DHAVE_PREAD',
'-DHAVE___ATTRIBUTE__',

# Include generated header files.
'-I%s/glog_internal' % gendir,
"src/base/commandlineflags.h",
"src/base/googleinit.h",
"src/base/mutex.h",
"src/demangle.cc",
"src/demangle.h",
"src/logging.cc",
"src/raw_logging.cc",
"src/signalhandler.cc",
"src/stacktrace.h",
"src/stacktrace_generic-inl.h",
"src/stacktrace_libunwind-inl.h",
"src/stacktrace_powerpc-inl.h",
"src/stacktrace_windows-inl.h",
"src/stacktrace_x86-inl.h",
"src/stacktrace_x86_64-inl.h",
"src/symbolize.cc",
"src/symbolize.h",
"src/utilities.cc",
"src/utilities.h",
"src/vlog_is_on.cc",
] + select({
# For stacktrace.
'@bazel_tools//src/conditions:darwin': [
'-DHAVE_UNWIND_H',
'-DHAVE_DLADDR',
],
'//conditions:default': [
'-DHAVE_UNWIND_H',
],
}) + ([
# Use gflags to parse CLI arguments.
'-DHAVE_LIB_GFLAGS',
] if with_gflags else []),
"@bazel_tools//src/conditions:windows": ["src/windows/port.cc", "src/windows/port.h"],
"//conditions:default": [":config_h"],
}),
copts =
select({
"@bazel_tools//src/conditions:windows": common_copts + windows_only_copts,
"@bazel_tools//src/conditions:darwin": common_copts + linux_or_darwin_copts + darwin_only_copts,
"//conditions:default": common_copts + linux_or_darwin_copts,
}),
deps = [
'@com_github_gflags_gflags//:gflags',
] if with_gflags else [],
":glog_headers",
] + gflags_deps,
**kwargs
)

# glog headers vary depending on the os.
native.cc_library(
name = "glog_headers",
deps = select({
"@bazel_tools//src/conditions:windows": [":windows_glog_headers"],
"//conditions:default": [":default_glog_headers"],
}),
)

native.cc_library(
name = "windows_glog_headers",
hdrs = ["src/glog/log_severity.h", "src/windows/config.h",] + native.glob(["src/windows/glog/*.h"]),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will leak config.h into the include path, which may break targets that depend on glog and contain #include "config.h". Can you apply the pattern from bazelbuild/bazel#4463 to calculate the path of src/windows/, and add "-I" + src_windows to windows_only_copts?

includes = ["src/windows"],
# config.h for windows seem hardcoded that way,
# and we need to propagate those defines to binaries/libraries linking
# against glog.
defines = [
"GOOGLE_GLOG_IS_A_DLL=1",
"GOOGLE_GLOG_DLL_DECL=__declspec(dllexport)",
"GOOGLE_GLOG_DLL_DECL_FOR_UNITTEST=__declspec(dllimport)",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are these necessary in defines? If so, are they all necessary or can some be in copts?

It looks to me like the public headers have an #ifndef GOOGLE_GLOG_DLL_DECL section that should make them unnecessary, but perhaps I'm missing something.

],
)

native.cc_library(
name = "default_glog_headers",
strip_include_prefix = "src",
hdrs = [
"src/glog/log_severity.h",
":logging_h",
":raw_logging_h",
":stl_logging_h",
":vlog_is_on_h",
],
)
native.genrule(
name = "config_h",
srcs = [
"src/config.h.cmake.in",
],
outs = [
"glog_internal/config.h",
],
cmd = "awk '{ gsub(/^#cmakedefine/, \"//cmakedefine\"); print; }' $< > $@",
)

native.genrule(
name = 'gen_sh',
name = "gen_sh",
outs = [
'gen.sh',
"gen.sh",
],
cmd = r'''\
#!/bin/sh
Expand All @@ -118,31 +165,22 @@ EOF
'''.format(int(with_gflags)),
)

native.genrule(
name = 'config_h',
srcs = [
'src/config.h.cmake.in',
],
outs = [
'glog_internal/config.h',
],
cmd = "awk '{ gsub(/^#cmakedefine/, \"//cmakedefine\"); print; }' $< > $@",
)

[native.genrule(
name = '%s_h' % f,
srcs = [
'src/glog/%s.h.in' % f,
],
outs = [
'src/glog/%s.h' % f,
],
cmd = '$(location :gen_sh) < $< > $@',
tools = [':gen_sh'],
) for f in [
'vlog_is_on',
'stl_logging',
'raw_logging',
'logging',
[
native.genrule(
name = "%s_h" % f,
srcs = [
"src/glog/%s.h.in" % f,
],
outs = [
"src/glog/%s.h" % f,
],
cmd = "$(location :gen_sh) < $< > $@",
tools = [":gen_sh"],
)
for f in [
"vlog_is_on",
"stl_logging",
"raw_logging",
"logging",
]
]