diff options
author | Philip Kuryloski <kuryloskip@vmware.com> | 2022-05-17 14:07:16 +0200 |
---|---|---|
committer | Philip Kuryloski <kuryloskip@vmware.com> | 2022-06-08 14:04:53 +0200 |
commit | 327f075d57d5184187e4bd9edba9ae9835d162c9 (patch) | |
tree | 839e90f7259ef43d64129c2b534050b762a90211 | |
parent | f0b0a4f90870d8d54190580094345484ca019532 (diff) | |
download | rabbitmq-server-git-327f075d57d5184187e4bd9edba9ae9835d162c9.tar.gz |
Make rabbitmq-server work with rules_erlang 3
Also rework elixir dependency handling, so we no longer rely on mix to
fetch the rabbitmq_cli deps
Also:
- Specify ra version with a commit rather than a branch
- Fixup compilation options for erlang 23
- Add missing ra reference in MODULE.bazel
- Add missing flag in oci.yaml
- Reduce bazel rbe jobs to try to save memory
- Use bazel built erlang for erlang git master tests
- Use the same cache for all the workflows but windows
- Avoid using `mix local.hex --force` in elixir rules
- Fetching seems blocked in CI, and this should reduce hex api usage in
all builds, which is always nice
- Remove xref and dialyze tags since rules_erlang 3 includes them in
the defaults
85 files changed, 1527 insertions, 880 deletions
@@ -16,34 +16,32 @@ build:rbe --config=buildbuddy build:rbe --remote_executor=grpcs://remote.buildbuddy.io -build:rbe --action_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1 - -build:rbe --@rules_erlang//:erlang_home=/usr/lib/erlang -build:rbe --//:elixir_home=/usr/local - build:rbe --spawn_strategy=remote build:rbe --test_strategy="" -build:rbe --jobs=100 +build:rbe --jobs=50 -build:rbe-23 --config=rbe -build:rbe-23 --crosstool_top=@rbe_23//cc:toolchain -build:rbe-23 --extra_toolchains=@rbe_23//config:cc-toolchain +build:rbe --crosstool_top=@rbe//cc:toolchain +build:rbe --extra_toolchains=@rbe//config:cc-toolchain -build:rbe-23 --host_platform=@rbe_23//config:platform -build:rbe-23 --platforms=@rbe_23//config:platform -build:rbe-23 --extra_execution_platforms=@rbe_23//config:platform +build:rbe --host_platform=@rbe//config:platform -build:rbe-23 --@rules_erlang//:erlang_version=23 +build:rbe --host_cpu=k8 +build:rbe --cpu=k8 + +build:rbe-23 --config=rbe +build:rbe-23 --platforms=//bazel/platforms:erlang_23_platform +build:rbe-23 --extra_execution_platforms=//bazel/platforms:erlang_23_platform build:rbe-24 --config=rbe -build:rbe-24 --crosstool_top=@rbe_24//cc:toolchain -build:rbe-24 --extra_toolchains=@rbe_24//config:cc-toolchain +build:rbe-24 --platforms=//bazel/platforms:erlang_24_platform +build:rbe-24 --extra_execution_platforms=//bazel/platforms:erlang_24_platform -build:rbe-24 --host_platform=@rbe_24//config:platform -build:rbe-24 --platforms=@rbe_24//config:platform -build:rbe-24 --extra_execution_platforms=@rbe_24//config:platform +build:rbe-25 --config=rbe +build:rbe-25 --platforms=//bazel/platforms:erlang_25_platform +build:rbe-25 --extra_execution_platforms=//bazel/platforms:erlang_25_platform -build:rbe-24 --@rules_erlang//:erlang_version=24 +build:local --platforms=//bazel/platforms:erlang_external_platform +build:local --extra_execution_platforms=//bazel/platforms:erlang_external_platform # Try importing a user specific .bazelrc # You can create your own by copying and editing the template-user.bazelrc template: diff --git a/.github/workflows/oci.yaml b/.github/workflows/oci.yaml index 91182c9812..fd4efd887d 100644 --- a/.github/workflows/oci.yaml +++ b/.github/workflows/oci.yaml @@ -5,8 +5,8 @@ on: workflow_dispatch: env: GENERIC_UNIX_ARCHIVE: ${{ github.workspace }}/bazel-bin/package-generic-unix.tar.xz - RABBITMQ_VERSION: ${{ github.sha }} - VERSION: ${{ github.sha }} + RABBITMQ_VERSION: ${{ github.event.pull_request.head.sha || github.sha }} + VERSION: ${{ github.event.pull_request.head.sha || github.sha }} jobs: # This job will build one docker image per supported Erlang major version. @@ -30,14 +30,6 @@ jobs: image_tag_suffix: - otp-min - otp-max - #! - otp-rc - include: - - image_tag_suffix: otp-min - skip_otp_verify: false - - image_tag_suffix: otp-max - skip_otp_verify: false - #! - image_tag_suffix: otp-rc - #! skip_otp_verify: true steps: - name: Checkout uses: actions/checkout@v3 @@ -45,28 +37,21 @@ jobs: - name: Load version info id: load-info run: | + # TODO: de-duplicate the info these files and MODULE.bazel FILE=packaging/docker-image/otp-versions/${{ matrix.image_tag_suffix }}.yaml echo "::set-output name=otp::$(yq eval '.otp' $FILE)" + echo "::set-output name=otp_major::$(yq eval '.otp_major' $FILE)" echo "::set-output name=otp_sha256::$(yq eval '.otp_sha256' $FILE)" echo "::set-output name=elixir::$(yq eval '.elixir' $FILE)" - - name: Set up Erlang & Elixir - uses: erlef/setup-beam@v1.11 - with: - otp-version: ${{ steps.load-info.outputs.otp }} - elixir-version: ${{ steps.load-info.outputs.elixir }} - version-type: strict - - - name: MOUNT BAZEL CACHE - uses: actions/cache@v3.0.4 + - name: Mount Bazel Cache + uses: actions/cache@v3.0.2 with: path: "/home/runner/repo-cache/" key: repo-cache - - name: CONFIGURE BAZEL + - name: Configure Bazel run: | - ERLANG_HOME="$(dirname $(dirname $(which erl)))" - ELIXIR_HOME="$(dirname $(dirname $(which iex)))" if [ -n "${{ secrets.BUILDBUDDY_API_KEY }}" ]; then cat << EOF >> user.bazelrc build:buildbuddy --remote_header=x-buildbuddy-api-key=${{ secrets.BUILDBUDDY_API_KEY }} @@ -75,20 +60,29 @@ jobs: cat << EOF >> user.bazelrc build:buildbuddy --build_metadata=ROLE=CI build:buildbuddy --build_metadata=VISIBILITY=PRIVATE - build:buildbuddy --remote_instance_name=buildbuddy-io/buildbuddy/ci-oci build:buildbuddy --repository_cache=/home/runner/repo-cache/ build:buildbuddy --color=yes build:buildbuddy --disk_cache= - build --@rules_erlang//:erlang_version=${{ steps.load-info.outputs.otp }} - build --@rules_erlang//:erlang_home=${ERLANG_HOME} - build --//:elixir_home=${ELIXIR_HOME} + build:buildbuddy --remote_download_toplevel EOF + - name: Check for otp & elixir version exact match + run: | + bazelisk build :otp_version --config=rbe-${{ steps.load-info.outputs.otp_major }} + if [ ! "$(cat bazel-bin/otp_version.txt)" == "${{ steps.load-info.outputs.otp }}" ]; then + exit 1 + fi + bazelisk build :elixir_version --config=rbe-${{ steps.load-info.outputs.otp_major }} + if [ ! "$(cat bazel-bin/elixir_version.txt)" == "${{ steps.load-info.outputs.elixir }}" ]; then + exit 1 + fi + - name: Build generic unix package run: | - sed -i"_orig" -E '/APP_VERSION/ s/3\.[0-9]+\.[0-9]+/${{ github.sha }}/' rabbitmq.bzl - bazelisk build :package-generic-unix + sed -i"_orig" -E '/APP_VERSION/ s/3\.[0-9]+\.[0-9]+/${{ github.event.pull_request.head.sha || github.sha }}/' rabbitmq.bzl + bazelisk build :package-generic-unix \ + --config=rbe-${{ steps.load-info.outputs.otp_major }} - name: Resolve generic unix package path run: | @@ -108,7 +102,7 @@ jobs: uses: actions/cache@v3.0.4 with: path: /tmp/.buildx-cache - key: ${{ runner.os }}-${{ matrix.image_tag_suffix }}-buildx-${{ github.sha }} + key: ${{ runner.os }}-${{ matrix.image_tag_suffix }}-buildx-${{ github.event.pull_request.head.sha || github.sha }} restore-keys: | ${{ runner.os }}-${{ matrix.image_tag_suffix }}-buildx- @@ -131,12 +125,12 @@ jobs: - name: Expand generic-unix-package working-directory: packaging/docker-image run: | - xzcat ${GENERIC_UNIX_ARCHIVE} | tar xvf - + xzcat ${{ steps.resolve-artifact-path.outputs.ARTIFACT_PATH }} | tar xvf - - name: Compute image tags id: compute-tags run: | - echo "::set-output name=TAG_1::${{ github.sha }}-${{ matrix.image_tag_suffix }}" + echo "::set-output name=TAG_1::${{ github.event.pull_request.head.sha || github.sha }}-${{ matrix.image_tag_suffix }}" echo "::set-output name=TAG_2::${GITHUB_REF##*/}-${{ matrix.image_tag_suffix }}" - name: Build and push @@ -152,8 +146,7 @@ jobs: PGP_KEYSERVER=pgpkeys.eu OTP_VERSION=${{ steps.load-info.outputs.otp }} OTP_SHA256=${{ steps.load-info.outputs.otp_sha256 }} - SKIP_OTP_VERIFY=${{ matrix.skip_otp_verify }} - RABBITMQ_BUILD=rabbitmq_server-${{ github.sha }} + RABBITMQ_BUILD=rabbitmq_server-${{ github.event.pull_request.head.sha || github.sha }} cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache-new diff --git a/.github/workflows/perform-bazel-execution-comparison.yaml b/.github/workflows/perform-bazel-execution-comparison.yaml index f2bd9a6b07..700e843ca2 100644 --- a/.github/workflows/perform-bazel-execution-comparison.yaml +++ b/.github/workflows/perform-bazel-execution-comparison.yaml @@ -13,9 +13,9 @@ jobs: strategy: matrix: erlang_version: - - "24" + - "23" include: - - erlang_version: "24" + - erlang_version: "23" cache_name: ci-bazel-cache-analysis timeout-minutes: 120 steps: @@ -48,9 +48,9 @@ jobs: strategy: matrix: erlang_version: - - "24" + - "23" include: - - erlang_version: "24" + - erlang_version: "23" cache_name: ci-bazel-cache-analysis timeout-minutes: 120 steps: diff --git a/.github/workflows/rabbitmq_peer_discovery_aws.yaml b/.github/workflows/rabbitmq_peer_discovery_aws.yaml index 56c4c562a6..28caf58308 100644 --- a/.github/workflows/rabbitmq_peer_discovery_aws.yaml +++ b/.github/workflows/rabbitmq_peer_discovery_aws.yaml @@ -9,8 +9,7 @@ jobs: matrix: include: - image_tag_suffix: otp-max - erlang_version: "24" - rbe_default_branch: linux-erlang-24.1 + erlang_version: "25" timeout-minutes: 45 steps: - name: CHECKOUT REPOSITORY @@ -34,7 +33,6 @@ jobs: build:buildbuddy --build_metadata=ROLE=CI build:buildbuddy --build_metadata=VISIBILITY=PRIVATE - build:buildbuddy --remote_instance_name=buildbuddy-io/buildbuddy/ci-aws-${{ matrix.erlang_version }} build:buildbuddy --repository_cache=/home/runner/repo-cache/ build:buildbuddy --color=yes build:buildbuddy --disk_cache= diff --git a/.github/workflows/test-erlang-git.yaml b/.github/workflows/test-erlang-git.yaml index bb27f2984e..d59d0a79b7 100644 --- a/.github/workflows/test-erlang-git.yaml +++ b/.github/workflows/test-erlang-git.yaml @@ -11,19 +11,6 @@ jobs: steps: - name: CHECKOUT REPOSITORY uses: actions/checkout@v3 - - name: UPDATE RBE IMAGE SHA - env: - IMAGE: pivotalrabbitmq/rabbitmq-server-buildenv - TAG: linux-erlang-git-master - run: | - # buildbuddy caches the container image, so we must use a specific sha to ensure - # the latest is used - DIGEST="$(skopeo inspect --format '{{.Digest}}' docker://${IMAGE}:${TAG})" - echo "Will use ${IMAGE}@${DIGEST}" - sudo npm install --global --silent @bazel/buildozer - npx buildozer \ - "dict_set exec_properties container-image:docker://${IMAGE}@${DIGEST}" \ - //:erlang_git_platform - name: MOUNT BAZEL CACHE uses: actions/cache@v3.0.4 with: @@ -39,21 +26,15 @@ jobs: cat << EOF >> user.bazelrc build:buildbuddy --build_metadata=ROLE=CI build:buildbuddy --build_metadata=VISIBILITY=PUBLIC - build:buildbuddy --remote_instance_name=buildbuddy-io/buildbuddy/ci-erlang-git build:buildbuddy --repository_cache=/home/runner/repo-cache/ build:buildbuddy --color=yes build:buildbuddy --disk_cache= - build:rbe-git --config=rbe - build:rbe-git --crosstool_top=@buildbuddy_toolchain//:toolchain - build:rbe-git --extra_toolchains=@buildbuddy_toolchain//:cc_toolchain - - build:rbe-git --host_platform=//:erlang_git_platform - build:rbe-git --platforms=//:erlang_git_platform - build:rbe-git --extra_execution_platforms=//:erlang_git_platform - build:rbe-git --@rules_erlang//:erlang_home=/usr/local/lib/erlang - build:rbe-git --@rules_erlang//:erlang_version=25 + build:rbe --platforms=//bazel/platforms:erlang_git_master_platform + build:rbe --extra_execution_platforms=//bazel/platforms:erlang_git_master_platform EOF + + bazelisk info release #! - name: Setup tmate session #! uses: mxschmitt/action-tmate@v3 - name: RUN TESTS @@ -61,6 +42,6 @@ jobs: sudo sysctl -w net.ipv4.tcp_keepalive_time=60 sudo ethtool -K eth0 tso off gso off gro off tx off rx off lro off bazelisk test //... \ - --config=rbe-git \ + --config=rbe \ --test_tag_filters=-mixed-version-cluster,-exclusive,-aws \ --verbose_failures diff --git a/.github/workflows/test-mixed-versions.yaml b/.github/workflows/test-mixed-versions.yaml index 456a60ec72..17f3037027 100644 --- a/.github/workflows/test-mixed-versions.yaml +++ b/.github/workflows/test-mixed-versions.yaml @@ -29,9 +29,9 @@ jobs: strategy: fail-fast: false matrix: - erlang_version: - - "23" + erlang_major: - "24" + #! - "25" timeout-minutes: 120 steps: - name: CHECKOUT REPOSITORY @@ -51,7 +51,6 @@ jobs: cat << EOF >> user.bazelrc build:buildbuddy --build_metadata=ROLE=CI build:buildbuddy --build_metadata=VISIBILITY=PUBLIC - build:buildbuddy --remote_instance_name=buildbuddy-io/buildbuddy/ci-${{ matrix.erlang_version }} build:buildbuddy --repository_cache=/home/runner/repo-cache/ build:buildbuddy --color=yes build:buildbuddy --disk_cache= @@ -63,7 +62,7 @@ jobs: sudo sysctl -w net.ipv4.tcp_keepalive_time=60 sudo ethtool -K eth0 tso off gso off gro off tx off rx off lro off bazelisk test //... \ - --config=rbe-${{ matrix.erlang_version }} \ + --config=rbe-${{ matrix.erlang_major }} \ --test_tag_filters=mixed-version-cluster,-exclusive,-aws \ --verbose_failures test-exclusive-mixed-versions: @@ -71,9 +70,11 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - erlang_version: - - "23" - - "24" + include: + - erlang_version: "24" + elixir_version: 1.12.3 + #! - erlang_version: "25" + #! elixir_version: 1.13.4 timeout-minutes: 60 steps: - name: CHECKOUT REPOSITORY @@ -82,7 +83,7 @@ jobs: uses: erlef/setup-beam@v1.11 with: otp-version: ${{ matrix.erlang_version }} - elixir-version: 1.12.3 + elixir-version: ${{ matrix.elixir_version }} - name: MOUNT BAZEL CACHE uses: actions/cache@v3.0.4 with: @@ -100,7 +101,6 @@ jobs: cat << EOF >> user.bazelrc build:buildbuddy --build_metadata=ROLE=CI build:buildbuddy --build_metadata=VISIBILITY=PRIVATE - build:buildbuddy --remote_instance_name=buildbuddy-io/buildbuddy/ci-exclusive-${{ matrix.erlang_version }} build:buildbuddy --repository_cache=/home/runner/repo-cache/ build:buildbuddy --color=yes build:buildbuddy --disk_cache= @@ -108,6 +108,8 @@ jobs: build --@rules_erlang//:erlang_version=${{ matrix.erlang_version }} build --@rules_erlang//:erlang_home=${ERLANG_HOME} build --//:elixir_home=${ELIXIR_HOME} + build --platforms=//bazel/platforms:erlang_external_platform + build --extra_execution_platforms=//bazel/platforms:erlang_external_platform EOF #! - name: Setup tmate session #! uses: mxschmitt/action-tmate@v3 diff --git a/.github/workflows/test-windows.yaml b/.github/workflows/test-windows.yaml index c8bbae9df2..8be01227ad 100644 --- a/.github/workflows/test-windows.yaml +++ b/.github/workflows/test-windows.yaml @@ -10,9 +10,11 @@ jobs: strategy: fail-fast: false matrix: - erlang_version: - #! - "23" - - "24" + include: + - erlang_version: "24" + elixir_version: 1.12.3 + - erlang_version: "25" + elixir_version: 1.13.4 timeout-minutes: 120 steps: - name: CHECKOUT REPOSITORY @@ -21,7 +23,7 @@ jobs: uses: erlef/setup-beam@v1.11 with: otp-version: ${{ matrix.erlang_version }} - elixir-version: 1.12.3 + elixir-version: ${{ matrix.elixir_version }} #! - name: MOUNT BAZEL CACHE #! uses: actions/cache@v1 #! with: @@ -42,7 +44,7 @@ jobs: build:buildbuddy --build_metadata=ROLE=CI build:buildbuddy --build_metadata=VISIBILITY=PUBLIC - build:buildbuddy --remote_instance_name=buildbuddy-io/buildbuddy/ci-windows-${{ matrix.erlang_version }} + build:buildbuddy --remote_instance_name=buildbuddy-io/buildbuddy/ci-windows # build:buildbuddy --repository_cache=/home/runner/repo-cache/ build:buildbuddy --color=yes build:buildbuddy --disk_cache= @@ -50,6 +52,8 @@ jobs: build --@rules_erlang//:erlang_version=${{ matrix.erlang_version }} build --@rules_erlang//:erlang_home="${ERL_PATH/\/bin\/erl/}" build --//:elixir_home="${IEX_PATH/\/bin\/iex/}" + build --platforms=//bazel/platforms:erlang_external_platform + build --extra_execution_platforms=//bazel/platforms:erlang_external_platform EOF bazelisk info release diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 687de9e79e..8f71a3bbbb 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -29,9 +29,10 @@ jobs: strategy: fail-fast: false matrix: - erlang_version: + erlang_major: - "23" - "24" + - "25" timeout-minutes: 120 steps: - name: CHECKOUT REPOSITORY @@ -51,7 +52,6 @@ jobs: cat << EOF >> user.bazelrc build:buildbuddy --build_metadata=ROLE=CI build:buildbuddy --build_metadata=VISIBILITY=PUBLIC - build:buildbuddy --remote_instance_name=buildbuddy-io/buildbuddy/ci-${{ matrix.erlang_version }} build:buildbuddy --repository_cache=/home/runner/repo-cache/ build:buildbuddy --color=yes build:buildbuddy --disk_cache= @@ -65,7 +65,7 @@ jobs: sudo sysctl -w net.ipv4.tcp_keepalive_time=60 sudo ethtool -K eth0 tso off gso off gro off tx off rx off lro off bazelisk test //... \ - --config=rbe-${{ matrix.erlang_version }} \ + --config=rbe-${{ matrix.erlang_major }} \ --test_tag_filters=-exclusive,-aws,-mixed-version-cluster \ --verbose_failures test-exclusive: @@ -74,9 +74,13 @@ jobs: strategy: fail-fast: false matrix: - erlang_version: - - "23" - - "24" + include: + #! - erlang_version: "23" + #! elixir_version: 1.10.4 + - erlang_version: "24" + elixir_version: 1.12.3 + - erlang_version: "25" + elixir_version: 1.13.4 timeout-minutes: 60 steps: - name: CHECKOUT REPOSITORY @@ -85,7 +89,7 @@ jobs: uses: erlef/setup-beam@v1.11 with: otp-version: ${{ matrix.erlang_version }} - elixir-version: 1.12.3 + elixir-version: ${{ matrix.elixir_version }} - name: MOUNT BAZEL CACHE uses: actions/cache@v3.0.4 with: @@ -103,7 +107,6 @@ jobs: cat << EOF >> user.bazelrc build:buildbuddy --build_metadata=ROLE=CI build:buildbuddy --build_metadata=VISIBILITY=PRIVATE - build:buildbuddy --remote_instance_name=buildbuddy-io/buildbuddy/ci-exclusive-${{ matrix.erlang_version }} build:buildbuddy --repository_cache=/home/runner/repo-cache/ build:buildbuddy --color=yes build:buildbuddy --disk_cache= @@ -111,6 +114,8 @@ jobs: build --@rules_erlang//:erlang_version=${{ matrix.erlang_version }} build --@rules_erlang//:erlang_home=${ERLANG_HOME} build --//:elixir_home=${ELIXIR_HOME} + build --platforms=//bazel/platforms:erlang_external_platform + build --extra_execution_platforms=//bazel/platforms:erlang_external_platform EOF #! - name: Setup tmate session #! uses: mxschmitt/action-tmate@v3 diff --git a/BUILD.bazel b/BUILD.bazel index 810388549f..1f64d40e3a 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -1,12 +1,16 @@ -load("@rules_pkg//:pkg.bzl", "pkg_tar") +load( + "@bazel_skylib//rules:common_settings.bzl", + "string_flag", +) load("@rules_erlang//:dialyze.bzl", "plt") load("@rules_erlang//:shell.bzl", "shell") -load("elixir_home.bzl", "elixir_home") +load("@rules_erlang//:erl_eval.bzl", "erl_eval") +load("//bazel/elixir:iex_eval.bzl", "iex_eval") load(":rabbitmq_home.bzl", "rabbitmq_home") load(":rabbitmq_run.bzl", "rabbitmq_run", "rabbitmq_run_command") load(":rabbitmqctl.bzl", "rabbitmqctl") -load(":rabbitmq.bzl", "APP_VERSION", "all_plugins") -load(":dist.bzl", "collect_licenses", "versioned_rabbitmq_home") +load(":dist.bzl", "package_generic_unix") +load(":rabbitmq.bzl", "all_plugins") exports_files([ "scripts/bazel/rabbitmq-run.sh", @@ -20,37 +24,24 @@ config_setting( }, ) -# This allows us to -# `bazel build //my/target \ -# --//:elixir_home=/path/to/elixir/installation` -elixir_home( +string_flag( name = "elixir_home", - build_setting_default = "~/.kiex/elixirs/elixir-1.10.4", + build_setting_default = "", visibility = ["//visibility:public"], ) -platform( - name = "erlang_git_platform", - constraint_values = [ - "@platforms//os:linux", - "@platforms//cpu:x86_64", - "@bazel_tools//tools/cpp:clang", - ], - exec_properties = { - "OSFamily": "Linux", - # linux-erlang-git-master - "container-image": "docker://pivotalrabbitmq/rabbitmq-server-buildenv@sha256:5d4fa38f723186668a497a8ee57e22010187e9347add5d4a7cc199dc13f1493f", - }, -) - plt( name = "base_plt", visibility = ["//visibility:public"], ) +PLUGINS = all_plugins( + rabbitmq_workspace = "", +) + rabbitmq_home( name = "broker-home", - plugins = all_plugins(rabbitmq_workspace = ""), + plugins = PLUGINS, ) rabbitmq_run( @@ -86,73 +77,22 @@ rabbitmqctl( shell( name = "repl", - deps = all_plugins(rabbitmq_workspace = ""), -) - -collect_licenses( - name = "licenses", - srcs = glob( - ["LICENSE*"], - exclude = [ - "LICENSE.md", - "LICENSE.txt", - ], - ), - deps = all_plugins(rabbitmq_workspace = ""), + deps = PLUGINS, ) -versioned_rabbitmq_home( - name = "dist-home", - plugins = all_plugins(rabbitmq_workspace = ""), +erl_eval( + name = "otp_version", + outs = ["otp_version.txt"], + expression = """{ok, Version} = file:read_file(filename:join([code:root_dir(), "releases", erlang:system_info(otp_release), "OTP_VERSION"])), file:write_file(os:getenv("OUTS"), Version), halt().""", ) -pkg_tar( - name = "license-files", - srcs = [ - ":licenses", - "//deps/rabbit:INSTALL", - ], - visibility = ["//visibility:public"], +iex_eval( + name = "elixir_version", + outs = ["elixir_version.txt"], + expression = """File.write!(System.get_env("OUTS"), System.version()); System.halt()""", ) -pkg_tar( - name = "scripts", - srcs = [ - "scripts/bash_autocomplete.sh", - "scripts/rabbitmq-script-wrapper", - "scripts/rabbitmqctl-autocomplete.sh", - "scripts/zsh_autocomplete.sh", - ], - package_dir = "scripts", - visibility = ["//visibility:public"], -) - -pkg_tar( - name = "release-notes", - srcs = glob([ - "release-notes/*.md", - "release-notes/*.txt", - ]), - package_dir = "release-notes", - visibility = ["//visibility:public"], -) - -pkg_tar( - name = "package-generic-unix", - srcs = [ - ":dist-home", - ], - extension = "tar.xz", - package_dir = "rabbitmq_server-{}".format(APP_VERSION), - strip_prefix = "dist-home", - visibility = ["//visibility:public"], - deps = [ - ":license-files", - ":release-notes", - ":scripts", - "//deps/rabbit:manpages-dir", - ], -) +package_generic_unix(PLUGINS) genrule( name = "test-logs", diff --git a/MODULE.bazel b/MODULE.bazel index dbf61f8938..8e3dbfe376 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -3,61 +3,67 @@ module( version = "3.10.0", ) -bazel_dep(name = "rules_erlang", version = "2.5.2") +bazel_dep(name = "rules_erlang", version = "3.0.1") + +git_override( + module_name = "rules_erlang", + remote = "https://github.com/rabbitmq/rules_erlang.git", + commit = "8eaf098114d25ca4f97094bbd38ac360b1b8774f", # <- internal-erlang-with-platforms branch +) erlang_package = use_extension( "@rules_erlang//bzlmod:extensions.bzl", "erlang_package", ) -erlang_package.hex( +erlang_package.hex_package( name = "accept", version = "0.3.5", sha256 = "11b18c220bcc2eab63b5470c038ef10eb6783bcb1fcdb11aa4137defa5ac1bb8", ) -erlang_package.hex( +erlang_package.hex_package( name = "aten", version = "0.5.7", sha256 = "8b623c8be27b59a911d16ab0af41777b504c147bc0d60a29015fab58321c04b0", ) -erlang_package.hex( +erlang_package.hex_package( name = "base64url", version = "1.0.1", sha256 = "f9b3add4731a02a9b0410398b475b33e7566a695365237a6bdee1bb447719f5c", ) -erlang_package.hex( +erlang_package.hex_package( name = "cowboy", version = "2.8.0", sha256 = "4643e4fba74ac96d4d152c75803de6fad0b3fa5df354c71afdd6cbeeb15fac8a", ) -erlang_package.hex( +erlang_package.hex_package( name = "cowlib", version = "2.9.1", sha256 = "e4175dc240a70d996156160891e1c62238ede1729e45740bdd38064dad476170", ) -erlang_package.hex( +erlang_package.hex_package( name = "credentials_obfuscation", version = "3.1.0", sha256 = "04884e62b1c6cdfba999d4d6b3e99bc0a59d5e439517bc5c01767255afb7b778", ) -erlang_package.git( +erlang_package.git_package( repository = "extend/ct_helper", branch = "master", ) -erlang_package.hex( +erlang_package.hex_package( name = "cuttlefish", version = "3.0.1", sha256 = "3feff3ae4ed1f0ca6df87ac89235068fbee9242ee85d2ac17fb1b8ce0e30f1a6", ) -erlang_package.hex( +erlang_package.hex_package( name = "eetcd", version = "0.3.5", sha256 = "af9d5158ad03a6794d412708d605be5dd1ebd0b8a1271786530d99f165bb0cff", @@ -76,59 +82,59 @@ erlang_app( """, ) -erlang_package.git( +erlang_package.git_package( repository = "rabbitmq/emqttc", branch = "remove-logging", ) -erlang_package.hex( +erlang_package.hex_package( name = "enough", version = "0.1.0", sha256 = "0460c7abda5f5e0ea592b12bc6976b8a5c4b96e42f332059cd396525374bf9a1", ) -erlang_package.hex( +erlang_package.hex_package( name = "gen_batch_server", version = "0.8.7", sha256 = "94a49a528486298b009d2a1b452132c0a0d68b3e89d17d3764cb1ec879b7557a", ) -erlang_package.hex( +erlang_package.hex_package( name = "gun", version = "1.3.3", sha256 = "3106ce167f9c9723f849e4fb54ea4a4d814e3996ae243a1c828b256e749041e0", ) -erlang_package.git( +erlang_package.git_package( name = "inet_tcp_proxy_dist", repository = "rabbitmq/inet_tcp_proxy", branch = "master", ) -erlang_package.git( +erlang_package.git_package( name = "jose", repository = "potatosalad/erlang-jose", commit = "2b1d66b5f4fbe33cb198149a8cb23895a2c877ea", ) -erlang_package.hex( +erlang_package.hex_package( name = "jsx", version = "3.1.0", sha256 = "0c5cc8fdc11b53cc25cf65ac6705ad39e54ecc56d1c22e4adb8f5a53fb9427f3", ) -erlang_package.git( +erlang_package.git_package( repository = "eproxus/meck", branch = "master", ) -erlang_package.hex( +erlang_package.hex_package( name = "observer_cli", version = "1.7.3", sha256 = "a41b6d3e11a3444e063e09cc225f7f3e631ce14019e5fbcaebfda89b1bd788ea", ) -erlang_package.git( +erlang_package.git_package( repository = "rabbitmq/osiris", branch = "main", patch_cmds = [""" @@ -137,10 +143,12 @@ echo "Injecting ${VERSION} into Makefile..." sed -i"_orig" -E '/PROJECT_VERSION/ s/[0-9]+\\.[0-9]+\\.[0-9]+/'${VERSION}'/' Makefile echo "Injecting ${VERSION} into BUILD.bazel..." sed -i"_orig" -E '/VERSION/ s/[0-9]+\\.[0-9]+\\.[0-9]+/'${VERSION}'/' BUILD.bazel + +sed -i"_orig2" -E 's/ct_sharded\\.bzl/ct.bzl/' BUILD.bazel """], ) -erlang_package.hex( +erlang_package.hex_package( name = "prometheus", version = "4.8.2", sha256 = "c3abd6521e52cec4f0d8eca603cf214dfc84d8a27aa85946639f1424b8554d98", @@ -159,20 +167,20 @@ erlang_app( """, ) -erlang_package.git( +erlang_package.git_package( repository = "manopapad/proper", branch = "master", ) -erlang_package.hex( +erlang_package.hex_package( name = "quantile_estimator", version = "0.2.1", sha256 = "282a8a323ca2a845c9e6f787d166348f776c1d4a41ede63046d72d422e3da946", ) -erlang_package.git( +erlang_package.git_package( repository = "rabbitmq/ra", - branch = "main", + commit = "fcaad359a4e64f87357acbcc84f01e0377706ce3", patch_cmds = [""" VERSION=$(git rev-parse HEAD) echo "Injecting ${VERSION} into ra.app.src..." @@ -180,47 +188,48 @@ sed -i"_orig" "/vsn,/ s/2\\.[0-9]\\.[0-9]/${VERSION}/" src/ra.app.src """], ) -erlang_package.hex( +erlang_package.hex_package( name = "ranch", version = "2.1.0", sha256 = "244ee3fa2a6175270d8e1fc59024fd9dbc76294a321057de8f803b1479e76916", ) -erlang_package.hex( +erlang_package.hex_package( name = "recon", version = "2.5.2", sha256 = "2c7523c8dee91dff41f6b3d63cba2bd49eb6d2fe5bf1eec0df7f87eb5e230e1c", ) -erlang_package.hex( +erlang_package.hex_package( name = "redbug", version = "2.0.7", sha256 = "3624feb7a4b78fd9ae0e66cc3158fe7422770ad6987a1ebf8df4d3303b1c4b0c", ) -erlang_package.hex( +erlang_package.hex_package( name = "seshat", version = "0.3.2", + sha256 = "20d820acbeef9d07298ee863d0c9d06f8e620acba100939ebb2925e4d6b0dfc7", ) -erlang_package.hex( +erlang_package.hex_package( name = "stdout_formatter", version = "0.2.4", sha256 = "51f1df921b0477275ea712763042155dbc74acc75d9648dbd54985c45c913b29", ) -erlang_package.git( +erlang_package.git_package( repository = "schlagert/syslog", tag = "4.0.0", ) -erlang_package.hex( +erlang_package.hex_package( name = "sysmon_handler", version = "1.3.0", sha256 = "922cf0dd558b9fdb1326168373315b52ed6a790ba943f6dcbd9ee22a74cebdef", ) -erlang_package.hex( +erlang_package.hex_package( name = "systemd", version = "0.6.1", sha256 = "8ec5ed610a5507071cdb7423e663e2452a747a624bb8a58582acd9491ccad233", @@ -239,18 +248,12 @@ erlang_app( """, ) -erlang_package.git( +erlang_package.git_package( name = "trust_store_http", repository = "rabbitmq/trust-store-http", branch = "master", ) -erlang_package.git( - name = "ra", - repository = "rabbitmq/ra", - branch = "main", -) - use_repo( erlang_package, "accept", @@ -273,6 +276,7 @@ use_repo( "osiris", "prometheus", "proper", + "ra", "ranch", "recon", "redbug", @@ -283,3 +287,61 @@ use_repo( "systemd", "trust_store_http", ) + +elixir = use_extension( + "//bazel/bzlmod:extensions.bzl", + "elixir", +) + +elixir.hex_package( + name = "amqp", + version = "2.1.2", + sha256 = "535901c611a979221d045839e9e7a661bf33d04590b796c8fa30f487511fde04", + deps = [ + "@//deps/amqp_client:erlang_app", + ], +) + +elixir.hex_package( + name = "csv", + version = "2.4.1", + sha256 = "54508938ac67e27966b10ef49606e3ad5995d665d7fc2688efb3eab1307c9079", + deps = [ + "@parallel_stream//:elixir_app", + ], +) + +elixir.hex_package( + name = "json", + version = "1.4.1", + sha256 = "9abf218dbe4ea4fcb875e087d5f904ef263d012ee5ed21d46e9dbca63f053d16", +) + +elixir.hex_package( + name = "parallel_stream", + version = "1.0.6", + sha256 = "639b2e8749e11b87b9eb42f2ad325d161c170b39b288ac8d04c4f31f8f0823eb", +) + +elixir.hex_package( + name = "temp", + version = "0.4.7", + sha256 = "6af19e7d6a85a427478be1021574d1ae2a1e1b90882586f06bde76c63cd03e0d", +) + +elixir.hex_package( + name = "x509", + version = "0.7.0", + sha256 = "5ff9c79e77d64a62ccffd90aaeb23e8f5b6e47844ef7bc8fed931ecf238662e0", +) + +use_repo( + elixir, + "amqp", + "csv", + "hex", + "json", + "parallel_stream", + "temp", + "x509", +) diff --git a/WORKSPACE.bazel b/WORKSPACE.bazel index ec3371b501..fdc668ac6d 100644 --- a/WORKSPACE.bazel +++ b/WORKSPACE.bazel @@ -1,5 +1,17 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") + +http_archive( + name = "bazel_skylib", + sha256 = "af87959afe497dc8dfd4c6cb66e1279cb98ccc84284619ebfec27d9c09a903de", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.2.0/bazel-skylib-1.2.0.tar.gz", + "https://github.com/bazelbuild/bazel-skylib/releases/download/1.2.0/bazel-skylib-1.2.0.tar.gz", + ], +) + +load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") + +bazel_skylib_workspace() http_archive( name = "rules_pkg", @@ -32,41 +44,38 @@ buildbuddy( llvm = True, ) -git_repository( - name = "rbe_23", - commit = "d50764600e0fed0debc86f714f2c36b571e98719", - remote = "https://github.com/rabbitmq/rbe-erlang-platform.git", -) +load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") git_repository( - name = "rbe_24", - commit = "38aa3c971edd4f051948ee9911fa316d9c2b62e4", + name = "rbe", + commit = "6a2899b87ee4f4dc0ef6f0012be6c3f94e6c9c2f", # linux-rbe branch remote = "https://github.com/rabbitmq/rbe-erlang-platform.git", ) -http_archive( - name = "rules_pkg", - sha256 = "038f1caa773a7e35b3663865ffb003169c6a71dc995e39bf4815792f385d837d", - urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/rules_pkg/releases/download/0.4.0/rules_pkg-0.4.0.tar.gz", - "https://github.com/bazelbuild/rules_pkg/releases/download/0.4.0/rules_pkg-0.4.0.tar.gz", - ], -) - -load("@rules_pkg//:deps.bzl", "rules_pkg_dependencies") - -rules_pkg_dependencies() - git_repository( name = "rules_erlang", - commit = "371d4adb83a3588e2d49403e1c6c6c7ba22e225d", + commit = "8eaf098114d25ca4f97094bbd38ac360b1b8774f", remote = "https://github.com/rabbitmq/rules_erlang.git", ) -load("@rules_erlang//:rules_erlang.bzl", "rules_erlang_dependencies") +load( + "@rules_erlang//:rules_erlang.bzl", + "rules_erlang_dependencies", +) rules_erlang_dependencies() +register_toolchains( + "//bazel/toolchains:erlang_toolchain_external", + "//bazel/toolchains:erlang_toolchain_23", + "//bazel/toolchains:erlang_toolchain_24", + "//bazel/toolchains:erlang_toolchain_25", + "//bazel/toolchains:erlang_toolchain_git_master", + "//bazel/toolchains:elixir_toolchain_external", + "//bazel/toolchains:elixir_toolchain_1_10", + "//bazel/toolchains:elixir_toolchain_1_13", +) + load("//:workspace_helpers.bzl", "rabbitmq_external_deps") rabbitmq_external_deps(rabbitmq_workspace = "@") @@ -84,7 +93,7 @@ pkg_zip( name = "inet_tcp_proxy_ez", package_dir = "inet_tcp_proxy/ebin", srcs = [ - "@rules_erlang.2.5.2.erlang_package.inet_tcp_proxy_dist//:erlang_app", + "@inet_tcp_proxy_dist//:erlang_app", ], package_file_name = "inet_tcp_proxy-0.1.0.ez", visibility = ["//visibility:public"], @@ -102,6 +111,9 @@ http_archive( name = "rabbitmq-server-generic-unix-3.9", build_file = "@//:BUILD.package_generic_unix", patch_cmds = [ADD_PLUGINS_DIR_BUILD_FILE], + repo_mapping = { + "@inet_tcp_proxy_dist": "@rules_erlang.erlang_package.inet_tcp_proxy_dist", + }, sha256 = "4672fad92a815b879cc78a5a9fd28445152b61745d68acd50432c15f96792171", strip_prefix = "rabbitmq_server-3.9.13", urls = ["https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.9.13/rabbitmq-server-generic-unix-3.9.13.tar.xz"], diff --git a/bazel/bzlmod/BUILD.bazel b/bazel/bzlmod/BUILD.bazel new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/bazel/bzlmod/BUILD.bazel diff --git a/bazel/bzlmod/extensions.bzl b/bazel/bzlmod/extensions.bzl new file mode 100644 index 0000000000..15faf25905 --- /dev/null +++ b/bazel/bzlmod/extensions.bzl @@ -0,0 +1,100 @@ +load( + "@bazel_tools//tools/build_defs/repo:git.bzl", + "new_git_repository", +) +load( + "@rules_erlang//:hex_archive.bzl", + "hex_archive", +) + +def _installation_suffix(erlang_installation): + wn = erlang_installation.workspace_name + return wn.removeprefix("rules_erlang").removeprefix(".erlang_package.") + +def _merge_package(props, packages): + for p in packages: + if props["name"] == p["name"]: + if props != p: + fail("package conflict: {} and {}".format(props, p)) + return packages + return packages + [props] + +def _hex(): + new_git_repository( + name = "hex", + remote = "https://github.com/hexpm/hex.git", + tag = "v1.0.1", + build_file_content = MIX_PACKAGE_BUILD_FILE_CONTENT.format( + name = "hex", + deps = [], + ), + ) + +def _impl(ctx): + _hex() + + hex_packages = [] + for mod in ctx.modules: + for package in mod.tags.hex_package: + props = { + "name": package.name, + "version": package.version, + "sha256": package.sha256, + "deps": package.deps, + "build_file_content": package.build_file_content, + "patch_cmds": package.patch_cmds, + } + hex_packages = _merge_package(props, hex_packages) + + for props in hex_packages: + name = props["name"] + deps = props.pop("deps") + if props["build_file_content"] == "": + props["build_file_content"] = MIX_PACKAGE_BUILD_FILE_CONTENT.format( + name = name, + deps = deps + ["@hex//:elixir_app"], + ) + hex_archive( + package_name = name, + **props + ) + +hex_package = tag_class(attrs = { + "name": attr.string(), + "version": attr.string(), + "sha256": attr.string(), + "deps": attr.string_list(), + "build_file_content": attr.string(), + "patch_cmds": attr.string_list(), +}) + +elixir = module_extension( + implementation = _impl, + tag_classes = { + "hex_package": hex_package, + }, +) + +MIX_PACKAGE_BUILD_FILE_CONTENT = """load( + "@rabbitmq-server//bazel/mix:mix_app.bzl", + "mix_app", +) + +filegroup( + name = "srcs", + srcs = glob([ + "mix.exs", + "lib/**/*", + ]), + visibility = ["//visibility:public"], +) + +mix_app( + name = "elixir_app", + app_name = "{name}", + srcs = [":srcs"], + license_files = glob(["LICENSE*"]), + deps = {deps}, + visibility = ["//visibility:public"], +) +""" diff --git a/bazel/elixir/BUILD.bazel b/bazel/elixir/BUILD.bazel new file mode 100644 index 0000000000..b362f11b13 --- /dev/null +++ b/bazel/elixir/BUILD.bazel @@ -0,0 +1,14 @@ +load( + ":elixir_as_app.bzl", + "elixir_as_app", +) + +toolchain_type( + name = "toolchain_type", + visibility = ["//visibility:public"], +) + +elixir_as_app( + name = "erlang_app", + visibility = ["//visibility:public"], +) diff --git a/bazel/elixir/elixir.bzl b/bazel/elixir/elixir.bzl new file mode 100644 index 0000000000..b533c83e64 --- /dev/null +++ b/bazel/elixir/elixir.bzl @@ -0,0 +1,90 @@ +load( + ":elixir_build.bzl", + "elixir_build", + "elixir_external", +) +load( + ":elixir_toolchain.bzl", + "elixir_toolchain", +) + +def elixir_toolchain_external(): + elixir_constraint = Label("//bazel/platforms:elixir_external") + + elixir_external( + name = "external_elixir_installation_ref", + target_compatible_with = [ + elixir_constraint, + ], + ) + + elixir_toolchain( + name = "elixir_external", + elixir = ":external_elixir_installation_ref", + ) + + native.toolchain( + name = "elixir_toolchain_external", + exec_compatible_with = [ + elixir_constraint, + ], + target_compatible_with = [ + elixir_constraint, + ], + toolchain = ":elixir_external", + toolchain_type = Label("@rabbitmq-server//bazel/elixir:toolchain_type"), + visibility = ["//visibility:public"], + ) + + return elixir_constraint + +def elixir_toolchain_from_http_archive( + name_suffix = "", + version = None, + url = None, + strip_prefix = None, + sha256 = None, + elixir_constraint = None): + elixir_build( + name = "elixir_build{}".format(name_suffix), + url = url, + strip_prefix = strip_prefix, + sha256 = sha256, + target_compatible_with = [ + elixir_constraint, + ], + ) + + elixir_toolchain( + name = "elixir{}".format(name_suffix), + elixir = ":elixir_build{}".format(name_suffix), + ) + + native.toolchain( + name = "elixir_toolchain{}".format(name_suffix), + exec_compatible_with = [ + elixir_constraint, + ], + target_compatible_with = [ + elixir_constraint, + ], + toolchain = ":elixir{}".format(name_suffix), + toolchain_type = Label("@rabbitmq-server//bazel/elixir:toolchain_type"), + visibility = ["//visibility:public"], + ) + +def elixir_toolchain_from_github_release( + name_suffix = "_default", + version = None, + sha256 = None): + [major, minor, patch] = version.split(".") + elixir_constraint = Label("@rabbitmq-server//bazel/platforms:elixir_{}_{}".format(major, minor)) + url = "https://github.com/elixir-lang/elixir/archive/refs/tags/v{}.tar.gz".format(version) + elixir_toolchain_from_http_archive( + name_suffix = name_suffix, + url = url, + strip_prefix = "elixir-{}".format(version), + sha256 = sha256, + elixir_constraint = elixir_constraint, + ) + return elixir_constraint diff --git a/bazel/elixir/elixir_as_app.bzl b/bazel/elixir/elixir_as_app.bzl new file mode 100644 index 0000000000..433355ce74 --- /dev/null +++ b/bazel/elixir/elixir_as_app.bzl @@ -0,0 +1,42 @@ +load( + "@rules_erlang//:erlang_app_info.bzl", + "ErlangAppInfo", +) +load( + ":elixir_toolchain.bzl", + "elixir_dirs", +) + +def _impl(ctx): + ebin = ctx.actions.declare_directory("ebin") + + (elixir_home, elixir_runfiles) = elixir_dirs(ctx) + + ctx.actions.run_shell( + inputs = elixir_runfiles.files, + outputs = [ebin], + command = """set -euo pipefail + +cp -r "{elixir_home}"/lib/elixir/ebin/* {ebin} +""".format( + elixir_home = elixir_home, + ebin = ebin.path, + ), + ) + + return [ + DefaultInfo(files = depset([ebin])), + ErlangAppInfo( + app_name = "elixir", + include = [], + beam = [ebin], + priv = [], + deps = [], + ), + ] + +elixir_as_app = rule( + implementation = _impl, + toolchains = [":toolchain_type"], + provides = [ErlangAppInfo], +) diff --git a/bazel/elixir/elixir_build.bzl b/bazel/elixir/elixir_build.bzl new file mode 100644 index 0000000000..e9f47561ca --- /dev/null +++ b/bazel/elixir/elixir_build.bzl @@ -0,0 +1,160 @@ +load( + "@bazel_skylib//rules:common_settings.bzl", + "BuildSettingInfo", +) +load( + "@rules_erlang//tools:erlang_toolchain.bzl", + "erlang_dirs", + "maybe_symlink_erlang", +) + +ElixirInfo = provider( + doc = "A Home directory of a built Elixir", + fields = [ + "release_dir", + "elixir_home", + "version_file", + ], +) + +def _impl(ctx): + (_, _, filename) = ctx.attr.url.rpartition("/") + downloaded_archive = ctx.actions.declare_file(filename) + + release_dir = ctx.actions.declare_directory(ctx.label.name + "_release") + build_dir = ctx.actions.declare_directory(ctx.label.name + "_build") + + version_file = ctx.actions.declare_file(ctx.label.name + "_version") + + ctx.actions.run_shell( + inputs = [], + outputs = [downloaded_archive], + command = """set -euo pipefail + +curl -L "{archive_url}" -o {archive_path} + +if [ -n "{sha256}" ]; then + echo "{sha256} {archive_path}" | sha256sum --check --strict - +fi +""".format( + archive_url = ctx.attr.url, + archive_path = downloaded_archive.path, + sha256 = ctx.attr.sha256, + ), + mnemonic = "CURL", + progress_message = "Downloading {}".format(ctx.attr.url), + ) + + (erlang_home, _, runfiles) = erlang_dirs(ctx) + + inputs = depset( + direct = [downloaded_archive], + transitive = [runfiles.files], + ) + + strip_prefix = ctx.attr.strip_prefix + if strip_prefix != "": + strip_prefix += "\\/" + + ctx.actions.run_shell( + inputs = inputs, + outputs = [release_dir, build_dir, version_file], + command = """set -euo pipefail + +{maybe_symlink_erlang} + +export PATH="{erlang_home}"/bin:${{PATH}} + +ABS_BUILD_DIR=$PWD/{build_path} +ABS_RELEASE_DIR=$PWD/{release_path} +ABS_VERSION_FILE=$PWD/{version_file} + +tar --extract \\ + --transform 's/{strip_prefix}//' \\ + --file {archive_path} \\ + --directory $ABS_BUILD_DIR + +cd $ABS_BUILD_DIR + +make + +cp -r bin $ABS_RELEASE_DIR/ +cp -r lib $ABS_RELEASE_DIR/ + +$ABS_RELEASE_DIR/bin/iex --version > $ABS_VERSION_FILE +""".format( + maybe_symlink_erlang = maybe_symlink_erlang(ctx), + erlang_home = erlang_home, + archive_path = downloaded_archive.path, + strip_prefix = strip_prefix, + build_path = build_dir.path, + release_path = release_dir.path, + version_file = version_file.path, + ), + mnemonic = "ELIXIR", + progress_message = "Compiling elixir from source", + ) + + return [ + DefaultInfo( + files = depset([ + release_dir, + version_file, + ]), + ), + ctx.toolchains["@rules_erlang//tools:toolchain_type"].otpinfo, + ElixirInfo( + release_dir = release_dir, + elixir_home = None, + version_file = version_file, + ), + ] + +elixir_build = rule( + implementation = _impl, + attrs = { + "url": attr.string(mandatory = True), + "strip_prefix": attr.string(), + "sha256": attr.string(), + }, + toolchains = ["@rules_erlang//tools:toolchain_type"], +) + +def _elixir_external_impl(ctx): + elixir_home = ctx.attr._elixir_home[BuildSettingInfo].value + + version_file = ctx.actions.declare_file(ctx.label.name + "_version") + + ctx.actions.run_shell( + inputs = [], + outputs = [version_file], + command = """set -euo pipefail + +"{elixir_home}"/bin/iex --version > {version_file} +""".format( + elixir_home = elixir_home, + version_file = version_file.path, + ), + mnemonic = "ELIXIR", + progress_message = "Validating elixir at {}".format(elixir_home), + ) + + return [ + DefaultInfo( + files = depset([version_file]), + ), + ctx.toolchains["@rules_erlang//tools:toolchain_type"].otpinfo, + ElixirInfo( + release_dir = None, + elixir_home = elixir_home, + version_file = version_file, + ), + ] + +elixir_external = rule( + implementation = _elixir_external_impl, + attrs = { + "_elixir_home": attr.label(default = Label("//:elixir_home")), + }, + toolchains = ["@rules_erlang//tools:toolchain_type"], +) diff --git a/bazel/elixir/elixir_toolchain.bzl b/bazel/elixir/elixir_toolchain.bzl new file mode 100644 index 0000000000..444eb110d5 --- /dev/null +++ b/bazel/elixir/elixir_toolchain.bzl @@ -0,0 +1,65 @@ +load( + "@rules_erlang//private:erlang_build.bzl", + "OtpInfo", +) +load( + ":elixir_build.bzl", + "ElixirInfo", +) + +def _impl(ctx): + toolchain_info = platform_common.ToolchainInfo( + otpinfo = ctx.attr.elixir[OtpInfo], + elixirinfo = ctx.attr.elixir[ElixirInfo], + ) + return [toolchain_info] + +elixir_toolchain = rule( + implementation = _impl, + attrs = { + "elixir": attr.label( + mandatory = True, + providers = [OtpInfo, ElixirInfo], + ), + }, + provides = [platform_common.ToolchainInfo], +) + +def _build_info(ctx): + return ctx.toolchains[":toolchain_type"].otpinfo + +def erlang_dirs(ctx): + info = _build_info(ctx) + if info.release_dir != None: + runfiles = ctx.runfiles([ + info.release_dir, + info.version_file, + ]) + else: + runfiles = ctx.runfiles([ + info.version_file, + ]) + return (info.erlang_home, info.release_dir, runfiles) + +def elixir_dirs(ctx, short_path = False): + info = ctx.toolchains[":toolchain_type"].elixirinfo + if info.elixir_home != None: + return (info.elixir_home, ctx.runfiles([info.version_file])) + else: + p = info.release_dir.short_path if short_path else info.release_dir.path + return (p, ctx.runfiles([info.release_dir, info.version_file])) + +def maybe_symlink_erlang(ctx, short_path = False): + info = _build_info(ctx) + release_dir = info.release_dir + if release_dir == None: + return "" + else: + return """mkdir -p $(dirname "{erlang_home}") +ln -sf $PWD/{erlang_release_dir} "{erlang_home}" +ERTS_DIRNAME="$(basename "$(echo "{erlang_home}"/erts-*)")" +ln -sf ../$ERTS_DIRNAME/bin/epmd "{erlang_home}"/bin/epmd +""".format( + erlang_release_dir = release_dir.short_path if short_path else release_dir.path, + erlang_home = info.erlang_home, + ) diff --git a/bazel/elixir/iex_eval.bzl b/bazel/elixir/iex_eval.bzl new file mode 100644 index 0000000000..3b652848ab --- /dev/null +++ b/bazel/elixir/iex_eval.bzl @@ -0,0 +1,70 @@ +load( + ":elixir_toolchain.bzl", + "elixir_dirs", + "erlang_dirs", + "maybe_symlink_erlang", +) + +def _impl(ctx): + outs = [ + ctx.actions.declare_file(f) + for f in ctx.attr.outs + ] + + (erlang_home, _, erlang_runfiles) = erlang_dirs(ctx) + (elixir_home, elixir_runfiles) = elixir_dirs(ctx) + + script = """set -euo pipefail + +{maybe_symlink_erlang} + +if [[ "{elixir_home}" == /* ]]; then + ABS_ELIXIR_HOME="{elixir_home}" +else + ABS_ELIXIR_HOME=$PWD/{elixir_home} +fi + +export PATH="$ABS_ELIXIR_HOME"/bin:"{erlang_home}"/bin:${{PATH}} + +export SRCS="{srcs}" +export OUTS="{outs}" + +${{ABS_ELIXIR_HOME}}/bin/iex --eval "$1" +""".format( + maybe_symlink_erlang = maybe_symlink_erlang(ctx), + erlang_home = erlang_home, + elixir_home = elixir_home, + srcs = ctx.configuration.host_path_separator.join([src.path for src in ctx.files.srcs]), + outs = ctx.configuration.host_path_separator.join([out.path for out in outs]), + ) + + inputs = depset( + direct = ctx.files.srcs, + transitive = [ + erlang_runfiles.files, + elixir_runfiles.files, + ], + ) + + ctx.actions.run_shell( + inputs = inputs, + outputs = outs, + command = script, + arguments = [ctx.attr.expression], + ) + + return [ + DefaultInfo(files = depset(outs)), + ] + +iex_eval = rule( + implementation = _impl, + attrs = { + "srcs": attr.label_list(allow_files = True), + "outs": attr.string_list(), + "expression": attr.string( + mandatory = True, + ), + }, + toolchains = [":toolchain_type"], +) diff --git a/bazel/mix/BUILD.bazel b/bazel/mix/BUILD.bazel new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/bazel/mix/BUILD.bazel diff --git a/bazel/mix/mix_app.bzl b/bazel/mix/mix_app.bzl new file mode 100644 index 0000000000..5a5dea9bb1 --- /dev/null +++ b/bazel/mix/mix_app.bzl @@ -0,0 +1,172 @@ +load( + "@rules_erlang//:erlang_app_info.bzl", + "ErlangAppInfo", + "flat_deps", +) +load( + "@rules_erlang//:util.bzl", + "path_join", +) +load( + "@rules_erlang//private:util.bzl", + "erl_libs_contents", +) +load( + "//bazel/elixir:elixir_toolchain.bzl", + "elixir_dirs", + "erlang_dirs", + "maybe_symlink_erlang", +) + +def find_mix_exs(files): + mix_exs = [ + f + for f in files + if f.basename == "mix.exs" + ] + if len(mix_exs) == 0: + fail("mix.exs is not among the srcs") + return mix_exs[0] + +def _mix_deps_dir_contents(ctx, deps_dir): + files = [] + for (srcs, name) in ctx.attr.dep_srcs.items(): + for src in srcs.files.to_list(): + rp = src.path.removeprefix("external/.elixir.{}/".format(name)) + f = ctx.actions.declare_file(path_join(deps_dir, name, rp)) + ctx.actions.symlink( + output = f, + target_file = src, + ) + files.append(f) + return files + +def _impl(ctx): + mix_exs = find_mix_exs(ctx.files.srcs) + + ebin = ctx.actions.declare_directory("ebin") + home = ctx.actions.declare_directory("mix_home") + build_dir = ctx.actions.declare_directory("_build") + + (erlang_home, _, erlang_runfiles) = erlang_dirs(ctx) + (elixir_home, elixir_runfiles) = elixir_dirs(ctx) + + erl_libs_dir = ctx.label.name + "_apps" + erl_libs_files = erl_libs_contents( + ctx, + headers = True, + dir = erl_libs_dir, + ) + + script = """set -euo pipefail + +{maybe_symlink_erlang} + +if [[ "{elixir_home}" == /* ]]; then + ABS_ELIXIR_HOME="{elixir_home}" +else + ABS_ELIXIR_HOME=$PWD/{elixir_home} +fi +ABS_EBIN_DIR=$PWD/{ebin} + +export PATH="$ABS_ELIXIR_HOME"/bin:"{erlang_home}"/bin:${{PATH}} +export HOME=$PWD/{home} +export MIX_BUILD_PATH=$PWD/{build_dir} +export MIX_ENV=prod +export DEPS_DIR=$(dirname ${{ABS_EBIN_DIR}})/{erl_libs_dir} +export ERL_LIBS=${{DEPS_DIR}} + +cd $(dirname {mix_exs}) + +export ERL_COMPILER_OPTIONS=deterministic +${{ABS_ELIXIR_HOME}}/bin/mix compile --no-deps-check + +if [ -n "$(ls ${{MIX_BUILD_PATH}}/lib/{app_name}/consolidated)" ]; then + cp ${{MIX_BUILD_PATH}}/lib/{app_name}/consolidated/* ${{ABS_EBIN_DIR}} +fi +if [ -n "$(ls ${{MIX_BUILD_PATH}}/lib/{app_name}/ebin)" ]; then + cp ${{MIX_BUILD_PATH}}/lib/{app_name}/ebin/* ${{ABS_EBIN_DIR}} +fi + +# remove symlinks from the _build directory since it +# is not used, and bazel does not allow them +find ${{MIX_BUILD_PATH}} -type l -delete +""".format( + maybe_symlink_erlang = maybe_symlink_erlang(ctx), + package = ctx.label.package, + erlang_home = erlang_home, + elixir_home = elixir_home, + home = home.path, + build_dir = build_dir.path, + erl_libs_dir = erl_libs_dir, + mix_exs = mix_exs.path, + app_name = ctx.attr.app_name, + ebin = ebin.path, + ) + + inputs = depset( + direct = ctx.files.srcs, + transitive = [ + erlang_runfiles.files, + elixir_runfiles.files, + depset(erl_libs_files), + ], + ) + + ctx.actions.run_shell( + inputs = inputs, + outputs = [ebin, home, build_dir], + command = script, + mnemonic = "MIX", + ) + + deps = flat_deps(ctx.attr.deps) + + runfiles = ctx.runfiles([ebin]) + runfiles = runfiles.merge_all( + [ + erlang_runfiles, + elixir_runfiles, + ] + [ + dep[DefaultInfo].default_runfiles + for dep in deps + ], + ) + + return [ + DefaultInfo( + files = depset([ebin]), + runfiles = runfiles, + ), + ErlangAppInfo( + app_name = ctx.attr.app_name, + include = [], + beam = [ebin], + priv = [], + license_files = ctx.files.license_files, + deps = deps, + ), + ] + +mix_app = rule( + implementation = _impl, + attrs = { + "app_name": attr.string( + mandatory = True, + ), + "srcs": attr.label_list( + mandatory = True, + allow_files = True, + ), + "license_files": attr.label_list( + allow_files = True, + ), + "deps": attr.label_list( + providers = [ErlangAppInfo], + ), + }, + toolchains = [ + "//bazel/elixir:toolchain_type", + ], + provides = [ErlangAppInfo], +) diff --git a/bazel/platforms/BUILD.bazel b/bazel/platforms/BUILD.bazel new file mode 100644 index 0000000000..c3bf69b577 --- /dev/null +++ b/bazel/platforms/BUILD.bazel @@ -0,0 +1,72 @@ +package( + default_visibility = ["//visibility:public"], +) + +constraint_value( + name = "erlang_git_master", + constraint_setting = "@rules_erlang//platforms:erlang_major_version", +) + +constraint_setting( + name = "elixir_version", +) + +constraint_value( + name = "elixir_external", + constraint_setting = ":elixir_version", +) + +constraint_value( + name = "elixir_1_10", + constraint_setting = ":elixir_version", +) + +constraint_value( + name = "elixir_1_13", + constraint_setting = ":elixir_version", +) + +platform( + name = "erlang_external_platform", + constraint_values = [ + "@rules_erlang//platforms:erlang_external", + ":elixir_external", + ], + parents = ["@rbe//config:platform"], +) + +platform( + name = "erlang_23_platform", + constraint_values = [ + "@rules_erlang//platforms:erlang_23", + ":elixir_1_10", + ], + parents = ["@rbe//config:platform"], +) + +platform( + name = "erlang_24_platform", + constraint_values = [ + "@rules_erlang//platforms:erlang_24", + ":elixir_1_13", + ], + parents = ["@rbe//config:platform"], +) + +platform( + name = "erlang_25_platform", + constraint_values = [ + "@rules_erlang//platforms:erlang_25", + ":elixir_1_13", + ], + parents = ["@rbe//config:platform"], +) + +platform( + name = "erlang_git_master_platform", + constraint_values = [ + ":erlang_git_master", + ":elixir_1_13", + ], + parents = ["@rbe//config:platform"], +) diff --git a/bazel/toolchains/BUILD.bazel b/bazel/toolchains/BUILD.bazel new file mode 100644 index 0000000000..49b8bf9512 --- /dev/null +++ b/bazel/toolchains/BUILD.bazel @@ -0,0 +1,50 @@ +load( + "@rules_erlang//tools:erlang.bzl", + "erlang_toolchain_external", + "erlang_toolchain_from_github_release", + "erlang_toolchain_from_http_archive", +) +load( + "//bazel/elixir:elixir.bzl", + "elixir_toolchain_external", + "elixir_toolchain_from_github_release", +) + +erlang_toolchain_external() + +erlang_toolchain_from_github_release( + name_suffix = "_23", + sha256 = "35123f366ded534775a05db8ad6c06c20519ae228af1b5952132b10845621f21", + version = "23.3.4.14", +) + +erlang_toolchain_from_github_release( + name_suffix = "_24", + sha256 = "76fcca5ba6f11eb9caac32bf053badc46b5d66f867150eef077f4f0d7944ecd7", + version = "24.3.4", +) + +erlang_toolchain_from_github_release( + name_suffix = "_25", + sha256 = "2d7678c9bc6fcf3a1242c4d1c3864855d85e73ade792cd80adb8a9f379996711", + version = "25.0", +) + +erlang_toolchain_from_http_archive( + erlang_constraint = "//bazel/platforms:erlang_git_master", + name_suffix = "_git_master", + strip_prefix = "otp-master", + url = "https://github.com/erlang/otp/archive/refs/heads/master.tar.gz", +) + +elixir_toolchain_external() + +elixir_toolchain_from_github_release( + name_suffix = "_1_10", + version = "1.10.4", +) + +elixir_toolchain_from_github_release( + name_suffix = "_1_13", + version = "1.13.4", +) diff --git a/deps/amqp10_client/BUILD.bazel b/deps/amqp10_client/BUILD.bazel index 508be45768..323bdb9879 100644 --- a/deps/amqp10_client/BUILD.bazel +++ b/deps/amqp10_client/BUILD.bazel @@ -1,10 +1,9 @@ load("@rules_erlang//:xref.bzl", "xref") load("@rules_erlang//:dialyze.bzl", "dialyze", "plt") -load("//:rabbitmq_home.bzl", "rabbitmq_home") -load("//:rabbitmq_run.bzl", "rabbitmq_run") load( "//:rabbitmq.bzl", "assert_suites", + "broker_for_integration_suites", "rabbitmq_app", "rabbitmq_integration_suite", "rabbitmq_suite", @@ -60,7 +59,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -71,20 +70,10 @@ plt( dialyze( plt = ":base_plt", - tags = ["dialyze"], ) -rabbitmq_home( - name = "broker-for-tests-home", - plugins = [ - "//deps/rabbit:erlang_app", - "//deps/rabbitmq_amqp1_0:erlang_app", - ], -) - -rabbitmq_run( - name = "rabbitmq-for-tests-run", - home = ":broker-for-tests-home", +broker_for_integration_suites( + extra_plugins = ["//deps/rabbitmq_amqp1_0:erlang_app"], ) PACKAGE = "deps/amqp10_client" diff --git a/deps/amqp10_common/BUILD.bazel b/deps/amqp10_common/BUILD.bazel index 4a3cdeda1d..4fe84a7947 100644 --- a/deps/amqp10_common/BUILD.bazel +++ b/deps/amqp10_common/BUILD.bazel @@ -1,14 +1,9 @@ -load("@rules_erlang//:app_file.bzl", "app_file") -load("@rules_erlang//:erlang_app_info.bzl", "erlang_app_info") -load("@rules_erlang//:erlc.bzl", "erlc") load("@rules_erlang//:xref.bzl", "xref") load("@rules_erlang//:dialyze.bzl", "dialyze") load( "//:rabbitmq.bzl", - "APP_VERSION", - "RABBITMQ_ERLC_OPTS", - "RABBITMQ_TEST_ERLC_OPTS", "assert_suites", + "rabbitmq_app", "rabbitmq_suite", ) @@ -46,73 +41,38 @@ genrule( tools = [":codegen"], ) -app_file( - name = "app_file", - app_description = "Modules shared by rabbitmq-amqp1.0 and rabbitmq-amqp1.0-client", - app_extra = """%% Hex.pm package informations. - {licenses, ["MPL-2.0"]}, - {links, [ - {"Website", "https://www.rabbitmq.com/"}, - {"GitHub", "https://github.com/rabbitmq/rabbitmq-server/deps/amqp10_common"} - ]}, - {build_tools, ["make", "rebar3"]}, - {files, [ - "erlang.mk", - "git-revisions.txt", - "include", - "LICENSE*", - "Makefile", - "rabbitmq-components.mk", - "README", - "README.md", - "mk" - ]} -""", - app_name = "amqp10_common", - app_version = APP_VERSION, - modules = [":beam_files"], -) +APP_EXTRA_KEYS = """%% Hex.pm package informations. + {licenses, ["MPL-2.0"]}, + {links, [ + {"Website", "https://www.rabbitmq.com/"}, + {"GitHub", "https://github.com/rabbitmq/rabbitmq-server/deps/amqp10_common"} + ]}, + {build_tools, ["make", "rebar3"]}, + {files, [ + "erlang.mk", + "git-revisions.txt", + "include", + "LICENSE*", + "Makefile", + "rabbitmq-components.mk", + "README", + "README.md", + "mk" + ]} +""" -erlc( - name = "beam_files", - srcs = ["src/amqp10_framing0.erl"] + glob(["src/*.erl"]), - hdrs = ["include/amqp10_framing.hrl"] + glob(["include/*.hrl"]), - dest = "ebin", - erlc_opts = RABBITMQ_ERLC_OPTS, -) - -erlang_app_info( - name = "erlang_app", - hdrs = ["include/amqp10_framing.hrl"] + glob(["include/*.hrl"]), - app = ":app_file", - app_name = "amqp10_common", - beam = [":beam_files"], - visibility = ["//visibility:public"], -) - -erlc( - name = "test_beam_files", - srcs = ["src/amqp10_framing0.erl"] + glob(["src/*.erl"]), - hdrs = ["include/amqp10_framing.hrl"] + glob(["include/*.hrl"]), - dest = "test", - erlc_opts = RABBITMQ_TEST_ERLC_OPTS, -) - -erlang_app_info( - name = "test_erlang_app", - testonly = True, - hdrs = ["include/amqp10_framing.hrl"] + glob(["include/*.hrl"]), - app = ":app_file", +rabbitmq_app( + app_description = "Modules shared by rabbitmq-amqp1.0 and rabbitmq-amqp1.0-client", + app_extra_keys = APP_EXTRA_KEYS, app_name = "amqp10_common", - beam = [":test_beam_files"], - visibility = ["//visibility:public"], + extra_hdrs = ["include/amqp10_framing.hrl"], + extra_srcs = ["src/amqp10_framing0.erl"], ) -xref(tags = ["xref"]) +xref() dialyze( plt = "//:base_plt", - tags = ["dialyze"], ) suites = [ diff --git a/deps/amqp_client/BUILD.bazel b/deps/amqp_client/BUILD.bazel index 7f3316b7fa..91d6d2b327 100644 --- a/deps/amqp_client/BUILD.bazel +++ b/deps/amqp_client/BUILD.bazel @@ -61,7 +61,6 @@ xref( additional_libs = [ "@ranch//:erlang_app", ], - tags = ["xref"], ) plt( @@ -73,7 +72,6 @@ plt( dialyze( plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) diff --git a/deps/rabbit/BUILD.bazel b/deps/rabbit/BUILD.bazel index 13c71d2e0b..cb9807d362 100644 --- a/deps/rabbit/BUILD.bazel +++ b/deps/rabbit/BUILD.bazel @@ -1,4 +1,3 @@ -load("@rules_erlang//:erlc.bzl", "erlc") load("@rules_erlang//:xref.bzl", "xref") load("@rules_erlang//:dialyze.bzl", "dialyze", "plt") load("//:rabbitmq_home.bzl", "rabbitmq_home") @@ -6,12 +5,11 @@ load("//:rabbitmq_run.bzl", "rabbitmq_run") load( "//:rabbitmq.bzl", "RABBITMQ_DIALYZER_OPTS", - "RABBITMQ_ERLC_OPTS", - "RABBITMQ_TEST_ERLC_OPTS", "assert_suites", "rabbitmq_app", "rabbitmq_integration_suite", "rabbitmq_suite", + "rabbitmq_test_helper", ) load(":bats.bzl", "bats") @@ -206,7 +204,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt_apps = [ "mnesia", @@ -224,7 +222,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) @@ -254,52 +251,40 @@ rabbitmq_run( home = ":broker-for-tests-home", ) -erlc( +rabbitmq_test_helper( name = "quorum_queue_utils", - testonly = True, srcs = [ "test/quorum_queue_utils.erl", ], - dest = "test", - erlc_opts = RABBITMQ_TEST_ERLC_OPTS, ) -erlc( +rabbitmq_test_helper( name = "rabbit_ha_test_consumer", - testonly = True, srcs = [ "test/rabbit_ha_test_consumer.erl", ], - dest = "test", - erlc_opts = RABBITMQ_TEST_ERLC_OPTS, deps = [ "//deps/amqp_client:erlang_app", "//deps/rabbit_common:erlang_app", ], ) -erlc( +rabbitmq_test_helper( name = "rabbit_ha_test_producer", - testonly = True, srcs = [ "test/rabbit_ha_test_producer.erl", ], - dest = "test", - erlc_opts = RABBITMQ_TEST_ERLC_OPTS, deps = [ "//deps/amqp_client:erlang_app", "//deps/rabbit_common:erlang_app", ], ) -erlc( +rabbitmq_test_helper( name = "test_util", - testonly = True, srcs = [ "test/test_util.erl", ], - dest = "test", - erlc_opts = RABBITMQ_TEST_ERLC_OPTS, ) PACKAGE = "deps/rabbit" diff --git a/deps/rabbit/apps/rabbitmq_prelaunch/BUILD.bazel b/deps/rabbit/apps/rabbitmq_prelaunch/BUILD.bazel index fdc256395a..a482b63562 100644 --- a/deps/rabbit/apps/rabbitmq_prelaunch/BUILD.bazel +++ b/deps/rabbit/apps/rabbitmq_prelaunch/BUILD.bazel @@ -32,7 +32,6 @@ xref( "@systemd//:erlang_app", "@osiris//:erlang_app", ], - tags = ["xref"], ) plt( @@ -42,7 +41,6 @@ plt( dialyze( plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) diff --git a/deps/rabbit/test/feature_flags_SUITE_data/my_plugin/BUILD.bazel b/deps/rabbit/test/feature_flags_SUITE_data/my_plugin/BUILD.bazel index 5e05264f08..8b81edc72e 100644 --- a/deps/rabbit/test/feature_flags_SUITE_data/my_plugin/BUILD.bazel +++ b/deps/rabbit/test/feature_flags_SUITE_data/my_plugin/BUILD.bazel @@ -8,7 +8,7 @@ DEPS = [ erlang_app( app_description = "Plugin to test feature flags", - app_extra = BROKER_VERSION_REQUIREMENTS_ANY, + app_extra_keys = BROKER_VERSION_REQUIREMENTS_ANY, app_name = "my_plugin", app_version = "1.0.0", deps = DEPS, diff --git a/deps/rabbit_common/BUILD.bazel b/deps/rabbit_common/BUILD.bazel index 089231b2b2..50142d5592 100644 --- a/deps/rabbit_common/BUILD.bazel +++ b/deps/rabbit_common/BUILD.bazel @@ -1,14 +1,9 @@ -load("@rules_erlang//:app_file.bzl", "app_file") -load("@rules_erlang//:erlang_app_info.bzl", "erlang_app_info") -load("@rules_erlang//:erlc.bzl", "erlc") load("@rules_erlang//:xref.bzl", "xref") load("@rules_erlang//:dialyze.bzl", "dialyze", "plt") load( "//:rabbitmq.bzl", - "APP_VERSION", - "RABBITMQ_ERLC_OPTS", - "RABBITMQ_TEST_ERLC_OPTS", "assert_suites", + "rabbitmq_app", "rabbitmq_suite", ) @@ -56,8 +51,6 @@ genrule( tools = [":codegen"], ) -DEPS = [] - RUNTIME_DEPS = [ "@jsx//:erlang_app", "@recon//:erlang_app", @@ -98,78 +91,25 @@ EXTRA_APPS = [ "xmerl", ] -HDRS = glob(["include/*.hrl"]) + ["include/rabbit_framing.hrl"] - -app_file( - name = "app_file", +rabbitmq_app( app_description = "Modules shared by rabbitmq-server and rabbitmq-erlang-client", - app_extra = APP_EXTRA_KEYS, + app_extra_keys = APP_EXTRA_KEYS, app_name = APP_NAME, - app_version = APP_VERSION, extra_apps = EXTRA_APPS, - modules = [":beam_files"], - deps = DEPS + RUNTIME_DEPS, -) - -erlc( - name = "beam_files", - srcs = glob( - ["src/*.erl"], - ) + [ - "src/rabbit_framing_amqp_0_8.erl", - "src/rabbit_framing_amqp_0_9_1.erl", - ], - hdrs = HDRS, - dest = "ebin", - erlc_opts = RABBITMQ_ERLC_OPTS, - deps = DEPS, -) - -erlang_app_info( - name = "erlang_app", - hdrs = HDRS, - app = ":app_file", - app_name = APP_NAME, - beam = [ - ":beam_files", + extra_hdrs = [ + "include/rabbit_framing.hrl", ], - visibility = ["//visibility:public"], - deps = DEPS + RUNTIME_DEPS, -) - -erlc( - name = "test_beam_files", - testonly = True, - srcs = glob( - ["src/*.erl"], - ) + [ + extra_srcs = [ "src/rabbit_framing_amqp_0_8.erl", "src/rabbit_framing_amqp_0_9_1.erl", ], - hdrs = HDRS, - dest = "src", - erlc_opts = RABBITMQ_TEST_ERLC_OPTS, - deps = DEPS, -) - -erlang_app_info( - name = "test_erlang_app", - testonly = True, - hdrs = HDRS, - app = ":app_file", - app_name = APP_NAME, - beam = [ - ":test_beam_files", - ], - visibility = ["//:__subpackages__"], - deps = DEPS + RUNTIME_DEPS, + runtime_deps = RUNTIME_DEPS, ) xref( additional_libs = [ "@ranch//:erlang_app", ], - tags = ["xref"], ) plt( @@ -184,7 +124,6 @@ plt( dialyze( plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) diff --git a/deps/rabbitmq_amqp1_0/BUILD.bazel b/deps/rabbitmq_amqp1_0/BUILD.bazel index c0f1019025..b855aa7a57 100644 --- a/deps/rabbitmq_amqp1_0/BUILD.bazel +++ b/deps/rabbitmq_amqp1_0/BUILD.bazel @@ -47,7 +47,6 @@ rabbitmq_app( xref( size = "small", - tags = ["xref"], ) plt( @@ -61,7 +60,6 @@ dialyze( size = "medium", dialyzer_opts = RABBITMQ_DIALYZER_OPTS + ["-Wno_undefined_callbacks"], plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) diff --git a/deps/rabbitmq_auth_backend_cache/BUILD.bazel b/deps/rabbitmq_auth_backend_cache/BUILD.bazel index 06a9762440..a44b1e4b55 100644 --- a/deps/rabbitmq_auth_backend_cache/BUILD.bazel +++ b/deps/rabbitmq_auth_backend_cache/BUILD.bazel @@ -43,7 +43,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -53,7 +53,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) diff --git a/deps/rabbitmq_auth_backend_http/BUILD.bazel b/deps/rabbitmq_auth_backend_http/BUILD.bazel index c3ff31a62b..d46de91e40 100644 --- a/deps/rabbitmq_auth_backend_http/BUILD.bazel +++ b/deps/rabbitmq_auth_backend_http/BUILD.bazel @@ -49,7 +49,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -61,7 +61,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) diff --git a/deps/rabbitmq_auth_backend_ldap/BUILD.bazel b/deps/rabbitmq_auth_backend_ldap/BUILD.bazel index e3729bfda7..e4574b8064 100644 --- a/deps/rabbitmq_auth_backend_ldap/BUILD.bazel +++ b/deps/rabbitmq_auth_backend_ldap/BUILD.bazel @@ -64,7 +64,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -76,7 +76,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) diff --git a/deps/rabbitmq_auth_backend_oauth2/BUILD.bazel b/deps/rabbitmq_auth_backend_oauth2/BUILD.bazel index 2b3e2e86e7..1abc5455c5 100644 --- a/deps/rabbitmq_auth_backend_oauth2/BUILD.bazel +++ b/deps/rabbitmq_auth_backend_oauth2/BUILD.bazel @@ -1,4 +1,3 @@ -load("@rules_erlang//:erlc.bzl", "erlc") load("@rules_erlang//:xref.bzl", "xref") load("@rules_erlang//:dialyze.bzl", "dialyze", "plt") load( @@ -10,6 +9,7 @@ load( "rabbitmq_app", "rabbitmq_integration_suite", "rabbitmq_suite", + "rabbitmq_test_helper", "without", ) @@ -40,7 +40,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -53,20 +53,16 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS + ["-Wno_undefined_callbacks"], plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) broker_for_integration_suites() -erlc( +rabbitmq_test_helper( name = "rabbit_auth_backend_oauth2_test_util", - testonly = True, srcs = [ "test/rabbit_auth_backend_oauth2_test_util.erl", ], - dest = "test", - erlc_opts = RABBITMQ_TEST_ERLC_OPTS, ) PACKAGE = "deps/rabbitmq_auth_backend_oauth2" diff --git a/deps/rabbitmq_auth_mechanism_ssl/BUILD.bazel b/deps/rabbitmq_auth_mechanism_ssl/BUILD.bazel index 38186fd431..00d1c84ab2 100644 --- a/deps/rabbitmq_auth_mechanism_ssl/BUILD.bazel +++ b/deps/rabbitmq_auth_mechanism_ssl/BUILD.bazel @@ -35,7 +35,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -45,5 +45,4 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], ) diff --git a/deps/rabbitmq_aws/BUILD.bazel b/deps/rabbitmq_aws/BUILD.bazel index eb42eb8fab..040c068af1 100644 --- a/deps/rabbitmq_aws/BUILD.bazel +++ b/deps/rabbitmq_aws/BUILD.bazel @@ -41,7 +41,6 @@ xref( "@ranch//:erlang_app", "@recon//:erlang_app", ], - tags = ["xref"], ) plt( @@ -52,7 +51,6 @@ plt( dialyze( plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) diff --git a/deps/rabbitmq_cli/BUILD.bazel b/deps/rabbitmq_cli/BUILD.bazel index fea45d28ff..c7dfc38aa6 100644 --- a/deps/rabbitmq_cli/BUILD.bazel +++ b/deps/rabbitmq_cli/BUILD.bazel @@ -1,27 +1,26 @@ load(":rabbitmqctl.bzl", "rabbitmqctl") load(":rabbitmqctl_test.bzl", "rabbitmqctl_test") -load(":elixir.bzl", "elixir") load("//:rabbitmq_home.bzl", "rabbitmq_home") load("//:rabbitmq_run.bzl", "rabbitmq_run") load("//:rabbitmq.bzl", "STARTS_BACKGROUND_BROKER_TAG") -# This rule simply exposes elixir as a runtime lib for tests in erlang -elixir( - name = "elixir_app", - visibility = ["//visibility:public"], -) - # Note: All the various rabbitmq-* scripts are just copies of rabbitmqctl rabbitmqctl( name = "rabbitmqctl", - srcs = glob([ + srcs = [ "mix.exs", "config/config.exs", + ] + glob([ "lib/**/*.ex", ]), visibility = ["//visibility:public"], deps = [ "//deps/rabbit_common:erlang_app", + "@csv//:elixir_app", + "@hex//:elixir_app", + "@json//:elixir_app", + "@observer_cli//:erlang_app", + "@stdout_formatter//:erlang_app", ], ) @@ -46,9 +45,10 @@ rabbitmq_run( rabbitmqctl_test( name = "rabbitmqctl_tests", size = "large", - srcs = glob([ + srcs = [ "mix.exs", "config/config.exs", + ] + glob([ "lib/**/*.ex", "test/**/*.exs", ]), @@ -60,5 +60,13 @@ rabbitmqctl_test( "//deps/amqp_client:erlang_app", "//deps/rabbit:erlang_app", "//deps/rabbit_common:erlang_app", + "@amqp//:elixir_app", + "@csv//:elixir_app", + "@hex//:elixir_app", + "@json//:elixir_app", + "@observer_cli//:erlang_app", + "@stdout_formatter//:erlang_app", + "@temp//:elixir_app", + "@x509//:elixir_app", ], ) diff --git a/deps/rabbitmq_cli/elixir.bzl b/deps/rabbitmq_cli/elixir.bzl deleted file mode 100644 index 4ea13f7c5b..0000000000 --- a/deps/rabbitmq_cli/elixir.bzl +++ /dev/null @@ -1,68 +0,0 @@ -load("@rules_erlang//:erlang_home.bzl", "ErlangHomeProvider", "ErlangVersionProvider") -load("@rules_erlang//:erlang_app_info.bzl", "ErlangAppInfo") -load("@rules_erlang//:util.bzl", "path_join", "windows_path") -load("//:elixir_home.bzl", "ElixirHomeProvider") - -def _impl(ctx): - erlang_version = ctx.attr._erlang_version[ErlangVersionProvider].version - erlang_home = ctx.attr._erlang_home[ErlangHomeProvider].path - elixir_home = ctx.attr._elixir_home[ElixirHomeProvider].path - - ebin = ctx.actions.declare_directory(path_join(ctx.attr.name, "ebin")) - - if not ctx.attr.is_windows: - ctx.actions.run( - inputs = [], - outputs = [ebin], - executable = "cp", - arguments = [ - "-R", - "{}/lib/elixir/ebin".format(elixir_home), - ebin.dirname, - ], - ) - else: - # robocopy exits non-zero when new files are copied, so we can't - # just ctx.actions.run robocopy - ctx.actions.run_shell( - inputs = [], - outputs = [ebin], - command = "cp -R \"{elixir_home}\"/lib/elixir/ebin {ebin}".format( - elixir_home = elixir_home, - ebin = ebin.dirname, - ), - ) - - return [ - DefaultInfo( - files = depset([ebin]), - runfiles = ctx.runfiles([ebin]), - ), - ErlangAppInfo( - app_name = ctx.attr.name, - erlang_version = erlang_version, - include = [], - beam = [ebin], - priv = [], - deps = [], - ), - ] - -elixir_private = rule( - implementation = _impl, - attrs = { - "is_windows": attr.bool(mandatory = True), - "_erlang_version": attr.label(default = Label("@rules_erlang//:erlang_version")), - "_erlang_home": attr.label(default = Label("@rules_erlang//:erlang_home")), - "_elixir_home": attr.label(default = Label("//:elixir_home")), - }, -) - -def elixir(**kwargs): - elixir_private( - is_windows = select({ - "@bazel_tools//src/conditions:host_windows": True, - "//conditions:default": False, - }), - **kwargs - ) diff --git a/deps/rabbitmq_cli/rabbitmqctl.bzl b/deps/rabbitmq_cli/rabbitmqctl.bzl index f7467a3b33..242023dd4e 100644 --- a/deps/rabbitmq_cli/rabbitmqctl.bzl +++ b/deps/rabbitmq_cli/rabbitmqctl.bzl @@ -1,4 +1,3 @@ -load("@rules_erlang//:erlang_home.bzl", "ErlangHomeProvider", "ErlangVersionProvider") load( "@rules_erlang//:erlang_app_info.bzl", "ErlangAppInfo", @@ -6,138 +5,104 @@ load( ) load( "@rules_erlang//:util.bzl", - "BEGINS_WITH_FUN", - "QUERY_ERL_VERSION", "path_join", ) -load("//:elixir_home.bzl", "ElixirHomeProvider") - -MIX_DEPS_DIR = "deps" +load( + "@rules_erlang//private:util.bzl", + "erl_libs_contents", +) +load( + "//bazel/mix:mix_app.bzl", + "find_mix_exs", +) +load( + "//bazel/elixir:elixir_toolchain.bzl", + "elixir_dirs", + "erlang_dirs", + "maybe_symlink_erlang", +) def _impl(ctx): - erlang_version = ctx.attr._erlang_version[ErlangVersionProvider].version - erlang_home = ctx.attr._erlang_home[ErlangHomeProvider].path - elixir_home = ctx.attr._elixir_home[ElixirHomeProvider].path + mix_exs = find_mix_exs(ctx.files.srcs) - escript = ctx.actions.declare_file(path_join("escript", "rabbitmqctl")) + escript = ctx.actions.declare_file(path_join("escript", ctx.label.name)) ebin = ctx.actions.declare_directory("ebin") + home = ctx.actions.declare_directory("mix_home") + build_dir = ctx.actions.declare_directory("_build") + + (erlang_home, _, erlang_runfiles) = erlang_dirs(ctx) + (elixir_home, elixir_runfiles) = elixir_dirs(ctx) - copy_compiled_deps_commands = [] - copy_compiled_deps_commands.append("mkdir ${{MIX_INVOCATION_DIR}}/{}".format(MIX_DEPS_DIR)) - for dep in ctx.attr.deps: - lib_info = dep[ErlangAppInfo] - if lib_info.erlang_version != erlang_version: - fail("Mismatched erlang versions", erlang_version, lib_info.erlang_version) - - dest_dir = path_join("${MIX_INVOCATION_DIR}", MIX_DEPS_DIR, lib_info.app_name) - copy_compiled_deps_commands.append( - "mkdir {}".format(dest_dir), - ) - copy_compiled_deps_commands.append( - "mkdir {}".format(path_join(dest_dir, "include")), - ) - copy_compiled_deps_commands.append( - "mkdir {}".format(path_join(dest_dir, "ebin")), - ) - for hdr in lib_info.include: - copy_compiled_deps_commands.append( - "cp ${{PWD}}/{source} {target}".format( - source = hdr.path, - target = path_join(dest_dir, "include", hdr.basename), - ), - ) - for beam in lib_info.beam: - copy_compiled_deps_commands.append( - "cp ${{PWD}}/{source} {target}".format( - source = beam.path, - target = path_join(dest_dir, "ebin", beam.basename), - ), - ) - - mix_invocation_dir = ctx.actions.declare_directory("{}_mix".format(ctx.label.name)) - - package_dir = ctx.label.package - if ctx.label.workspace_root != "": - package_dir = path_join(ctx.label.workspace_root, package_dir) + erl_libs_dir = ctx.label.name + "_apps" + erl_libs_files = erl_libs_contents( + ctx, + headers = True, + dir = erl_libs_dir, + ) + + package_dir = path_join(ctx.label.workspace_root, ctx.label.package) script = """set -euo pipefail export LANG="en_US.UTF-8" export LC_ALL="en_US.UTF-8" -export PATH="{elixir_home}"/bin:"{erlang_home}"/bin:${{PATH}} - -MIX_INVOCATION_DIR="{mix_invocation_dir}" +{maybe_symlink_erlang} -cp -R ${{PWD}}/{package_dir}/config ${{MIX_INVOCATION_DIR}}/config -# cp -R ${{PWD}}/{package_dir}/include ${{MIX_INVOCATION_DIR}}/include # rabbitmq_cli's include directory is empty -cp -R ${{PWD}}/{package_dir}/lib ${{MIX_INVOCATION_DIR}}/lib -cp ${{PWD}}/{package_dir}/mix.exs ${{MIX_INVOCATION_DIR}}/mix.exs - -{copy_compiled_deps_command} - -cd ${{MIX_INVOCATION_DIR}} -export HOME=${{PWD}} - -{begins_with_fun} -V=$("{erlang_home}"/bin/{query_erlang_version}) -if ! beginswith "{erlang_version}" "$V"; then - echo "Erlang version mismatch (Expected {erlang_version}, found $V)" - exit 1 +if [[ "{elixir_home}" == /* ]]; then + ABS_ELIXIR_HOME="{elixir_home}" +else + ABS_ELIXIR_HOME=$PWD/{elixir_home} fi +ABS_EBIN_DIR=$PWD/{ebin} +ABS_ESCRIPT_PATH=$PWD/{escript_path} -export DEPS_DIR={mix_deps_dir} +export PATH="$ABS_ELIXIR_HOME"/bin:"{erlang_home}"/bin:${{PATH}} +export HOME=$PWD/{home} +export MIX_BUILD_PATH=$PWD/{build_dir} +export MIX_ENV=prod +export DEPS_DIR=$(dirname ${{ABS_EBIN_DIR}})/{erl_libs_dir} +export ERL_LIBS=${{DEPS_DIR}} -# mix can error on windows regarding permissions for a symlink at this path -# deps/rabbitmq_cli/rabbitmqctl_mix/_build/dev/lib/rabbit_common/ebin -# so instead we'll try skip that -mkdir -p _build/dev/lib/rabbit_common -mkdir _build/dev/lib/rabbit_common/include -cp ${{DEPS_DIR}}/rabbit_common/include/* \\ - _build/dev/lib/rabbit_common/include -mkdir _build/dev/lib/rabbit_common/ebin -cp ${{DEPS_DIR}}/rabbit_common/ebin/* \\ - _build/dev/lib/rabbit_common/ebin +cd $(dirname {mix_exs}) export ERL_COMPILER_OPTIONS=deterministic -"{elixir_home}"/bin/mix local.hex --force -"{elixir_home}"/bin/mix local.rebar --force -"{elixir_home}"/bin/mix make_all_in_src_archive - -cd ${{OLDPWD}} -cp ${{MIX_INVOCATION_DIR}}/escript/rabbitmqctl {escript_path} - -mkdir -p {ebin_dir} -mv ${{MIX_INVOCATION_DIR}}/_build/dev/lib/rabbitmqctl/ebin/* {ebin_dir} -mv ${{MIX_INVOCATION_DIR}}/_build/dev/lib/rabbitmqctl/consolidated/* {ebin_dir} - -rm -dR ${{MIX_INVOCATION_DIR}} -mkdir ${{MIX_INVOCATION_DIR}} -touch ${{MIX_INVOCATION_DIR}}/placeholder - """.format( - begins_with_fun = BEGINS_WITH_FUN, - query_erlang_version = QUERY_ERL_VERSION, - erlang_version = erlang_version, +"${{ABS_ELIXIR_HOME}}"/bin/mix compile --no-deps-check +"${{ABS_ELIXIR_HOME}}"/bin/mix escript.build --no-deps-check + +mv escript/rabbitmqctl ${{ABS_ESCRIPT_PATH}} +if [ -n "$(ls ${{MIX_BUILD_PATH}}/lib/{app_name}/consolidated)" ]; then + cp ${{MIX_BUILD_PATH}}/lib/{app_name}/consolidated/* ${{ABS_EBIN_DIR}} +fi +if [ -n "$(ls ${{MIX_BUILD_PATH}}/lib/{app_name}/ebin)" ]; then + cp ${{MIX_BUILD_PATH}}/lib/{app_name}/ebin/* ${{ABS_EBIN_DIR}} +fi +""".format( + maybe_symlink_erlang = maybe_symlink_erlang(ctx), erlang_home = erlang_home, elixir_home = elixir_home, - mix_invocation_dir = mix_invocation_dir.path, + home = home.path, + build_dir = build_dir.path, package_dir = package_dir, - copy_compiled_deps_command = "\n".join(copy_compiled_deps_commands), - mix_deps_dir = MIX_DEPS_DIR, + erl_libs_dir = erl_libs_dir, + mix_exs = mix_exs.path, + app_name = "rabbitmqctl", escript_path = escript.path, - ebin_dir = ebin.path, + ebin = ebin.path, ) - inputs = [] - inputs.extend(ctx.files.srcs) - for dep in ctx.attr.deps: - lib_info = dep[ErlangAppInfo] - inputs.extend(lib_info.include) - inputs.extend(lib_info.beam) + inputs = depset( + direct = ctx.files.srcs, + transitive = [ + erlang_runfiles.files, + elixir_runfiles.files, + depset(erl_libs_files), + ], + ) ctx.actions.run_shell( inputs = inputs, - outputs = [escript, ebin, mix_invocation_dir], + outputs = [escript, ebin, home, build_dir], command = script, mnemonic = "MIX", ) @@ -145,8 +110,15 @@ touch ${{MIX_INVOCATION_DIR}}/placeholder deps = flat_deps(ctx.attr.deps) runfiles = ctx.runfiles([ebin]) - for dep in deps: - runfiles = runfiles.merge(dep[DefaultInfo].default_runfiles) + runfiles = runfiles.merge_all( + [ + erlang_runfiles, + elixir_runfiles, + ] + [ + dep[DefaultInfo].default_runfiles + for dep in deps + ], + ) return [ DefaultInfo( @@ -156,7 +128,6 @@ touch ${{MIX_INVOCATION_DIR}}/placeholder ), ErlangAppInfo( app_name = ctx.attr.name, - erlang_version = erlang_version, include = [], beam = [ebin], priv = [], @@ -167,13 +138,21 @@ touch ${{MIX_INVOCATION_DIR}}/placeholder rabbitmqctl_private = rule( implementation = _impl, attrs = { - "is_windows": attr.bool(mandatory = True), - "srcs": attr.label_list(allow_files = True), - "deps": attr.label_list(providers = [ErlangAppInfo]), - "_erlang_version": attr.label(default = Label("@rules_erlang//:erlang_version")), - "_erlang_home": attr.label(default = Label("@rules_erlang//:erlang_home")), - "_elixir_home": attr.label(default = Label("//:elixir_home")), + "is_windows": attr.bool( + mandatory = True, + ), + "srcs": attr.label_list( + mandatory = True, + allow_files = True, + ), + "deps": attr.label_list( + providers = [ErlangAppInfo], + ), }, + toolchains = [ + "//bazel/elixir:toolchain_type", + ], + provides = [ErlangAppInfo], executable = True, ) diff --git a/deps/rabbitmq_cli/rabbitmqctl_test.bzl b/deps/rabbitmq_cli/rabbitmqctl_test.bzl index da47c7905e..9165b2fe55 100644 --- a/deps/rabbitmq_cli/rabbitmqctl_test.bzl +++ b/deps/rabbitmq_cli/rabbitmqctl_test.bzl @@ -1,16 +1,9 @@ load( - "@rules_erlang//:erlang_home.bzl", - "ErlangHomeProvider", - "ErlangVersionProvider", -) -load( "@rules_erlang//:erlang_app_info.bzl", "ErlangAppInfo", ) load( "@rules_erlang//:util.bzl", - "BEGINS_WITH_FUN", - "QUERY_ERL_VERSION", "path_join", "windows_path", ) @@ -19,18 +12,22 @@ load( "erl_libs_contents", ) load( - "//:elixir_home.bzl", - "ElixirHomeProvider", + "//bazel/elixir:elixir_toolchain.bzl", + "elixir_dirs", + "erlang_dirs", + "maybe_symlink_erlang", ) def _impl(ctx): - erlang_version = ctx.attr._erlang_version[ErlangVersionProvider].version - erlang_home = ctx.attr._erlang_home[ErlangHomeProvider].path - elixir_home = ctx.attr._elixir_home[ElixirHomeProvider].path - - erl_libs_dir = ctx.label.name + "_deps" - - erl_libs_files = erl_libs_contents(ctx, headers = True, dir = erl_libs_dir) + (erlang_home, _, erlang_runfiles) = erlang_dirs(ctx) + (elixir_home, elixir_runfiles) = elixir_dirs(ctx, short_path = True) + + erl_libs_dir = ctx.label.name + "_apps" + erl_libs_files = erl_libs_contents( + ctx, + headers = True, + dir = erl_libs_dir, + ) package_dir = path_join(ctx.label.workspace_root, ctx.label.package) @@ -43,9 +40,19 @@ def _impl(ctx): export LANG="en_US.UTF-8" export LC_ALL="en_US.UTF-8" -export PATH="{elixir_home}"/bin:"{erlang_home}"/bin:${{PATH}} +{maybe_symlink_erlang} -INITIAL_DIR=${{PWD}} +if [[ "{elixir_home}" == /* ]]; then + ABS_ELIXIR_HOME="{elixir_home}" +else + ABS_ELIXIR_HOME=$PWD/{elixir_home} +fi + +export PATH="$ABS_ELIXIR_HOME"/bin:"{erlang_home}"/bin:${{PATH}} +export HOME="${{TEST_UNDECLARED_OUTPUTS_DIR}}" +export MIX_ENV=test +export DEPS_DIR=$PWD/{package_dir}/{erl_libs_dir} +export ERL_LIBS=${{DEPS_DIR}} ln -s ${{PWD}}/{package_dir}/config ${{TEST_UNDECLARED_OUTPUTS_DIR}} # ln -s ${{PWD}}/{package_dir}/include ${{TEST_UNDECLARED_OUTPUTS_DIR}} @@ -53,28 +60,20 @@ ln -s ${{PWD}}/{package_dir}/lib ${{TEST_UNDECLARED_OUTPUTS_DIR}} ln -s ${{PWD}}/{package_dir}/test ${{TEST_UNDECLARED_OUTPUTS_DIR}} ln -s ${{PWD}}/{package_dir}/mix.exs ${{TEST_UNDECLARED_OUTPUTS_DIR}} +INITIAL_DIR=${{PWD}} cd ${{TEST_UNDECLARED_OUTPUTS_DIR}} -export HOME=${{PWD}} - -{begins_with_fun} -V=$("{erlang_home}"/bin/{query_erlang_version}) -if ! beginswith "{erlang_version}" "$V"; then - echo "Erlang version mismatch (Expected {erlang_version}, found $V)" - exit 1 -fi - -export DEPS_DIR=$TEST_SRCDIR/$TEST_WORKSPACE/{erl_libs_path} export ERL_COMPILER_OPTIONS=deterministic -export MIX_ENV=test mix dialyzer -"{elixir_home}"/bin/mix local.hex --force -"{elixir_home}"/bin/mix local.rebar --force -"{elixir_home}"/bin/mix make_all +# "${{ABS_ELIXIR_HOME}}"/bin/mix deps.get dialyxir +# "${{ABS_ELIXIR_HOME}}"/bin/mix dialyzer --no-deps-check +"${{ABS_ELIXIR_HOME}}"/bin/mix compile --no-deps-check # due to https://github.com/elixir-lang/elixir/issues/7699 we # "run" the tests, but skip them all, in order to trigger # compilation of all *_test.exs files before we actually run them -"{elixir_home}"/bin/mix test --exclude test +"$ABS_ELIXIR_HOME"/bin/mix test \\ + --no-deps-check \\ + --exclude test export TEST_TMPDIR=${{TEST_UNDECLARED_OUTPUTS_DIR}} @@ -88,28 +87,25 @@ cd ${{INITIAL_DIR}} ./{rabbitmq_run_cmd} start-background-broker cd ${{TEST_UNDECLARED_OUTPUTS_DIR}} -# The test cases will need to be able to load code from the deps -# directly, so we set ERL_LIBS -export ERL_LIBS=$DEPS_DIR - # run the actual tests set +u set -x -"{elixir_home}"/bin/mix test --trace --max-failures 1 ${{TEST_FILE}} +"$ABS_ELIXIR_HOME"/bin/mix test \\ + --no-deps-check \\ + --trace \\ + --max-failures 1 \\ + ${{TEST_FILE}} """.format( - begins_with_fun = BEGINS_WITH_FUN, - query_erlang_version = QUERY_ERL_VERSION, - erlang_version = erlang_version, + maybe_symlink_erlang = maybe_symlink_erlang(ctx, short_path = True), erlang_home = erlang_home, elixir_home = elixir_home, package_dir = package_dir, - erl_libs_path = erl_libs_path, + erl_libs_dir = erl_libs_dir, rabbitmq_run_cmd = ctx.attr.rabbitmq_run[DefaultInfo].files_to_run.executable.short_path, ) else: output = ctx.actions.declare_file(ctx.label.name + ".bat") script = """@echo off -echo Erlang Version: {erlang_version} :: set LANG="en_US.UTF-8" :: set LC_ALL="en_US.UTF-8" @@ -145,16 +141,11 @@ goto :EOF :error exit /b 1 """.format( - erlang_version = erlang_version, - erlang_home = windows_path(ctx.attr._erlang_home[ErlangHomeProvider].path), + erlang_home = windows_path(erlang_home), elixir_home = windows_path(elixir_home), package_dir = windows_path(ctx.label.package), erl_libs_path = erl_libs_path, rabbitmq_run_cmd = ctx.attr.rabbitmq_run[DefaultInfo].files_to_run.executable.short_path, - test_env = "", - filter_tests_args = "", - dir = "", - package = "", ) ctx.actions.write( @@ -166,10 +157,13 @@ exit /b 1 files = ctx.files.srcs + ctx.files.data, transitive_files = depset(erl_libs_files), ) - for dep in ctx.attr.deps: - lib_info = dep[ErlangAppInfo] - runfiles = runfiles.merge(ctx.runfiles(lib_info.include + lib_info.beam)) - runfiles = runfiles.merge(ctx.attr.rabbitmq_run[DefaultInfo].default_runfiles) + runfiles = runfiles.merge_all( + [ + erlang_runfiles, + elixir_runfiles, + ctx.attr.rabbitmq_run[DefaultInfo].default_runfiles, + ], + ) return [DefaultInfo( runfiles = runfiles, @@ -179,18 +173,27 @@ exit /b 1 rabbitmqctl_private_test = rule( implementation = _impl, attrs = { - "is_windows": attr.bool(mandatory = True), - "srcs": attr.label_list(allow_files = [".ex", ".exs"]), - "data": attr.label_list(allow_files = True), - "deps": attr.label_list(providers = [ErlangAppInfo]), + "is_windows": attr.bool( + mandatory = True, + ), + "srcs": attr.label_list( + mandatory = True, + allow_files = [".ex", ".exs"], + ), + "data": attr.label_list( + allow_files = True, + ), + "deps": attr.label_list( + providers = [ErlangAppInfo], + ), "rabbitmq_run": attr.label( executable = True, cfg = "target", ), - "_erlang_version": attr.label(default = Label("@rules_erlang//:erlang_version")), - "_erlang_home": attr.label(default = Label("@rules_erlang//:erlang_home")), - "_elixir_home": attr.label(default = Label("//:elixir_home")), }, + toolchains = [ + "//bazel/elixir:toolchain_type", + ], test = True, ) diff --git a/deps/rabbitmq_consistent_hash_exchange/BUILD.bazel b/deps/rabbitmq_consistent_hash_exchange/BUILD.bazel index faa25fd21d..daa524be99 100644 --- a/deps/rabbitmq_consistent_hash_exchange/BUILD.bazel +++ b/deps/rabbitmq_consistent_hash_exchange/BUILD.bazel @@ -35,7 +35,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -45,7 +45,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS + ["-Wno_undefined_callbacks"], plt = ":base_plt", - tags = ["dialyze"], ) broker_for_integration_suites() diff --git a/deps/rabbitmq_event_exchange/BUILD.bazel b/deps/rabbitmq_event_exchange/BUILD.bazel index 3eb776f354..2bb9b652e1 100644 --- a/deps/rabbitmq_event_exchange/BUILD.bazel +++ b/deps/rabbitmq_event_exchange/BUILD.bazel @@ -27,7 +27,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -37,7 +37,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) diff --git a/deps/rabbitmq_federation/BUILD.bazel b/deps/rabbitmq_federation/BUILD.bazel index 83f6e721a2..9d6193f95c 100644 --- a/deps/rabbitmq_federation/BUILD.bazel +++ b/deps/rabbitmq_federation/BUILD.bazel @@ -1,4 +1,3 @@ -load("@rules_erlang//:erlc.bzl", "erlc") load("@rules_erlang//:xref.bzl", "xref") load("@rules_erlang//:dialyze.bzl", "dialyze", "plt") load( @@ -11,6 +10,7 @@ load( "rabbitmq_app", "rabbitmq_integration_suite", "rabbitmq_suite", + "rabbitmq_test_helper", ) APP_NAME = "rabbitmq_federation" @@ -44,7 +44,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -54,15 +54,13 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS + ["-Wno_undefined_callbacks"], plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) broker_for_integration_suites() -erlc( +rabbitmq_test_helper( name = "rabbit_federation_test_util", - testonly = True, srcs = [ "test/rabbit_federation_test_util.erl", ], @@ -70,8 +68,6 @@ erlc( "include/**/*.hrl", "src/**/*.hrl", ]), - dest = "test", - erlc_opts = RABBITMQ_TEST_ERLC_OPTS, deps = [ ":test_erlang_app", "//deps/amqp_client:erlang_app", diff --git a/deps/rabbitmq_federation_management/BUILD.bazel b/deps/rabbitmq_federation_management/BUILD.bazel index 89e5dbd7d4..a1521d944d 100644 --- a/deps/rabbitmq_federation_management/BUILD.bazel +++ b/deps/rabbitmq_federation_management/BUILD.bazel @@ -41,7 +41,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -51,7 +51,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], ) broker_for_integration_suites() diff --git a/deps/rabbitmq_jms_topic_exchange/BUILD.bazel b/deps/rabbitmq_jms_topic_exchange/BUILD.bazel index f0b848e8dc..3c6da8affd 100644 --- a/deps/rabbitmq_jms_topic_exchange/BUILD.bazel +++ b/deps/rabbitmq_jms_topic_exchange/BUILD.bazel @@ -32,7 +32,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -42,7 +42,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) diff --git a/deps/rabbitmq_management/BUILD.bazel b/deps/rabbitmq_management/BUILD.bazel index 3502d93cd8..af32f2a9a8 100644 --- a/deps/rabbitmq_management/BUILD.bazel +++ b/deps/rabbitmq_management/BUILD.bazel @@ -1,4 +1,3 @@ -load("@rules_erlang//:erlc.bzl", "erlc") load("@rules_erlang//:xref.bzl", "xref") load("@rules_erlang//:dialyze.bzl", "dialyze", "plt") load( @@ -11,6 +10,7 @@ load( "rabbitmq_app", "rabbitmq_integration_suite", "rabbitmq_suite", + "rabbitmq_test_helper", ) APP_NAME = "rabbitmq_management" @@ -74,7 +74,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -84,19 +84,16 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) broker_for_integration_suites() -erlc( +rabbitmq_test_helper( name = "rabbit_mgmt_runtime_parameters_util", - testonly = True, srcs = [ "test/rabbit_mgmt_runtime_parameters_util.erl", ], - dest = "test", deps = [ "//deps/rabbit_common:erlang_app", ], diff --git a/deps/rabbitmq_management_agent/BUILD.bazel b/deps/rabbitmq_management_agent/BUILD.bazel index 99bbfabc4a..52dbb4213b 100644 --- a/deps/rabbitmq_management_agent/BUILD.bazel +++ b/deps/rabbitmq_management_agent/BUILD.bazel @@ -55,7 +55,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt_apps = list(EXTRA_APPS) @@ -71,7 +71,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS + ["-Wno_undefined_callbacks"], plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) diff --git a/deps/rabbitmq_mqtt/BUILD.bazel b/deps/rabbitmq_mqtt/BUILD.bazel index 6a8d7c3528..6088a85f38 100644 --- a/deps/rabbitmq_mqtt/BUILD.bazel +++ b/deps/rabbitmq_mqtt/BUILD.bazel @@ -1,4 +1,3 @@ -load("@rules_erlang//:erlc.bzl", "erlc") load("@rules_erlang//:xref.bzl", "xref") load("@rules_erlang//:dialyze.bzl", "dialyze", "plt") load( @@ -11,6 +10,7 @@ load( "rabbitmq_app", "rabbitmq_integration_suite", "rabbitmq_suite", + "rabbitmq_test_helper", ) APP_NAME = "rabbitmq_mqtt" @@ -68,7 +68,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -78,20 +78,16 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS + ["-Wno_undefined_callbacks"], plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) broker_for_integration_suites() -erlc( +rabbitmq_test_helper( name = "rabbit_auth_backend_mqtt_mock", - testonly = True, srcs = [ "test/rabbit_auth_backend_mqtt_mock.erl", ], - dest = "test", - erlc_opts = RABBITMQ_TEST_ERLC_OPTS, deps = [ "//deps/rabbit_common:erlang_app", ], diff --git a/deps/rabbitmq_peer_discovery_aws/BUILD.bazel b/deps/rabbitmq_peer_discovery_aws/BUILD.bazel index bfc2ea4560..e0a1e2ec42 100644 --- a/deps/rabbitmq_peer_discovery_aws/BUILD.bazel +++ b/deps/rabbitmq_peer_discovery_aws/BUILD.bazel @@ -36,7 +36,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -48,7 +48,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) diff --git a/deps/rabbitmq_peer_discovery_common/BUILD.bazel b/deps/rabbitmq_peer_discovery_common/BUILD.bazel index bbafec6b54..a30b3c1a57 100644 --- a/deps/rabbitmq_peer_discovery_common/BUILD.bazel +++ b/deps/rabbitmq_peer_discovery_common/BUILD.bazel @@ -38,7 +38,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -50,7 +50,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) diff --git a/deps/rabbitmq_peer_discovery_consul/BUILD.bazel b/deps/rabbitmq_peer_discovery_consul/BUILD.bazel index ca8059ed1e..177b7f49a3 100644 --- a/deps/rabbitmq_peer_discovery_consul/BUILD.bazel +++ b/deps/rabbitmq_peer_discovery_consul/BUILD.bazel @@ -33,7 +33,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -43,7 +43,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) diff --git a/deps/rabbitmq_peer_discovery_etcd/BUILD.bazel b/deps/rabbitmq_peer_discovery_etcd/BUILD.bazel index 86291b7f92..cb9f0c2792 100644 --- a/deps/rabbitmq_peer_discovery_etcd/BUILD.bazel +++ b/deps/rabbitmq_peer_discovery_etcd/BUILD.bazel @@ -35,7 +35,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -45,7 +45,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) diff --git a/deps/rabbitmq_peer_discovery_k8s/BUILD.bazel b/deps/rabbitmq_peer_discovery_k8s/BUILD.bazel index 931f98c2d8..84c81e2c87 100644 --- a/deps/rabbitmq_peer_discovery_k8s/BUILD.bazel +++ b/deps/rabbitmq_peer_discovery_k8s/BUILD.bazel @@ -33,7 +33,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -43,7 +43,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) diff --git a/deps/rabbitmq_prometheus/BUILD.bazel b/deps/rabbitmq_prometheus/BUILD.bazel index 3d594d47cb..4b28029da9 100644 --- a/deps/rabbitmq_prometheus/BUILD.bazel +++ b/deps/rabbitmq_prometheus/BUILD.bazel @@ -41,7 +41,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -51,7 +51,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) diff --git a/deps/rabbitmq_random_exchange/BUILD.bazel b/deps/rabbitmq_random_exchange/BUILD.bazel index 325a243391..ed4ad5dda5 100644 --- a/deps/rabbitmq_random_exchange/BUILD.bazel +++ b/deps/rabbitmq_random_exchange/BUILD.bazel @@ -25,7 +25,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -35,5 +35,4 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], ) diff --git a/deps/rabbitmq_recent_history_exchange/BUILD.bazel b/deps/rabbitmq_recent_history_exchange/BUILD.bazel index b1580ec003..1a3286967c 100644 --- a/deps/rabbitmq_recent_history_exchange/BUILD.bazel +++ b/deps/rabbitmq_recent_history_exchange/BUILD.bazel @@ -30,7 +30,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -40,7 +40,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) diff --git a/deps/rabbitmq_sharding/BUILD.bazel b/deps/rabbitmq_sharding/BUILD.bazel index 07f81eaf8f..0f1c22308c 100644 --- a/deps/rabbitmq_sharding/BUILD.bazel +++ b/deps/rabbitmq_sharding/BUILD.bazel @@ -26,7 +26,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -36,7 +36,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) diff --git a/deps/rabbitmq_shovel/BUILD.bazel b/deps/rabbitmq_shovel/BUILD.bazel index b74f094f78..3a578a8186 100644 --- a/deps/rabbitmq_shovel/BUILD.bazel +++ b/deps/rabbitmq_shovel/BUILD.bazel @@ -1,4 +1,3 @@ -load("@rules_erlang//:erlc.bzl", "erlc") load("@rules_erlang//:xref.bzl", "xref") load("@rules_erlang//:dialyze.bzl", "dialyze", "plt") load("//:rabbitmq_home.bzl", "rabbitmq_home") @@ -12,6 +11,7 @@ load( "rabbitmq_app", "rabbitmq_integration_suite", "rabbitmq_suite", + "rabbitmq_test_helper", ) APP_NAME = "rabbitmq_shovel" @@ -60,7 +60,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -70,7 +70,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS + ["-Wno_undefined_callbacks"], plt = ":base_plt", - tags = ["dialyze"], ) rabbitmq_home( @@ -87,14 +86,11 @@ rabbitmq_run( home = ":broker-for-tests-home", ) -erlc( +rabbitmq_test_helper( name = "shovel_test_utils", - testonly = True, srcs = [ "test/shovel_test_utils.erl", ], - dest = "test", - erlc_opts = RABBITMQ_TEST_ERLC_OPTS, ) PACKAGE = "deps/rabbitmq_shovel" diff --git a/deps/rabbitmq_shovel_management/BUILD.bazel b/deps/rabbitmq_shovel_management/BUILD.bazel index 855a796c79..4f692ac600 100644 --- a/deps/rabbitmq_shovel_management/BUILD.bazel +++ b/deps/rabbitmq_shovel_management/BUILD.bazel @@ -40,7 +40,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -50,7 +50,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], ) rabbitmq_home( diff --git a/deps/rabbitmq_stomp/BUILD.bazel b/deps/rabbitmq_stomp/BUILD.bazel index 938e85639e..60057f19f3 100644 --- a/deps/rabbitmq_stomp/BUILD.bazel +++ b/deps/rabbitmq_stomp/BUILD.bazel @@ -1,4 +1,3 @@ -load("@rules_erlang//:erlc.bzl", "erlc") load("@rules_erlang//:xref.bzl", "xref") load("@rules_erlang//:dialyze.bzl", "dialyze", "plt") load( @@ -11,6 +10,7 @@ load( "rabbitmq_app", "rabbitmq_integration_suite", "rabbitmq_suite", + "rabbitmq_test_helper", ) APP_NAME = "rabbitmq_stomp" @@ -66,7 +66,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -76,7 +76,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS + ["-Wno_undefined_callbacks"], plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) @@ -84,9 +83,8 @@ broker_for_integration_suites() PACKAGE = "deps/rabbitmq_stomp" -erlc( +rabbitmq_test_helper( name = "rabbit_stomp_client", - testonly = True, srcs = [ "test/src/rabbit_stomp_client.erl", ], @@ -94,8 +92,6 @@ erlc( "include/**/*.hrl", "src/**/*.hrl", ]), - dest = "test", - erlc_opts = RABBITMQ_TEST_ERLC_OPTS, deps = [ ":test_erlang_app", ], diff --git a/deps/rabbitmq_stream/BUILD.bazel b/deps/rabbitmq_stream/BUILD.bazel index fe6362c723..0e15468c8a 100644 --- a/deps/rabbitmq_stream/BUILD.bazel +++ b/deps/rabbitmq_stream/BUILD.bazel @@ -52,7 +52,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -65,7 +65,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS + ["-Wno_undefined_callbacks"], plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) diff --git a/deps/rabbitmq_stream_common/BUILD.bazel b/deps/rabbitmq_stream_common/BUILD.bazel index 912fea0129..994d9039b6 100644 --- a/deps/rabbitmq_stream_common/BUILD.bazel +++ b/deps/rabbitmq_stream_common/BUILD.bazel @@ -17,12 +17,11 @@ rabbitmq_app( app_name = APP_NAME, ) -xref(tags = ["xref"]) +xref() dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = "//:base_plt", - tags = ["dialyze"], ) suites = [ diff --git a/deps/rabbitmq_stream_management/BUILD.bazel b/deps/rabbitmq_stream_management/BUILD.bazel index 6cb025c1ec..4bd1f52770 100644 --- a/deps/rabbitmq_stream_management/BUILD.bazel +++ b/deps/rabbitmq_stream_management/BUILD.bazel @@ -36,7 +36,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -46,7 +46,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) diff --git a/deps/rabbitmq_top/BUILD.bazel b/deps/rabbitmq_top/BUILD.bazel index 92aaae5ad2..6f4108cbd9 100644 --- a/deps/rabbitmq_top/BUILD.bazel +++ b/deps/rabbitmq_top/BUILD.bazel @@ -37,7 +37,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -47,5 +47,4 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], ) diff --git a/deps/rabbitmq_tracing/BUILD.bazel b/deps/rabbitmq_tracing/BUILD.bazel index 7193444fc8..913cc588a8 100644 --- a/deps/rabbitmq_tracing/BUILD.bazel +++ b/deps/rabbitmq_tracing/BUILD.bazel @@ -47,7 +47,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -57,7 +57,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) diff --git a/deps/rabbitmq_trust_store/BUILD.bazel b/deps/rabbitmq_trust_store/BUILD.bazel index 63629eb90e..756fdda343 100644 --- a/deps/rabbitmq_trust_store/BUILD.bazel +++ b/deps/rabbitmq_trust_store/BUILD.bazel @@ -45,7 +45,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -57,7 +57,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) diff --git a/deps/rabbitmq_web_dispatch/BUILD.bazel b/deps/rabbitmq_web_dispatch/BUILD.bazel index c545050a43..f409d55094 100644 --- a/deps/rabbitmq_web_dispatch/BUILD.bazel +++ b/deps/rabbitmq_web_dispatch/BUILD.bazel @@ -39,7 +39,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -51,7 +51,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) diff --git a/deps/rabbitmq_web_mqtt/BUILD.bazel b/deps/rabbitmq_web_mqtt/BUILD.bazel index f74ad94621..26c84d3e2d 100644 --- a/deps/rabbitmq_web_mqtt/BUILD.bazel +++ b/deps/rabbitmq_web_mqtt/BUILD.bazel @@ -1,4 +1,3 @@ -load("@rules_erlang//:erlc.bzl", "erlc") load("@rules_erlang//:xref.bzl", "xref") load("@rules_erlang//:dialyze.bzl", "dialyze", "plt") load( @@ -9,6 +8,7 @@ load( "broker_for_integration_suites", "rabbitmq_app", "rabbitmq_integration_suite", + "rabbitmq_test_helper", ) APP_NAME = "rabbitmq_web_mqtt" @@ -51,7 +51,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -61,7 +61,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) @@ -69,12 +68,10 @@ broker_for_integration_suites() PACKAGE = "deps/rabbitmq_web_mqtt" -erlc( +rabbitmq_test_helper( name = "test_utils", srcs = glob(["test/src/*.erl"]), hdrs = glob(["test/src/*.hrl"]), - dest = "test", - erlc_opts = RABBITMQ_TEST_ERLC_OPTS, ) suites = [ diff --git a/deps/rabbitmq_web_mqtt_examples/BUILD.bazel b/deps/rabbitmq_web_mqtt_examples/BUILD.bazel index 8c2c7c348a..736beb0be5 100644 --- a/deps/rabbitmq_web_mqtt_examples/BUILD.bazel +++ b/deps/rabbitmq_web_mqtt_examples/BUILD.bazel @@ -31,10 +31,9 @@ rabbitmq_app( runtime_deps = RUNTIME_DEPS, ) -xref(tags = ["xref"]) +xref() dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = "//:base_plt", - tags = ["dialyze"], ) diff --git a/deps/rabbitmq_web_stomp/BUILD.bazel b/deps/rabbitmq_web_stomp/BUILD.bazel index b65634315f..4ab857ce64 100644 --- a/deps/rabbitmq_web_stomp/BUILD.bazel +++ b/deps/rabbitmq_web_stomp/BUILD.bazel @@ -1,4 +1,3 @@ -load("@rules_erlang//:erlc.bzl", "erlc") load("@rules_erlang//:xref.bzl", "xref") load("@rules_erlang//:dialyze.bzl", "dialyze", "plt") load( @@ -11,6 +10,7 @@ load( "rabbitmq_app", "rabbitmq_integration_suite", "rabbitmq_suite", + "rabbitmq_test_helper", ) APP_NAME = "rabbitmq_web_stomp" @@ -56,7 +56,7 @@ rabbitmq_app( deps = DEPS, ) -xref(tags = ["xref"]) +xref() plt( name = "base_plt", @@ -66,7 +66,6 @@ plt( dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = ":base_plt", - tags = ["dialyze"], warnings_as_errors = False, ) @@ -74,12 +73,9 @@ broker_for_integration_suites() PACKAGE = "deps/rabbitmq_web_stomp" -erlc( +rabbitmq_test_helper( name = "test_util", - testonly = True, srcs = glob(["test/src/*.erl"]), - dest = "test", - erlc_opts = RABBITMQ_TEST_ERLC_OPTS, ) suites = [ diff --git a/deps/rabbitmq_web_stomp_examples/BUILD.bazel b/deps/rabbitmq_web_stomp_examples/BUILD.bazel index 53dd9ad1e3..f299c19704 100644 --- a/deps/rabbitmq_web_stomp_examples/BUILD.bazel +++ b/deps/rabbitmq_web_stomp_examples/BUILD.bazel @@ -31,10 +31,9 @@ rabbitmq_app( runtime_deps = RUNTIME_DEPS, ) -xref(tags = ["xref"]) +xref() dialyze( dialyzer_opts = RABBITMQ_DIALYZER_OPTS, plt = "//:base_plt", - tags = ["dialyze"], ) @@ -1,14 +1,22 @@ -load("@rules_erlang//:erlang_home.bzl", "ErlangHomeProvider") +load("@rules_pkg//:pkg.bzl", "pkg_tar") load("@rules_erlang//:erlang_app_info.bzl", "ErlangAppInfo", "flat_deps") load("@rules_erlang//:util.bzl", "path_join") load("@rules_erlang//:ct.bzl", "additional_file_dest_relative_path") load( + "@rules_erlang//tools:erlang_toolchain.bzl", + "erlang_dirs", + "maybe_symlink_erlang", +) +load( ":rabbitmq_home.bzl", "RABBITMQ_HOME_ATTRS", "RabbitmqHomeInfo", "flatten", "link_escript", - "unique_versions", +) +load( + ":rabbitmq.bzl", + "APP_VERSION", ) def _collect_licenses_impl(ctx): @@ -70,11 +78,15 @@ def _app_file(plugin_lib_info): def _plugins_dir(ctx, plugins): plugins_dir = ctx.actions.declare_directory(path_join(ctx.label.name, "plugins")) - erlang_home = ctx.attr._erlang_home[ErlangHomeProvider].path + (erlang_home, _, runfiles) = erlang_dirs(ctx) - inputs = [] + inputs = runfiles.files.to_list() - commands = ["set -euo pipefail", ""] + commands = [ + "set -euo pipefail", + "", + maybe_symlink_erlang(ctx), + ] for plugin in plugins: lib_info = plugin[ErlangAppInfo] @@ -158,10 +170,6 @@ def _plugins_dir(ctx, plugins): def _versioned_rabbitmq_home_impl(ctx): plugins = flat_deps(ctx.attr.plugins) - erlang_versions = unique_versions(plugins) - if len(erlang_versions) > 1: - fail("plugins do not have a unified erlang version", erlang_versions) - scripts = [_copy_script(ctx, script) for script in ctx.files._scripts] rabbitmq_ctl_copies = [ @@ -195,9 +203,8 @@ def _versioned_rabbitmq_home_impl(ctx): versioned_rabbitmq_home_private = rule( implementation = _versioned_rabbitmq_home_impl, - attrs = dict(RABBITMQ_HOME_ATTRS.items() + { - "_erlang_home": attr.label(default = "@rules_erlang//:erlang_home"), - }.items()), + attrs = RABBITMQ_HOME_ATTRS, + toolchains = ["@rules_erlang//tools:toolchain_type"], ) def versioned_rabbitmq_home(**kwargs): @@ -208,3 +215,70 @@ def versioned_rabbitmq_home(**kwargs): }), **kwargs ) + +# This macro must be invoked from the top level BUILD.bazel of rabbitmq-server +def package_generic_unix(plugins): + collect_licenses( + name = "licenses", + srcs = native.glob( + ["LICENSE*"], + exclude = [ + "LICENSE.md", + "LICENSE.txt", + ], + ), + deps = plugins, + ) + + pkg_tar( + name = "license-files", + srcs = [ + ":licenses", + "//deps/rabbit:INSTALL", + ], + visibility = ["//visibility:public"], + ) + + pkg_tar( + name = "scripts", + srcs = [ + "scripts/bash_autocomplete.sh", + "scripts/rabbitmq-script-wrapper", + "scripts/rabbitmqctl-autocomplete.sh", + "scripts/zsh_autocomplete.sh", + ], + package_dir = "scripts", + visibility = ["//visibility:public"], + ) + + pkg_tar( + name = "release-notes", + srcs = native.glob([ + "release-notes/*.md", + "release-notes/*.txt", + ]), + package_dir = "release-notes", + visibility = ["//visibility:public"], + ) + + versioned_rabbitmq_home( + name = "dist-home", + plugins = plugins, + ) + + pkg_tar( + name = "package-generic-unix", + srcs = [ + ":dist-home", + ], + extension = "tar.xz", + package_dir = "rabbitmq_server-{}".format(APP_VERSION), + strip_prefix = "dist-home", + visibility = ["//visibility:public"], + deps = [ + ":license-files", + ":release-notes", + ":scripts", + "//deps/rabbit:manpages-dir", + ], + ) diff --git a/elixir_home.bzl b/elixir_home.bzl deleted file mode 100644 index 8f35fc90ec..0000000000 --- a/elixir_home.bzl +++ /dev/null @@ -1,13 +0,0 @@ -ElixirHomeProvider = provider( - fields = ["path"], -) - -def _impl(ctx): - return ElixirHomeProvider(path = ctx.build_setting_value) - -elixir_home = rule( - implementation = _impl, - # The next line marks this as a special rule that we can - # configure when invoking the cli or via .bazelrc file - build_setting = config.string(flag = True), -) diff --git a/packaging/docker-image/Dockerfile b/packaging/docker-image/Dockerfile index b31b90470b..af326dd539 100644 --- a/packaging/docker-image/Dockerfile +++ b/packaging/docker-image/Dockerfile @@ -3,11 +3,21 @@ FROM ubuntu:20.04 RUN set -eux; \ - apt-get update; \ - apt-get install -y --no-install-recommends \ + apt-get update; \ + apt-get install -y lsb-release ubuntu-dbgsym-keyring; \ + echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse" > /etc/apt/sources.list.d/ddebs.list; \ + echo "deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse" >> /etc/apt/sources.list.d/ddebs.list; \ + echo "deb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse" >> /etc/apt/sources.list.d/ddebs.list; \ + apt-get update; \ + apt-get install -y --no-install-recommends \ # grab gosu for easy step-down from root - gosu \ - ; \ + gosu \ + libc6-dbg \ + libgcc-s1-dbgsym \ + libstdc++6-dbgsym \ + libtinfo6-dbgsym \ + zlib1g-dbgsym \ + ; \ rm -rf /var/lib/apt/lists/*; \ # verify that the "gosu" binary works gosu nobody true diff --git a/packaging/docker-image/otp-versions/otp-max.yaml b/packaging/docker-image/otp-versions/otp-max.yaml index fd79f7dd74..74f279570e 100644 --- a/packaging/docker-image/otp-versions/otp-max.yaml +++ b/packaging/docker-image/otp-versions/otp-max.yaml @@ -1,7 +1,7 @@ -otp: '24.3.4' -otp_major: '24' +otp: '25.0' +otp_major: '25' # make -C packaging/docker-image find-otp-sha256 OTP_VERSION_MATCH=24.0 -otp_sha256: e59bedbb871af52244ca5284fd0a572d52128abd4decf4347fe2aef047b65c58 +otp_sha256: 5988e3bca208486494446e885ca2149fe487ee115cbc3770535fd22a795af5d2 # Which is the max supported Elixir? # https://github.com/rabbitmq/rabbitmq-server/blob/master/deps/rabbitmq_cli/mix.exs#L14 # Which is the latest Elixir release? diff --git a/packaging/docker-image/otp-versions/otp-min.yaml b/packaging/docker-image/otp-versions/otp-min.yaml index 13d6099b3b..acfec5d561 100644 --- a/packaging/docker-image/otp-versions/otp-min.yaml +++ b/packaging/docker-image/otp-versions/otp-min.yaml @@ -1,7 +1,7 @@ -otp: '23.2' -otp_major: '23' -# make -C packaging/docker-image find-otp-sha256 OTP_VERSION_MATCH=23.2 -otp_sha256: 79f2233a960cc427607d52a7b7e9e5b08afba96a4d87ced4efb64e902b44160c -# Which is the min supported Elixir? +otp: '24.3.4' +otp_major: '24' +# make -C packaging/docker-image find-otp-sha256 OTP_VERSION_MATCH=24.0 +otp_sha256: e59bedbb871af52244ca5284fd0a572d52128abd4decf4347fe2aef047b65c58 +# Which is the max supported Elixir? # https://github.com/rabbitmq/rabbitmq-server/blob/master/deps/rabbitmq_cli/mix.exs#L14 -elixir: '1.12.3'
\ No newline at end of file +elixir: '1.12.3' diff --git a/packaging/docker-image/otp-versions/otp-rc.yaml b/packaging/docker-image/otp-versions/otp-rc.yaml deleted file mode 100644 index e9afb95b22..0000000000 --- a/packaging/docker-image/otp-versions/otp-rc.yaml +++ /dev/null @@ -1,3 +0,0 @@ -otp: '25.0-rc3' -otp_major: '25' -elixir: '1.13.4' diff --git a/rabbitmq.bzl b/rabbitmq.bzl index f9838a7bd9..7c13e30385 100644 --- a/rabbitmq.bzl +++ b/rabbitmq.bzl @@ -1,4 +1,8 @@ load( + "@rules_erlang//:erlang_bytecode.bzl", + "erlang_bytecode", +) +load( "@rules_erlang//:erlang_app.bzl", "DEFAULT_ERLC_OPTS", "DEFAULT_TEST_ERLC_OPTS", @@ -6,7 +10,7 @@ load( "test_erlang_app", ) load( - "@rules_erlang//:ct_sharded.bzl", + "@rules_erlang//:ct.bzl", "ct_suite", "ct_suite_variant", _assert_suites = "assert_suites", @@ -87,7 +91,10 @@ LABELS_WITH_TEST_VERSIONS = [ ] def all_plugins(rabbitmq_workspace = "@rabbitmq-server"): - return [rabbitmq_workspace + p for p in ALL_PLUGINS] + return [ + Label("{}{}".format(rabbitmq_workspace, p)) + for p in ALL_PLUGINS + ] def with_test_versions(deps): r = [] @@ -107,6 +114,8 @@ def rabbitmq_app( app_env = "", app_extra_keys = "", extra_apps = [], + extra_hdrs = [], + extra_srcs = [], extra_priv = [], build_deps = [], deps = [], @@ -118,8 +127,10 @@ def rabbitmq_app( app_module = app_module, app_registered = app_registered, app_env = app_env, - app_extra = app_extra_keys, + app_extra_keys = app_extra_keys, extra_apps = extra_apps, + extra_hdrs = extra_hdrs, + extra_srcs = extra_srcs, extra_priv = extra_priv, erlc_opts = select({ "//:debug_build": without("+deterministic", RABBITMQ_ERLC_OPTS), @@ -137,8 +148,10 @@ def rabbitmq_app( app_module = app_module, app_registered = app_registered, app_env = app_env, - app_extra = app_extra_keys, + app_extra_keys = app_extra_keys, extra_apps = extra_apps, + extra_hdrs = extra_hdrs, + extra_srcs = extra_srcs, extra_priv = extra_priv, erlc_opts = select({ "//:debug_build": without("+deterministic", RABBITMQ_TEST_ERLC_OPTS), @@ -160,13 +173,13 @@ def rabbitmq_suite(erlc_opts = [], test_env = {}, **kwargs): ) return kwargs["name"] -def broker_for_integration_suites(): +def broker_for_integration_suites(extra_plugins = []): rabbitmq_home( name = "broker-for-tests-home", plugins = [ "//deps/rabbit:erlang_app", ":erlang_app", - ], + ] + extra_plugins, testonly = True, ) @@ -176,6 +189,16 @@ def broker_for_integration_suites(): testonly = True, ) +def rabbitmq_test_helper( + erlc_opts = RABBITMQ_TEST_ERLC_OPTS, + **kwargs): + erlang_bytecode( + testonly = True, + dest = "test", + erlc_opts = erlc_opts, + **kwargs + ) + def rabbitmq_integration_suite( package, name = None, @@ -220,7 +243,7 @@ def rabbitmq_integration_suite( ":rabbitmq-for-tests-run", ] + tools, runtime_deps = [ - "//deps/rabbitmq_cli:elixir_app", + "//bazel/elixir:erlang_app", "//deps/rabbitmq_cli:rabbitmqctl", "//deps/rabbitmq_ct_client_helpers:erlang_app", ] + runtime_deps, @@ -248,7 +271,7 @@ def rabbitmq_integration_suite( "@rabbitmq-server-generic-unix-3.9//:rabbitmq-run", ] + tools, runtime_deps = [ - "//deps/rabbitmq_cli:elixir_app", + "//bazel/elixir:erlang_app", "//deps/rabbitmq_cli:rabbitmqctl", "//deps/rabbitmq_ct_client_helpers:erlang_app", ] + runtime_deps, diff --git a/rabbitmq_home.bzl b/rabbitmq_home.bzl index e6ac310aa9..9f992d23c3 100644 --- a/rabbitmq_home.bzl +++ b/rabbitmq_home.bzl @@ -68,24 +68,12 @@ def _plugins_dir_links(ctx, plugin): return links -def unique_versions(plugins): - erlang_versions = [] - for plugin in plugins: - erlang_version = plugin[ErlangAppInfo].erlang_version - if not erlang_version in erlang_versions: - erlang_versions.append(erlang_version) - return erlang_versions - def flatten(list_of_lists): return [item for sublist in list_of_lists for item in sublist] def _impl(ctx): plugins = flat_deps(ctx.attr.plugins) - erlang_versions = unique_versions(plugins) - if len(erlang_versions) > 1: - fail("plugins do not have a unified erlang version", erlang_versions) - if not ctx.attr.is_windows: source_scripts = ctx.files._scripts else: diff --git a/rabbitmq_run.bzl b/rabbitmq_run.bzl index dc09a0df22..c0385570c4 100644 --- a/rabbitmq_run.bzl +++ b/rabbitmq_run.bzl @@ -1,6 +1,18 @@ -load("@rules_erlang//:erlang_home.bzl", "ErlangHomeProvider", "ErlangVersionProvider") -load("@rules_erlang//:util.bzl", "path_join", "windows_path") -load(":rabbitmq_home.bzl", "RabbitmqHomeInfo", "rabbitmq_home_short_path") +load( + "@rules_erlang//:util.bzl", + "path_join", + "windows_path", +) +load( + "@rules_erlang//tools:erlang_toolchain.bzl", + "erlang_dirs", + "maybe_symlink_erlang", +) +load( + ":rabbitmq_home.bzl", + "RabbitmqHomeInfo", + "rabbitmq_home_short_path", +) def _impl(ctx): rabbitmq_home_path = rabbitmq_home_short_path(ctx.attr.home) @@ -10,6 +22,8 @@ def _impl(ctx): path_join(rabbitmq_home_path, "plugins"), ]) + (erlang_home, _, runfiles) = erlang_dirs(ctx) + if not ctx.attr.is_windows: output = ctx.actions.declare_file(ctx.label.name) ctx.actions.expand_template( @@ -18,7 +32,7 @@ def _impl(ctx): substitutions = { "{RABBITMQ_HOME}": rabbitmq_home_path, "{ERL_LIBS}": erl_libs, - "{ERLANG_HOME}": ctx.attr._erlang_home[ErlangHomeProvider].path, + "{ERLANG_HOME}": erlang_home, }, is_executable = True, ) @@ -30,12 +44,12 @@ def _impl(ctx): substitutions = { "{RABBITMQ_HOME}": windows_path(rabbitmq_home_path), "{ERL_LIBS}": erl_libs, - "{ERLANG_HOME}": windows_path(ctx.attr._erlang_home[ErlangHomeProvider].path), + "{ERLANG_HOME}": windows_path(erlang_home), }, is_executable = True, ) - runfiles = ctx.runfiles(ctx.attr.home[DefaultInfo].files.to_list()) + runfiles = runfiles.merge(ctx.runfiles(ctx.attr.home[DefaultInfo].files.to_list())) return [DefaultInfo( runfiles = runfiles, @@ -53,10 +67,10 @@ rabbitmq_run_private = rule( default = Label("//:scripts/bazel/rabbitmq-run.bat"), allow_single_file = True, ), - "_erlang_home": attr.label(default = Label("@rules_erlang//:erlang_home")), "is_windows": attr.bool(mandatory = True), "home": attr.label(providers = [RabbitmqHomeInfo]), }, + toolchains = ["@rules_erlang//tools:toolchain_type"], executable = True, ) diff --git a/rabbitmqctl.bzl b/rabbitmqctl.bzl index e68d041bfc..237fcf34ef 100644 --- a/rabbitmqctl.bzl +++ b/rabbitmqctl.bzl @@ -1,9 +1,6 @@ -load("@rules_erlang//:erlang_home.bzl", "ErlangVersionProvider") load(":rabbitmq_home.bzl", "RabbitmqHomeInfo", "rabbitmq_home_short_path") def _impl(ctx): - erlang_version = ctx.attr._erlang_version[ErlangVersionProvider].version - rabbitmq_home_path = rabbitmq_home_short_path(ctx.attr.home) script = """ @@ -25,7 +22,6 @@ def _impl(ctx): rabbitmqctl = rule( implementation = _impl, attrs = { - "_erlang_version": attr.label(default = Label("@rules_erlang//:erlang_version")), "home": attr.label(providers = [RabbitmqHomeInfo]), }, executable = True, diff --git a/tools/erlang_ls.bzl b/tools/erlang_ls.bzl index f767255ce2..2dbdea821b 100644 --- a/tools/erlang_ls.bzl +++ b/tools/erlang_ls.bzl @@ -1,9 +1,12 @@ -load("@rules_erlang//:erlang_home.bzl", "ErlangHomeProvider") +load( + "@rules_erlang//tools:erlang_toolchain.bzl", + "erlang_dirs", +) def _impl(ctx): out = ctx.actions.declare_file(ctx.label.name) - erlang_home = ctx.attr._erlang_home[ErlangHomeProvider].path + (erlang_home, _, _) = erlang_dirs(ctx) ctx.actions.write( output = out, @@ -32,7 +35,7 @@ plt_path: bazel-bin/deps/rabbit/.base_plt.plt erlang_ls_config = rule( implementation = _impl, - attrs = { - "_erlang_home": attr.label(default = "@rules_erlang//:erlang_home"), - }, + toolchains = [ + "@rules_erlang//tools:toolchain_type", + ], ) diff --git a/user-template.bazelrc b/user-template.bazelrc index 6df69345bf..f7620754fc 100644 --- a/user-template.bazelrc +++ b/user-template.bazelrc @@ -1,6 +1,6 @@ -build --@rules_erlang//:erlang_home=/Users/rabbitmq/kerl/24.0 -build --@rules_erlang//:erlang_version=24.0 -build --//:elixir_home=/Users/rabbitmq/.kiex/elixirs/elixir-1.12.0/lib/elixir +build:local --@rules_erlang//:erlang_home=/Users/rabbitmq/kerl/24.0 +build:local --@rules_erlang//:erlang_version=24.0 +build:local --//:elixir_home=/Users/rabbitmq/.kiex/elixirs/elixir-1.12.0/lib/elixir # rabbitmqctl wait shells out to 'ps', which is broken in the bazel macOS # sandbox (https://github.com/bazelbuild/bazel/issues/7448) @@ -18,5 +18,5 @@ build --flaky_test_attempts=1 build:buildbuddy --remote_header=x-buildbuddy-api-key=YOUR_API_KEY # cross compile for linux (if on macOS) with rbe -build:rbe --host_cpu=k8 -build:rbe --cpu=k8 +# build:rbe --host_cpu=k8 +# build:rbe --cpu=k8 diff --git a/workspace_helpers.bzl b/workspace_helpers.bzl index 4ed1a38035..13f4be02f9 100644 --- a/workspace_helpers.bzl +++ b/workspace_helpers.bzl @@ -3,7 +3,6 @@ load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository", "new_git_r load("@rules_erlang//:github.bzl", "github_erlang_app") load("@rules_erlang//:hex_archive.bzl", "hex_archive") load("@rules_erlang//:hex_pm.bzl", "hex_pm_erlang_app") -load("//:rabbitmq.bzl", "APP_VERSION") def rabbitmq_external_deps(rabbitmq_workspace = "@rabbitmq-server"): hex_pm_erlang_app( @@ -131,9 +130,6 @@ erlang_app( org = "potatosalad", ref = "2b1d66b5f4fbe33cb198149a8cb23895a2c877ea", version = "2b1d66b5f4fbe33cb198149a8cb23895a2c877ea", - first_srcs = [ - "src/jose_block_encryptor.erl", - ], sha256 = "7816f39d00655f2605cfac180755e97e268dba86c2f71037998ff63792ca727b", ) |