Hide certain header files from the cc_library().
authorZhongming Qu <qzmfranklin@gmail.com>
Thu, 14 Dec 2017 08:51:26 +0000 (00:51 -0800)
committerZhongming Qu <qzmfranklin@gmail.com>
Thu, 14 Dec 2017 08:58:33 +0000 (00:58 -0800)
This commit addresses a few issues:

    1.  No longer leak config.h in a way similar to
            https://github.com/gflags/gflags/issues/233
        The solution of prefixing the path by 'glog_internal' is modified from
            https://github.com/gflags/gflags/issues/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.

BUILD
bazel/glog.bzl

diff --git a/BUILD b/BUILD
index ae99505..37fb27b 100644 (file)
--- a/BUILD
+++ b/BUILD
@@ -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()
index ff2a268..37e5320 100644 (file)
@@ -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' \
@@ -103,7 +105,9 @@ 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',
@@ -111,55 +115,25 @@ EOF''')
             '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',
+        ]
+    ]