diff options
Diffstat (limited to 'bazel/glog.bzl')
-rw-r--r-- | bazel/glog.bzl | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/bazel/glog.bzl b/bazel/glog.bzl new file mode 100644 index 000000000000..a46e2d148ba8 --- /dev/null +++ b/bazel/glog.bzl @@ -0,0 +1,219 @@ +# Implement a macro glog_library() that the BUILD file can load. + +# By default, glog is built with gflags support. You can change this behavior +# by using glog_library(with_gflags=0) +# +# This file is inspired by the following sample BUILD files: +# https://github.com/google/glog/issues/61 +# https://github.com/google/glog/files/393474/BUILD.txt +# +# Known issue: the namespace parameter is not supported on Win32. + +def glog_library(namespace = "google", with_gflags = 1, **kwargs): + if native.repository_name() != "@": + repo_name = native.repository_name().lstrip("@") + gendir = "$(GENDIR)/external/" + repo_name + src_windows = "external/%s/src/windows" % repo_name + else: + gendir = "$(GENDIR)" + src_windows = "src/windows" + + # Config setting for WebAssembly target. + native.config_setting( + name = "wasm", + values = {"cpu": "wasm"}, + ) + + common_copts = [ + "-DGLOG_BAZEL_BUILD", + "-DHAVE_STDINT_H", + "-DHAVE_STRING_H", + "-DHAVE_UNWIND_H", + ] + (["-DHAVE_LIB_GFLAGS"] if with_gflags else []) + + wasm_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_TIME_H", + # Enable dumping stacktrace upon sigaction. + "-DHAVE_SIGACTION", + # For logging.cc. + "-DHAVE_PREAD", + "-DHAVE___ATTRIBUTE__", + "-I%s/glog_internal" % gendir, + ] + + linux_or_darwin_copts = wasm_copts + [ + # For src/utilities.cc. + "-DHAVE_SYS_SYSCALL_H", + ] + + freebsd_only_copts = [ + # Enable declaration of _Unwind_Backtrace + "-D_GNU_SOURCE", + ] + + darwin_only_copts = [ + # For stacktrace. + "-DHAVE_DLADDR", + ] + + windows_only_copts = [ + "-DHAVE_SNPRINTF", + "-I" + src_windows, + ] + + windows_only_srcs = [ + "src/glog/log_severity.h", + "src/windows/config.h", + "src/windows/port.cc", + "src/windows/port.h", + ] + + gflags_deps = ["@com_github_gflags_gflags//:gflags"] if with_gflags else [] + + native.cc_library( + name = "glog", + visibility = ["//visibility:public"], + srcs = [ + "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({ + "@bazel_tools//src/conditions:windows": windows_only_srcs, + "//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, + "@bazel_tools//src/conditions:freebsd": common_copts + linux_or_darwin_copts + freebsd_only_copts, + ":wasm": common_copts + wasm_copts, + "//conditions:default": common_copts + linux_or_darwin_copts, + }), + deps = [ + ":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 = native.glob(["src/windows/glog/*.h"]), + strip_include_prefix = "src/windows", + # We need to override the default GOOGLE_GLOG_DLL_DECL from + # src/windows/glog/*.h to match src/windows/config.h. + defines = ["GOOGLE_GLOG_DLL_DECL=__declspec(dllexport)"], + deps = [":strip_include_prefix_hack"], + ) + + # Workaround https://github.com/bazelbuild/bazel/issues/6337 by declaring + # the dependencies without strip_include_prefix. + native.cc_library( + name = "strip_include_prefix_hack", + hdrs = native.glob(["src/windows/*.h"]), + ) + + 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", + outs = [ + "gen.sh", + ], + cmd = r'''\ +#!/bin/sh +cat > $@ <<"EOF" +sed -e 's/@ac_cv_cxx_using_operator@/1/g' \ + -e 's/@ac_cv_have_unistd_h@/1/g' \ + -e 's/@ac_cv_have_stdint_h@/1/g' \ + -e 's/@ac_cv_have_systypes_h@/1/g' \ + -e 's/@ac_cv_have_libgflags@/{}/g' \ + -e 's/@ac_cv_have_uint16_t@/1/g' \ + -e 's/@ac_cv_have___builtin_expect@/1/g' \ + -e 's/@ac_cv_have_.*@/0/g' \ + -e 's/@ac_google_start_namespace@/namespace google {{/g' \ + -e 's/@ac_google_end_namespace@/}}/g' \ + -e 's/@ac_google_namespace@/google/g' \ + -e 's/@ac_cv___attribute___noinline@/__attribute__((noinline))/g' \ + -e 's/@ac_cv___attribute___noreturn@/__attribute__((noreturn))/g' \ + -e 's/@ac_cv___attribute___printf_4_5@/__attribute__((__format__ (__printf__, 4, 5)))/g' +EOF +'''.format(int(with_gflags)), + ) + + [ + 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", + ] + ] |