summaryrefslogtreecommitdiff
path: root/bazel/gflags.bzl
blob: 6d1ef6cfe4f51d8bb6bbf6a5de61650fa986afd7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# ------------------------------------------------------------------------------
# Add native rules to configure source files
def gflags_sources(namespace=["google", "gflags"]):
    native.genrule(
        name = "gflags_declare_h",
        srcs = ["src/gflags_declare.h.in"],
        outs = ["gflags_declare.h"],
        cmd  = ("awk '{ " +
                "gsub(/@GFLAGS_NAMESPACE@/, \"" + namespace[0] + "\"); " +
                "gsub(/@(HAVE_STDINT_H|HAVE_SYS_TYPES_H|HAVE_INTTYPES_H|GFLAGS_INTTYPES_FORMAT_C99)@/, \"1\"); " +
                "gsub(/@([A-Z0-9_]+)@/, \"0\"); " +
                "print; }' $(<) > $(@)")
    )
    gflags_ns_h_files = []
    for ns in namespace[1:]:
        gflags_ns_h_file = "gflags_{}.h".format(ns)
        native.genrule(
            name = gflags_ns_h_file.replace('.', '_'),
            srcs = ["src/gflags_ns.h.in"],
            outs = [gflags_ns_h_file],
            cmd  = ("awk '{ " +
                    "gsub(/@ns@/, \"" + ns + "\"); " +
                    "gsub(/@NS@/, \"" + ns.upper() + "\"); " +
                    "print; }' $(<) > $(@)")
        )
        gflags_ns_h_files.append(gflags_ns_h_file)
    native.genrule(
        name = "gflags_h",
        srcs = ["src/gflags.h.in"],
        outs = ["gflags.h"],
        cmd  = ("awk '{ " +
                "gsub(/@GFLAGS_ATTRIBUTE_UNUSED@/, \"\"); " +
                "gsub(/@INCLUDE_GFLAGS_NS_H@/, \"" + '\n'.join(["#include \\\"gflags/{}\\\"".format(hdr) for hdr in gflags_ns_h_files]) + "\"); " +
                "print; }' $(<) > $(@)")
    )
    native.genrule(
        name = "gflags_completions_h",
        srcs = ["src/gflags_completions.h.in"],
        outs = ["gflags_completions.h"],
        cmd  = "awk '{ gsub(/@GFLAGS_NAMESPACE@/, \"" + namespace[0] + "\"); print; }' $(<) > $(@)"
    )
    hdrs = [":gflags_h", ":gflags_declare_h", ":gflags_completions_h"]
    hdrs.extend([':' + hdr.replace('.', '_') for hdr in gflags_ns_h_files])
    srcs = [
        "src/config.h",
        "src/gflags.cc",
        "src/gflags_completions.cc",
        "src/gflags_reporting.cc",
        "src/mutex.h",
        "src/util.h",
    ] + select({
        "//:x64_windows": [
            "src/windows_port.cc",
            "src/windows_port.h",
        ],
        "//conditions:default": [],
    })
    return [hdrs, srcs]

# ------------------------------------------------------------------------------
# Add native rule to build gflags library
def gflags_library(hdrs=[], srcs=[], threads=1):
    name = "gflags"
    copts = [
        "-DGFLAGS_BAZEL_BUILD",
        "-DGFLAGS_INTTYPES_FORMAT_C99",
        "-DGFLAGS_IS_A_DLL=0",
        # macros otherwise defined by CMake configured defines.h file
        "-DHAVE_STDINT_H",
        "-DHAVE_SYS_TYPES_H",
        "-DHAVE_INTTYPES_H",
        "-DHAVE_SYS_STAT_H",
        "-DHAVE_STRTOLL",
        "-DHAVE_STRTOQ",
        "-DHAVE_RWLOCK",
    ] + select({
        "//:x64_windows": [
            "-DOS_WINDOWS",
        ],
        "//conditions:default": [
            "-DHAVE_UNISTD_H",
            "-DHAVE_FNMATCH_H",
            "-DHAVE_PTHREAD",
        ],
    })
    linkopts = []
    if threads:
        linkopts = linkopts + select({
            "//:x64_windows": [],
            "//conditions:default": ["-lpthread"],
        })
    else:
        name += "_nothreads"
        copts = copts + ["-DNO_THREADS"]
    native.cc_library(
        name       = name,
        hdrs       = hdrs,
        srcs       = srcs,
        copts      = copts,
        linkopts   = linkopts,
        visibility = ["//visibility:public"],
        include_prefix = 'gflags'
    )