From c58dd5a5e9da408212fe74035036d2e09aea961b Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Tue, 28 Apr 2026 14:15:44 -0700 Subject: [PATCH] Add bazel support Similar to swift-syntax this is nice to have first part for such core libraries. --- .bazelversion | 1 + .github/workflows/pull_request.yml | 19 +++- .gitignore | 1 + .licenseignore | 2 + BUILD.bazel | 25 +++++ Examples/BUILD.bazel | 25 +++++ MODULE.bazel | 10 ++ Tests/BUILD.bazel | 142 +++++++++++++++++++++++++++++ Tools/BUILD.bazel | 28 ++++++ 9 files changed, 252 insertions(+), 1 deletion(-) create mode 100644 .bazelversion create mode 100644 BUILD.bazel create mode 100644 Examples/BUILD.bazel create mode 100644 MODULE.bazel create mode 100644 Tests/BUILD.bazel create mode 100644 Tools/BUILD.bazel diff --git a/.bazelversion b/.bazelversion new file mode 100644 index 000000000..47da986f8 --- /dev/null +++ b/.bazelversion @@ -0,0 +1 @@ +9.1.0 diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 85c388cb8..3b9c9be21 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -59,6 +59,23 @@ jobs: - name: Build run: cmake --build .cmake-build + bazel-linux: + name: Bazel (Linux) + needs: [soundness, validate_format_config] + runs-on: ubuntu-latest + container: + image: swift:6.0-jammy + steps: + - name: Checkout repo + uses: actions/checkout@v6 + - name: Install Bazelisk + run: | + apt-get -qq update && apt-get -qq -y install curl + curl -fsSL -o /usr/local/bin/bazel https://github.com/bazelbuild/bazelisk/releases/latest/download/bazelisk-linux-amd64 + chmod +x /usr/local/bin/bazel + - name: Test + run: bazel test //... + soundness: name: Soundness uses: swiftlang/github-workflows/.github/workflows/soundness.yml@0.0.11 @@ -68,7 +85,7 @@ jobs: required: name: Required runs-on: ubuntu-latest - needs: [tests, soundness, validate_format_config, cmake-build] + needs: [tests, soundness, validate_format_config, cmake-build, bazel-linux] steps: - name: Success run: echo "All required jobs succeeded." diff --git a/.gitignore b/.gitignore index 6a37c14b2..37f67d61e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .DS_Store +/bazel-* /.build /Packages /*.xcodeproj diff --git a/.licenseignore b/.licenseignore index aadec0564..78608136f 100644 --- a/.licenseignore +++ b/.licenseignore @@ -27,3 +27,5 @@ Package.resolved **/Package.resolved .unacceptablelanguageignore **/Snapshots/* +.bazelversion +*.bazel diff --git a/BUILD.bazel b/BUILD.bazel new file mode 100644 index 000000000..77ba8f011 --- /dev/null +++ b/BUILD.bazel @@ -0,0 +1,25 @@ +load("@rules_swift//swift:swift.bzl", "swift_library") + +package(default_visibility = ["//:__subpackages__"]) + +swift_library( + name = "ArgumentParserToolInfo", + srcs = glob(["Sources/ArgumentParserToolInfo/**/*.swift"]), + module_name = "ArgumentParserToolInfo", +) + +swift_library( + name = "ArgumentParser", + srcs = glob(["Sources/ArgumentParser/**/*.swift"]), + module_name = "ArgumentParser", + visibility = ["//visibility:public"], + deps = [":ArgumentParserToolInfo"], +) + +swift_library( + name = "ArgumentParserTestHelpers", + testonly = True, + srcs = glob(["Sources/ArgumentParserTestHelpers/**/*.swift"]), + module_name = "ArgumentParserTestHelpers", + deps = [":ArgumentParser"], +) diff --git a/Examples/BUILD.bazel b/Examples/BUILD.bazel new file mode 100644 index 000000000..150c6c317 --- /dev/null +++ b/Examples/BUILD.bazel @@ -0,0 +1,25 @@ +load("@rules_swift//swift:swift.bzl", "swift_binary") + +package(default_visibility = ["//:__subpackages__"]) + +swift_binary( + name = "count-lines", + srcs = glob(["count-lines/**/*.swift"]), + target_compatible_with = ["@platforms//os:macos"], + deps = ["//:ArgumentParser"], +) + +[ + swift_binary( + name = tool, + srcs = glob(["{}/**/*.swift".format(tool)]), + deps = ["//:ArgumentParser"], + ) + for tool in [ + "color", + "default-as-flag", + "math", + "repeat", + "roll", + ] +] diff --git a/MODULE.bazel b/MODULE.bazel new file mode 100644 index 000000000..258f33bd0 --- /dev/null +++ b/MODULE.bazel @@ -0,0 +1,10 @@ +module( + name = "swift_argument_parser", + version = "0", + compatibility_level = 1, +) + +bazel_dep(name = "apple_support", version = "2.5.4") +bazel_dep(name = "bazel_skylib", version = "1.9.0") +bazel_dep(name = "platforms", version = "1.0.0") +bazel_dep(name = "rules_swift", version = "3.6.1", max_compatibility_level = 3) diff --git a/Tests/BUILD.bazel b/Tests/BUILD.bazel new file mode 100644 index 000000000..dfb7aeb89 --- /dev/null +++ b/Tests/BUILD.bazel @@ -0,0 +1,142 @@ +load("@bazel_skylib//rules:copy_file.bzl", "copy_file") +load("@rules_swift//swift:swift.bzl", "swift_test") + +[ + copy_file( + name = name + ".copy", + src = target, + out = name, + allow_symlink = True, + ) + for name, target in [ + ("generate-docc-reference", "//Tools:generate-docc-reference"), + ("generate-manual", "//Tools:generate-manual"), + ("color", "//Examples:color"), + ("count-lines", "//Examples:count-lines"), + ("default-as-flag", "//Examples:default-as-flag"), + ("math", "//Examples:math"), + ("repeat", "//Examples:repeat"), + ("roll", "//Examples:roll"), + ] +] + +genrule( + name = "generate_module_accessor", + outs = ["module_accessor.swift"], + cmd = """cat > $@ <<'EOF' +import Foundation + +public extension Bundle { + static let module: Bundle = { + let testSrcDir = ProcessInfo.processInfo.environment["TEST_SRCDIR"]! + let url = URL(fileURLWithPath: testSrcDir) + .appendingPathComponent("_main/Tests/ArgumentParserExampleTests") + return Bundle(url: url)! + }() +} +EOF +""", +) + +swift_test( + name = "EndToEndTests", + srcs = glob(["ArgumentParserEndToEndTests/**/*.swift"]), + deps = [ + "//:ArgumentParser", + "//:ArgumentParserTestHelpers", + ], +) + +swift_test( + name = "ExampleTests", + srcs = glob(["ArgumentParserExampleTests/**/*.swift"]) + [":generate_module_accessor"], + data = glob([ + "ArgumentParserExampleTests/**/*.zsh", + "ArgumentParserExampleTests/**/*.bash", + "ArgumentParserExampleTests/**/*.fish", + "ArgumentParserExampleTests/**/*.txt", + ]) + [ + ":math", + ":repeat", + ":roll", + ] + select({ + "@platforms//os:macos": [":count-lines"], + "//conditions:default": [], + }), + deps = [ + "//:ArgumentParser", + "//:ArgumentParserTestHelpers", + ], +) + +swift_test( + name = "GenerateDoccReferenceTests", + srcs = glob(["ArgumentParserGenerateDoccReferenceTests/**/*.swift"]), + data = glob(["ArgumentParserGenerateDoccReferenceTests/**/*.md"]) + [ + ":color", + ":generate-docc-reference", + ":math", + ":repeat", + ":roll", + ] + select({ + "@platforms//os:macos": [":count-lines"], + "//conditions:default": [], + }), + deps = [ + "//:ArgumentParser", + "//:ArgumentParserTestHelpers", + ], +) + +swift_test( + name = "GenerateManualTests", + srcs = glob(["ArgumentParserGenerateManualTests/**/*.swift"]), + data = glob(["ArgumentParserGenerateManualTests/**/*.mdoc"]) + [ + ":color", + ":default-as-flag", + ":generate-manual", + ":math", + ":repeat", + ":roll", + ] + select({ + "@platforms//os:macos": [":count-lines"], + "//conditions:default": [], + }), + deps = [ + "//:ArgumentParser", + "//:ArgumentParserTestHelpers", + ], +) + +swift_test( + name = "PackageManagerTests", + srcs = glob(["ArgumentParserPackageManagerTests/**/*.swift"]), + deps = [ + "//:ArgumentParser", + "//:ArgumentParserTestHelpers", + ], +) + +swift_test( + name = "ToolInfoTests", + srcs = glob(["ArgumentParserToolInfoTests/**/*.swift"]), + data = glob(["ArgumentParserToolInfoTests/**/*.json"]), + deps = [ + "//:ArgumentParserToolInfo", + ], +) + +swift_test( + name = "UnitTests", + srcs = glob(["ArgumentParserUnitTests/**/*.swift"]), + data = glob([ + "ArgumentParserUnitTests/**/*.json", + "ArgumentParserUnitTests/**/*.bash", + "ArgumentParserUnitTests/**/*.fish", + "ArgumentParserUnitTests/**/*.zsh", + ]), + deps = [ + "//:ArgumentParser", + "//:ArgumentParserTestHelpers", + ], +) diff --git a/Tools/BUILD.bazel b/Tools/BUILD.bazel new file mode 100644 index 000000000..644ddca7c --- /dev/null +++ b/Tools/BUILD.bazel @@ -0,0 +1,28 @@ +load("@rules_swift//swift:swift.bzl", "swift_binary") + +package(default_visibility = ["//:__subpackages__"]) + +swift_binary( + name = "changelog-authors", + srcs = glob(["changelog-authors/**/*.swift"]), + target_compatible_with = ["@platforms//os:macos"], + deps = ["//:ArgumentParser"], +) + +swift_binary( + name = "generate-docc-reference", + srcs = glob(["generate-docc-reference/**/*.swift"]), + deps = [ + "//:ArgumentParser", + "//:ArgumentParserToolInfo", + ], +) + +swift_binary( + name = "generate-manual", + srcs = glob(["generate-manual/**/*.swift"]), + deps = [ + "//:ArgumentParser", + "//:ArgumentParserToolInfo", + ], +)