From 08ddae1abcf1c0c516aec7b4f051984f83a952c5 Mon Sep 17 00:00:00 2001 From: "Brown, Chris C" <77508021+peakschris@users.noreply.github.com> Date: Sun, 26 Jan 2025 13:44:37 -0500 Subject: [PATCH 1/2] feat: modules (broken, checkpoint) --- .bazelrc | 1 + .bazelversion | 3 +- MODULE.bazel | 50 ++++++++++++++++++ antlr/antlr2.bzl | 2 +- antlr/antlr3.bzl | 4 +- antlr/antlr4.bzl | 6 +-- antlr/extensions.bzl | 24 +++++++++ antlr/repositories.bzl | 110 +++++++++++++++++++++------------------ examples/.bazelrc | 3 +- examples/.bazelversion | 3 +- examples/MODULE.bazel | 43 +++++++++++++++ examples/WORKSPACE.bazel | 49 +---------------- 12 files changed, 190 insertions(+), 108 deletions(-) create mode 100644 MODULE.bazel create mode 100644 antlr/extensions.bzl create mode 100644 examples/MODULE.bazel diff --git a/.bazelrc b/.bazelrc index 5e85732..2a17b57 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,4 +1,5 @@ build --javacopt="--release 8" +common --noenable_workspace # CI common:ci --announce_rc diff --git a/.bazelversion b/.bazelversion index 04edabd..781c528 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1,2 @@ -5.4.1 \ No newline at end of file +# TODO: Revert to older version of bazel to ensure backward compatibility +8.0.0 diff --git a/MODULE.bazel b/MODULE.bazel new file mode 100644 index 0000000..e9365ab --- /dev/null +++ b/MODULE.bazel @@ -0,0 +1,50 @@ +module( + name = "rules_antlr", + version = "0.0.0", + compatibility_level = 1, +) + +bazel_dep(name = "rules_java", version = "5.4.1") +bazel_dep(name = "stardoc", version = "0.5.0", repo_name = "io_bazel_stardoc") + +http_jar = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_jar") +http_jar( + name = "junit", + sha256 = "59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a", + url = "https://repo1.maven.org/maven2/junit/junit/4.12/junit-4.12.jar", +) + +http_jar( + name = "jimfs", + sha256 = "c4828e28d7c0a930af9387510b3bada7daa5c04d7c25a75c7b8b081f1c257ddd", + url = "https://repo1.maven.org/maven2/com/google/jimfs/jimfs/1.1/jimfs-1.1.jar", +) + +http_jar( + name = "guava", + sha256 = "4a5aa70cc968a4d137e599ad37553e5cfeed2265e8c193476d7119036c536fe7", + url = "https://repo1.maven.org/maven2/com/google/guava/guava/27.1-jre/guava-27.1-jre.jar", +) + +http_jar( + name = "javax_json", + sha256 = "0e1dec40a1ede965941251eda968aeee052cc4f50378bc316cc48e8159bdbeb4", + url = "https://repo1.maven.org/maven2/org/glassfish/javax.json/1.0.4/javax.json-1.0.4.jar", +) + +http_jar( + name = "stringtemplate4", + sha256 = "28547dba48cfceb77b6efbfe069aebe9ed3324ae60dbd52093d13a1d636ed069", + url = "https://repo1.maven.org/maven2/org/antlr/ST4/4.3/ST4-4.3.jar", +) + +antlr_extension = use_extension("@rules_antlr//antlr:extensions.bzl", "antlr_extension", dev_dependency = True) +antlr_extension.toolchain( + languages = [ + ], + versions = [ + "2.7.7", + "3.5.2", + "4.8", + ], +) diff --git a/antlr/antlr2.bzl b/antlr/antlr2.bzl index c4b0e64..c82a000 100644 --- a/antlr/antlr2.bzl +++ b/antlr/antlr2.bzl @@ -56,7 +56,7 @@ downloaded and unzipped the debugger over the top of the standard ANTLR distribution, the code emanating from ANTLR with this option will not compile. """), - "deps": attr.label_list(default = [Label("@antlr2//jar")], doc = "The dependencies to use. Defaults to the final ANTLR 2 release, but if you need to use a different version, you can specify the dependencies here."), + "deps": attr.label_list(default = [Label("@@antlr2//jar")], doc = "The dependencies to use. Defaults to the final ANTLR 2 release, but if you need to use a different version, you can specify the dependencies here."), "diagnostic": attr.bool(default = False, doc = "Generate a text file from your grammar with a lot of debugging info."), "docbook": attr.bool(default = False, doc = "Generate a docbook SGML file from your grammar without actions and so on. It only works for parsers, not lexers or tree parsers."), "html": attr.bool(default = False, doc = "Generate a HTML file from your grammar without actions and so on. It only works for parsers, not lexers or tree parsers."), diff --git a/antlr/antlr3.bzl b/antlr/antlr3.bzl index b8c60e9..0e41c8f 100644 --- a/antlr/antlr3.bzl +++ b/antlr/antlr3.bzl @@ -121,8 +121,8 @@ antlr = rule( "debug": attr.bool(default = False, doc = "Generate a parser that emits debugging events."), "depend": attr.bool(default = False, doc = "Generate file dependencies; don't actually run antlr."), "deps": attr.label_list(default = [ - Label("@antlr3_runtime//jar"), - Label("@antlr3_tool//jar"), + Label("@@antlr3_runtime//jar"), + Label("@@antlr3_tool//jar"), Label("@stringtemplate4//jar"), ], doc = """ The dependencies to use. Defaults to the most recent ANTLR 3 release, diff --git a/antlr/antlr4.bzl b/antlr/antlr4.bzl index 9196472..22b1639 100644 --- a/antlr/antlr4.bzl +++ b/antlr/antlr4.bzl @@ -83,9 +83,9 @@ Runs [ANTLR 4](https://www.antlr.org//) on a set of grammars. "atn": attr.bool(default = False, doc = "Generate rule augmented transition network diagrams."), "depend": attr.bool(default = False, doc = "Generate a list of file dependencies instead of parser and/or lexer."), "deps": attr.label_list(default = [ - Label("@antlr4_tool//jar"), - Label("@antlr4_runtime//jar"), - Label("@antlr3_runtime//jar"), + Label("@@antlr4_tool//jar"), + Label("@@antlr4_runtime//jar"), + Label("@@antlr3_runtime//jar"), Label("@stringtemplate4//jar"), Label("@javax_json//jar"), ], doc = """ diff --git a/antlr/extensions.bzl b/antlr/extensions.bzl new file mode 100644 index 0000000..0758963 --- /dev/null +++ b/antlr/extensions.bzl @@ -0,0 +1,24 @@ +load("repositories.bzl", "rules_antlr_dependencies") + +def _antlr_repositories_impl(module_ctx): + for mod in module_ctx.modules: + for toolchain in mod.tags.toolchain: + all_args = toolchain.versions + toolchain.languages + rules_antlr_dependencies( + *all_args, + ) + return module_ctx.extension_metadata( + root_module_direct_deps="all", + root_module_direct_dev_deps=[], + reproducible=False) + +antlr_extension = module_extension( + implementation = _antlr_repositories_impl, + tag_classes = { + "toolchain": tag_class(attrs = { + "languages": attr.string_list(doc = "A list of languages to support."), + "name": attr.string(doc = "The name of the repository used for the toolchains.", default = "antlr_repositories"), + "versions": attr.string_list(doc = "The antlr versions to support."), + }), + }, +) diff --git a/antlr/repositories.bzl b/antlr/repositories.bzl index a7c2651..aa25f49 100644 --- a/antlr/repositories.bzl +++ b/antlr/repositories.bzl @@ -178,17 +178,28 @@ def rules_antlr_dependencies(*versionsAndLanguages): if not languages: languages = [JAVA] + # Collect up deps, then download them once. This avoids an + # error where bazel reports that the dependency has already + # been downloaded. + all_deps = {} for version in sorted(versions, key = _toString): if version == 4 or version == "4.8": - _antlr48_dependencies(languages) + deps = _antlr48_dependencies(languages) + all_deps.update(deps) elif version == "4.7.2": - _antlr472_dependencies(languages) + deps = _antlr472_dependencies(languages) + all_deps.update(deps) elif version == "4.7.1": - _antlr471_dependencies(languages) + deps = _antlr471_dependencies(languages) + all_deps.update(deps) elif version == 3 or version == "3.5.2": - _antlr352_dependencies(languages) + deps = _antlr352_dependencies(languages) + all_deps.update(deps) elif version == 2 or version == "2.7.7": - _antlr277_dependencies(languages) + deps = _antlr277_dependencies(languages) + all_deps.update(deps) + print(all_deps) + _dependencies(all_deps) else: fail("Missing ANTLR version", attr = "versionsAndLanguages") @@ -218,88 +229,85 @@ def rules_antlr_optimized_dependencies(version): fail('Unsupported ANTLR version provided: "{0}". Currently supported are: {1}'.format(version, v4_opt), attr = "version") def _antlr48_dependencies(languages): - _antlr4_dependencies( + _antlr4_runtime( "4.8", - languages, - { + languages) + + return { "antlr4_runtime": "4.8", "antlr4_tool": "4.8", "antlr3_runtime": "3.5.2", "stringtemplate4": "4.3", "javax_json": "1.0.4", - }, - ) + } def _antlr472_dependencies(languages): - _antlr4_dependencies( + _antlr4_runtime( "4.7.2", - languages, - { + languages) + return { "antlr4_runtime": "4.7.2", "antlr4_tool": "4.7.2", "antlr3_runtime": "3.5.2", "stringtemplate4": "4.0.8", "javax_json": "1.0.4", - }, - ) + } def _antlr471_dependencies(languages): - _antlr4_dependencies( + _antlr4_runtime( "4.7.1", - languages, - { + languages) + return { "antlr4_runtime": "4.7.1", "antlr4_tool": "4.7.1", "antlr3_runtime": "3.5.2", "stringtemplate4": "4.0.8", "javax_json": "1.0.4", - }, - ) + } def _antlr474_optimized_dependencies(): - _dependencies({ + return { "antlr4_runtime": "4.7.4-opt", "antlr4_tool": "4.7.4-opt", "antlr3_runtime": "3.5.2", "stringtemplate4": "4.0.8", "javax_json": "1.0.4", - }) + } def _antlr473_optimized_dependencies(): - _dependencies({ + return { "antlr4_runtime": "4.7.3-opt", "antlr4_tool": "4.7.3-opt", "antlr3_runtime": "3.5.2", "stringtemplate4": "4.0.8", "javax_json": "1.0.4", - }) + } def _antlr472_optimized_dependencies(): - _dependencies({ + return { "antlr4_runtime": "4.7.2-opt", "antlr4_tool": "4.7.2-opt", "antlr3_runtime": "3.5.2", "stringtemplate4": "4.0.8", "javax_json": "1.0.4", - }) + } def _antlr471_optimized_dependencies(): - _dependencies({ + return { "antlr4_runtime": "4.7.1-opt", "antlr4_tool": "4.7.1-opt", "antlr3_runtime": "3.5.2", "stringtemplate4": "4.0.8", "javax_json": "1.0.4", - }) + } -def _antlr4_dependencies(version, languages, dependencies): - _dependencies(dependencies) +def _antlr4_runtime(version, languages): archive = PACKAGES["antlr"][version] build_script, workspace = _antlr4_build_script(languages) if build_script: http_archive( - name = "antlr4_runtimes", + name = "antlr4_runtime", sha256 = archive["sha256"], strip_prefix = archive["prefix"], url = archive["url"], @@ -392,24 +400,22 @@ def _load_rules_python_defs(script): return "" if script.find('load("@rules_python//python:defs.bzl"') > -1 else 'load("@rules_python//python:defs.bzl", "py_library")' def _antlr352_dependencies(languages): - _antlr3_dependencies( + _antlr3_runtime( "3.5.2", - languages, - { + languages) + return { "antlr3_runtime": "3.5.2", "antlr3_tool": "3.5.2", "stringtemplate4": "4.0.8", - }, - ) + } -def _antlr3_dependencies(version, languages, dependencies): - _dependencies(dependencies) +def _antlr3_runtime(version, languages): archive = PACKAGES["antlr"][version] build_script = _antlr3_build_script(languages) if build_script: http_archive( - name = "antlr3_runtimes", + name = "antlr3_runtime", sha256 = archive["sha256"], strip_prefix = archive["prefix"], url = archive["url"], @@ -452,22 +458,20 @@ py_library( return script def _antlr277_dependencies(languages): - _antlr2_dependencies( + _antlr2_runtime( "2.7.7", - languages, - { + languages) + return { "antlr2": "2.7.7", - }, - ) + } -def _antlr2_dependencies(version, languages, dependencies): - _dependencies(dependencies) +def _antlr2_runtime(version, languages): archive = PACKAGES["antlr"][version] build_script = _antlr2_build_script(languages) if build_script: http_archive( - name = "antlr2_runtimes", + name = "antlr2_runtime", sha256 = archive["sha256"], strip_prefix = "antlr-2.7.7", url = archive["url"], @@ -507,13 +511,15 @@ py_library( def _dependencies(dependencies): for key in dependencies: version = dependencies[key] - _download( - name = key, - path = PACKAGES[key][version]["path"], - sha256 = PACKAGES[key][version]["sha256"], - ) + if not key.endswith("_runtime"): + _download( + name = key, + path = PACKAGES[key][version]["path"], + sha256 = PACKAGES[key][version]["sha256"], + ) def _download(name, path, sha256): + print(name, path, sha256) http_jar( name = name, url = path if path.startswith("https") else "https://repo1.maven.org/maven2/" + path, diff --git a/examples/.bazelrc b/examples/.bazelrc index 39834cc..b1f2518 100644 --- a/examples/.bazelrc +++ b/examples/.bazelrc @@ -1,4 +1,5 @@ -build --incompatible_use_platforms_repo_for_constraints +common --noenable_workspace +common --noincompatible_disallow_empty_glob # CI common:ci --announce_rc diff --git a/examples/.bazelversion b/examples/.bazelversion index 04edabd..b511921 100644 --- a/examples/.bazelversion +++ b/examples/.bazelversion @@ -1 +1,2 @@ -5.4.1 \ No newline at end of file +# TODO: Test with a variety of bazel versions +8.0.1 diff --git a/examples/MODULE.bazel b/examples/MODULE.bazel new file mode 100644 index 0000000..f24965a --- /dev/null +++ b/examples/MODULE.bazel @@ -0,0 +1,43 @@ +module( + name = "examples", + version = "0.0.0", + compatibility_level = 1, +) + +## Use rules_antlr from parent folder +bazel_dep(name = "rules_antlr", version = "0.0.0") +local_path_override( + module_name = "rules_antlr", + path = "..", +) + +antlr_extension = use_extension("@rules_antlr//antlr:extensions.bzl", "antlr_extension") +antlr_extension.toolchain( + languages = [ + "C", + "Cpp", + "Go", + "ObjC", + "Python", + "Python2", + ], + versions = [ + "2.7.7", + "3.5.2", + "4.8", + ], +) +use_repo(antlr_extension, "antlr2", "antlr2_runtime", "antlr3_runtime", "antlr3_tool", "antlr4_runtime", "antlr4_tool") + +## Third party dependencies +bazel_dep(name = "platforms", version = "0.0.10") +bazel_dep(name = "rules_go", version = "0.48.0", repo_name = "io_bazel_rules_go") + +go_sdk = use_extension("@io_bazel_rules_go//go:extensions.bzl", "go_sdk") +go_sdk.download( + version = "1.22.3", +) + +bazel_dep(name = "rules_python", version = "0.40.0") +bazel_dep(name = "rules_cc", version = "0.0.16") +bazel_dep(name = "rules_java", version = "8.6.1") diff --git a/examples/WORKSPACE.bazel b/examples/WORKSPACE.bazel index a7bcfb9..c98eb0e 100644 --- a/examples/WORKSPACE.bazel +++ b/examples/WORKSPACE.bazel @@ -1,47 +1,2 @@ -workspace(name = "examples") - -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") - -local_repository( - name = "rules_antlr", - path = "..", -) - -http_archive( - name = "platforms", - sha256 = "218efe8ee736d26a3572663b374a253c012b716d8af0c07e842e82f238a0a7ee", - urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/platforms/releases/download/0.0.10/platforms-0.0.10.tar.gz", - "https://github.com/bazelbuild/platforms/releases/download/0.0.10/platforms-0.0.10.tar.gz", - ], -) - -http_archive( - name = "io_bazel_rules_go", - sha256 = "e88471aea3a3a4f19ec1310a55ba94772d087e9ce46e41ae38ecebe17935de7b", - urls = [ - "https://storage.googleapis.com/bazel-mirror/github.com/bazelbuild/rules_go/releases/download/v0.20.3/rules_go-v0.20.3.tar.gz", - "https://github.com/bazelbuild/rules_go/releases/download/v0.20.3/rules_go-v0.20.3.tar.gz", - ], -) - -load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies") - -go_rules_dependencies() - -go_register_toolchains() - -http_archive( - name = "rules_python", - sha256 = "aa96a691d3a8177f3215b14b0edc9641787abaaa30363a080165d06ab65e1161", - url = "https://github.com/bazelbuild/rules_python/releases/download/0.0.1/rules_python-0.0.1.tar.gz", -) - -load("@rules_python//python:repositories.bzl", "py_repositories") - -py_repositories() - -load("@rules_antlr//antlr:lang.bzl", "C", "CPP", "GO", "JAVA", "OBJC", "PYTHON", "PYTHON2") -load("@rules_antlr//antlr:repositories.bzl", "rules_antlr_dependencies") - -rules_antlr_dependencies("2.7.7", 3, "4.8", C, CPP, GO, OBJC, PYTHON, PYTHON2) +# TODO: Provide examples in both MODULE and WORKSPACE formats +# Maybe two separate example directories? From de7c268309bed509bef1572437c54237b69256a8 Mon Sep 17 00:00:00 2001 From: "Brown, Chris C" <77508021+peakschris@users.noreply.github.com> Date: Sun, 26 Jan 2025 13:48:45 -0500 Subject: [PATCH 2/2] remove comments --- .bazelversion | 1 - examples/.bazelversion | 1 - 2 files changed, 2 deletions(-) diff --git a/.bazelversion b/.bazelversion index 781c528..ae9a76b 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1,2 +1 @@ -# TODO: Revert to older version of bazel to ensure backward compatibility 8.0.0 diff --git a/examples/.bazelversion b/examples/.bazelversion index b511921..cd1d2e9 100644 --- a/examples/.bazelversion +++ b/examples/.bazelversion @@ -1,2 +1 @@ -# TODO: Test with a variety of bazel versions 8.0.1