Merge pull request #132 from haberman/bazel
Added Bazel build, and auto-generate CMake build from it.pull/13171/head
commit
d4e78f9fdf
17 changed files with 1730 additions and 271 deletions
@ -0,0 +1,537 @@ |
||||
load( |
||||
":build_defs.bzl", |
||||
"lua_cclibrary", |
||||
"lua_library", |
||||
"lua_binary", |
||||
"lua_test", |
||||
"generated_file_staleness_test", |
||||
"make_shell_script", |
||||
"upb_amalgamation", |
||||
"upb_proto_library", |
||||
) |
||||
|
||||
# C/C++ rules ################################################################## |
||||
|
||||
cc_library( |
||||
name = "upb", |
||||
srcs = [ |
||||
"google/protobuf/descriptor.upb.c", |
||||
"upb/decode.c", |
||||
"upb/def.c", |
||||
"upb/encode.c", |
||||
"upb/handlers.c", |
||||
"upb/handlers-inl.h", |
||||
"upb/msg.c", |
||||
"upb/msgfactory.c", |
||||
"upb/port_def.inc", |
||||
"upb/port_undef.inc", |
||||
"upb/refcounted.c", |
||||
"upb/sink.c", |
||||
"upb/structdefs.int.h", |
||||
"upb/structs.int.h", |
||||
"upb/table.c", |
||||
"upb/table.int.h", |
||||
"upb/upb.c", |
||||
], |
||||
hdrs = [ |
||||
"google/protobuf/descriptor.upb.h", |
||||
"upb/decode.h", |
||||
"upb/def.h", |
||||
"upb/encode.h", |
||||
"upb/handlers.h", |
||||
"upb/msg.h", |
||||
"upb/msgfactory.h", |
||||
"upb/refcounted.h", |
||||
"upb/sink.h", |
||||
"upb/upb.h", |
||||
], |
||||
copts = [ |
||||
"-std=c89", |
||||
"-pedantic", |
||||
"-Wno-long-long", |
||||
], |
||||
) |
||||
|
||||
cc_library( |
||||
name = "upb_descriptor", |
||||
srcs = [ |
||||
"upb/descriptor/descriptor.upbdefs.c", |
||||
"upb/descriptor/reader.c", |
||||
], |
||||
hdrs = [ |
||||
"upb/descriptor/descriptor.upbdefs.h", |
||||
"upb/descriptor/reader.h", |
||||
], |
||||
copts = [ |
||||
"-std=c89", |
||||
"-pedantic", |
||||
"-Wno-long-long", |
||||
], |
||||
deps = [":upb"], |
||||
) |
||||
|
||||
cc_library( |
||||
name = "upb_pb", |
||||
srcs = [ |
||||
"upb/pb/compile_decoder.c", |
||||
"upb/pb/decoder.c", |
||||
"upb/pb/decoder.int.h", |
||||
"upb/pb/encoder.c", |
||||
"upb/pb/glue.c", |
||||
"upb/pb/textprinter.c", |
||||
"upb/pb/varint.c", |
||||
"upb/pb/varint.int.h", |
||||
], |
||||
hdrs = [ |
||||
"upb/pb/decoder.h", |
||||
"upb/pb/encoder.h", |
||||
"upb/pb/glue.h", |
||||
"upb/pb/textprinter.h", |
||||
], |
||||
copts = [ |
||||
"-std=c89", |
||||
"-pedantic", |
||||
"-Wno-long-long", |
||||
], |
||||
deps = [ |
||||
":upb", |
||||
":upb_descriptor", |
||||
], |
||||
) |
||||
|
||||
cc_library( |
||||
name = "upb_json", |
||||
srcs = [ |
||||
"upb/json/parser.c", |
||||
"upb/json/printer.c", |
||||
], |
||||
hdrs = [ |
||||
"upb/json/parser.h", |
||||
"upb/json/printer.h", |
||||
], |
||||
copts = [ |
||||
"-std=c89", |
||||
"-pedantic", |
||||
"-Wno-long-long", |
||||
], |
||||
deps = [":upb"], |
||||
) |
||||
|
||||
cc_library( |
||||
name = "upb_cc_bindings", |
||||
hdrs = [ |
||||
"upb/bindings/stdc++/string.h", |
||||
], |
||||
deps = [":upb"], |
||||
) |
||||
|
||||
# Amalgamation ################################################################# |
||||
|
||||
py_binary( |
||||
name = "amalgamate", |
||||
srcs = ["tools/amalgamate.py"], |
||||
) |
||||
|
||||
upb_amalgamation( |
||||
name = "gen_amalgamation", |
||||
outs = [ |
||||
"upb.c", |
||||
"upb.h", |
||||
], |
||||
amalgamator = ":amalgamate", |
||||
libs = [ |
||||
":upb", |
||||
":upb_descriptor", |
||||
":upb_pb", |
||||
":upb_json", |
||||
], |
||||
) |
||||
|
||||
cc_library( |
||||
name = "amalgamation", |
||||
srcs = ["upb.c"], |
||||
hdrs = ["upb.h"], |
||||
) |
||||
|
||||
# C/C++ tests ################################################################## |
||||
|
||||
cc_library( |
||||
name = "upb_test", |
||||
testonly = 1, |
||||
srcs = [ |
||||
"tests/testmain.cc", |
||||
], |
||||
hdrs = [ |
||||
"tests/test_util.h", |
||||
"tests/upb_test.h", |
||||
], |
||||
) |
||||
|
||||
cc_test( |
||||
name = "test_varint", |
||||
srcs = ["tests/pb/test_varint.c"], |
||||
deps = [ |
||||
":upb_pb", |
||||
":upb_test", |
||||
], |
||||
) |
||||
|
||||
cc_test( |
||||
name = "test_def", |
||||
srcs = ["tests/test_def.c"], |
||||
deps = [ |
||||
":upb_pb", |
||||
":upb_test", |
||||
], |
||||
) |
||||
|
||||
cc_test( |
||||
name = "test_handlers", |
||||
srcs = ["tests/test_handlers.c"], |
||||
deps = [ |
||||
":upb_pb", |
||||
":upb_test", |
||||
], |
||||
) |
||||
|
||||
cc_test( |
||||
name = "test_decoder", |
||||
srcs = ["tests/pb/test_decoder.cc"], |
||||
deps = [ |
||||
":upb_pb", |
||||
":upb_test", |
||||
], |
||||
) |
||||
|
||||
cc_test( |
||||
name = "test_encoder", |
||||
srcs = ["tests/pb/test_encoder.cc"], |
||||
data = ["upb/descriptor/descriptor.pb"], |
||||
deps = [ |
||||
":upb_cc_bindings", |
||||
":upb_pb", |
||||
":upb_test", |
||||
], |
||||
) |
||||
|
||||
cc_test( |
||||
name = "test_cpp", |
||||
srcs = ["tests/test_cpp.cc"], |
||||
deps = [ |
||||
":upb", |
||||
":upb_descriptor", |
||||
":upb_pb", |
||||
":upb_test", |
||||
], |
||||
) |
||||
|
||||
cc_test( |
||||
name = "test_table", |
||||
srcs = ["tests/test_table.cc"], |
||||
deps = [ |
||||
":upb", |
||||
":upb_test", |
||||
], |
||||
) |
||||
|
||||
cc_test( |
||||
name = "test_json", |
||||
srcs = [ |
||||
"tests/json/test.upbdefs.c", |
||||
"tests/json/test.upbdefs.h", |
||||
"tests/json/test_json.cc", |
||||
], |
||||
deps = [ |
||||
":upb_json", |
||||
":upb_test", |
||||
], |
||||
) |
||||
|
||||
upb_proto_library( |
||||
name = "conformance_proto_upb", |
||||
upbc = ":upbc", |
||||
deps = [ |
||||
"@com_google_protobuf//:conformance_proto", |
||||
"@com_google_protobuf//:test_messages_proto3_proto", |
||||
], |
||||
) |
||||
|
||||
cc_binary( |
||||
name = "conformance_upb", |
||||
srcs = [ |
||||
"tests/conformance_upb.c", |
||||
], |
||||
deps = [ |
||||
":conformance_proto_upb", |
||||
":upb", |
||||
], |
||||
) |
||||
|
||||
make_shell_script( |
||||
name = "gen_test_conformance_upb", |
||||
out = "test_conformance_upb.sh", |
||||
contents = "$(rlocation com_google_protobuf/conformance_test_runner) $(rlocation upb/conformance_upb)", |
||||
) |
||||
|
||||
sh_test( |
||||
name = "test_conformance_upb", |
||||
srcs = ["test_conformance_upb.sh"], |
||||
data = [ |
||||
"tests/conformance_upb_failures.txt", |
||||
":conformance_upb", |
||||
"@bazel_tools//tools/bash/runfiles", |
||||
"@com_google_protobuf//:conformance_test_runner", |
||||
], |
||||
) |
||||
|
||||
# Lua libraries. ############################################################### |
||||
|
||||
lua_cclibrary( |
||||
name = "lua/upb_c", |
||||
srcs = [ |
||||
"upb/bindings/lua/def.c", |
||||
"upb/bindings/lua/msg.c", |
||||
"upb/bindings/lua/upb.c", |
||||
], |
||||
hdrs = [ |
||||
"upb/bindings/lua/upb.h", |
||||
], |
||||
deps = [ |
||||
"upb", |
||||
"upb_pb", |
||||
], |
||||
) |
||||
|
||||
lua_library( |
||||
name = "lua/upb", |
||||
srcs = ["upb/bindings/lua/upb.lua"], |
||||
luadeps = ["lua/upb_c"], |
||||
strip_prefix = "upb/bindings/lua", |
||||
) |
||||
|
||||
lua_cclibrary( |
||||
name = "lua/upb/table_c", |
||||
srcs = ["upb/bindings/lua/upb/table.c"], |
||||
luadeps = ["lua/upb_c"], |
||||
deps = ["upb"], |
||||
) |
||||
|
||||
lua_library( |
||||
name = "lua/upb/table", |
||||
srcs = ["upb/bindings/lua/upb/table.lua"], |
||||
luadeps = [ |
||||
"lua/upb", |
||||
"lua/upb/table_c", |
||||
], |
||||
strip_prefix = "upb/bindings/lua", |
||||
) |
||||
|
||||
lua_cclibrary( |
||||
name = "lua/upb/pb_c", |
||||
srcs = ["upb/bindings/lua/upb/pb.c"], |
||||
luadeps = ["lua/upb_c"], |
||||
deps = ["upb_pb"], |
||||
) |
||||
|
||||
lua_library( |
||||
name = "lua/upb/pb", |
||||
srcs = ["upb/bindings/lua/upb/pb.lua"], |
||||
luadeps = [ |
||||
"lua/upb", |
||||
"lua/upb/pb_c", |
||||
], |
||||
strip_prefix = "upb/bindings/lua", |
||||
) |
||||
|
||||
lua_library( |
||||
name = "lua/upbc_lib", |
||||
srcs = [ |
||||
"tools/dump_cinit.lua", |
||||
"tools/make_c_api.lua", |
||||
], |
||||
luadeps = [ |
||||
"lua/upb", |
||||
"lua/upb/table", |
||||
], |
||||
strip_prefix = "tools", |
||||
) |
||||
|
||||
# Lua tests. ################################################################### |
||||
|
||||
lua_test( |
||||
name = "lua/test_upb", |
||||
luadeps = ["lua/upb"], |
||||
luamain = "tests/bindings/lua/test_upb.lua", |
||||
) |
||||
|
||||
lua_test( |
||||
name = "lua/test_upb_pb", |
||||
luadeps = ["lua/upb/pb"], |
||||
luamain = "tests/bindings/lua/test_upb.pb.lua", |
||||
) |
||||
|
||||
# upb compiler ################################################################# |
||||
|
||||
lua_binary( |
||||
name = "upbc", |
||||
luadeps = [ |
||||
"lua/upbc_lib", |
||||
], |
||||
luamain = "tools/upbc.lua", |
||||
) |
||||
|
||||
# Test the CMake build ######################################################### |
||||
|
||||
make_shell_script( |
||||
name = "gen_run_cmake_build", |
||||
out = "run_cmake_build.sh", |
||||
contents = "mkdir build && cd build && cmake .. && make -j8" |
||||
) |
||||
|
||||
sh_test( |
||||
name = "cmake_build", |
||||
srcs = ["run_cmake_build.sh"], |
||||
data = glob([ |
||||
"CMakeLists.txt", |
||||
"google/**/*", |
||||
"upb/**/*", |
||||
"tests/**/*", |
||||
]) + [ |
||||
"@bazel_tools//tools/bash/runfiles", |
||||
], |
||||
) |
||||
|
||||
# Generated files ############################################################## |
||||
|
||||
exports_files(["tools/staleness_test.py"]) |
||||
|
||||
py_library( |
||||
name = "staleness_test_lib", |
||||
testonly = 1, |
||||
srcs = ["tools/staleness_test_lib.py"], |
||||
) |
||||
|
||||
genrule( |
||||
name = "make_dynasm_decoder", |
||||
srcs = [ |
||||
"third_party/dynasm/dynasm.lua", |
||||
"third_party/dynasm/dasm_x64.lua", |
||||
"third_party/dynasm/dasm_x86.lua", |
||||
"upb/pb/compile_decoder_x64.dasc", |
||||
], |
||||
outs = ["generated/upb/pb/compile_decoder_x64.h"], |
||||
cmd = "LUA_PATH=third_party/dynasm/?.lua $(location @lua//:lua) third_party/dynasm/dynasm.lua -c upb/pb/compile_decoder_x64.dasc > $@", |
||||
tools = ["@lua"], |
||||
) |
||||
|
||||
proto_library( |
||||
name = "upb_descriptor_proto", |
||||
srcs = [ |
||||
"upb/descriptor/descriptor.proto", |
||||
], |
||||
) |
||||
|
||||
py_binary( |
||||
name = "make_cmakelists", |
||||
srcs = ["tools/make_cmakelists.py"], |
||||
) |
||||
|
||||
genrule( |
||||
name = "gen_cmakelists", |
||||
outs = ["generated/CMakeLists.txt"], |
||||
srcs = ["BUILD", "WORKSPACE"], |
||||
tools = [":make_cmakelists"], |
||||
cmd = "$(location :make_cmakelists) $@" |
||||
) |
||||
|
||||
genrule( |
||||
name = "copy_upb_descriptor_pb", |
||||
srcs = [":upb_descriptor_proto"], |
||||
outs = ["generated/upb/descriptor/descriptor.pb"], |
||||
cmd = "cp $< $@", |
||||
) |
||||
|
||||
genrule( |
||||
name = "generate_old_upbdefs", |
||||
srcs = ["generated/upb/descriptor/descriptor.pb"], |
||||
outs = [ |
||||
"generated/upb/descriptor/descriptor.upbdefs.h", |
||||
"generated/upb/descriptor/descriptor.upbdefs.c", |
||||
], |
||||
cmd = "UPBC=$$PWD/$(location :upbc); INFILE=$$PWD/$<; cd $(GENDIR)/generated && $$UPBC --generate-upbdefs $$INFILE", |
||||
tools = [":upbc"], |
||||
) |
||||
|
||||
proto_library( |
||||
name = "google_descriptor_proto", |
||||
srcs = [ |
||||
"google/protobuf/descriptor.proto", |
||||
], |
||||
) |
||||
|
||||
genrule( |
||||
name = "copy_google_descriptor_pb", |
||||
srcs = [":google_descriptor_proto"], |
||||
outs = ["generated/google/protobuf/descriptor.pb"], |
||||
cmd = "cp $< $@", |
||||
) |
||||
|
||||
genrule( |
||||
name = "generate_descriptor_c", |
||||
srcs = ["generated/google/protobuf/descriptor.pb"], |
||||
outs = [ |
||||
"generated/google/protobuf/descriptor.upb.h", |
||||
"generated/google/protobuf/descriptor.upb.c", |
||||
], |
||||
cmd = "UPBC=$$PWD/$(location :upbc); INFILE=$$PWD/$<; cd $(GENDIR)/generated && $$UPBC $$INFILE", |
||||
tools = [":upbc"], |
||||
) |
||||
|
||||
proto_library( |
||||
name = "json_test_proto", |
||||
srcs = ["tests/json/test.proto"], |
||||
) |
||||
|
||||
genrule( |
||||
name = "copy_json_test_proto", |
||||
srcs = [":json_test_proto"], |
||||
outs = ["generated/tests/json/test.proto.pb"], |
||||
cmd = "cp $< $@", |
||||
) |
||||
|
||||
genrule( |
||||
name = "generated_json_test_proto_upbdefs", |
||||
srcs = ["generated/tests/json/test.proto.pb"], |
||||
outs = [ |
||||
"generated/tests/json/test.upbdefs.h", |
||||
"generated/tests/json/test.upbdefs.c", |
||||
], |
||||
cmd = "UPBC=$$PWD/$(location :upbc); INFILE=$$PWD/$<; cd $(GENDIR)/generated && $$UPBC --generate-upbdefs $$INFILE", |
||||
tools = [":upbc"], |
||||
) |
||||
|
||||
genrule( |
||||
name = "generate_json_ragel", |
||||
srcs = ["upb/json/parser.rl"], |
||||
outs = ["generated/upb/json/parser.c"], |
||||
cmd = "$(location @ragel//:ragel) -C -o upb/json/parser.c $< && mv upb/json/parser.c $@", |
||||
tools = ["@ragel"], |
||||
) |
||||
|
||||
generated_file_staleness_test( |
||||
name = "test_generated_files", |
||||
outs = [ |
||||
"CMakeLists.txt", |
||||
"google/protobuf/descriptor.upb.c", |
||||
"google/protobuf/descriptor.upb.h", |
||||
"tests/json/test.proto.pb", |
||||
"tests/json/test.upbdefs.c", |
||||
"tests/json/test.upbdefs.h", |
||||
"upb/descriptor/descriptor.pb", |
||||
"upb/descriptor/descriptor.upbdefs.c", |
||||
"upb/descriptor/descriptor.upbdefs.h", |
||||
"upb/json/parser.c", |
||||
"upb/pb/compile_decoder_x64.h", |
||||
], |
||||
generated_pattern = "generated/%s", |
||||
) |
@ -0,0 +1,40 @@ |
||||
|
||||
workspace(name = "upb") |
||||
|
||||
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") |
||||
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") |
||||
|
||||
http_archive( |
||||
name = "lua", |
||||
build_file = "//:lua.BUILD", |
||||
sha256 = "b9e2e4aad6789b3b63a056d442f7b39f0ecfca3ae0f1fc0ae4e9614401b69f4b", |
||||
strip_prefix = "lua-5.2.4", |
||||
urls = [ |
||||
"https://mirror.bazel.build/www.lua.org/ftp/lua-5.2.4.tar.gz", |
||||
"https://www.lua.org/ftp/lua-5.2.4.tar.gz", |
||||
], |
||||
) |
||||
|
||||
git_repository( |
||||
name = "com_google_protobuf", |
||||
commit = "25feb59620627b673df76813dfd66e3f565765e7", |
||||
#sha256 = "d7a221b3d4fb4f05b7473795ccea9e05dab3b8721f6286a95fffbffc2d926f8b", |
||||
remote = "https://github.com/haberman/protobuf.git", |
||||
#tag = "conformance-build-tag", |
||||
) |
||||
|
||||
http_archive( |
||||
name = "ragel", |
||||
sha256 = "5f156edb65d20b856d638dd9ee2dfb43285914d9aa2b6ec779dac0270cd56c3f", |
||||
build_file = "//:ragel.BUILD", |
||||
strip_prefix = "ragel-6.10", |
||||
urls = ["http://www.colm.net/files/ragel/ragel-6.10.tar.gz"], |
||||
) |
||||
|
||||
# Used by protobuf. |
||||
http_archive( |
||||
name = "bazel_skylib", |
||||
sha256 = "bbccf674aa441c266df9894182d80de104cabd19be98be002f6d478aaa31574d", |
||||
strip_prefix = "bazel-skylib-2169ae1c374aab4a09aa90e65efe1a3aad4e279b", |
||||
urls = ["https://github.com/bazelbuild/bazel-skylib/archive/2169ae1c374aab4a09aa90e65efe1a3aad4e279b.tar.gz"], |
||||
) |
@ -0,0 +1,273 @@ |
||||
|
||||
_shell_find_runfiles = """ |
||||
# --- begin runfiles.bash initialization --- |
||||
# Copy-pasted from Bazel's Bash runfiles library (tools/bash/runfiles/runfiles.bash). |
||||
set -euo pipefail |
||||
if [[ ! -d "${RUNFILES_DIR:-/dev/null}" && ! -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then |
||||
if [[ -f "$0.runfiles_manifest" ]]; then |
||||
export RUNFILES_MANIFEST_FILE="$0.runfiles_manifest" |
||||
elif [[ -f "$0.runfiles/MANIFEST" ]]; then |
||||
export RUNFILES_MANIFEST_FILE="$0.runfiles/MANIFEST" |
||||
elif [[ -f "$0.runfiles/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then |
||||
export RUNFILES_DIR="$0.runfiles" |
||||
fi |
||||
fi |
||||
if [[ -f "${RUNFILES_DIR:-/dev/null}/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then |
||||
source "${RUNFILES_DIR}/bazel_tools/tools/bash/runfiles/runfiles.bash" |
||||
elif [[ -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then |
||||
source "$(grep -m1 "^bazel_tools/tools/bash/runfiles/runfiles.bash " \ |
||||
"$RUNFILES_MANIFEST_FILE" | cut -d ' ' -f 2-)" |
||||
else |
||||
echo >&2 "ERROR: cannot find @bazel_tools//tools/bash/runfiles:runfiles.bash" |
||||
exit 1 |
||||
fi |
||||
# --- end runfiles.bash initialization --- |
||||
""" |
||||
|
||||
def _librule(name): |
||||
return name + "_lib" |
||||
|
||||
def lua_cclibrary(name, srcs, hdrs = [], deps = [], luadeps = []): |
||||
lib_rule = name + "_lib" |
||||
so_rule = "lib" + name + ".so" |
||||
so_file = _remove_prefix(name, "lua/") + ".so" |
||||
|
||||
native.cc_library( |
||||
name = _librule(name), |
||||
hdrs = hdrs, |
||||
srcs = srcs, |
||||
deps = deps + [_librule(dep) for dep in luadeps] + ["@lua//:liblua_headers"], |
||||
) |
||||
|
||||
native.cc_binary( |
||||
name = so_rule, |
||||
linkshared = True, |
||||
deps = [_librule(name)], |
||||
) |
||||
|
||||
native.genrule( |
||||
name = name + "_copy", |
||||
srcs = [":" + so_rule], |
||||
outs = [so_file], |
||||
cmd = "cp $< $@", |
||||
) |
||||
|
||||
native.filegroup( |
||||
name = name, |
||||
data = [so_file], |
||||
) |
||||
|
||||
def _remove_prefix(str, prefix): |
||||
if not str.startswith(prefix): |
||||
fail("%s doesn't start with %s" % (str, prefix)) |
||||
return str[len(prefix):] |
||||
|
||||
def _remove_suffix(str, suffix): |
||||
if not str.endswith(suffix): |
||||
fail("%s doesn't end with %s" % (str, suffix)) |
||||
return str[:-len(suffix)] |
||||
|
||||
def lua_library(name, srcs, strip_prefix, luadeps = []): |
||||
outs = [_remove_prefix(src, strip_prefix + "/") for src in srcs] |
||||
native.genrule( |
||||
name = name + "_copy", |
||||
srcs = srcs, |
||||
outs = outs, |
||||
cmd = "cp $(SRCS) $(@D)", |
||||
) |
||||
|
||||
native.filegroup( |
||||
name = name, |
||||
data = outs + luadeps, |
||||
) |
||||
|
||||
def make_shell_script(name, contents, out): |
||||
script_contents = (_shell_find_runfiles + contents).replace("$", "$$") |
||||
native.genrule( |
||||
name = "gen_" + name, |
||||
outs = [out], |
||||
cmd = "(cat <<'HEREDOC'\n%s\nHEREDOC\n) > $@" % script_contents, |
||||
) |
||||
|
||||
def _lua_binary_or_test(name, luamain, luadeps, rule): |
||||
script = name + ".sh" |
||||
|
||||
make_shell_script( |
||||
name = "gen_" + name, |
||||
out = script, |
||||
contents = """ |
||||
BASE=$(dirname $(rlocation upb/upb_c.so)) |
||||
export LUA_CPATH="$BASE/?.so" |
||||
export LUA_PATH="$BASE/?.lua" |
||||
$(rlocation lua/lua) $(rlocation upb/tools/upbc.lua) "$@" |
||||
""" |
||||
) |
||||
|
||||
rule( |
||||
name = name, |
||||
srcs = [script], |
||||
data = ["@lua//:lua", "@bazel_tools//tools/bash/runfiles", luamain] + luadeps, |
||||
) |
||||
|
||||
def lua_binary(name, luamain, luadeps=[]): |
||||
_lua_binary_or_test(name, luamain, luadeps, native.sh_binary) |
||||
|
||||
def lua_test(name, luamain, luadeps=[]): |
||||
_lua_binary_or_test(name, luamain, luadeps, native.sh_test) |
||||
|
||||
def generated_file_staleness_test(name, outs, generated_pattern): |
||||
"""Tests that checked-in file(s) match the contents of generated file(s). |
||||
|
||||
The resulting test will verify that all output files exist and have the |
||||
correct contents. If the test fails, it can be invoked with --fix to |
||||
bring the checked-in files up to date. |
||||
|
||||
Args: |
||||
name: Name of the rule. |
||||
outs: the checked-in files that are copied from generated files. |
||||
generated_pattern: the pattern for transforming each "out" file into a |
||||
generated file. For example, if generated_pattern="generated/%s" then |
||||
a file foo.txt will look for generated file generated/foo.txt. |
||||
""" |
||||
|
||||
script_name = name + ".py" |
||||
script_src = "//:tools/staleness_test.py" |
||||
|
||||
# Filter out non-existing rules so Blaze doesn't error out before we even |
||||
# run the test. |
||||
existing_outs = native.glob(include = outs) |
||||
|
||||
# The file list contains a few extra bits of information at the end. |
||||
# These get unpacked by the Config class in staleness_test_lib.py. |
||||
file_list = outs + [generated_pattern, native.package_name() or ".", name] |
||||
|
||||
native.genrule( |
||||
name = name + "_makescript", |
||||
outs = [script_name], |
||||
srcs = [script_src], |
||||
testonly = 1, |
||||
cmd = "cat $(location " + script_src + ") > $@; " + |
||||
"sed -i 's|INSERT_FILE_LIST_HERE|" + "\\n ".join(file_list) + "|' $@", |
||||
) |
||||
|
||||
native.py_test( |
||||
name = name, |
||||
srcs = [script_name], |
||||
data = existing_outs + [generated_pattern % file for file in outs], |
||||
deps = [ |
||||
"//:staleness_test_lib", |
||||
], |
||||
) |
||||
|
||||
# upb_amalgamation() rule, with file_list aspect. |
||||
|
||||
SrcList = provider( |
||||
fields = { |
||||
'srcs' : 'list of srcs', |
||||
'hdrs' : 'list of hdrs', |
||||
} |
||||
) |
||||
|
||||
def _file_list_aspect_impl(target, ctx): |
||||
srcs = [] |
||||
hdrs = [] |
||||
for src in ctx.rule.attr.srcs: |
||||
srcs += src.files.to_list() |
||||
for hdr in ctx.rule.attr.hdrs: |
||||
hdrs += hdr.files.to_list() |
||||
return [SrcList(srcs = srcs, hdrs = hdrs)] |
||||
|
||||
_file_list_aspect = aspect( |
||||
implementation = _file_list_aspect_impl, |
||||
) |
||||
|
||||
def _upb_amalgamation(ctx): |
||||
srcs = [] |
||||
hdrs = [] |
||||
for lib in ctx.attr.libs: |
||||
srcs += lib[SrcList].srcs |
||||
hdrs += lib[SrcList].hdrs |
||||
ctx.actions.run( |
||||
inputs = srcs + hdrs, |
||||
outputs = ctx.outputs.outs, |
||||
arguments = ["", ctx.bin_dir.path + "/"] + [f.path for f in srcs], |
||||
progress_message = "Making amalgamation", |
||||
executable = ctx.executable.amalgamator, |
||||
) |
||||
|
||||
upb_amalgamation = rule( |
||||
implementation = _upb_amalgamation, |
||||
attrs = { |
||||
"amalgamator": attr.label( |
||||
executable = True, |
||||
cfg = "host", |
||||
), |
||||
"libs": attr.label_list(aspects = [_file_list_aspect]), |
||||
"outs": attr.output_list(), |
||||
} |
||||
) |
||||
|
||||
# upb_proto_library() rule |
||||
|
||||
def _remove_up(string): |
||||
if string.startswith("../"): |
||||
string = string[3:] |
||||
pos = string.find("/") |
||||
string = string[pos + 1:] |
||||
|
||||
return _remove_suffix(string, ".proto") |
||||
|
||||
def _upb_proto_library_srcs_impl(ctx): |
||||
descriptors = [] |
||||
outs = [] |
||||
for dep in ctx.attr.deps: |
||||
if hasattr(dep, 'proto'): |
||||
for desc in dep.proto.transitive_descriptor_sets: |
||||
descriptors.append(desc) |
||||
for src in dep.proto.transitive_sources: |
||||
outs.append(ctx.actions.declare_file(_remove_up(src.short_path) + ".upb.h")) |
||||
outs.append(ctx.actions.declare_file(_remove_up(src.short_path) + ".upb.c")) |
||||
outdir = _remove_suffix(outs[-1].path, _remove_up(src.short_path) + ".upb.c") |
||||
|
||||
concatenated = ctx.actions.declare_file(ctx.label.name + "_concatenated_descriptor.bin") |
||||
descriptor_paths = [d.path for d in descriptors] |
||||
|
||||
ctx.actions.run_shell( |
||||
inputs = descriptors, |
||||
outputs = [concatenated], |
||||
progress_message = "Concatenating descriptors", |
||||
command = "cat %s > %s" % (" ".join(descriptor_paths), concatenated.path), |
||||
) |
||||
ctx.actions.run( |
||||
inputs = [concatenated], |
||||
outputs = outs, |
||||
executable = ctx.executable.upbc, |
||||
arguments = ["--outdir", outdir, concatenated.path], |
||||
progress_message = "Generating upb protos", |
||||
) |
||||
|
||||
return [DefaultInfo(files = depset(outs))] |
||||
|
||||
_upb_proto_library_srcs = rule( |
||||
implementation = _upb_proto_library_srcs_impl, |
||||
attrs = { |
||||
"upbc": attr.label( |
||||
executable = True, |
||||
cfg = "host", |
||||
), |
||||
"deps": attr.label_list(), |
||||
} |
||||
) |
||||
|
||||
def upb_proto_library(name, deps, upbc): |
||||
srcs_rule = name + "_srcs.cc" |
||||
_upb_proto_library_srcs( |
||||
name = srcs_rule, |
||||
upbc = upbc, |
||||
deps = deps, |
||||
) |
||||
native.cc_library( |
||||
name = name, |
||||
srcs = [":" + srcs_rule], |
||||
deps = [":upb"], |
||||
) |
@ -0,0 +1,4 @@ |
||||
#!/bin/bash |
||||
|
||||
cd $(dirname $0)/../.. |
||||
bazel test :all |
@ -0,0 +1,2 @@ |
||||
build_file: "upb/kokoro/ubuntu/build.sh" |
||||
timeout_mins: 15 |
@ -0,0 +1,2 @@ |
||||
build_file: "upb/kokoro/ubuntu/build.sh" |
||||
timeout_mins: 15 |
@ -0,0 +1,102 @@ |
||||
package( |
||||
default_visibility = ["//visibility:public"], |
||||
) |
||||
|
||||
cc_library( |
||||
name = "liblua_headers", |
||||
defines = ["LUA_USE_LINUX"], |
||||
hdrs = [ |
||||
"src/lauxlib.h", |
||||
"src/lua.h", |
||||
"src/lua.hpp", |
||||
"src/luaconf.h", |
||||
"src/lualib.h", |
||||
], |
||||
includes = ["src"], |
||||
) |
||||
|
||||
cc_library( |
||||
name = "liblua", |
||||
srcs = [ |
||||
"src/lapi.c", |
||||
"src/lapi.h", |
||||
"src/lauxlib.c", |
||||
"src/lauxlib.h", |
||||
"src/lbaselib.c", |
||||
"src/lbitlib.c", |
||||
"src/lcode.c", |
||||
"src/lcode.h", |
||||
"src/lcorolib.c", |
||||
"src/lctype.c", |
||||
"src/lctype.h", |
||||
"src/ldblib.c", |
||||
"src/ldebug.c", |
||||
"src/ldebug.h", |
||||
"src/ldo.c", |
||||
"src/ldo.h", |
||||
"src/ldump.c", |
||||
"src/lfunc.c", |
||||
"src/lfunc.h", |
||||
"src/lgc.c", |
||||
"src/lgc.h", |
||||
"src/linit.c", |
||||
"src/liolib.c", |
||||
"src/llex.c", |
||||
"src/llex.h", |
||||
"src/llimits.h", |
||||
"src/lmathlib.c", |
||||
"src/lmem.c", |
||||
"src/lmem.h", |
||||
"src/loadlib.c", |
||||
"src/lobject.c", |
||||
"src/lobject.h", |
||||
"src/lopcodes.c", |
||||
"src/lopcodes.h", |
||||
"src/loslib.c", |
||||
"src/lparser.c", |
||||
"src/lparser.h", |
||||
"src/lstate.c", |
||||
"src/lstate.h", |
||||
"src/lstring.c", |
||||
"src/lstring.h", |
||||
"src/lstrlib.c", |
||||
"src/ltable.c", |
||||
"src/ltable.h", |
||||
"src/ltablib.c", |
||||
"src/ltm.c", |
||||
"src/ltm.h", |
||||
"src/lundump.c", |
||||
"src/lundump.h", |
||||
"src/lvm.c", |
||||
"src/lvm.h", |
||||
"src/lzio.c", |
||||
"src/lzio.h", |
||||
], |
||||
defines = ["LUA_USE_LINUX"], |
||||
hdrs = [ |
||||
"src/lauxlib.h", |
||||
"src/lua.h", |
||||
"src/lua.hpp", |
||||
"src/luaconf.h", |
||||
"src/lualib.h", |
||||
], |
||||
includes = ["src"], |
||||
linkopts = [ |
||||
"-lm", |
||||
"-ldl", |
||||
], |
||||
) |
||||
|
||||
cc_binary( |
||||
name = "lua", |
||||
srcs = [ |
||||
"src/lua.c", |
||||
], |
||||
deps = [ |
||||
":liblua", |
||||
], |
||||
linkopts = [ |
||||
"-lreadline", |
||||
"-rdynamic", |
||||
], |
||||
) |
@ -0,0 +1,193 @@ |
||||
|
||||
package( |
||||
default_visibility = ["//visibility:public"], |
||||
) |
||||
|
||||
cc_binary( |
||||
name = "ragel", |
||||
srcs = [ |
||||
"ragel/rubycodegen.cpp", |
||||
"ragel/goipgoto.h", |
||||
"ragel/cdtable.h", |
||||
"ragel/rubycodegen.h", |
||||
"ragel/gotable.h", |
||||
"ragel/gocodegen.cpp", |
||||
"ragel/rubyfflat.cpp", |
||||
"ragel/common.cpp", |
||||
"ragel/gofflat.cpp", |
||||
"ragel/cdtable.cpp", |
||||
"ragel/cdsplit.cpp", |
||||
"ragel/rlparse.cpp", |
||||
"ragel/csfgoto.cpp", |
||||
"ragel/javacodegen.cpp", |
||||
"ragel/gocodegen.h", |
||||
"ragel/mlgoto.cpp", |
||||
"ragel/fsmgraph.cpp", |
||||
"ragel/version.h", |
||||
"ragel/mlfflat.h", |
||||
"ragel/fsmgraph.h", |
||||
"ragel/fsmbase.cpp", |
||||
"ragel/fsmstate.cpp", |
||||
"ragel/gotablish.cpp", |
||||
"ragel/rubyflat.cpp", |
||||
"ragel/cdfgoto.h", |
||||
"ragel/cscodegen.h", |
||||
"ragel/mlflat.cpp", |
||||
"ragel/rubyflat.h", |
||||
"ragel/goftable.h", |
||||
"ragel/rbxgoto.cpp", |
||||
"ragel/csfflat.cpp", |
||||
"ragel/gofgoto.cpp", |
||||
"ragel/gofgoto.h", |
||||
"ragel/ragel.h", |
||||
"ragel/goftable.cpp", |
||||
"ragel/cdcodegen.cpp", |
||||
"ragel/rlparse.h", |
||||
"ragel/cdsplit.h", |
||||
"ragel/xmlcodegen.cpp", |
||||
"ragel/goipgoto.cpp", |
||||
"ragel/dotcodegen.h", |
||||
"ragel/gogoto.cpp", |
||||
"ragel/csflat.h", |
||||
"ragel/csfflat.h", |
||||
#"ragel/config.h.in", |
||||
"ragel/csipgoto.cpp", |
||||
"ragel/mltable.cpp", |
||||
"ragel/mlflat.h", |
||||
"ragel/csftable.cpp", |
||||
"ragel/cdgoto.h", |
||||
"ragel/goflat.cpp", |
||||
"ragel/rubyfflat.h", |
||||
"ragel/mlftable.h", |
||||
"ragel/rubyftable.h", |
||||
"ragel/fsmap.cpp", |
||||
"ragel/redfsm.cpp", |
||||
"ragel/goflat.h", |
||||
"ragel/parsetree.cpp", |
||||
"ragel/fsmmin.cpp", |
||||
"ragel/dotcodegen.cpp", |
||||
"ragel/redfsm.h", |
||||
"ragel/mlcodegen.cpp", |
||||
"ragel/cdfgoto.cpp", |
||||
"ragel/cssplit.cpp", |
||||
"ragel/cstable.cpp", |
||||
"ragel/javacodegen.h", |
||||
"ragel/parsedata.cpp", |
||||
"ragel/buffer.h", |
||||
"ragel/gogoto.h", |
||||
"ragel/csgoto.h", |
||||
"ragel/pcheck.h", |
||||
"ragel/rubyftable.cpp", |
||||
"ragel/csfgoto.h", |
||||
"ragel/common.h", |
||||
"ragel/cdftable.h", |
||||
"ragel/mlgoto.h", |
||||
"ragel/csgoto.cpp", |
||||
"ragel/cdflat.h", |
||||
"ragel/cdipgoto.h", |
||||
"ragel/cstable.h", |
||||
"ragel/gendata.h", |
||||
"ragel/cdfflat.cpp", |
||||
"ragel/gotable.cpp", |
||||
"ragel/cdcodegen.h", |
||||
"ragel/gendata.cpp", |
||||
"ragel/rubytable.h", |
||||
"ragel/csflat.cpp", |
||||
"ragel/inputdata.h", |
||||
"ragel/inputdata.cpp", |
||||
"ragel/rubytable.cpp", |
||||
"ragel/fsmattach.cpp", |
||||
"ragel/csipgoto.h", |
||||
"ragel/cscodegen.cpp", |
||||
"ragel/cdfflat.h", |
||||
"ragel/rbxgoto.h", |
||||
"ragel/xmlcodegen.h", |
||||
"ragel/gofflat.h", |
||||
"ragel/parsedata.h", |
||||
"ragel/mlfgoto.h", |
||||
"ragel/cdflat.cpp", |
||||
"ragel/config.h", |
||||
"ragel/rlscan.cpp", |
||||
"ragel/mlcodegen.h", |
||||
"ragel/mlfflat.cpp", |
||||
"ragel/mlftable.cpp", |
||||
"ragel/mltable.h", |
||||
"ragel/cdipgoto.cpp", |
||||
"ragel/cdftable.cpp", |
||||
"ragel/parsetree.h", |
||||
"ragel/rlscan.h", |
||||
"ragel/main.cpp", |
||||
"ragel/cssplit.h", |
||||
"ragel/mlfgoto.cpp", |
||||
"ragel/csftable.h", |
||||
"ragel/gotablish.h", |
||||
"ragel/cdgoto.cpp", |
||||
"aapl/avlmelkey.h", |
||||
"aapl/dlistmel.h", |
||||
"aapl/avliset.h", |
||||
"aapl/avlkeyless.h", |
||||
"aapl/sbstset.h", |
||||
"aapl/sbsttable.h", |
||||
"aapl/quicksort.h", |
||||
"aapl/avlitree.h", |
||||
"aapl/avlcommon.h", |
||||
"aapl/bstset.h", |
||||
"aapl/avlmel.h", |
||||
"aapl/insertsort.h", |
||||
"aapl/dlist.h", |
||||
"aapl/avlmap.h", |
||||
"aapl/mergesort.h", |
||||
"aapl/resize.h", |
||||
"aapl/bstcommon.h", |
||||
"aapl/bstmap.h", |
||||
"aapl/compare.h", |
||||
"aapl/svector.h", |
||||
"aapl/avlset.h", |
||||
"aapl/bsttable.h", |
||||
"aapl/avlikeyless.h", |
||||
"aapl/bubblesort.h", |
||||
"aapl/table.h", |
||||
"aapl/avlbasic.h", |
||||
"aapl/vector.h", |
||||
"aapl/avlimap.h", |
||||
"aapl/dlistval.h", |
||||
"aapl/dlcommon.h", |
||||
"aapl/avlibasic.h", |
||||
"aapl/sbstmap.h", |
||||
"aapl/avlimel.h", |
||||
"aapl/avlimelkey.h", |
||||
"aapl/avltree.h", |
||||
], |
||||
includes = ["ragel", "aapl"], |
||||
) |
||||
|
||||
config_h_contents = """ |
||||
#define PACKAGE "ragel" |
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */ |
||||
#define PACKAGE_BUGREPORT "" |
||||
|
||||
/* Define to the full name of this package. */ |
||||
#define PACKAGE_NAME "ragel" |
||||
|
||||
/* Define to the full name and version of this package. */ |
||||
#define PACKAGE_STRING "ragel 6.10" |
||||
|
||||
/* Define to the one symbol short name of this package. */ |
||||
#define PACKAGE_TARNAME "ragel" |
||||
|
||||
/* Define to the home page for this package. */ |
||||
#define PACKAGE_URL "" |
||||
|
||||
/* Define to the version of this package. */ |
||||
#define PACKAGE_VERSION "6.10" |
||||
|
||||
/* Version number of package */ |
||||
#define VERSION "6.10" |
||||
""" |
||||
|
||||
genrule( |
||||
name = "gen_config_h", |
||||
outs = ["ragel/config.h"], |
||||
cmd = "(cat <<'HEREDOC'\n%s\nHEREDOC\n) > $@" % config_h_contents, |
||||
) |
@ -0,0 +1,234 @@ |
||||
#!/usr/bin/env python |
||||
|
||||
"""TODO(haberman): DO NOT SUBMIT without one-line documentation for make_cmakelists. |
||||
|
||||
TODO(haberman): DO NOT SUBMIT without a detailed description of make_cmakelists. |
||||
""" |
||||
|
||||
from __future__ import absolute_import |
||||
from __future__ import division |
||||
from __future__ import print_function |
||||
|
||||
import sys |
||||
import textwrap |
||||
|
||||
def StripColons(deps): |
||||
return map(lambda x: x[1:], deps) |
||||
|
||||
def IsSourceFile(name): |
||||
return name.endswith(".c") or name.endswith(".cc") |
||||
|
||||
class BuildFileFunctions(object): |
||||
def __init__(self, converter): |
||||
self.converter = converter |
||||
|
||||
def _add_deps(self, kwargs): |
||||
if "deps" not in kwargs: |
||||
return |
||||
self.converter.toplevel += "target_link_libraries(%s\n %s)\n" % ( |
||||
kwargs["name"], |
||||
"\n ".join(StripColons(kwargs["deps"])) |
||||
) |
||||
|
||||
def load(self, *args): |
||||
pass |
||||
|
||||
def cc_library(self, **kwargs): |
||||
if kwargs["name"] == "amalgamation": |
||||
return |
||||
files = kwargs.get("srcs", []) + kwargs.get("hdrs", []) |
||||
self.converter.toplevel += "add_library(%s\n %s)\n" % ( |
||||
kwargs["name"], |
||||
"\n ".join(files) |
||||
) |
||||
self._add_deps(kwargs) |
||||
|
||||
# CMake wants to know if each library is C or C++. |
||||
# If there are only .h files, it can't infer. Assume C++. |
||||
if not filter(IsSourceFile, files): |
||||
line = "set_target_properties(%s PROPERTIES LINKER_LANGUAGE CXX)\n" |
||||
self.converter.toplevel += line % (kwargs["name"]) |
||||
|
||||
def cc_binary(self, **kwargs): |
||||
pass |
||||
|
||||
def cc_test(self, **kwargs): |
||||
self.converter.toplevel += "add_executable(%s\n %s)\n" % ( |
||||
kwargs["name"], |
||||
"\n ".join(kwargs["srcs"]) |
||||
) |
||||
self.converter.toplevel += "add_test(NAME %s COMMAND %s)\n" % ( |
||||
kwargs["name"], |
||||
kwargs["name"], |
||||
) |
||||
|
||||
if "data" in kwargs: |
||||
for data_dep in kwargs["data"]: |
||||
self.converter.toplevel += textwrap.dedent("""\ |
||||
add_custom_command( |
||||
TARGET %s POST_BUILD |
||||
COMMAND ${CMAKE_COMMAND} -E copy |
||||
${CMAKE_SOURCE_DIR}/%s |
||||
${CMAKE_CURRENT_BINARY_DIR}/%s)\n""" % ( |
||||
kwargs["name"], data_dep, data_dep |
||||
)) |
||||
|
||||
self._add_deps(kwargs) |
||||
|
||||
def py_library(self, **kwargs): |
||||
pass |
||||
|
||||
def py_binary(self, **kwargs): |
||||
pass |
||||
|
||||
def lua_cclibrary(self, **kwargs): |
||||
pass |
||||
|
||||
def lua_library(self, **kwargs): |
||||
pass |
||||
|
||||
def lua_binary(self, **kwargs): |
||||
pass |
||||
|
||||
def lua_test(self, **kwargs): |
||||
pass |
||||
|
||||
def sh_test(self, **kwargs): |
||||
pass |
||||
|
||||
def make_shell_script(self, **kwargs): |
||||
pass |
||||
|
||||
def exports_files(self, files, **kwargs): |
||||
pass |
||||
|
||||
def proto_library(self, **kwargs): |
||||
pass |
||||
|
||||
def generated_file_staleness_test(self, **kwargs): |
||||
pass |
||||
|
||||
def upb_amalgamation(self, **kwargs): |
||||
pass |
||||
|
||||
def upb_proto_library(self, **kwargs): |
||||
pass |
||||
|
||||
def genrule(self, **kwargs): |
||||
pass |
||||
|
||||
def glob(*args): |
||||
return [] |
||||
|
||||
|
||||
class WorkspaceFileFunctions(object): |
||||
def __init__(self, converter): |
||||
self.converter = converter |
||||
|
||||
def load(self, *args): |
||||
pass |
||||
|
||||
def workspace(self, **kwargs): |
||||
self.converter.prelude += "project(%s)\n" % (kwargs["name"]) |
||||
|
||||
def http_archive(self, **kwargs): |
||||
pass |
||||
|
||||
def git_repository(self, **kwargs): |
||||
pass |
||||
|
||||
|
||||
class Converter(object): |
||||
def __init__(self): |
||||
self.prelude = "" |
||||
self.toplevel = "" |
||||
self.if_lua = "" |
||||
|
||||
def convert(self): |
||||
return self.template % { |
||||
"prelude": converter.prelude, |
||||
"toplevel": converter.toplevel, |
||||
} |
||||
|
||||
template = textwrap.dedent("""\ |
||||
# This file was generated from BUILD using tools/make_cmakelists.py. |
||||
|
||||
cmake_minimum_required(VERSION 3.1) |
||||
|
||||
if(${CMAKE_VERSION} VERSION_LESS 3.12) |
||||
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}) |
||||
else() |
||||
cmake_policy(VERSION 3.12) |
||||
endif() |
||||
|
||||
cmake_minimum_required (VERSION 3.0) |
||||
cmake_policy(SET CMP0048 NEW) |
||||
|
||||
%(prelude)s |
||||
|
||||
# Prevent CMake from setting -rdynamic on Linux (!!). |
||||
SET(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") |
||||
SET(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") |
||||
|
||||
# Set default build type. |
||||
if(NOT CMAKE_BUILD_TYPE) |
||||
message(STATUS "Setting build type to 'RelWithDebInfo' as none was specified.") |
||||
set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING |
||||
"Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." |
||||
FORCE) |
||||
endif() |
||||
|
||||
# When using Ninja, compiler output won't be colorized without this. |
||||
include(CheckCXXCompilerFlag) |
||||
CHECK_CXX_COMPILER_FLAG(-fdiagnostics-color=always SUPPORTS_COLOR_ALWAYS) |
||||
if(SUPPORTS_COLOR_ALWAYS) |
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color=always") |
||||
endif() |
||||
|
||||
# Implement ASAN/UBSAN options |
||||
if(UPB_ENABLE_ASAN) |
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") |
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address") |
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address") |
||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address") |
||||
endif() |
||||
|
||||
if(UPB_ENABLE_UBSAN) |
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined") |
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address") |
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address") |
||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address") |
||||
endif() |
||||
|
||||
include_directories(.) |
||||
include_directories(${CMAKE_CURRENT_BINARY_DIR}) |
||||
|
||||
if(APPLE) |
||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -undefined dynamic_lookup -flat_namespace") |
||||
elseif(UNIX) |
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--build-id") |
||||
endif() |
||||
|
||||
enable_testing() |
||||
|
||||
%(toplevel)s |
||||
|
||||
""") |
||||
|
||||
data = {} |
||||
converter = Converter() |
||||
|
||||
def GetDict(obj): |
||||
ret = {} |
||||
for k in dir(obj): |
||||
if not k.startswith("_"): |
||||
ret[k] = getattr(obj, k); |
||||
return ret |
||||
|
||||
globs = GetDict(converter) |
||||
|
||||
execfile("WORKSPACE", GetDict(WorkspaceFileFunctions(converter))) |
||||
execfile("BUILD", GetDict(BuildFileFunctions(converter))) |
||||
|
||||
with open(sys.argv[1], "w") as f: |
||||
f.write(converter.convert()) |
@ -0,0 +1,30 @@ |
||||
"""The py_test() script for generated_file_staleness_test() rules. |
||||
|
||||
Note that this file is preprocessed! The INSERT_<...> text below is replaced |
||||
with the actual list of files before we actually run the script. |
||||
""" |
||||
|
||||
from __future__ import absolute_import |
||||
|
||||
from tools import staleness_test_lib |
||||
import unittest |
||||
import sys |
||||
|
||||
file_list = """ |
||||
INSERT_FILE_LIST_HERE |
||||
""".split() |
||||
|
||||
config = staleness_test_lib.Config(file_list) |
||||
|
||||
|
||||
class TestFilesMatch(unittest.TestCase): |
||||
|
||||
def testFilesMatch(self): |
||||
errors = staleness_test_lib.CheckFilesMatch(config) |
||||
self.assertFalse(errors, errors) |
||||
|
||||
|
||||
if len(sys.argv) > 1 and sys.argv[1] == "--fix": |
||||
staleness_test_lib.FixFiles(config) |
||||
else: |
||||
unittest.main() |
@ -0,0 +1,158 @@ |
||||
"""Shared code for validating generated_file_staleness_test() rules. |
||||
|
||||
This code is used by test scripts generated from |
||||
generated_file_staleness_test() rules. |
||||
""" |
||||
|
||||
from __future__ import absolute_import |
||||
from __future__ import print_function |
||||
|
||||
import os |
||||
from shutil import copyfile |
||||
|
||||
|
||||
class _FilePair(object): |
||||
"""Represents a single (target, generated) file pair.""" |
||||
|
||||
def __init__(self, target, generated): |
||||
self.target = target |
||||
self.generated = generated |
||||
|
||||
|
||||
class Config(object): |
||||
"""Represents the configuration for a single staleness test target.""" |
||||
|
||||
def __init__(self, file_list): |
||||
# Duplicate to avoid modifying our arguments. |
||||
file_list = list(file_list) |
||||
|
||||
# The file list contains a few other bits of information at the end. |
||||
# This is packed by the code in build_defs.bzl. |
||||
self.target_name = file_list.pop() |
||||
self.package_name = file_list.pop() |
||||
self.pattern = file_list.pop() |
||||
|
||||
self.file_list = file_list |
||||
|
||||
|
||||
def _GetFilePairs(config): |
||||
"""Generates the list of file pairs. |
||||
|
||||
Args: |
||||
config: a Config object representing this target's config. |
||||
|
||||
Returns: |
||||
A list of _FilePair objects. |
||||
""" |
||||
|
||||
ret = [] |
||||
|
||||
has_bazel_genfiles = os.path.exists("bazel-genfiles") |
||||
|
||||
for filename in config.file_list: |
||||
target = os.path.join(config.package_name, filename) |
||||
generated = os.path.join(config.package_name, config.pattern % filename) |
||||
if has_bazel_genfiles: |
||||
generated = os.path.join("bazel-genfiles", generated) |
||||
|
||||
# Generated files should always exist. Blaze should guarantee this before |
||||
# we are run. |
||||
if not os.path.isfile(generated): |
||||
print("Generated file '%s' does not exist." % generated) |
||||
print("Please run this command to generate it:") |
||||
print(" bazel build %s:%s" % (config.package_name, config.target_name)) |
||||
ret.append(_FilePair(target, generated)) |
||||
|
||||
return ret |
||||
|
||||
|
||||
def _GetMissingAndStaleFiles(file_pairs): |
||||
"""Generates lists of missing and stale files. |
||||
|
||||
Args: |
||||
file_pairs: a list of _FilePair objects. |
||||
|
||||
Returns: |
||||
missing_files: a list of _FilePair objects representing missing files. |
||||
These target files do not exist at all. |
||||
stale_files: a list of _FilePair objects representing stale files. |
||||
These target files exist but have stale contents. |
||||
""" |
||||
|
||||
missing_files = [] |
||||
stale_files = [] |
||||
|
||||
for pair in file_pairs: |
||||
if not os.path.isfile(pair.target): |
||||
missing_files.append(pair) |
||||
continue |
||||
|
||||
generated = open(pair.generated).read() |
||||
target = open(pair.target).read() |
||||
if generated != target: |
||||
stale_files.append(pair) |
||||
|
||||
return missing_files, stale_files |
||||
|
||||
|
||||
def _CopyFiles(file_pairs): |
||||
"""Copies all generated files to the corresponding target file. |
||||
|
||||
The target files must be writable already. |
||||
|
||||
Args: |
||||
file_pairs: a list of _FilePair objects that we want to copy. |
||||
""" |
||||
|
||||
for pair in file_pairs: |
||||
target_dir = os.path.dirname(pair.target) |
||||
if not os.path.isdir(target_dir): |
||||
os.makedirs(target_dir) |
||||
copyfile(pair.generated, pair.target) |
||||
|
||||
|
||||
def FixFiles(config): |
||||
"""Implements the --fix option: overwrites missing or out-of-date files. |
||||
|
||||
Args: |
||||
config: the Config object for this test. |
||||
""" |
||||
|
||||
file_pairs = _GetFilePairs(config) |
||||
missing_files, stale_files = _GetMissingAndStaleFiles(file_pairs) |
||||
|
||||
_CopyFiles(stale_files + missing_files) |
||||
|
||||
|
||||
def CheckFilesMatch(config): |
||||
"""Checks whether each target file matches the corresponding generated file. |
||||
|
||||
Args: |
||||
config: the Config object for this test. |
||||
|
||||
Returns: |
||||
None if everything matches, otherwise a string error message. |
||||
""" |
||||
|
||||
diff_errors = [] |
||||
|
||||
file_pairs = _GetFilePairs(config) |
||||
missing_files, stale_files = _GetMissingAndStaleFiles(file_pairs) |
||||
|
||||
for pair in missing_files: |
||||
diff_errors.append("File %s does not exist" % pair.target) |
||||
continue |
||||
|
||||
for pair in stale_files: |
||||
diff_errors.append("File %s is out of date" % pair.target) |
||||
|
||||
if diff_errors: |
||||
error_msg = "Files out of date!\n\n" |
||||
error_msg += "To fix run THIS command:\n" |
||||
error_msg += " bazel-bin/%s/%s --fix\n\n" % (config.package_name, |
||||
config.target_name) |
||||
error_msg += "Errors:\n" |
||||
error_msg += " " + "\n ".join(diff_errors) |
||||
return error_msg |
||||
else: |
||||
return None |
@ -1,5 +0,0 @@ |
||||
#!/bin/sh |
||||
BASE=`dirname "$0"` |
||||
export LUA_CPATH="$BASE/../lua/?.so" |
||||
export LUA_PATH="$BASE/?.lua;$BASE/../lua/?.lua" |
||||
lua $BASE/upbc.lua "$@" |
Loading…
Reference in new issue