parent
c5d6ec737e
commit
173554146f
20 changed files with 89 additions and 3719 deletions
@ -1,7 +1,37 @@ |
||||
## <a name="cla"></a> Signing the CLA |
||||
|
||||
Please sign the [Google Contributor License Agreement |
||||
(CLA)](https://cla.developers.google.com/) |
||||
before sending pull requests. For any code changes to be |
||||
accepted, the CLA must be signed. It's a quick process, I |
||||
promise! |
||||
# How to Contribute |
||||
|
||||
We'd love to accept your patches and contributions to this project. There are |
||||
just a few small guidelines you need to follow. |
||||
|
||||
## Get in touch |
||||
|
||||
If your idea will take you more than, say, 30 minutes to |
||||
implement, please get in touch first via the issue tracker |
||||
to touch base about your plan. That will give an |
||||
opportunity for early feedback and help avoid wasting your |
||||
time. |
||||
|
||||
## Contributor License Agreement |
||||
|
||||
Contributions to this project must be accompanied by a Contributor License |
||||
Agreement. You (or your employer) retain the copyright to your contribution; |
||||
this simply gives us permission to use and redistribute your contributions as |
||||
part of the project. Head over to <https://cla.developers.google.com/> to see |
||||
your current agreements on file or to sign a new one. |
||||
|
||||
You generally only need to submit a CLA once, so if you've already submitted one |
||||
(even if it was for a different project), you probably don't need to do it |
||||
again. |
||||
|
||||
## Code Reviews |
||||
|
||||
All submissions, including submissions by project members, require review. We |
||||
use GitHub pull requests for this purpose. Consult |
||||
[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more |
||||
information on using pull requests. |
||||
|
||||
## Community Guidelines |
||||
|
||||
This project follows [Google's Open Source Community |
||||
Guidelines](https://opensource.google/conduct/). |
||||
|
@ -1,72 +0,0 @@ |
||||
|
||||
μpb Design |
||||
---------- |
||||
|
||||
μpb has the following design goals: |
||||
|
||||
- C89 compatible. |
||||
- small code size (both for the core library and generated messages). |
||||
- fast performance (hundreds of MB/s). |
||||
- idiomatic for C programs. |
||||
- easy to wrap in high-level languages (Python, Ruby, Lua, etc) with |
||||
good performance and all standard protobuf features. |
||||
- hands-off about memory management, allowing for easy integration |
||||
with existing VMs and/or garbage collectors. |
||||
- offers binary ABI compatibility between apps, generated messages, and |
||||
the core library (doesn't require re-generating messages or recompiling |
||||
your application when the core library changes). |
||||
- provides all features that users expect from a protobuf library |
||||
(generated messages in C, reflection, text format, etc.). |
||||
- layered, so the core is small and doesn't require descriptors. |
||||
- tidy about symbol references, so that any messages or features that |
||||
aren't used by a C program can have their code GC'd by the linker. |
||||
- possible to use protobuf binary format without leaking message/field |
||||
names into the binary. |
||||
|
||||
μpb accomplishes these goals by keeping a very small core that does not contain |
||||
descriptors. We need some way of knowing what fields are in each message and |
||||
where they live, but instead of descriptors, we keep a small/lightweight summary |
||||
of the .proto file. We call this a `upb_msglayout`. It contains the bare |
||||
minimum of what we need to know to parse and serialize protobuf binary format |
||||
into our internal representation for messages, `upb_msg`. |
||||
|
||||
The core then contains functions to parse/serialize a message, given a `upb_msg*` |
||||
and a `const upb_msglayout*`. |
||||
|
||||
This approach is similar to [nanopb](https://github.com/nanopb/nanopb) which |
||||
also compiles message definitions to a compact, internal representation without |
||||
names. However nanopb does not aim to be a fully-featured library, and has no |
||||
support for text format, JSON, or descriptors. μpb is unique in that it has a |
||||
small core similar to nanopb (though not quite as small), but also offers a |
||||
full-featured protobuf library for applications that want reflection, text |
||||
format, JSON format, etc. |
||||
|
||||
Without descriptors, the core doesn't have access to field names, so it cannot |
||||
parse/serialize to protobuf text format or JSON. Instead this functionality |
||||
lives in separate modules that depend on the module implementing descriptors. |
||||
With the descriptor module we can parse/serialize binary descriptors and |
||||
validate that they follow all the rules of protobuf schemas. |
||||
|
||||
To provide binary compatibility, we version the structs that generated messages |
||||
use to create a `upb_msglayout*`. The current initializers are |
||||
`upb_msglayout_msginit_v1`, `upb_msglayout_fieldinit_v1`, etc. Then |
||||
`upb_msglayout*` uses these as its internal representation. If upb changes its |
||||
internal representation for a `upb_msglayout*`, it will also include code to |
||||
convert the old representation to the new representation. This will use some |
||||
more memory/CPU at runtime to convert between the two, but apps that statically |
||||
link μpb will never need to worry about this. |
||||
|
||||
TODO |
||||
---- |
||||
|
||||
1. revise our generated code until it is in a state where we feel comfortable |
||||
committing to API/ABI stability for it. In particular there is an open |
||||
question of whether non-ABI-compatible field accesses should have a |
||||
fastpath different from the ABI-compatible field access. |
||||
1. Add missing features (maps, extensions, unknown fields). |
||||
1. Flesh out C++ wrappers. |
||||
1. *(lower-priority)*: revise all of the existing encoders/decoders and |
||||
handlers. We probably will want to keep handlers, since they let us decouple |
||||
encoders/decoders from `upb_msg`, but we need to simplify all of that a LOT. |
||||
Likely we will want to make handlers only per-message instead of per-field, |
||||
except for variable-length fields. |
@ -1,124 +1,62 @@ |
||||
|
||||
# μpb - a small protobuf implementation in C |
||||
|
||||
|Platform|Build Status| |
||||
|--------|------------| |
||||
|macOS|[](https://fusion.corp.google.com/projectanalysis/summary/KOKORO/prod%3Aupb%2Fmacos%2Fcontinuous)| |
||||
|ubuntu|[](https://fusion.corp.google.com/projectanalysis/summary/KOKORO/prod%3Aupb%2Fubuntu%2Fcontinuous)| |
||||
|
||||
μpb (often written 'upb') is a small protobuf implementation written in C. |
||||
|
||||
upb generates a C API for creating, parsing, and serializing messages |
||||
as declared in `.proto` files. upb is heavily arena-based: all |
||||
messages always live in an arena (note: the arena can live in stack or |
||||
static memory if desired). Here is a simple example: |
||||
|
||||
```c |
||||
#include "conformance/conformance.upb.h" |
||||
|
||||
void foo(const char* data, size_t size) { |
||||
upb_arena *arena; |
||||
|
||||
/* Generated message type. */ |
||||
conformance_ConformanceRequest *request; |
||||
conformance_ConformanceResponse *response; |
||||
|
||||
arena = upb_arena_new(); |
||||
request = conformance_ConformanceRequest_parse(data, size, arena); |
||||
response = conformance_ConformanceResponse_new(arena); |
||||
|
||||
switch (conformance_ConformanceRequest_payload_case(request)) { |
||||
case conformance_ConformanceRequest_payload_protobuf_payload: { |
||||
upb_strview payload = conformance_ConformanceRequest_protobuf_payload(request); |
||||
// ... |
||||
break; |
||||
} |
||||
|
||||
case conformance_ConformanceRequest_payload_NOT_SET: |
||||
fprintf(stderr, "conformance_upb: Request didn't have payload.\n"); |
||||
break; |
||||
|
||||
default: { |
||||
static const char msg[] = "Unsupported input format."; |
||||
conformance_ConformanceResponse_set_skipped( |
||||
response, upb_strview_make(msg, sizeof(msg))); |
||||
break; |
||||
} |
||||
} |
||||
|
||||
/* Frees all messages on the arena. */ |
||||
upb_arena_free(arena); |
||||
} |
||||
``` |
||||
# μpb: small, fast C protos |
||||
|
||||
API and ABI are both subject to change! Please do not distribute |
||||
as a shared library for this reason (for now at least). |
||||
μpb (often written 'upb') is a small |
||||
[protobuf](https://github.com/protocolbuffers/protobuf) implementation written |
||||
in C. |
||||
|
||||
## Using upb in your project |
||||
upb is the core runtime for protobuf languages extensions in |
||||
[Ruby](https://github.com/protocolbuffers/protobuf/tree/master/ruby), |
||||
[PHP](https://github.com/protocolbuffers/protobuf/tree/master/php), and (soon) |
||||
Python. |
||||
|
||||
Currently only Bazel is supported (CMake support is partial and incomplete |
||||
but full CMake support is an eventual goal). |
||||
While upb offers a C API, the C API & ABI **are not stable**. For this reason, |
||||
upb is not generally offered as a C library for direct consumption, and there |
||||
are no releases. |
||||
|
||||
To use upb in your Bazel project, first add upb to your `WORKSPACE` file, |
||||
either as a `git_repository()` or as a `new_local_repository()` with a |
||||
Git Submodule. (For an example, see `examples/bazel/ in this repo). |
||||
## Features |
||||
|
||||
```python |
||||
# Add this to your WORKSPACE file. |
||||
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") |
||||
upb has comparable speed to protobuf C++, but is an order of magnitude smaller |
||||
in code size. |
||||
|
||||
git_repository( |
||||
name = "upb", |
||||
remote = "https://github.com/protocolbuffers/upb.git", |
||||
commit = "d16bf99ac4658793748cda3251226059892b3b7b", |
||||
) |
||||
Like the main protobuf implementation in C++, it supports: |
||||
|
||||
load("@upb//bazel:workspace_deps.bzl", "upb_deps") |
||||
- a generated API (in C) |
||||
- reflection |
||||
- binary & JSON wire formats |
||||
- text format serialization |
||||
- all standard features of protobufs (oneofs, maps, unknown fields, etc.) |
||||
- full conformance with the protobuf conformance tests |
||||
|
||||
upb_deps() |
||||
``` |
||||
upb also supports some features that C++ does not: |
||||
|
||||
Then in your BUILD file you can add `upb_proto_library()` rules that |
||||
generate code for a corresponding `proto_library()` rule. For |
||||
example: |
||||
|
||||
```python |
||||
# Add this to your BUILD file. |
||||
load("@upb//bazel:upb_proto_library.bzl", "upb_proto_library") |
||||
|
||||
proto_library( |
||||
name = "foo_proto", |
||||
srcs = ["foo.proto"], |
||||
) |
||||
|
||||
upb_proto_library( |
||||
name = "foo_upbproto", |
||||
deps = [":foo_proto"], |
||||
) |
||||
|
||||
cc_binary( |
||||
name = "test_binary", |
||||
srcs = ["test_binary.c"], |
||||
deps = [":foo_upbproto"], |
||||
) |
||||
``` |
||||
- **optional reflection:** generated messages are agnostic to whether |
||||
reflection will be linked in or not. |
||||
- **no global state:** no pre-main registration or other global state. |
||||
- **fast reflection-based parsing:** messages loaded at runtime parse |
||||
just as fast as compiled-in messages. |
||||
|
||||
However there are some features it does not support: |
||||
|
||||
Then in your `.c` file you can #include the generated header: |
||||
- proto2 extensions (coming soon!) |
||||
- text format parsing |
||||
- deep descriptor verification: upb's descriptor validation is not is exhaustive |
||||
as `protoc`. |
||||
|
||||
```c |
||||
#include "foo.upb.h" |
||||
## Install |
||||
|
||||
/* Insert code that uses generated types. */ |
||||
For Ruby, use [RubyGems](https://rubygems.org/gems/google-protobuf): |
||||
|
||||
``` |
||||
$ gem install google-protobuf |
||||
``` |
||||
|
||||
## Lua bindings |
||||
For PHP, use [PECL](https://pecl.php.net/package/protobuf): |
||||
|
||||
This repo has some Lua bindings for the core library. These are |
||||
experimental and very incomplete. These are currently included in |
||||
order to validate that the C API is suitable for wrapping. As the |
||||
project matures these Lua bindings may become publicly available. |
||||
``` |
||||
$ sudo pecl install protobuf |
||||
``` |
||||
|
||||
## Contact |
||||
## Contributing |
||||
|
||||
Author: Josh Haberman ([jhaberman@gmail.com](mailto:jhaberman@gmail.com), |
||||
[haberman@google.com](mailto:haberman@google.com)) |
||||
Please see [CONTRIBUTING.md](CONTRIBUTING.md). |
||||
|
@ -1,106 +0,0 @@ |
||||
# Copyright (c) 2009-2021, Google LLC |
||||
# All rights reserved. |
||||
# |
||||
# Redistribution and use in source and binary forms, with or without |
||||
# modification, are permitted provided that the following conditions are met: |
||||
# * Redistributions of source code must retain the above copyright |
||||
# notice, this list of conditions and the following disclaimer. |
||||
# * Redistributions in binary form must reproduce the above copyright |
||||
# notice, this list of conditions and the following disclaimer in the |
||||
# documentation and/or other materials provided with the distribution. |
||||
# * Neither the name of Google LLC nor the |
||||
# names of its contributors may be used to endorse or promote products |
||||
# derived from this software without specific prior written permission. |
||||
# |
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
||||
# DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY |
||||
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
||||
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
load( |
||||
":build_defs.bzl", |
||||
"generated_file_staleness_test", |
||||
) |
||||
load( |
||||
"//bazel:build_defs.bzl", |
||||
"make_shell_script", |
||||
) |
||||
|
||||
licenses(["notice"]) |
||||
|
||||
exports_files(["staleness_test.py"]) |
||||
|
||||
py_library( |
||||
name = "staleness_test_lib", |
||||
testonly = 1, |
||||
srcs = ["staleness_test_lib.py"], |
||||
) |
||||
|
||||
py_binary( |
||||
name = "make_cmakelists", |
||||
srcs = ["make_cmakelists.py"], |
||||
) |
||||
|
||||
genrule( |
||||
name = "gen_cmakelists", |
||||
srcs = [ |
||||
"//:BUILD", |
||||
"//:WORKSPACE", |
||||
"//:cmake_files", |
||||
":cmake_files", |
||||
], |
||||
outs = ["generated-in/CMakeLists.txt"], |
||||
cmd = "$(location :make_cmakelists) $@", |
||||
tools = [":make_cmakelists"], |
||||
) |
||||
|
||||
genrule( |
||||
name = "copy_protos", |
||||
srcs = ["//:descriptor_upb_proto"], |
||||
outs = [ |
||||
"generated-in/google/protobuf/descriptor.upb.c", |
||||
"generated-in/google/protobuf/descriptor.upb.h", |
||||
], |
||||
cmd = "cp $(SRCS) $(@D)/generated-in/google/protobuf", |
||||
) |
||||
|
||||
generated_file_staleness_test( |
||||
name = "test_generated_files", |
||||
outs = [ |
||||
"CMakeLists.txt", |
||||
"google/protobuf/descriptor.upb.c", |
||||
"google/protobuf/descriptor.upb.h", |
||||
], |
||||
generated_pattern = "generated-in/%s", |
||||
) |
||||
|
||||
# Test the CMake build ######################################################### |
||||
|
||||
filegroup( |
||||
name = "cmake_files", |
||||
srcs = glob([ |
||||
"**/*", |
||||
]), |
||||
) |
||||
|
||||
make_shell_script( |
||||
name = "gen_run_cmake_build", |
||||
out = "run_cmake_build.sh", |
||||
contents = "find . && mkdir build && cd build && cmake ../cmake && make -j8 && make test", |
||||
) |
||||
|
||||
sh_test( |
||||
name = "cmake_build", |
||||
srcs = ["run_cmake_build.sh"], |
||||
data = [ |
||||
":cmake_files", |
||||
"//:cmake_files", |
||||
], |
||||
deps = ["@bazel_tools//tools/bash/runfiles"], |
||||
) |
@ -1,129 +0,0 @@ |
||||
# 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) |
||||
|
||||
project(upb) |
||||
set(CMAKE_C_STANDARD 99) |
||||
|
||||
|
||||
# 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) |
||||
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() |
||||
|
||||
add_library(port INTERFACE) |
||||
add_library(upb |
||||
../upb/decode.c |
||||
../upb/decode_internal.h |
||||
../upb/encode.c |
||||
../upb/msg.c |
||||
../upb/msg_internal.h |
||||
../upb/table.c |
||||
../upb/table_internal.h |
||||
../upb/upb.c |
||||
../upb/upb_internal.h |
||||
../upb/decode.h |
||||
../upb/encode.h |
||||
../upb/msg.h |
||||
../upb/upb.h |
||||
../upb/upb.hpp) |
||||
target_link_libraries(upb |
||||
fastdecode |
||||
port) |
||||
add_library(fastdecode |
||||
../upb/decode_internal.h |
||||
../upb/decode_fast.c |
||||
../upb/decode_fast.h |
||||
../upb/msg.h |
||||
../upb/msg_internal.h |
||||
../upb/upb_internal.h) |
||||
target_link_libraries(fastdecode |
||||
port |
||||
table) |
||||
add_library(generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me INTERFACE) |
||||
target_link_libraries(generated_code_support__only_for_generated_code_do_not_use__i_give_permission_to_break_me INTERFACE |
||||
table |
||||
upb) |
||||
add_library(reflection |
||||
../upb/def.c |
||||
../upb/msg.h |
||||
../upb/reflection.c |
||||
../upb/def.h |
||||
../upb/def.hpp |
||||
../upb/reflection.h |
||||
../upb/reflection.hpp) |
||||
target_link_libraries(reflection |
||||
descriptor_upb_proto |
||||
port |
||||
table |
||||
upb) |
||||
add_library(textformat |
||||
../upb/text_encode.c |
||||
../upb/text_encode.h) |
||||
target_link_libraries(textformat |
||||
port |
||||
reflection) |
||||
add_library(json |
||||
../upb/json_decode.c |
||||
../upb/json_encode.c |
||||
../upb/json_decode.h |
||||
../upb/json_encode.h) |
||||
target_link_libraries(json |
||||
port |
||||
reflection |
||||
upb) |
||||
add_library(table INTERFACE) |
||||
target_link_libraries(table INTERFACE |
||||
port) |
||||
|
||||
|
@ -1,23 +0,0 @@ |
||||
|
||||
# upb CMake build (EXPERIMENTAL) |
||||
|
||||
upb's CMake support is experimental. The core library builds successfully |
||||
under CMake, and this is verified by the Bazel tests in this directory. |
||||
However there is no support for building the upb compiler or for generating |
||||
.upb.c/upb.h files. This means upb's CMake support is incomplete at best, |
||||
unless your application is intended to be purely reflective. |
||||
|
||||
If you find this CMake setup useful in its current state, please consider |
||||
filing an issue so we know. If you have suggestions for how it could be |
||||
more useful (and particularly if you can contribute some code for it) |
||||
please feel free to file an issue for that too. Do keep in mind that upb |
||||
does not currently provide any ABI stability, so we want to avoid providing |
||||
a shared library. |
||||
|
||||
The CMakeLists.txt is generated from the Bazel BUILD files using the Python |
||||
scripts in this directory. We want to avoid having two separate sources of |
||||
truth that both need to be updated when a file is added or removed. |
||||
|
||||
This directory also contains some generated files that would be created |
||||
on the fly during a Bazel build. These are automaticaly kept in sync by |
||||
the Bazel test `//cmake:test_generated_files`. |
@ -1,68 +0,0 @@ |
||||
# Copyright (c) 2009-2021, Google LLC |
||||
# All rights reserved. |
||||
# |
||||
# Redistribution and use in source and binary forms, with or without |
||||
# modification, are permitted provided that the following conditions are met: |
||||
# * Redistributions of source code must retain the above copyright |
||||
# notice, this list of conditions and the following disclaimer. |
||||
# * Redistributions in binary form must reproduce the above copyright |
||||
# notice, this list of conditions and the following disclaimer in the |
||||
# documentation and/or other materials provided with the distribution. |
||||
# * Neither the name of Google LLC nor the |
||||
# names of its contributors may be used to endorse or promote products |
||||
# derived from this software without specific prior written permission. |
||||
# |
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
||||
# DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY |
||||
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
||||
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
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 = ":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.bak -e '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", |
||||
], |
||||
) |
@ -1,486 +0,0 @@ |
||||
/* This file was generated by upbc (the upb compiler) from the input
|
||||
* file: |
||||
* |
||||
* google/protobuf/descriptor.proto |
||||
* |
||||
* Do not edit -- your changes will be discarded when the file is |
||||
* regenerated. */ |
||||
|
||||
#include <stddef.h> |
||||
#include "upb/msg_internal.h" |
||||
#include "google/protobuf/descriptor.upb.h" |
||||
|
||||
#include "upb/port_def.inc" |
||||
|
||||
static const upb_msglayout *const google_protobuf_FileDescriptorSet_submsgs[1] = { |
||||
&google_protobuf_FileDescriptorProto_msginit, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_FileDescriptorSet__fields[1] = { |
||||
{1, UPB_SIZE(0, 0), 0, 0, 11, _UPB_MODE_ARRAY}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_FileDescriptorSet_msginit = { |
||||
&google_protobuf_FileDescriptorSet_submsgs[0], |
||||
&google_protobuf_FileDescriptorSet__fields[0], |
||||
UPB_SIZE(8, 8), 1, false, 1, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout *const google_protobuf_FileDescriptorProto_submsgs[6] = { |
||||
&google_protobuf_DescriptorProto_msginit, |
||||
&google_protobuf_EnumDescriptorProto_msginit, |
||||
&google_protobuf_FieldDescriptorProto_msginit, |
||||
&google_protobuf_FileOptions_msginit, |
||||
&google_protobuf_ServiceDescriptorProto_msginit, |
||||
&google_protobuf_SourceCodeInfo_msginit, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_FileDescriptorProto__fields[12] = { |
||||
{1, UPB_SIZE(4, 8), 1, 0, 12, _UPB_MODE_SCALAR}, |
||||
{2, UPB_SIZE(12, 24), 2, 0, 12, _UPB_MODE_SCALAR}, |
||||
{3, UPB_SIZE(36, 72), 0, 0, 12, _UPB_MODE_ARRAY}, |
||||
{4, UPB_SIZE(40, 80), 0, 0, 11, _UPB_MODE_ARRAY}, |
||||
{5, UPB_SIZE(44, 88), 0, 1, 11, _UPB_MODE_ARRAY}, |
||||
{6, UPB_SIZE(48, 96), 0, 4, 11, _UPB_MODE_ARRAY}, |
||||
{7, UPB_SIZE(52, 104), 0, 2, 11, _UPB_MODE_ARRAY}, |
||||
{8, UPB_SIZE(28, 56), 3, 3, 11, _UPB_MODE_SCALAR}, |
||||
{9, UPB_SIZE(32, 64), 4, 5, 11, _UPB_MODE_SCALAR}, |
||||
{10, UPB_SIZE(56, 112), 0, 0, 5, _UPB_MODE_ARRAY}, |
||||
{11, UPB_SIZE(60, 120), 0, 0, 5, _UPB_MODE_ARRAY}, |
||||
{12, UPB_SIZE(20, 40), 5, 0, 12, _UPB_MODE_SCALAR}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_FileDescriptorProto_msginit = { |
||||
&google_protobuf_FileDescriptorProto_submsgs[0], |
||||
&google_protobuf_FileDescriptorProto__fields[0], |
||||
UPB_SIZE(64, 128), 12, false, 12, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout *const google_protobuf_DescriptorProto_submsgs[7] = { |
||||
&google_protobuf_DescriptorProto_msginit, |
||||
&google_protobuf_DescriptorProto_ExtensionRange_msginit, |
||||
&google_protobuf_DescriptorProto_ReservedRange_msginit, |
||||
&google_protobuf_EnumDescriptorProto_msginit, |
||||
&google_protobuf_FieldDescriptorProto_msginit, |
||||
&google_protobuf_MessageOptions_msginit, |
||||
&google_protobuf_OneofDescriptorProto_msginit, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_DescriptorProto__fields[10] = { |
||||
{1, UPB_SIZE(4, 8), 1, 0, 12, _UPB_MODE_SCALAR}, |
||||
{2, UPB_SIZE(16, 32), 0, 4, 11, _UPB_MODE_ARRAY}, |
||||
{3, UPB_SIZE(20, 40), 0, 0, 11, _UPB_MODE_ARRAY}, |
||||
{4, UPB_SIZE(24, 48), 0, 3, 11, _UPB_MODE_ARRAY}, |
||||
{5, UPB_SIZE(28, 56), 0, 1, 11, _UPB_MODE_ARRAY}, |
||||
{6, UPB_SIZE(32, 64), 0, 4, 11, _UPB_MODE_ARRAY}, |
||||
{7, UPB_SIZE(12, 24), 2, 5, 11, _UPB_MODE_SCALAR}, |
||||
{8, UPB_SIZE(36, 72), 0, 6, 11, _UPB_MODE_ARRAY}, |
||||
{9, UPB_SIZE(40, 80), 0, 2, 11, _UPB_MODE_ARRAY}, |
||||
{10, UPB_SIZE(44, 88), 0, 0, 12, _UPB_MODE_ARRAY}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_DescriptorProto_msginit = { |
||||
&google_protobuf_DescriptorProto_submsgs[0], |
||||
&google_protobuf_DescriptorProto__fields[0], |
||||
UPB_SIZE(48, 96), 10, false, 10, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout *const google_protobuf_DescriptorProto_ExtensionRange_submsgs[1] = { |
||||
&google_protobuf_ExtensionRangeOptions_msginit, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_DescriptorProto_ExtensionRange__fields[3] = { |
||||
{1, UPB_SIZE(4, 4), 1, 0, 5, _UPB_MODE_SCALAR}, |
||||
{2, UPB_SIZE(8, 8), 2, 0, 5, _UPB_MODE_SCALAR}, |
||||
{3, UPB_SIZE(12, 16), 3, 0, 11, _UPB_MODE_SCALAR}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_DescriptorProto_ExtensionRange_msginit = { |
||||
&google_protobuf_DescriptorProto_ExtensionRange_submsgs[0], |
||||
&google_protobuf_DescriptorProto_ExtensionRange__fields[0], |
||||
UPB_SIZE(16, 24), 3, false, 3, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_DescriptorProto_ReservedRange__fields[2] = { |
||||
{1, UPB_SIZE(4, 4), 1, 0, 5, _UPB_MODE_SCALAR}, |
||||
{2, UPB_SIZE(8, 8), 2, 0, 5, _UPB_MODE_SCALAR}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_DescriptorProto_ReservedRange_msginit = { |
||||
NULL, |
||||
&google_protobuf_DescriptorProto_ReservedRange__fields[0], |
||||
UPB_SIZE(16, 16), 2, false, 2, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout *const google_protobuf_ExtensionRangeOptions_submsgs[1] = { |
||||
&google_protobuf_UninterpretedOption_msginit, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_ExtensionRangeOptions__fields[1] = { |
||||
{999, UPB_SIZE(0, 0), 0, 0, 11, _UPB_MODE_ARRAY}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_ExtensionRangeOptions_msginit = { |
||||
&google_protobuf_ExtensionRangeOptions_submsgs[0], |
||||
&google_protobuf_ExtensionRangeOptions__fields[0], |
||||
UPB_SIZE(8, 8), 1, false, 0, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout *const google_protobuf_FieldDescriptorProto_submsgs[1] = { |
||||
&google_protobuf_FieldOptions_msginit, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_FieldDescriptorProto__fields[11] = { |
||||
{1, UPB_SIZE(24, 24), 1, 0, 12, _UPB_MODE_SCALAR}, |
||||
{2, UPB_SIZE(32, 40), 2, 0, 12, _UPB_MODE_SCALAR}, |
||||
{3, UPB_SIZE(12, 12), 3, 0, 5, _UPB_MODE_SCALAR}, |
||||
{4, UPB_SIZE(4, 4), 4, 0, 14, _UPB_MODE_SCALAR}, |
||||
{5, UPB_SIZE(8, 8), 5, 0, 14, _UPB_MODE_SCALAR}, |
||||
{6, UPB_SIZE(40, 56), 6, 0, 12, _UPB_MODE_SCALAR}, |
||||
{7, UPB_SIZE(48, 72), 7, 0, 12, _UPB_MODE_SCALAR}, |
||||
{8, UPB_SIZE(64, 104), 8, 0, 11, _UPB_MODE_SCALAR}, |
||||
{9, UPB_SIZE(16, 16), 9, 0, 5, _UPB_MODE_SCALAR}, |
||||
{10, UPB_SIZE(56, 88), 10, 0, 12, _UPB_MODE_SCALAR}, |
||||
{17, UPB_SIZE(20, 20), 11, 0, 8, _UPB_MODE_SCALAR}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_FieldDescriptorProto_msginit = { |
||||
&google_protobuf_FieldDescriptorProto_submsgs[0], |
||||
&google_protobuf_FieldDescriptorProto__fields[0], |
||||
UPB_SIZE(72, 112), 11, false, 10, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout *const google_protobuf_OneofDescriptorProto_submsgs[1] = { |
||||
&google_protobuf_OneofOptions_msginit, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_OneofDescriptorProto__fields[2] = { |
||||
{1, UPB_SIZE(4, 8), 1, 0, 12, _UPB_MODE_SCALAR}, |
||||
{2, UPB_SIZE(12, 24), 2, 0, 11, _UPB_MODE_SCALAR}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_OneofDescriptorProto_msginit = { |
||||
&google_protobuf_OneofDescriptorProto_submsgs[0], |
||||
&google_protobuf_OneofDescriptorProto__fields[0], |
||||
UPB_SIZE(16, 32), 2, false, 2, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout *const google_protobuf_EnumDescriptorProto_submsgs[3] = { |
||||
&google_protobuf_EnumDescriptorProto_EnumReservedRange_msginit, |
||||
&google_protobuf_EnumOptions_msginit, |
||||
&google_protobuf_EnumValueDescriptorProto_msginit, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_EnumDescriptorProto__fields[5] = { |
||||
{1, UPB_SIZE(4, 8), 1, 0, 12, _UPB_MODE_SCALAR}, |
||||
{2, UPB_SIZE(16, 32), 0, 2, 11, _UPB_MODE_ARRAY}, |
||||
{3, UPB_SIZE(12, 24), 2, 1, 11, _UPB_MODE_SCALAR}, |
||||
{4, UPB_SIZE(20, 40), 0, 0, 11, _UPB_MODE_ARRAY}, |
||||
{5, UPB_SIZE(24, 48), 0, 0, 12, _UPB_MODE_ARRAY}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_EnumDescriptorProto_msginit = { |
||||
&google_protobuf_EnumDescriptorProto_submsgs[0], |
||||
&google_protobuf_EnumDescriptorProto__fields[0], |
||||
UPB_SIZE(32, 64), 5, false, 5, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_EnumDescriptorProto_EnumReservedRange__fields[2] = { |
||||
{1, UPB_SIZE(4, 4), 1, 0, 5, _UPB_MODE_SCALAR}, |
||||
{2, UPB_SIZE(8, 8), 2, 0, 5, _UPB_MODE_SCALAR}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_EnumDescriptorProto_EnumReservedRange_msginit = { |
||||
NULL, |
||||
&google_protobuf_EnumDescriptorProto_EnumReservedRange__fields[0], |
||||
UPB_SIZE(16, 16), 2, false, 2, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout *const google_protobuf_EnumValueDescriptorProto_submsgs[1] = { |
||||
&google_protobuf_EnumValueOptions_msginit, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_EnumValueDescriptorProto__fields[3] = { |
||||
{1, UPB_SIZE(8, 8), 1, 0, 12, _UPB_MODE_SCALAR}, |
||||
{2, UPB_SIZE(4, 4), 2, 0, 5, _UPB_MODE_SCALAR}, |
||||
{3, UPB_SIZE(16, 24), 3, 0, 11, _UPB_MODE_SCALAR}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_EnumValueDescriptorProto_msginit = { |
||||
&google_protobuf_EnumValueDescriptorProto_submsgs[0], |
||||
&google_protobuf_EnumValueDescriptorProto__fields[0], |
||||
UPB_SIZE(24, 32), 3, false, 3, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout *const google_protobuf_ServiceDescriptorProto_submsgs[2] = { |
||||
&google_protobuf_MethodDescriptorProto_msginit, |
||||
&google_protobuf_ServiceOptions_msginit, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_ServiceDescriptorProto__fields[3] = { |
||||
{1, UPB_SIZE(4, 8), 1, 0, 12, _UPB_MODE_SCALAR}, |
||||
{2, UPB_SIZE(16, 32), 0, 0, 11, _UPB_MODE_ARRAY}, |
||||
{3, UPB_SIZE(12, 24), 2, 1, 11, _UPB_MODE_SCALAR}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_ServiceDescriptorProto_msginit = { |
||||
&google_protobuf_ServiceDescriptorProto_submsgs[0], |
||||
&google_protobuf_ServiceDescriptorProto__fields[0], |
||||
UPB_SIZE(24, 48), 3, false, 3, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout *const google_protobuf_MethodDescriptorProto_submsgs[1] = { |
||||
&google_protobuf_MethodOptions_msginit, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_MethodDescriptorProto__fields[6] = { |
||||
{1, UPB_SIZE(4, 8), 1, 0, 12, _UPB_MODE_SCALAR}, |
||||
{2, UPB_SIZE(12, 24), 2, 0, 12, _UPB_MODE_SCALAR}, |
||||
{3, UPB_SIZE(20, 40), 3, 0, 12, _UPB_MODE_SCALAR}, |
||||
{4, UPB_SIZE(28, 56), 4, 0, 11, _UPB_MODE_SCALAR}, |
||||
{5, UPB_SIZE(1, 1), 5, 0, 8, _UPB_MODE_SCALAR}, |
||||
{6, UPB_SIZE(2, 2), 6, 0, 8, _UPB_MODE_SCALAR}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_MethodDescriptorProto_msginit = { |
||||
&google_protobuf_MethodDescriptorProto_submsgs[0], |
||||
&google_protobuf_MethodDescriptorProto__fields[0], |
||||
UPB_SIZE(32, 64), 6, false, 6, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout *const google_protobuf_FileOptions_submsgs[1] = { |
||||
&google_protobuf_UninterpretedOption_msginit, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_FileOptions__fields[21] = { |
||||
{1, UPB_SIZE(20, 24), 1, 0, 12, _UPB_MODE_SCALAR}, |
||||
{8, UPB_SIZE(28, 40), 2, 0, 12, _UPB_MODE_SCALAR}, |
||||
{9, UPB_SIZE(4, 4), 3, 0, 14, _UPB_MODE_SCALAR}, |
||||
{10, UPB_SIZE(8, 8), 4, 0, 8, _UPB_MODE_SCALAR}, |
||||
{11, UPB_SIZE(36, 56), 5, 0, 12, _UPB_MODE_SCALAR}, |
||||
{16, UPB_SIZE(9, 9), 6, 0, 8, _UPB_MODE_SCALAR}, |
||||
{17, UPB_SIZE(10, 10), 7, 0, 8, _UPB_MODE_SCALAR}, |
||||
{18, UPB_SIZE(11, 11), 8, 0, 8, _UPB_MODE_SCALAR}, |
||||
{20, UPB_SIZE(12, 12), 9, 0, 8, _UPB_MODE_SCALAR}, |
||||
{23, UPB_SIZE(13, 13), 10, 0, 8, _UPB_MODE_SCALAR}, |
||||
{27, UPB_SIZE(14, 14), 11, 0, 8, _UPB_MODE_SCALAR}, |
||||
{31, UPB_SIZE(15, 15), 12, 0, 8, _UPB_MODE_SCALAR}, |
||||
{36, UPB_SIZE(44, 72), 13, 0, 12, _UPB_MODE_SCALAR}, |
||||
{37, UPB_SIZE(52, 88), 14, 0, 12, _UPB_MODE_SCALAR}, |
||||
{39, UPB_SIZE(60, 104), 15, 0, 12, _UPB_MODE_SCALAR}, |
||||
{40, UPB_SIZE(68, 120), 16, 0, 12, _UPB_MODE_SCALAR}, |
||||
{41, UPB_SIZE(76, 136), 17, 0, 12, _UPB_MODE_SCALAR}, |
||||
{42, UPB_SIZE(16, 16), 18, 0, 8, _UPB_MODE_SCALAR}, |
||||
{44, UPB_SIZE(84, 152), 19, 0, 12, _UPB_MODE_SCALAR}, |
||||
{45, UPB_SIZE(92, 168), 20, 0, 12, _UPB_MODE_SCALAR}, |
||||
{999, UPB_SIZE(100, 184), 0, 0, 11, _UPB_MODE_ARRAY}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_FileOptions_msginit = { |
||||
&google_protobuf_FileOptions_submsgs[0], |
||||
&google_protobuf_FileOptions__fields[0], |
||||
UPB_SIZE(104, 192), 21, false, 1, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout *const google_protobuf_MessageOptions_submsgs[1] = { |
||||
&google_protobuf_UninterpretedOption_msginit, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_MessageOptions__fields[5] = { |
||||
{1, UPB_SIZE(1, 1), 1, 0, 8, _UPB_MODE_SCALAR}, |
||||
{2, UPB_SIZE(2, 2), 2, 0, 8, _UPB_MODE_SCALAR}, |
||||
{3, UPB_SIZE(3, 3), 3, 0, 8, _UPB_MODE_SCALAR}, |
||||
{7, UPB_SIZE(4, 4), 4, 0, 8, _UPB_MODE_SCALAR}, |
||||
{999, UPB_SIZE(8, 8), 0, 0, 11, _UPB_MODE_ARRAY}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_MessageOptions_msginit = { |
||||
&google_protobuf_MessageOptions_submsgs[0], |
||||
&google_protobuf_MessageOptions__fields[0], |
||||
UPB_SIZE(16, 16), 5, false, 3, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout *const google_protobuf_FieldOptions_submsgs[1] = { |
||||
&google_protobuf_UninterpretedOption_msginit, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_FieldOptions__fields[7] = { |
||||
{1, UPB_SIZE(4, 4), 1, 0, 14, _UPB_MODE_SCALAR}, |
||||
{2, UPB_SIZE(12, 12), 2, 0, 8, _UPB_MODE_SCALAR}, |
||||
{3, UPB_SIZE(13, 13), 3, 0, 8, _UPB_MODE_SCALAR}, |
||||
{5, UPB_SIZE(14, 14), 4, 0, 8, _UPB_MODE_SCALAR}, |
||||
{6, UPB_SIZE(8, 8), 5, 0, 14, _UPB_MODE_SCALAR}, |
||||
{10, UPB_SIZE(15, 15), 6, 0, 8, _UPB_MODE_SCALAR}, |
||||
{999, UPB_SIZE(16, 16), 0, 0, 11, _UPB_MODE_ARRAY}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_FieldOptions_msginit = { |
||||
&google_protobuf_FieldOptions_submsgs[0], |
||||
&google_protobuf_FieldOptions__fields[0], |
||||
UPB_SIZE(24, 24), 7, false, 3, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout *const google_protobuf_OneofOptions_submsgs[1] = { |
||||
&google_protobuf_UninterpretedOption_msginit, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_OneofOptions__fields[1] = { |
||||
{999, UPB_SIZE(0, 0), 0, 0, 11, _UPB_MODE_ARRAY}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_OneofOptions_msginit = { |
||||
&google_protobuf_OneofOptions_submsgs[0], |
||||
&google_protobuf_OneofOptions__fields[0], |
||||
UPB_SIZE(8, 8), 1, false, 0, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout *const google_protobuf_EnumOptions_submsgs[1] = { |
||||
&google_protobuf_UninterpretedOption_msginit, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_EnumOptions__fields[3] = { |
||||
{2, UPB_SIZE(1, 1), 1, 0, 8, _UPB_MODE_SCALAR}, |
||||
{3, UPB_SIZE(2, 2), 2, 0, 8, _UPB_MODE_SCALAR}, |
||||
{999, UPB_SIZE(4, 8), 0, 0, 11, _UPB_MODE_ARRAY}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_EnumOptions_msginit = { |
||||
&google_protobuf_EnumOptions_submsgs[0], |
||||
&google_protobuf_EnumOptions__fields[0], |
||||
UPB_SIZE(8, 16), 3, false, 0, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout *const google_protobuf_EnumValueOptions_submsgs[1] = { |
||||
&google_protobuf_UninterpretedOption_msginit, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_EnumValueOptions__fields[2] = { |
||||
{1, UPB_SIZE(1, 1), 1, 0, 8, _UPB_MODE_SCALAR}, |
||||
{999, UPB_SIZE(4, 8), 0, 0, 11, _UPB_MODE_ARRAY}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_EnumValueOptions_msginit = { |
||||
&google_protobuf_EnumValueOptions_submsgs[0], |
||||
&google_protobuf_EnumValueOptions__fields[0], |
||||
UPB_SIZE(8, 16), 2, false, 1, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout *const google_protobuf_ServiceOptions_submsgs[1] = { |
||||
&google_protobuf_UninterpretedOption_msginit, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_ServiceOptions__fields[2] = { |
||||
{33, UPB_SIZE(1, 1), 1, 0, 8, _UPB_MODE_SCALAR}, |
||||
{999, UPB_SIZE(4, 8), 0, 0, 11, _UPB_MODE_ARRAY}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_ServiceOptions_msginit = { |
||||
&google_protobuf_ServiceOptions_submsgs[0], |
||||
&google_protobuf_ServiceOptions__fields[0], |
||||
UPB_SIZE(8, 16), 2, false, 0, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout *const google_protobuf_MethodOptions_submsgs[1] = { |
||||
&google_protobuf_UninterpretedOption_msginit, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_MethodOptions__fields[3] = { |
||||
{33, UPB_SIZE(8, 8), 1, 0, 8, _UPB_MODE_SCALAR}, |
||||
{34, UPB_SIZE(4, 4), 2, 0, 14, _UPB_MODE_SCALAR}, |
||||
{999, UPB_SIZE(12, 16), 0, 0, 11, _UPB_MODE_ARRAY}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_MethodOptions_msginit = { |
||||
&google_protobuf_MethodOptions_submsgs[0], |
||||
&google_protobuf_MethodOptions__fields[0], |
||||
UPB_SIZE(16, 24), 3, false, 0, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout *const google_protobuf_UninterpretedOption_submsgs[1] = { |
||||
&google_protobuf_UninterpretedOption_NamePart_msginit, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_UninterpretedOption__fields[7] = { |
||||
{2, UPB_SIZE(56, 80), 0, 0, 11, _UPB_MODE_ARRAY}, |
||||
{3, UPB_SIZE(32, 32), 1, 0, 12, _UPB_MODE_SCALAR}, |
||||
{4, UPB_SIZE(8, 8), 2, 0, 4, _UPB_MODE_SCALAR}, |
||||
{5, UPB_SIZE(16, 16), 3, 0, 3, _UPB_MODE_SCALAR}, |
||||
{6, UPB_SIZE(24, 24), 4, 0, 1, _UPB_MODE_SCALAR}, |
||||
{7, UPB_SIZE(40, 48), 5, 0, 12, _UPB_MODE_SCALAR}, |
||||
{8, UPB_SIZE(48, 64), 6, 0, 12, _UPB_MODE_SCALAR}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_UninterpretedOption_msginit = { |
||||
&google_protobuf_UninterpretedOption_submsgs[0], |
||||
&google_protobuf_UninterpretedOption__fields[0], |
||||
UPB_SIZE(64, 96), 7, false, 0, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_UninterpretedOption_NamePart__fields[2] = { |
||||
{1, UPB_SIZE(4, 8), 1, 0, 12, _UPB_MODE_SCALAR}, |
||||
{2, UPB_SIZE(1, 1), 2, 0, 8, _UPB_MODE_SCALAR}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_UninterpretedOption_NamePart_msginit = { |
||||
NULL, |
||||
&google_protobuf_UninterpretedOption_NamePart__fields[0], |
||||
UPB_SIZE(16, 32), 2, false, 2, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout *const google_protobuf_SourceCodeInfo_submsgs[1] = { |
||||
&google_protobuf_SourceCodeInfo_Location_msginit, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_SourceCodeInfo__fields[1] = { |
||||
{1, UPB_SIZE(0, 0), 0, 0, 11, _UPB_MODE_ARRAY}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_SourceCodeInfo_msginit = { |
||||
&google_protobuf_SourceCodeInfo_submsgs[0], |
||||
&google_protobuf_SourceCodeInfo__fields[0], |
||||
UPB_SIZE(8, 8), 1, false, 1, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_SourceCodeInfo_Location__fields[5] = { |
||||
{1, UPB_SIZE(20, 40), 0, 0, 5, _UPB_MODE_ARRAY | _UPB_MODE_IS_PACKED}, |
||||
{2, UPB_SIZE(24, 48), 0, 0, 5, _UPB_MODE_ARRAY | _UPB_MODE_IS_PACKED}, |
||||
{3, UPB_SIZE(4, 8), 1, 0, 12, _UPB_MODE_SCALAR}, |
||||
{4, UPB_SIZE(12, 24), 2, 0, 12, _UPB_MODE_SCALAR}, |
||||
{6, UPB_SIZE(28, 56), 0, 0, 12, _UPB_MODE_ARRAY}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_SourceCodeInfo_Location_msginit = { |
||||
NULL, |
||||
&google_protobuf_SourceCodeInfo_Location__fields[0], |
||||
UPB_SIZE(32, 64), 5, false, 4, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout *const google_protobuf_GeneratedCodeInfo_submsgs[1] = { |
||||
&google_protobuf_GeneratedCodeInfo_Annotation_msginit, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_GeneratedCodeInfo__fields[1] = { |
||||
{1, UPB_SIZE(0, 0), 0, 0, 11, _UPB_MODE_ARRAY}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_GeneratedCodeInfo_msginit = { |
||||
&google_protobuf_GeneratedCodeInfo_submsgs[0], |
||||
&google_protobuf_GeneratedCodeInfo__fields[0], |
||||
UPB_SIZE(8, 8), 1, false, 1, 255, |
||||
}; |
||||
|
||||
static const upb_msglayout_field google_protobuf_GeneratedCodeInfo_Annotation__fields[4] = { |
||||
{1, UPB_SIZE(20, 32), 0, 0, 5, _UPB_MODE_ARRAY | _UPB_MODE_IS_PACKED}, |
||||
{2, UPB_SIZE(12, 16), 1, 0, 12, _UPB_MODE_SCALAR}, |
||||
{3, UPB_SIZE(4, 4), 2, 0, 5, _UPB_MODE_SCALAR}, |
||||
{4, UPB_SIZE(8, 8), 3, 0, 5, _UPB_MODE_SCALAR}, |
||||
}; |
||||
|
||||
const upb_msglayout google_protobuf_GeneratedCodeInfo_Annotation_msginit = { |
||||
NULL, |
||||
&google_protobuf_GeneratedCodeInfo_Annotation__fields[0], |
||||
UPB_SIZE(24, 48), 4, false, 4, 255, |
||||
}; |
||||
|
||||
#include "upb/port_undef.inc" |
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,313 +0,0 @@ |
||||
#!/usr/bin/python |
||||
# |
||||
# Copyright (c) 2009-2021, Google LLC |
||||
# All rights reserved. |
||||
# |
||||
# Redistribution and use in source and binary forms, with or without |
||||
# modification, are permitted provided that the following conditions are met: |
||||
# * Redistributions of source code must retain the above copyright |
||||
# notice, this list of conditions and the following disclaimer. |
||||
# * Redistributions in binary form must reproduce the above copyright |
||||
# notice, this list of conditions and the following disclaimer in the |
||||
# documentation and/or other materials provided with the distribution. |
||||
# * Neither the name of Google LLC nor the |
||||
# names of its contributors may be used to endorse or promote products |
||||
# derived from this software without specific prior written permission. |
||||
# |
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
||||
# DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY |
||||
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
||||
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
"""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 |
||||
import os |
||||
|
||||
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, keyword=""): |
||||
if "deps" not in kwargs: |
||||
return |
||||
self.converter.toplevel += "target_link_libraries(%s%s\n %s)\n" % ( |
||||
kwargs["name"], |
||||
keyword, |
||||
"\n ".join(StripColons(kwargs["deps"])) |
||||
) |
||||
|
||||
def load(self, *args): |
||||
pass |
||||
|
||||
def cc_library(self, **kwargs): |
||||
if kwargs["name"].endswith("amalgamation"): |
||||
return |
||||
if kwargs["name"] == "upbc_generator": |
||||
return |
||||
if kwargs["name"] == "lupb": |
||||
return |
||||
files = kwargs.get("srcs", []) + kwargs.get("hdrs", []) |
||||
found_files = [] |
||||
for file in files: |
||||
if os.path.isfile(file): |
||||
found_files.append("../" + file) |
||||
elif os.path.isfile("cmake/" + file): |
||||
found_files.append("../cmake/" + file) |
||||
else: |
||||
print("Warning: no such file: " + file) |
||||
|
||||
if list(filter(IsSourceFile, files)): |
||||
# Has sources, make this a normal library. |
||||
self.converter.toplevel += "add_library(%s\n %s)\n" % ( |
||||
kwargs["name"], |
||||
"\n ".join(found_files) |
||||
) |
||||
self._add_deps(kwargs) |
||||
else: |
||||
# Header-only library, have to do a couple things differently. |
||||
# For some info, see: |
||||
# http://mariobadr.com/creating-a-header-only-library-with-cmake.html |
||||
self.converter.toplevel += "add_library(%s INTERFACE)\n" % ( |
||||
kwargs["name"] |
||||
) |
||||
self._add_deps(kwargs, " INTERFACE") |
||||
|
||||
def cc_binary(self, **kwargs): |
||||
pass |
||||
|
||||
def cc_test(self, **kwargs): |
||||
# Disable this until we properly support upb_proto_library(). |
||||
# 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) |
||||
pass |
||||
|
||||
def py_library(self, **kwargs): |
||||
pass |
||||
|
||||
def py_binary(self, **kwargs): |
||||
pass |
||||
|
||||
def lua_proto_library(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 cc_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 upb_proto_library_copts(self, **kwargs): |
||||
pass |
||||
|
||||
def upb_proto_reflection_library(self, **kwargs): |
||||
pass |
||||
|
||||
def upb_proto_srcs(self, **kwargs): |
||||
pass |
||||
|
||||
def genrule(self, **kwargs): |
||||
pass |
||||
|
||||
def config_setting(self, **kwargs): |
||||
pass |
||||
|
||||
def upb_fasttable_enabled(self, **kwargs): |
||||
pass |
||||
|
||||
def select(self, arg_dict): |
||||
return [] |
||||
|
||||
def glob(self, *args): |
||||
return [] |
||||
|
||||
def licenses(self, *args): |
||||
pass |
||||
|
||||
def filegroup(self, **kwargs): |
||||
pass |
||||
|
||||
def map_dep(self, arg): |
||||
return arg |
||||
|
||||
|
||||
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"]) |
||||
self.converter.prelude += "set(CMAKE_C_STANDARD 99)\n" |
||||
|
||||
def http_archive(self, **kwargs): |
||||
pass |
||||
|
||||
def git_repository(self, **kwargs): |
||||
pass |
||||
|
||||
def new_git_repository(self, **kwargs): |
||||
pass |
||||
|
||||
def bazel_version_repository(self, **kwargs): |
||||
pass |
||||
|
||||
def upb_deps(self): |
||||
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) |
||||
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 = {} |
||||
ret["UPB_DEFAULT_COPTS"] = [] # HACK |
||||
for k in dir(obj): |
||||
if not k.startswith("_"): |
||||
ret[k] = getattr(obj, k); |
||||
return ret |
||||
|
||||
globs = GetDict(converter) |
||||
|
||||
exec(open("WORKSPACE").read(), GetDict(WorkspaceFileFunctions(converter))) |
||||
exec(open("BUILD").read(), GetDict(BuildFileFunctions(converter))) |
||||
|
||||
with open(sys.argv[1], "w") as f: |
||||
f.write(converter.convert()) |
@ -1,57 +0,0 @@ |
||||
#!/usr/bin/python |
||||
# |
||||
# Copyright (c) 2009-2021, Google LLC |
||||
# All rights reserved. |
||||
# |
||||
# Redistribution and use in source and binary forms, with or without |
||||
# modification, are permitted provided that the following conditions are met: |
||||
# * Redistributions of source code must retain the above copyright |
||||
# notice, this list of conditions and the following disclaimer. |
||||
# * Redistributions in binary form must reproduce the above copyright |
||||
# notice, this list of conditions and the following disclaimer in the |
||||
# documentation and/or other materials provided with the distribution. |
||||
# * Neither the name of Google LLC nor the |
||||
# names of its contributors may be used to endorse or promote products |
||||
# derived from this software without specific prior written permission. |
||||
# |
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
||||
# DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY |
||||
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
||||
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
"""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 cmake 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() |
@ -1,186 +0,0 @@ |
||||
#!/usr/bin/python |
||||
# |
||||
# Copyright (c) 2009-2021, Google LLC |
||||
# All rights reserved. |
||||
# |
||||
# Redistribution and use in source and binary forms, with or without |
||||
# modification, are permitted provided that the following conditions are met: |
||||
# * Redistributions of source code must retain the above copyright |
||||
# notice, this list of conditions and the following disclaimer. |
||||
# * Redistributions in binary form must reproduce the above copyright |
||||
# notice, this list of conditions and the following disclaimer in the |
||||
# documentation and/or other materials provided with the distribution. |
||||
# * Neither the name of Google LLC nor the |
||||
# names of its contributors may be used to endorse or promote products |
||||
# derived from this software without specific prior written permission. |
||||
# |
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
||||
# DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY |
||||
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
||||
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
"""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 sys |
||||
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-bin") |
||||
|
||||
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-bin", 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)) |
||||
sys.exit(1) |
||||
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 |
||||
|
||||
with open(pair.generated) as g, open(pair.target) as t: |
||||
if g.read() != t.read(): |
||||
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,46 +0,0 @@ |
||||
# Copyright (c) 2009-2021, Google LLC |
||||
# All rights reserved. |
||||
# |
||||
# Redistribution and use in source and binary forms, with or without |
||||
# modification, are permitted provided that the following conditions are met: |
||||
# * Redistributions of source code must retain the above copyright |
||||
# notice, this list of conditions and the following disclaimer. |
||||
# * Redistributions in binary form must reproduce the above copyright |
||||
# notice, this list of conditions and the following disclaimer in the |
||||
# documentation and/or other materials provided with the distribution. |
||||
# * Neither the name of Google LLC nor the |
||||
# names of its contributors may be used to endorse or promote products |
||||
# derived from this software without specific prior written permission. |
||||
# |
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
||||
# DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY |
||||
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
||||
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
||||
load("@rules_proto//proto:defs.bzl", "proto_library") |
||||
load("@upb//bazel:upb_proto_library.bzl", "upb_proto_library") |
||||
|
||||
licenses(["notice"]) |
||||
|
||||
proto_library( |
||||
name = "foo_proto", |
||||
srcs = ["foo.proto"], |
||||
) |
||||
|
||||
upb_proto_library( |
||||
name = "foo_upbproto", |
||||
deps = [":foo_proto"], |
||||
) |
||||
|
||||
cc_binary( |
||||
name = "test_binary", |
||||
srcs = ["test_binary.c"], |
||||
copts = ["-std=c99"], |
||||
deps = [":foo_upbproto"], |
||||
) |
@ -1,14 +0,0 @@ |
||||
|
||||
workspace(name = "upb_example") |
||||
|
||||
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") |
||||
|
||||
git_repository( |
||||
name = "upb", |
||||
remote = "https://github.com/protocolbuffers/upb.git", |
||||
commit = "d16bf99ac4658793748cda3251226059892b3b7b", |
||||
) |
||||
|
||||
load("@upb//bazel:workspace_deps.bzl", "upb_deps") |
||||
|
||||
upb_deps() |
@ -1,7 +0,0 @@ |
||||
|
||||
syntax = "proto2"; |
||||
|
||||
message Foo { |
||||
optional int64 time = 1; |
||||
optional string greeting = 2; |
||||
} |
@ -1,43 +0,0 @@ |
||||
/*
|
||||
* Copyright (c) 2009-2021, Google LLC |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are met: |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* * Neither the name of Google LLC nor the |
||||
* names of its contributors may be used to endorse or promote products |
||||
* derived from this software without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
||||
* DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY |
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
#include <time.h> |
||||
|
||||
#include "examples/bazel/foo.upb.h" |
||||
|
||||
int main() { |
||||
upb_arena *arena = upb_arena_new(); |
||||
Foo* foo = Foo_new(arena); |
||||
const char greeting[] = "Hello, World!\n"; |
||||
|
||||
Foo_set_time(foo, time(NULL)); |
||||
/* Warning: the proto will not copy this, the string data must outlive
|
||||
* the proto. */ |
||||
Foo_set_greeting(foo, upb_strview_makez(greeting)); |
||||
|
||||
upb_arena_free(arena); |
||||
} |
Loading…
Reference in new issue