Merge pull request #132 from haberman/bazel

Added Bazel build, and auto-generate CMake build from it.
pull/13171/head
Joshua Haberman 6 years ago committed by GitHub
commit d4e78f9fdf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 537
      BUILD
  2. 367
      CMakeLists.txt
  3. 40
      WORKSPACE
  4. 273
      build_defs.bzl
  5. 4
      kokoro/ubuntu/build.sh
  6. 2
      kokoro/ubuntu/continuous.cfg
  7. 2
      kokoro/ubuntu/presubmit.cfg
  8. 102
      lua.BUILD
  9. 193
      ragel.BUILD
  10. 4
      tests/conformance_upb.c
  11. 234
      tools/make_cmakelists.py
  12. 30
      tools/staleness_test.py
  13. 158
      tools/staleness_test_lib.py
  14. 5
      tools/upbc
  15. 22
      tools/upbc.lua
  16. 26
      upb/json/parser.c
  17. 2
      upb/json/parser.rl

537
BUILD

@ -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",
)

@ -1,3 +1,4 @@
# This file was generated from BUILD using tools/make_cmakelists.py.
cmake_minimum_required(VERSION 3.1)
@ -9,16 +10,14 @@ endif()
cmake_minimum_required (VERSION 3.0)
cmake_policy(SET CMP0048 NEW)
project (upb)
project(upb)
# Prevent CMake from setting -rdynamic on Linux (!!).
SET(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
SET(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
# Options we define for users.
option(UPB_ENABLE_ASAN "Enable address sanitizer." OFF)
option(UPB_ENABLE_UBSAN "Enable undefined behavior sanitizer." OFF)
# Set default build type.
if(NOT CMAKE_BUILD_TYPE)
message(STATUS "Setting build type to 'RelWithDebInfo' as none was specified.")
@ -51,8 +50,6 @@ endif()
include_directories(.)
include_directories(${CMAKE_CURRENT_BINARY_DIR})
set(CMAKE_CXX_FLAGS "-std=c++11 -W -Wall -Wno-sign-compare")
set(CMAKE_C_FLAGS "-std=c89 -W -Wall -Wno-sign-compare")
if(APPLE)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -undefined dynamic_lookup -flat_namespace")
@ -60,250 +57,132 @@ elseif(UNIX)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--build-id")
endif()
FIND_PACKAGE(Lua)
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/third_party/protobuf/Makefile.am")
set(PROTOBUF_FOUND TRUE)
endif()
find_program(RAGEL NAMES ragel)
if(LUA_FOUND)
include_directories(${LUA_INCLUDE_DIR})
add_library(upb_c SHARED
upb/bindings/lua/upb.c
upb/bindings/lua/def.c
upb/bindings/lua/msg.c
)
target_link_libraries(upb_c LINK_PRIVATE
upbpb_pic
upbdef_pic
upbhandlers_pic upb_pic )
add_library(table_c SHARED
upb/bindings/lua/upb/table.c
)
target_link_libraries(table_c LINK_PRIVATE upb_c upb_pic)
add_library(pb_c SHARED
upb/bindings/lua/upb/pb.c
)
target_link_libraries(pb_c LINK_PRIVATE upb_c upbpb_pic)
set_target_properties(upb_c
PROPERTIES
LIBRARY_OUTPUT_DIRECTORY "lua"
PREFIX ""
SUFFIX ".so")
set_target_properties(table_c pb_c
PROPERTIES
LIBRARY_OUTPUT_DIRECTORY "lua/upb"
PREFIX ""
SUFFIX ".so")
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/tools/upbc
DEPENDS ${CMAKE_SOURCE_DIR}/tools/upbc
${CMAKE_SOURCE_DIR}/tools/upbc.lua
${CMAKE_SOURCE_DIR}/tools/dump_cinit.lua
${CMAKE_SOURCE_DIR}/tools/make_c_api.lua
${CMAKE_SOURCE_DIR}/upb/bindings/lua/upb.lua
${CMAKE_SOURCE_DIR}/upb/bindings/lua/upb/table.lua
${CMAKE_SOURCE_DIR}/upb/bindings/lua/upb/pb.lua
upb_c
table_c
pb_c
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_SOURCE_DIR}/tools/upbc
${CMAKE_SOURCE_DIR}/tools/upbc.lua
${CMAKE_SOURCE_DIR}/tools/dump_cinit.lua
${CMAKE_SOURCE_DIR}/tools/make_c_api.lua
${CMAKE_CURRENT_BINARY_DIR}/tools)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/lua/upb.lua
DEPENDS ${CMAKE_SOURCE_DIR}/upb/bindings/lua/upb.lua
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_SOURCE_DIR}/upb/bindings/lua/upb.lua
${CMAKE_CURRENT_BINARY_DIR}/lua)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/lua/upb/table.lua
${CMAKE_CURRENT_BINARY_DIR}/lua/upb/pb.lua
DEPENDS ${CMAKE_SOURCE_DIR}/upb/bindings/lua/upb/table.lua
${CMAKE_SOURCE_DIR}/upb/bindings/lua/upb/pb.lua
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_SOURCE_DIR}/upb/bindings/lua/upb/table.lua
${CMAKE_SOURCE_DIR}/upb/bindings/lua/upb/pb.lua
${CMAKE_CURRENT_BINARY_DIR}/lua/upb)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/upb/pb/compile_decoder_x64.h
DEPENDS upb/pb/compile_decoder_x64.dasc
COMMAND
cd ${CMAKE_CURRENT_SOURCE_DIR} &&
lua third_party/dynasm/dynasm.lua
-c upb/pb/compile_decoder_x64.dasc
> ${CMAKE_CURRENT_BINARY_DIR}/upb/pb/compile_decoder_x64.h
)
add_custom_target(
upbc ALL
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/make_c_api.lua
${CMAKE_CURRENT_SOURCE_DIR}/tools/upbc.lua
${CMAKE_CURRENT_BINARY_DIR}/tools/upbc
${CMAKE_CURRENT_BINARY_DIR}/lua/upb.lua
${CMAKE_CURRENT_BINARY_DIR}/lua/upb/pb.lua
)
add_custom_target(
genfiles2 ALL
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/upb/pb/compile_decoder_x64.h
)
add_test(
NAME testlua
COMMAND lua ${CMAKE_SOURCE_DIR}/tests/bindings/lua/test_upb.lua
${CMAKE_SOURCE_DIR}/tests/bindings/lua/test_upb.pb.lua
)
set_property(TEST testlua PROPERTY ENVIRONMENT
LUA_PATH=${CMAKE_SOURCE_DIR}/third_party/lunit/?.lua$<SEMICOLON>${CMAKE_SOURCE_DIR}/upb/bindings/lua/?.lua
LUA_CPATH=${CMAKE_BINARY_DIR}/upb/bindings/lua/?.so
)
set_tests_properties(testlua
PROPERTIES
DEPENDS "upb_c;pb_c"
)
enable_testing()
endif()
if(LUA_FOUND AND PROTOBUF_FOUND)
set(protobuf_BUILD_TESTS OFF CACHE BOOL "enable tests for proto2" FORCE)
set(protobuf_BUILD_SHARED_LIBS OFF CACHE BOOL "enable shared libs for proto2" FORCE)
set(protobuf_BUILD_CONFORMANCE ON CACHE BOOL "Build conformance tests" FORCE)
add_subdirectory(third_party/protobuf/cmake)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/conformance.upb.h
${CMAKE_CURRENT_BINARY_DIR}/google/protobuf/test_messages_proto3.upb.h
${CMAKE_CURRENT_BINARY_DIR}/google/protobuf/test_messages_proto3.upb.c
${CMAKE_CURRENT_BINARY_DIR}/google/protobuf/any.upb.c
${CMAKE_CURRENT_BINARY_DIR}/google/protobuf/duration.upb.c
${CMAKE_CURRENT_BINARY_DIR}/google/protobuf/field_mask.upb.c
${CMAKE_CURRENT_BINARY_DIR}/google/protobuf/struct.upb.c
${CMAKE_CURRENT_BINARY_DIR}/google/protobuf/timestamp.upb.c
${CMAKE_CURRENT_BINARY_DIR}/google/protobuf/wrappers.upb.c
${CMAKE_CURRENT_BINARY_DIR}/conformance.upb.c
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/tools/upbc
${CMAKE_CURRENT_SOURCE_DIR}/third_party/protobuf/conformance/conformance.proto
COMMAND protoc --include_imports
${CMAKE_CURRENT_SOURCE_DIR}/third_party/protobuf/conformance/conformance.proto
${CMAKE_CURRENT_SOURCE_DIR}/third_party/protobuf/src/google/protobuf/test_messages_proto3.proto
-I${CMAKE_CURRENT_SOURCE_DIR}/third_party/protobuf/conformance
-I${CMAKE_CURRENT_SOURCE_DIR}/third_party/protobuf/src
-o${CMAKE_CURRENT_BINARY_DIR}/conformance.pb &&
tools/upbc ${CMAKE_CURRENT_BINARY_DIR}/conformance.pb
)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/google/protobuf/descriptor.upb.h
${CMAKE_CURRENT_BINARY_DIR}/google/protobuf/descriptor.upb.c
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/tools/upbc
${CMAKE_CURRENT_SOURCE_DIR}/google/protobuf/descriptor.proto
COMMAND protoc
${CMAKE_CURRENT_SOURCE_DIR}/google/protobuf/descriptor.proto
-I${CMAKE_CURRENT_SOURCE_DIR}
-o${CMAKE_CURRENT_BINARY_DIR}/descriptor.pb &&
tools/upbc ${CMAKE_CURRENT_BINARY_DIR}/descriptor.pb
)
add_custom_target(
genfiles ALL
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/conformance.upb.h
${CMAKE_CURRENT_BINARY_DIR}/google/protobuf/descriptor.upb.h
)
add_executable(conformance_upb
tests/conformance_upb.c
${CMAKE_CURRENT_BINARY_DIR}/conformance.upb.c
${CMAKE_CURRENT_BINARY_DIR}/google/protobuf/test_messages_proto3.upb.c
${CMAKE_CURRENT_BINARY_DIR}/google/protobuf/any.upb.c
${CMAKE_CURRENT_BINARY_DIR}/google/protobuf/duration.upb.c
${CMAKE_CURRENT_BINARY_DIR}/google/protobuf/field_mask.upb.c
${CMAKE_CURRENT_BINARY_DIR}/google/protobuf/struct.upb.c
${CMAKE_CURRENT_BINARY_DIR}/google/protobuf/timestamp.upb.c
${CMAKE_CURRENT_BINARY_DIR}/google/protobuf/wrappers.upb.c
)
target_link_libraries(conformance_upb LINK_PRIVATE
upb
)
add_custom_target(
conformance
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/conformance_upb
${CMAKE_CURRENT_BINARY_DIR}/third_party/protobuf/cmake/conformance_test_runner
COMMAND ${CMAKE_CURRENT_BINARY_DIR}/third_party/protobuf/cmake/conformance_test_runner ${CMAKE_CURRENT_BINARY_DIR}/conformance_upb
)
endif()
if (RAGEL)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/upb/json/parser.c
DEPENDS upb/json/parser.rl
COMMAND cd ${CMAKE_CURRENT_SOURCE_DIR} && RAGEL -C -o ${CMAKE_CURRENT_BINARY_DIR}/upb/json/parser.c upb/json/parser.rl
)
endif()
configure_file(tools/copy_genfiles.sh.in tools/copy_genfiles.sh)
set(UPB_SRCS
upb/decode.c
upb/encode.c
upb/msg.c
upb/table.c
upb/upb.c
)
set (UPBDEF_SRCS
upb/descriptor/descriptor.upbdefs.c
upb/descriptor/reader.c
upb/def.c
upb/msgfactory.c
upb/refcounted.c
)
set(UPBHANDLERS_SRCS
upb/sink.c
upb/handlers.c
)
set(UPBPB_SRCS
enable_testing()
add_library(upb
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
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)
add_library(upb_descriptor
upb/descriptor/descriptor.upbdefs.c
upb/descriptor/reader.c
upb/descriptor/descriptor.upbdefs.h
upb/descriptor/reader.h)
target_link_libraries(upb_descriptor
upb)
add_library(upb_pb
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
)
set(UPBJSON_SRCS
upb/pb/varint.int.h
upb/pb/decoder.h
upb/pb/encoder.h
upb/pb/glue.h
upb/pb/textprinter.h)
target_link_libraries(upb_pb
upb
upb_descriptor)
add_library(upb_json
upb/json/parser.c
upb/json/printer.c
)
add_library(upb ${UPB_SRCS})
add_library(upbdef ${UPBDEF_SRCS})
add_library(upbhandlers ${UPBHANDLERS_SRCS})
add_library(upbpb ${UPBPB_SRCS})
add_library(upbjson ${UPBJSON_SRCS})
add_library(upb_pic ${UPB_SRCS})
add_library(upbdef_pic ${UPBDEF_SRCS})
add_library(upbhandlers_pic ${UPBHANDLERS_SRCS})
add_library(upbpb_pic ${UPBPB_SRCS})
add_library(upbjson_pic ${UPBJSON_SRCS})
upb/json/parser.h
upb/json/printer.h)
target_link_libraries(upb_json
upb)
add_library(upb_cc_bindings
upb/bindings/stdc++/string.h)
target_link_libraries(upb_cc_bindings
upb)
set_target_properties(upb_cc_bindings PROPERTIES LINKER_LANGUAGE CXX)
add_library(upb_test
tests/testmain.cc
tests/test_util.h
tests/upb_test.h)
add_executable(test_varint
tests/pb/test_varint.c)
add_test(NAME test_varint COMMAND test_varint)
target_link_libraries(test_varint
upb_pb
upb_test)
add_executable(test_def
tests/test_def.c)
add_test(NAME test_def COMMAND test_def)
target_link_libraries(test_def
upb_pb
upb_test)
add_executable(test_handlers
tests/test_handlers.c)
add_test(NAME test_handlers COMMAND test_handlers)
target_link_libraries(test_handlers
upb_pb
upb_test)
add_executable(test_decoder
tests/pb/test_decoder.cc)
add_test(NAME test_decoder COMMAND test_decoder)
target_link_libraries(test_decoder
upb_pb
upb_test)
add_executable(test_encoder
tests/pb/test_encoder.cc)
add_test(NAME test_encoder COMMAND test_encoder)
add_custom_command(
TARGET test_encoder POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_SOURCE_DIR}/upb/descriptor/descriptor.pb
${CMAKE_CURRENT_BINARY_DIR}/upb/descriptor/descriptor.pb)
target_link_libraries(test_encoder
upb_cc_bindings
upb_pb
upb_test)
add_executable(test_cpp
tests/test_cpp.cc)
add_test(NAME test_cpp COMMAND test_cpp)
target_link_libraries(test_cpp
upb
upb_descriptor
upb_pb
upb_test)
add_executable(test_table
tests/test_table.cc)
add_test(NAME test_table COMMAND test_table)
target_link_libraries(test_table
upb
upb_test)
add_executable(test_json
tests/json/test.upbdefs.c
tests/json/test.upbdefs.h
tests/json/test_json.cc)
add_test(NAME test_json COMMAND test_json)
target_link_libraries(test_json
upb_json
upb_test)
set_property(TARGET upb_pic PROPERTY POSITION_INDEPENDENT_CODE ON)
set_property(TARGET upbdef_pic PROPERTY POSITION_INDEPENDENT_CODE ON)
set_property(TARGET upbhandlers_pic PROPERTY POSITION_INDEPENDENT_CODE ON)
set_property(TARGET upbpb_pic PROPERTY POSITION_INDEPENDENT_CODE ON)
set_property(TARGET upbjson_pic PROPERTY POSITION_INDEPENDENT_CODE ON)

@ -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,
)

@ -8,8 +8,8 @@
#include <stdlib.h>
#include <unistd.h>
#include "conformance.upb.h"
#include "google/protobuf/test_messages_proto3.upb.h"
#include "conformance/conformance.upb.h"
#include "src/google/protobuf/test_messages_proto3.upb.h"
int test_count = 0;

@ -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 "$@"

@ -13,11 +13,17 @@ local make_c_api = require "make_c_api"
local upb = require "upb"
local generate_upbdefs = false
local outdir = "."
for _, argument in ipairs(arg) do
i = 1
while i <= #arg do
argument = arg[i]
if argument.sub(argument, 1, 2) == "--" then
if argument == "--generate-upbdefs" then
generate_upbdefs = true
elseif argument == "--outdir" then
i = i + 1
outdir = arg[i]
else
print("Unknown flag: " .. argument)
return 1
@ -29,6 +35,7 @@ for _, argument in ipairs(arg) do
end
src = argument
end
i = i + 1
end
if not src then
@ -40,6 +47,11 @@ function strip_proto(filename)
return string.gsub(filename, '%.proto$','')
end
local function open(filename)
local full_name = outdir .. "/" .. filename
return assert(io.open(full_name, "w"), "couldn't open " .. full_name)
end
-- Open input/output files.
local f = assert(io.open(src, "r"), "couldn't open input file " .. src)
local descriptor = f:read("*all")
@ -67,8 +79,8 @@ for _, file in ipairs(files) do
if generate_upbdefs then
-- Legacy generated defs.
local hfile = assert(io.open(hfilename, "w"), "couldn't open " .. hfilename)
local cfile = assert(io.open(cfilename, "w"), "couldn't open " .. cfilename)
local hfile = open(hfilename)
local cfile = open(cfilename)
local happend = dump_cinit.file_appender(hfile)
local cappend = dump_cinit.file_appender(cfile)
@ -90,8 +102,8 @@ for _, file in ipairs(files) do
print(string.format(" cfilename=%s", cfilename))
end
local hfile = assert(io.open(hfilename, "w"), "couldn't open " .. hfilename)
local cfile = assert(io.open(cfilename, "w"), "couldn't open " .. cfilename)
local hfile = open(hfilename)
local cfile = open(cfilename)
local happend = dump_cinit.file_appender(hfile)
local cappend = dump_cinit.file_appender(cfile)

@ -2366,7 +2366,7 @@ _match:
break;
case 2:
#line 2023 "upb/json/parser.rl"
{ p--; {stack[top++] = cs; cs = 24; goto _again;} }
{ p--; {stack[top++] = cs; cs = 24;goto _again;} }
break;
case 3:
#line 2027 "upb/json/parser.rl"
@ -2440,17 +2440,17 @@ _match:
#line 2082 "upb/json/parser.rl"
{
if (is_wellknown_msg(parser, UPB_WELLKNOWN_TIMESTAMP)) {
{stack[top++] = cs; cs = 48; goto _again;}
{stack[top++] = cs; cs = 48;goto _again;}
} else if (is_wellknown_msg(parser, UPB_WELLKNOWN_DURATION)) {
{stack[top++] = cs; cs = 41; goto _again;}
{stack[top++] = cs; cs = 41;goto _again;}
} else {
{stack[top++] = cs; cs = 33; goto _again;}
{stack[top++] = cs; cs = 33;goto _again;}
}
}
break;
case 21:
#line 2093 "upb/json/parser.rl"
{ p--; {stack[top++] = cs; cs = 76; goto _again;} }
{ p--; {stack[top++] = cs; cs = 76;goto _again;} }
break;
case 22:
#line 2098 "upb/json/parser.rl"
@ -2538,7 +2538,9 @@ _again:
switch ( *__acts++ ) {
case 0:
#line 2019 "upb/json/parser.rl"
{ p--; {cs = stack[--top]; goto _again;} }
{ p--; {cs = stack[--top]; if ( p == pe )
goto _test_eof;
goto _again;} }
break;
case 26:
#line 2111 "upb/json/parser.rl"
@ -2564,7 +2566,7 @@ _again:
#line 2139 "upb/json/parser.rl"
{ end_subobject_full(parser); }
break;
#line 2568 "upb/json/parser.c"
#line 2570 "upb/json/parser.c"
}
}
}
@ -2589,7 +2591,7 @@ error:
return p - buf;
}
bool end(void *closure, const void *hd) {
static bool end(void *closure, const void *hd) {
upb_json_parser *parser = closure;
/* Prevent compile warning on unused static constants. */
@ -2603,11 +2605,7 @@ bool end(void *closure, const void *hd) {
parse(parser, hd, &eof_ch, 0, NULL);
return parser->current_state >=
#line 2608 "upb/json/parser.c"
105
#line 2202 "upb/json/parser.rl"
;
return parser->current_state >= 105;
}
static void json_parser_reset(upb_json_parser *p) {
@ -2622,7 +2620,7 @@ static void json_parser_reset(upb_json_parser *p) {
/* Emit Ragel initialization of the parser. */
#line 2626 "upb/json/parser.c"
#line 2624 "upb/json/parser.c"
{
cs = json_start;
top = 0;

@ -2185,7 +2185,7 @@ error:
return p - buf;
}
bool end(void *closure, const void *hd) {
static bool end(void *closure, const void *hd) {
upb_json_parser *parser = closure;
/* Prevent compile warning on unused static constants. */

Loading…
Cancel
Save