Skip to content

Commit

Permalink
Hide certain header files from the cc_library().
Browse files Browse the repository at this point in the history
This commit addresses a few issues:

    1.  No longer leak config.h in a way similar to
            gflags/gflags#233
        The solution of prefixing the path by 'glog_internal' is modified from
            gflags/gflags#234

    2.  No longer expose internal headers.

    3.  Replace PACKAGE_NAME with native.package_name()

    4.  Uers can choose namespaces via the newly added 'namespace' keyword.

    5.  Replace glob with explicitly listing of files.

    6.  Make the genrules more compact using pythonic list construction.
  • Loading branch information
qzmfranklin committed Dec 14, 2017
1 parent 004fc8c commit e6e2e13
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 233 deletions.
145 changes: 2 additions & 143 deletions BUILD
Original file line number Diff line number Diff line change
@@ -1,146 +1,5 @@
licenses(['notice'])

namespace = 'google'
with_gflags = 1
with_libunwind = 1
load(':bazel/glog.bzl', 'glog_library')

cc_library(
name = 'glog',
visibility = [ '//visibility:public' ],
srcs = glob([
'src/base/commandlineflags.h',
'src/base/googleinit.h',
'src/demangle.cc',
'src/logging.cc',
'src/raw_logging.cc',
'src/signalhandler.cc',
'src/stacktrace_*-inl.h',
'src/symbolize.cc',
'src/utilities.cc',
'src/vlog_is_on.cc',
]),
hdrs = [
'src/base/mutex.h',
'src/demangle.h',
'src/stacktrace.h',
'src/symbolize.h',
'src/utilities.h',
'src/glog/log_severity.h',
],
includes = [
'src',
],
copts = [
# Disable warnings that exists in glog.
'-Wno-invalid-noreturn',
'-Wno-sign-compare',
'-Wno-unused-const-variable',
'-Wno-unused-function',
'-Wno-unused-local-typedefs',
'-Wno-unused-variable',
# Inject a C++ namespace.
"-D_START_GOOGLE_NAMESPACE_='namespace %s {'" % namespace,
"-D_END_GOOGLE_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',
] + ([
# Use gflags to parse CLI arguments.
# NOTE: These parenthesis are necessary.
'-DHAVE_LIB_GFLAGS',
] if with_gflags else []) + ([
# Use linunwind to get stacktrace.
'-DHAVE_LIB_UNWIND',
] if with_libunwind else []),
deps = [
':internal_headers',
] + ([
'//third_party/gflags',
] if with_gflags else []) + ([
'//third_party/libunwind',
] if with_libunwind else []),
)


cc_library(
name = 'internal_headers',
hdrs = [
':config_h',
':logging_h',
':raw_logging_h',
':stl_logging_h',
':vlog_is_on_h',
],
includes = [
PACKAGE_NAME,
] if PACKAGE_NAME else [],
)


genrule(
name = 'gen_sh',
outs = [
'gen.sh',
],
cmd = r'''\
#!/bin/sh
cat > $@ <<"EOF"
sed -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_h@/1/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
''',
)


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


[genrule(
name = '%s_h' % f,
srcs = [
'src/glog/%s.h.in' % f,
],
outs = [
'/'.join([PACKAGE_NAME, 'glog/%s.h' % f]) \
if PACKAGE_NAME else 'glog/%s.h' % f,
],
cmd = '$(location :gen_sh) < $(<) > $(@)',
tools = [':gen_sh'],
) for f in [
'vlog_is_on',
'stl_logging',
'raw_logging',
'logging',
]
]
glog_library()
154 changes: 64 additions & 90 deletions bazel/glog.bzl
Original file line number Diff line number Diff line change
@@ -1,94 +1,96 @@
# 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)

# 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

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

native.cc_library(
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 = [
'src/base/mutex.h',
'src/demangle.h',
'src/stacktrace.h',
'src/symbolize.h',
'src/utilities.h',
':logging_h',
':raw_logging_h',
':stl_logging_h',
':vlog_is_on_h',
'src/glog/log_severity.h',
],
includes = [
'src',
textual_hdrs = [
],
strip_include_prefix = 'src',
copts = [
# Disable warnings that exists in glog
# Disable warnings that exists in glog.
'-Wno-sign-compare',
'-Wno-unused-function',
'-Wno-unused-local-typedefs',
## Inject google namespace as 'google'
"-D_START_GOOGLE_NAMESPACE_='namespace google {'",
'-Wno-unused-variable',
# Inject a C++ namespace.
"-D_START_GOOGLE_NAMESPACE_='namespace %s {'" % namespace,
"-D_END_GOOGLE_NAMESPACE_='}'",
"-DGOOGLE_NAMESPACE='google'",
"-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',
# System header files enabler for src/utilities.cc
# Enable system calls from syscall.h
# For src/utilities.cc.
'-DHAVE_SYS_SYSCALL_H',
# Enable system calls from sys/time.h
'-DHAVE_SYS_TIME_H',
'-DHAVE_STDINT_H',
'-DHAVE_STRING_H',
# For logging.cc
# Enable dumping stacktrace upon sigaction.
'-DHAVE_SIGACTION',
# For logging.cc.
'-DHAVE_PREAD',

# Include generated header files.
'-I%s/glog_internal' % gendir,
] + [
'-DHAVE_LIB_GFLAGS'
# Use gflags to parse CLI arguments.
'-DHAVE_LIB_GFLAGS',
] if with_gflags else [],
deps = [
'@com_github_gflags_gflags//:gflags',
] if with_gflags else [],
deps = [ ':internal_headers' ] + \
[ '//external:gflags' ] if with_gflags else [],
)

internal_headers = [
':config_h',
':logging_h',
':raw_logging_h',
':stl_logging_h',
':vlog_is_on_h',
]

if PACKAGE_NAME:
native.cc_library(
name = 'internal_headers',
hdrs = internal_headers,
includes = [
PACKAGE_NAME,
],
)
else:
native.cc_library(
name = 'internal_headers',
hdrs = internal_headers,
)

native.genrule(
name = 'gen_sh',
outs = [
'gen.sh',
],
cmd = '''
#! /bin/sh
cmd = r'''\
#!/bin/sh
cat > $@ <<"EOF"
sed -e 's/@ac_cv_have_unistd_h@/1/g' \
-e 's/@ac_cv_have_stdint_h@/1/g' \
Expand All @@ -103,63 +105,35 @@ sed -e 's/@ac_cv_have_unistd_h@/1/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''')
EOF
''',
)

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

native.genrule(
name = 'logging_h',
[native.genrule(
name = '%s_h' % f,
srcs = [
'src/glog/logging.h.in',
'src/glog/%s.h.in' % f,
],
outs = [
'/'.join([PACKAGE_NAME, 'glog/logging.h']) if PACKAGE_NAME else 'glog/logging.h',
'src/glog/%s.h' % f,
],
cmd = '$(location :gen_sh) < $(<) > $(@)',
cmd = '$(location :gen_sh) < $< > $@',
tools = [':gen_sh'],
)

native.genrule(
name = 'raw_logging_h',
srcs = [
'src/glog/raw_logging.h.in',
],
outs = [
'/'.join([PACKAGE_NAME, 'glog/raw_logging.h']) if PACKAGE_NAME else 'glog/raw_logging.h',
],
cmd = '$(location :gen_sh) < $(<) > $(@)',
tools = [':gen_sh'],
)

native.genrule(
name = 'stl_logging_h',
srcs = [
'src/glog/stl_logging.h.in',
],
outs = [
'/'.join([PACKAGE_NAME, 'glog/stl_logging.h']) if PACKAGE_NAME else 'glog/stl_logging.h',
],
cmd = '$(location :gen_sh) < $(<) > $(@)',
tools = [':gen_sh'],
)

native.genrule(
name = 'vlog_is_on_h',
srcs = [
'src/glog/vlog_is_on.h.in',
],
outs = [
'/'.join([PACKAGE_NAME, 'glog/vlog_is_on.h']) if PACKAGE_NAME else 'glog/vlog_is_on.h',
],
cmd = '$(location :gen_sh) < $(<) > $(@)',
tools = [':gen_sh'],
)
) for f in [
'vlog_is_on',
'stl_logging',
'raw_logging',
'logging',
]
]

0 comments on commit e6e2e13

Please sign in to comment.