diff options
-rwxr-xr-x | bin/bootstrap.py | 92 | ||||
-rw-r--r-- | etc/import.prebuilt/TARGETS.absl | 21 | ||||
-rw-r--r-- | etc/import.prebuilt/TARGETS.bazel_remote_apis | 29 | ||||
-rw-r--r-- | etc/import.prebuilt/TARGETS.boringssl | 12 | ||||
-rw-r--r-- | etc/import.prebuilt/TARGETS.cli11 | 22 | ||||
-rw-r--r-- | etc/import.prebuilt/TARGETS.fmt | 8 | ||||
-rw-r--r-- | etc/import.prebuilt/TARGETS.git2 | 13 | ||||
-rw-r--r-- | etc/import.prebuilt/TARGETS.google_apis | 34 | ||||
-rw-r--r-- | etc/import.prebuilt/TARGETS.grpc | 86 | ||||
-rw-r--r-- | etc/import.prebuilt/TARGETS.gsl | 8 | ||||
-rw-r--r-- | etc/import.prebuilt/TARGETS.json | 7 | ||||
-rw-r--r-- | etc/import.prebuilt/TARGETS.protobuf | 13 | ||||
-rw-r--r-- | etc/import.prebuilt/TARGETS.zlib | 6 | ||||
-rw-r--r-- | etc/import.prebuilt/bin/TARGETS.protobuf | 1 | ||||
-rw-r--r-- | etc/import.prebuilt/include/TARGETS.grpc | 11 | ||||
-rw-r--r-- | etc/import.prebuilt/include/TARGETS.protobuf | 5 | ||||
-rw-r--r-- | etc/import.prebuilt/proto/google/protobuf/TARGETS.protobuf | 19 | ||||
-rw-r--r-- | etc/import.prebuilt/src/compiler/TARGETS.grpc | 5 | ||||
-rw-r--r-- | etc/repos.json | 17 |
19 files changed, 399 insertions, 10 deletions
diff --git a/bin/bootstrap.py b/bin/bootstrap.py index d4a638dd..61597abb 100755 --- a/bin/bootstrap.py +++ b/bin/bootstrap.py @@ -18,12 +18,19 @@ MAIN_MODULE = "" MAIN_TARGET = "" MAIN_STAGE = "bin/just" +LOCAL_LINK_DIRS_MODULE = "src/buildtool/main" +LOCAL_LINK_DIRS_TARGET = "just" + # relevant directories (global variables) SRCDIR = os.getcwd() WRKDIR = None DISTDIR = [] +LOCALBASE = "/" + +# other global variables +LOCAL_DEPS = False def git_hash(content): header = "blob {}\0".format(len(content)).encode('utf-8') @@ -58,10 +65,10 @@ def run(cmd, *, cwd, **kwargs): subprocess.run(cmd, cwd=cwd, check=True, **kwargs) -def setup_deps(): +def setup_deps(src_wrkdir): # unpack all dependencies and return a list of # additional C++ flags required - with open(os.path.join(SRCDIR, REPOS)) as f: + with open(os.path.join(src_wrkdir, REPOS)) as f: config = json.load(f)["repositories"] include_location = os.path.join(WRKDIR, "dep_includes") link_flags = [] @@ -112,18 +119,80 @@ def setup_deps(): return {"include": ["-I", include_location], "link": link_flags} +def config_to_local(*, repos_file, link_targets_file): + with open(repos_file) as f: + repos = json.load(f) + global_link_dirs = set() + for repo in repos["repositories"]: + desc = repos["repositories"][repo] + repo_desc = desc.get("repository") + if not isinstance(repo_desc, dict): + repo_desc = {} + if repo_desc.get("type") in ["archive", "zip"]: + local_bootstrap = desc.get("local_bootstrap", {}) + desc["repository"] = { + "type": "file", + "path": os.path.normpath( + os.path.join( + LOCALBASE, + local_bootstrap.get("local_path", "."))) + } + if "link_dirs" in local_bootstrap: + link = [] + for entry in local_bootstrap["link_dirs"]: + link += ["-L", os.path.join(LOCALBASE, entry)] + global_link_dirs.add(entry) + link += local_bootstrap.get("link", []) + local_bootstrap["link"] = link + desc["bootstrap"] = local_bootstrap + if "local_bootstrap" in desc: + del desc["local_bootstrap"] + if repo_desc.get("type") == "file": + local_bootstrap = desc.get("local_bootstrap", {}) + desc["repository"] = { + "type": "file", + "path": local_bootstrap.get("local_path", desc["repository"].get("path")) + } + desc["bootstrap"] = local_bootstrap + if "local_bootstrap" in desc: + del desc["local_bootstrap"] + + print("just-mr config rewritten to local:\n%s\n" + % (json.dumps(repos, indent=2))) + os.unlink(repos_file) + with open(repos_file, "w") as f: + json.dump(repos, f, indent=2) + + with open(link_targets_file) as f: + target = json.load(f) + main = target[LOCAL_LINK_DIRS_TARGET] + link_external = ["-L%s" % (os.path.join(LOCALBASE, d),) + for d in global_link_dirs] + print("External link arguments %r" % (link_external,)) + main["link external"] = link_external + target[LOCAL_LINK_DIRS_TARGET] = main + os.unlink(link_targets_file) + with open(link_targets_file, "w") as f: + json.dump(target, f, indent=2) def bootstrap(): - # TODO: add package build mode, building against preinstalled dependencies - # rather than building dependencies ourselves. - print("Bootstrapping in %r from sources %r, taking files from %r" % - (WRKDIR, SRCDIR, DISTDIR)) + if LOCAL_DEPS: + print("Bootstrap build in %r from sources %r against LOCALBASE %r" + % (WRKDIR, SRCDIR, LOCALBASE)) + else: + print("Bootstrapping in %r from sources %r, taking files from %r" % + (WRKDIR, SRCDIR, DISTDIR)) os.makedirs(WRKDIR, exist_ok=True) - dep_flags = setup_deps() - # handle proto src_wrkdir = os.path.join(WRKDIR, "src") shutil.copytree(SRCDIR, src_wrkdir) - flags = ["-I", src_wrkdir] + dep_flags["include"] + if LOCAL_DEPS: + config_to_local( + repos_file =os.path.join(src_wrkdir, REPOS), + link_targets_file=os.path.join(src_wrkdir, LOCAL_LINK_DIRS_MODULE, "TARGETS") + ) + dep_flags = setup_deps(src_wrkdir) + # handle proto + flags = ["-I", src_wrkdir] + dep_flags["include"] + ["-I", os.path.join(LOCALBASE, "include")] cpp_files = [] for root, dirs, files in os.walk(src_wrkdir): if 'test' in dirs: @@ -177,6 +246,8 @@ def main(args): global SRCDIR global WRKDIR global DISTDIR + global LOCAL_DEPS + global LOCALBASE if len(args) > 1: SRCDIR = os.path.abspath(args[1]) if len(args) > 2: @@ -188,6 +259,9 @@ def main(args): WRKDIR = tempfile.mkdtemp() if not DISTDIR: DISTDIR = [os.path.join(Path.home(), ".distfiles")] + + LOCAL_DEPS = "PACKAGE" in os.environ + LOCALBASE = os.environ.get("LOCALBASE", "/") bootstrap() diff --git a/etc/import.prebuilt/TARGETS.absl b/etc/import.prebuilt/TARGETS.absl new file mode 100644 index 00000000..986e6cb8 --- /dev/null +++ b/etc/import.prebuilt/TARGETS.absl @@ -0,0 +1,21 @@ +{ "absl": + { "type": ["@", "rules", "CC", "library"] + , "name": ["absl"] + , "link external": + [ "-lbad_optional_access" + , "-lstr_format_internal" + , "-ltime" + , "-lstrings" + , "-lstrings_internal" + , "-lbase" + , "-ldynamic_annotations" + , "-lspinlock_wait" + , "-lthrow_delegate" + , "-lraw_logging_internal" + , "-llog_severity" + , "-lint128" + , "-ltime_zone" + , "-lcivil_time" + ] + } +} diff --git a/etc/import.prebuilt/TARGETS.bazel_remote_apis b/etc/import.prebuilt/TARGETS.bazel_remote_apis new file mode 100644 index 00000000..8f846701 --- /dev/null +++ b/etc/import.prebuilt/TARGETS.bazel_remote_apis @@ -0,0 +1,29 @@ +{ "semver_proto": + { "type": ["@", "rules", "proto", "library"] + , "name": ["semver_proto"] + , "srcs": ["build/bazel/semver/semver.proto"] + } +, "remote_execution_proto impl": + { "type": ["@", "rules", "proto", "library"] + , "name": ["remote_execution_proto"] + , "service": ["yes"] + , "srcs": ["build/bazel/remote/execution/v2/remote_execution.proto"] + , "deps": + [ "semver_proto" + , ["@", "google_apis", "", "google_api_annotations_proto"] + , ["@", "google_apis", "", "google_api_http_proto"] + , ["@", "google_apis", "", "google_longrunning_operations_proto"] + , ["@", "google_apis", "", "google_rpc_status_proto"] + ] + } +, "remote_execution_proto": + { "type": "export" + , "target": "remote_execution_proto impl" + , "doc": + [ "Remote Execution API" + , "" + , "The Remote Execution API is an API that, at its most general, allows clients" + , "to request execution of binaries on a remote system." + ] + } +} diff --git a/etc/import.prebuilt/TARGETS.boringssl b/etc/import.prebuilt/TARGETS.boringssl new file mode 100644 index 00000000..3e4e0b71 --- /dev/null +++ b/etc/import.prebuilt/TARGETS.boringssl @@ -0,0 +1,12 @@ +{ "crypto": + { "type": ["@", "rules", "CC", "library"] + , "hdrs": [["TREE", null, "."]] + , "stage": ["openssl"] + , "link external": ["-lcrypto"] + } +, "ssl": + { "type": ["@", "rules", "CC", "library"] + , "link external": ["-lssl"] + , "deps": ["crypto"] + } +} diff --git a/etc/import.prebuilt/TARGETS.cli11 b/etc/import.prebuilt/TARGETS.cli11 new file mode 100644 index 00000000..1a8beb55 --- /dev/null +++ b/etc/import.prebuilt/TARGETS.cli11 @@ -0,0 +1,22 @@ +{ "cli11": + { "type": ["@", "rules", "CC", "library"] + , "hdrs": + [ "Option.hpp" + , "Split.hpp" + , "Formatter.hpp" + , "ConfigFwd.hpp" + , "Version.hpp" + , "TypeTools.hpp" + , "Validators.hpp" + , "FormatterFwd.hpp" + , "Macros.hpp" + , "StringTools.hpp" + , "Error.hpp" + , "Timer.hpp" + , "CLI.hpp" + , "App.hpp" + , "Config.hpp" + ] + , "stage": ["CLI"] + } +} diff --git a/etc/import.prebuilt/TARGETS.fmt b/etc/import.prebuilt/TARGETS.fmt new file mode 100644 index 00000000..58c436e4 --- /dev/null +++ b/etc/import.prebuilt/TARGETS.fmt @@ -0,0 +1,8 @@ +{ "fmt": + { "type": ["@", "rules", "CC", "library"] + , "name": ["fmt"] + , "stage": ["fmt"] + , "hdrs": [["TREE", null, "."]] + , "link external": ["-lfmt"] + } +} diff --git a/etc/import.prebuilt/TARGETS.git2 b/etc/import.prebuilt/TARGETS.git2 new file mode 100644 index 00000000..b4bf90e8 --- /dev/null +++ b/etc/import.prebuilt/TARGETS.git2 @@ -0,0 +1,13 @@ +{ "git2": + { "type": ["@", "rules", "CC", "library"] + , "hdrs": ["git2.h", ["TREE", null, "git2"]] + , "link external": + [ "-lgit2" + , "-lgit2_os_unix" + , "-lgit2_hash_openssl" + , "-lgit2_pcre" + , "-lgit2_http_parser" + , "-lpthread" + ] + } +} diff --git a/etc/import.prebuilt/TARGETS.google_apis b/etc/import.prebuilt/TARGETS.google_apis new file mode 100644 index 00000000..802e1027 --- /dev/null +++ b/etc/import.prebuilt/TARGETS.google_apis @@ -0,0 +1,34 @@ +{ "google_api_http_proto": + { "type": ["@", "rules", "proto", "library"] + , "name": ["google_api_http_proto"] + , "srcs": ["google/api/http.proto"] + } +, "google_api_annotations_proto": + { "type": ["@", "rules", "proto", "library"] + , "name": ["google_api_annotations_proto"] + , "srcs": ["google/api/annotations.proto"] + , "deps": ["google_api_http_proto"] + } +, "google_bytestream_proto": + { "type": ["@", "rules", "proto", "library"] + , "name": ["google_bytestream_proto"] + , "service": ["yes"] + , "srcs": ["google/bytestream/bytestream.proto"] + , "deps": ["google_api_annotations_proto"] + } +, "google_rpc_status_proto": + { "type": ["@", "rules", "proto", "library"] + , "name": ["google_rpc_status_proto"] + , "srcs": ["google/rpc/status.proto"] + } +, "google_longrunning_operations_proto": + { "type": ["@", "rules", "proto", "library"] + , "name": ["google_longrunning_operations_proto"] + , "srcs": ["google/longrunning/operations.proto"] + , "deps": + [ "google_api_annotations_proto" + , "google_api_http_proto" + , "google_rpc_status_proto" + ] + } +} diff --git a/etc/import.prebuilt/TARGETS.grpc b/etc/import.prebuilt/TARGETS.grpc new file mode 100644 index 00000000..0af9910a --- /dev/null +++ b/etc/import.prebuilt/TARGETS.grpc @@ -0,0 +1,86 @@ +{ "grpc++": + { "type": ["@", "rules", "CC", "library"] + , "hdrs": [["include", "grpcpp"]] + , "link external": + [ "-lgrpc++" + , "-lgrpc++_base" + , "-lgrpc" + , "-lcensus" + , "-lgrpc_lb_policy_pick_first" + , "-lgrpc_lb_policy_priority" + , "-lgrpc_lb_policy_round_robin" + , "-lgrpc_lb_policy_weighted_target" + , "-lgrpc_client_idle_filter" + , "-lgrpc_max_age_filter" + , "-lgrpc_resolver_dns_ares" + , "-lares" + , "-laddress_sorting" + , "-lgrpc_resolver_dns_native" + , "-lgrpc_resolver_dns_selection" + , "-lgrpc_resolver_sockaddr" + , "-lgrpc_transport_chttp2_server_insecure" + , "-lgrpc_transport_inproc" + , "-lgrpc_workaround_cronet_compression_filter" + , "-lgrpc_server_backward_compatibility" + , "-lgrpc_lb_policy_cds_secure" + , "-lgrpc_lb_policy_eds_secure" + , "-lgrpc_lb_address_filtering" + , "-lgrpc_lb_policy_grpclb_secure" + , "-lgrpc_grpclb_balancer_addresses" + , "-lgrpc_lb_upb" + , "-lgrpc_resolver_fake" + , "-lgrpc_lb_policy_lrs_secure" + , "-lgrpc_lb_policy_xds_routing" + , "-lgrpc_resolver_xds_secure" + , "-lgrpc_xds_client_secure" + , "-lenvoy_ads_upb" + , "-lenvoy_core_upb" + , "-lenvoy_type_upb" + , "-lenvoy_annotations_upb" + , "-ludpa_annotations_upb" + , "-lre2" + , "-lgrpc_transport_chttp2_client_secure" + , "-lgrpc_transport_chttp2_server_secure" + , "-lgrpc_transport_chttp2_server" + , "-lgrpc++_codegen_base_src" + , "-lgrpc_secure" + , "-ltsi" + , "-lalts_frame_protector" + , "-lalts_util" + , "-lalts_upb" + , "-lgrpc_transport_chttp2_client_insecure" + , "-lgrpc_transport_chttp2_client_connector" + , "-lgrpc_transport_chttp2" + , "-lgrpc_http_filters" + , "-lgrpc_message_size_filter" + , "-lgrpc_client_channel" + , "-lgrpc_client_authority_filter" + , "-lgrpc_deadline_filter" + , "-lgrpc_base" + , "-lgrpc_base_c" + , "-leventmanager_libuv" + , "-lgrpc_health_upb" + , "-ludpa_orca_upb" + , "-lproto_gen_validate_upb" + , "-lgoogle_api_upb" + , "-lupb" + , "-lupb_port" + , "-lgrpc_transport_chttp2_alpn" + , "-ltsi_interface" + , "-lgrpc_trace" + , "-lgpr_base" + ] + , "deps": + [ ["@", "absl", "", "absl"] + , ["@", "zlib", "", "zlib"] + , ["@", "libssl", "", "ssl"] + ] + } +, "grpc++_codegen_proto": + { "type": ["@", "rules", "CC", "library"] + , "name": ["grpc++_codegen_proto"] + , "hdrs": [["include", "grpcpp"], ["include", "grpc++"], ["include", "grpc"]] + , "link external": ["-lgrpc++_codegen_base_src"] + , "deps": ["grpc++"] + } +} diff --git a/etc/import.prebuilt/TARGETS.gsl b/etc/import.prebuilt/TARGETS.gsl new file mode 100644 index 00000000..df06ea7e --- /dev/null +++ b/etc/import.prebuilt/TARGETS.gsl @@ -0,0 +1,8 @@ +{ "gsl-lite": + {"type": ["@", "rules", "CC", "library"], "hdrs": ["gsl-lite hdrs"]} +, "gsl-lite hdrs": + { "type": ["@", "rules", "CC", "header directory"] + , "hdrs": ["gsl", "gsl-lite.h", "gsl-lite.hpp", "gsl-lite-vc6.hpp"] + , "stage": ["gsl-lite"] + } +} diff --git a/etc/import.prebuilt/TARGETS.json b/etc/import.prebuilt/TARGETS.json new file mode 100644 index 00000000..df94fa83 --- /dev/null +++ b/etc/import.prebuilt/TARGETS.json @@ -0,0 +1,7 @@ +{ "json": {"type": ["@", "rules", "CC", "library"], "hdrs": ["json headers"]} +, "json headers": + { "type": ["@", "rules", "CC", "header directory"] + , "stage": ["nlohmann"] + , "hdrs": [["TREE", null, "."]] + } +} diff --git a/etc/import.prebuilt/TARGETS.protobuf b/etc/import.prebuilt/TARGETS.protobuf new file mode 100644 index 00000000..a31d4138 --- /dev/null +++ b/etc/import.prebuilt/TARGETS.protobuf @@ -0,0 +1,13 @@ +{ "protoc": + {"type": ["@", "rules", "data", "staged"], "srcs": [["bin", "protoc"]]} +, "C++ runtime": + { "type": ["@", "rules", "CC", "library"] + , "name": ["protobuf"] + , "hdrs": [["include", "protobuf"]] + , "link external": ["-lprotobuf", "-lprotobuf_lite"] + } +, "well_known_protos": + { "type": ["@", "rules", "data", "staged"] + , "srcs": [["proto/google/protobuf", "well_known_protos"]] + } +} diff --git a/etc/import.prebuilt/TARGETS.zlib b/etc/import.prebuilt/TARGETS.zlib new file mode 100644 index 00000000..2bddbfbc --- /dev/null +++ b/etc/import.prebuilt/TARGETS.zlib @@ -0,0 +1,6 @@ +{ "zlib": + { "type": ["@", "rules", "CC", "library"] + , "name": ["zlib"] + , "link external": ["-lzlib"] + } +} diff --git a/etc/import.prebuilt/bin/TARGETS.protobuf b/etc/import.prebuilt/bin/TARGETS.protobuf new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/etc/import.prebuilt/bin/TARGETS.protobuf @@ -0,0 +1 @@ +{} diff --git a/etc/import.prebuilt/include/TARGETS.grpc b/etc/import.prebuilt/include/TARGETS.grpc new file mode 100644 index 00000000..d310d8ea --- /dev/null +++ b/etc/import.prebuilt/include/TARGETS.grpc @@ -0,0 +1,11 @@ +{ "grpc": + {"type": ["@", "rules", "data", "staged"], "srcs": [["TREE", null, "grpc"]]} +, "grpcpp": + { "type": ["@", "rules", "data", "staged"] + , "srcs": [["TREE", null, "grpcpp"]] + } +, "grpc++": + { "type": ["@", "rules", "data", "staged"] + , "srcs": [["TREE", null, "grpcpp"]] + } +} diff --git a/etc/import.prebuilt/include/TARGETS.protobuf b/etc/import.prebuilt/include/TARGETS.protobuf new file mode 100644 index 00000000..8c76bf6e --- /dev/null +++ b/etc/import.prebuilt/include/TARGETS.protobuf @@ -0,0 +1,5 @@ +{ "protobuf": + { "type": ["@", "rules", "data", "staged"] + , "srcs": [["TREE", null, "google/protobuf"]] + } +} diff --git a/etc/import.prebuilt/proto/google/protobuf/TARGETS.protobuf b/etc/import.prebuilt/proto/google/protobuf/TARGETS.protobuf new file mode 100644 index 00000000..ebdf4beb --- /dev/null +++ b/etc/import.prebuilt/proto/google/protobuf/TARGETS.protobuf @@ -0,0 +1,19 @@ +{ "well_known_protos": + { "type": ["@", "rules", "data", "staged"] + , "srcs": + [ "any.proto" + , "api.proto" + , "compiler/plugin.proto" + , "descriptor.proto" + , "duration.proto" + , "empty.proto" + , "field_mask.proto" + , "source_context.proto" + , "struct.proto" + , "timestamp.proto" + , "type.proto" + , "wrappers.proto" + ] + , "stage": ["google", "protobuf"] + } +} diff --git a/etc/import.prebuilt/src/compiler/TARGETS.grpc b/etc/import.prebuilt/src/compiler/TARGETS.grpc new file mode 100644 index 00000000..e3a51445 --- /dev/null +++ b/etc/import.prebuilt/src/compiler/TARGETS.grpc @@ -0,0 +1,5 @@ +{ "grpc_cpp_plugin": + { "type": "install" + , "files": {"grpc_cpp_plugin": ["", "bin/grpc_cpp_plugin"]} + } +} diff --git a/etc/repos.json b/etc/repos.json index 92d1b787..28c84200 100644 --- a/etc/repos.json +++ b/etc/repos.json @@ -16,6 +16,7 @@ , "catch2": "catch2" } , "bootstrap": {"link": ["-lpthread"]} + , "bootstrap_local": {"link": ["-lpthread"]} } , "just-distfiles": { "repository": @@ -97,6 +98,7 @@ , "import targets": { "repository": {"type": "file", "path": "etc/import", "pragma": {"to_git": true}} + , "local_bootstrap": {"local_path": "etc/import.prebuilt"} } , "gsl-lite": { "repository": @@ -111,6 +113,7 @@ , "target_root": "import targets" , "target_file_name": "TARGETS.gsl" , "bindings": {"rules": "rules"} + , "local_bootstrap": {"local_path": "include/gsl-lite"} } , "cli11": { "repository": @@ -125,6 +128,7 @@ , "target_file_name": "TARGETS.cli11" , "bindings": {"rules": "rules"} , "bootstrap": {"include_dir": "include/CLI", "include_name": "CLI"} + , "local_bootstrap": {"local_path": "include/CLI"} } , "json": { "repository": @@ -139,6 +143,7 @@ , "target_file_name": "TARGETS.json" , "bindings": {"rules": "rules"} , "bootstrap": {"include_name": "nlohmann"} + , "local_bootstrap": {"local_path": "include/nlohmann"} } , "fmt": { "repository": @@ -157,6 +162,8 @@ , "build": "cd src && clang++ -I ../include -c *.cc && ar cqs ../libfmt.a *.o" , "link": ["-lfmt"] } + , "local_bootstrap": + {"local_path": "include/fmt", "link": ["-lfmt"], "link_dirs": ["lib"]} } , "ssl": { "repository": @@ -172,10 +179,15 @@ , "bindings": {"rules": "rules-boringssl"} , "bootstrap": { "build": "SYS=`uname -s | tr 'A-Z' 'a-z'` && ARCH=`uname -m` && cc -I . -I src/include -c *.c src/crypto/*.c src/crypto/*/*.c $SYS-$ARCH/crypto/fipsmodule/*.S && ar cqs libcrypto.a *.o" - , "link": ["-lcrypto"] + , "link": ["-lcrypto", "-lpthread"] , "include_dir": "src/include/openssl" , "include_name": "openssl" } + , "local_bootstrap": + { "local_path": "include/openssl" + , "link": ["-lcrypto", "-lpthread"] + , "link_dirs": ["lib"] + } } , "protobuf": { "repository": @@ -206,6 +218,7 @@ , "protoc": "protobuf" , "google_apis": "google_apis" } + , "local_bootstrap": {"local_path": "proto"} } , "google_apis": { "repository": @@ -220,6 +233,7 @@ , "target_file_name": "TARGETS.google_apis" , "bindings": {"rules": "rules-protobuf", "protoc": "protobuf", "patches": "patches"} + , "local_bootstrap": {"local_path": "proto"} } , "upb": { "repository": @@ -321,6 +335,7 @@ , "target_file_name": "TARGETS.git2" , "bindings": {"rules": "rules-git2", "zlib": "zlib", "ssl": "ssl"} , "bootstrap": {"include_dir": "include", "include_name": "."} + , "local_bootstrap": {"local_path": "include"} } , "catch2": { "repository": |