Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bazelmod documentation and code examples. #2713

Merged
merged 61 commits into from
Jul 12, 2024
Merged
Show file tree
Hide file tree
Changes from 52 commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
69a9b33
Added some more Bazelmod code examples.
marvin-hansen Jun 24, 2024
bac6a13
Merge branch 'main' into main
marvin-hansen Jun 25, 2024
1f21f01
Added FFI example and dependencies vendoring example for Bazelmod.
marvin-hansen Jun 25, 2024
dcb42df
Merge remote-tracking branch 'origin/main'
marvin-hansen Jun 25, 2024
653bb40
Updated .gitignore to exclude fluff from JetBrain IDE's
marvin-hansen Jun 26, 2024
334f46b
Updated the crate_universe_bzlmod.md documentation.
marvin-hansen Jun 26, 2024
e7c60a3
Merge branch 'main' into main
marvin-hansen Jun 26, 2024
2aa5c3b
Updated presubmit.yml to build new bazelmod proto and oci example.
marvin-hansen Jun 27, 2024
50e0cc1
Added .gitignore file to all new Bazelmod examples.
marvin-hansen Jun 27, 2024
aaba5a3
Added CI build target for all remaining Bazelmod examples.
marvin-hansen Jun 27, 2024
e843c7c
Fixed a number of buildifier lint issues.
marvin-hansen Jun 27, 2024
82a25e0
Fixed more buildifier lint issues.
marvin-hansen Jun 27, 2024
a6a9774
Fixed MUSL cross compiling with Bazelmod CI build.
marvin-hansen Jun 27, 2024
893f774
Formated all bazel files in examples/bazelmod with buildifier
marvin-hansen Jun 27, 2024
2dddcee
Added Readme to compiler example and oci container example.
marvin-hansen Jun 27, 2024
f6706eb
Merge branch 'main' into main
marvin-hansen Jul 3, 2024
7f59ab6
Renovated Cross compilation with bzlmod example.
marvin-hansen Jul 4, 2024
426d896
Moved sysroot into MODULE.bazel.
marvin-hansen Jul 4, 2024
ff02ade
Merge remote-tracking branch 'origin/main'
marvin-hansen Jul 4, 2024
e158359
Removed OCI example.
marvin-hansen Jul 4, 2024
518a78b
Regenerate documentation
marvin-hansen Jul 4, 2024
4154f20
Regenerate documentation
marvin-hansen Jul 4, 2024
330fb57
Updated .gitignore files in examples to exclude hidden Mac system files.
marvin-hansen Jul 4, 2024
c0580e0
Fixed a corner case when compiling on older Intel Based Macs.
marvin-hansen Jul 4, 2024
30a4f27
Update sysroot in MUSL example.
marvin-hansen Jul 4, 2024
38752d9
Added Bazelversion file and symlinked all bzlmod examples to it.
marvin-hansen Jul 4, 2024
9aedaca
Removed .DS_Store Apple stuff.
marvin-hansen Jul 5, 2024
3c4d9e4
Formatted C code in FFI example.
marvin-hansen Jul 5, 2024
93e0b68
Formatted proto
marvin-hansen Jul 5, 2024
52eca2b
Merge branch 'bazelbuild:main' into main
marvin-hansen Jul 5, 2024
a2438ff
Formatted proto
marvin-hansen Jul 5, 2024
106a945
Merge remote-tracking branch 'origin/main'
marvin-hansen Jul 5, 2024
27ba0b6
Formatted proto
marvin-hansen Jul 5, 2024
0130fa4
Formatted proto
marvin-hansen Jul 5, 2024
0b405f4
Updated MUSL example
marvin-hansen Jul 5, 2024
82b7546
Formatted Bazelfiles.
marvin-hansen Jul 5, 2024
8c8fc22
Updated MUSL bazelmod example;
marvin-hansen Jul 5, 2024
7939b5b
Added platform tests to cross compile and MUSL example.
marvin-hansen Jul 5, 2024
fb25308
Formatted Bazel files.
marvin-hansen Jul 5, 2024
8a2f8d1
Formatted Bazel files.
marvin-hansen Jul 5, 2024
1854074
Switched MUSL example to MiMalloc
marvin-hansen Jul 5, 2024
f651e98
Removed more .DS_Store files and updated .gitignore
marvin-hansen Jul 5, 2024
200c187
Fixed platform script to work on BSD / Mac and Gnu/Linux systems.
marvin-hansen Jul 5, 2024
772bd63
Added local override to bazelmod MUSL example to test against head.
marvin-hansen Jul 7, 2024
1084934
Working on a patch to resolve MUSL toolchain.
marvin-hansen Jul 7, 2024
7a2576a
Added debug to rust_repository_set
marvin-hansen Jul 7, 2024
389508a
Added first draft to add constraint_value to MUSL toolchain via the a…
marvin-hansen Jul 7, 2024
ae6b370
Removed breaking return statement in abi_to_constraints
marvin-hansen Jul 7, 2024
e29643b
Uncommented MUSL case in abi_to_constraints
marvin-hansen Jul 7, 2024
ee2fd10
Reverted changed in rust_repository_set
marvin-hansen Jul 7, 2024
55713c2
Reverted back
marvin-hansen Jul 7, 2024
4fa6a19
Disabled MUSL on x86_64 due to issue #2726
marvin-hansen Jul 7, 2024
dbe63d7
Update examples/bzlmod/compile_opt/README.md
marvin-hansen Jul 8, 2024
96e1d83
Update examples/bzlmod/musl_cross_compiling/README.md
marvin-hansen Jul 8, 2024
95484c6
Removed bzlmod musl_cross_compiling example due to issue #2726
marvin-hansen Jul 8, 2024
0cc29b9
Updated cross compile Readme.
marvin-hansen Jul 8, 2024
6e97e3e
Removed .DS_Store files files and updated .gitignore
marvin-hansen Jul 8, 2024
dd99d68
Removed musl bazelmod example from CI config.
marvin-hansen Jul 8, 2024
7d099ab
Readme formatting in bzlmod/proto example.
marvin-hansen Jul 8, 2024
b8f87e0
Merge branch 'main' into main
marvin-hansen Jul 9, 2024
ab287dd
Removed all .DS_Store files in proto example.
marvin-hansen Jul 9, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions .bazelci/presubmit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -668,6 +668,40 @@ tasks:
- "//:nix_cross_compiling"
test_targets:
- "//..."
bzlmod_all_crate_deps:
name: Cargo dependencies with bzlmod
platform: ubuntu2004
working_directory: examples/bzlmod/all_crate_deps
build_targets:
- "//..."
bzlmod_all_deps_vendor:
name: Vendored dependencies with bzlmod
platform: ubuntu2004
working_directory: examples/bzlmod/all_deps_vendor
run_targets:
- "//basic/3rdparty:crates_vendor"
build_targets:
- "//..."
bzlmod_compile_opt:
name: Compiler optimization with bzlmod
platform: ubuntu2004
working_directory: examples/bzlmod/compile_opt
build_targets:
- "//..."
bzlmod_cross_compile:
name: Cross compilation with bzlmod
platform: ubuntu2004
working_directory: examples/bzlmod/cross_compile
build_targets:
- "//:all"
test_targets:
- "//..."
bzlmod_ffi:
name: FFI with bzlmod
platform: ubuntu2004
working_directory: examples/bzlmod/ffi
build_targets:
- "//..."
ubuntu2004_bzlmod_bcr:
name: bzlmod BCR presubmit
platform: ubuntu2004
Expand Down Expand Up @@ -717,6 +751,16 @@ tasks:
working_directory: examples/bzlmod/hello_world_no_cargo
build_targets:
- "//..."
bzlmod_musl_cross_compiling:
name: MUSL with bzlmod
platform: ubuntu2004
working_directory: examples/bzlmod/musl_cross_compiling
build_targets:
- "//..."
- "//:all"
- "//musl_scratch:multi_arch_images"
test_targets:
- "//..."
bzlmod_override_targets:
name: Override Targets bzlmod
platform: ubuntu2004
Expand All @@ -725,6 +769,12 @@ tasks:
- "//..."
test_targets:
- "//..."
bzlmod_proto:
name: Proto and Prost with bzlmod
platform: ubuntu2004
working_directory: examples/bzlmod/proto
build_targets:
- "//..."
compile_one_dependency:
name: --compile_one_dependency flag
platform: ubuntu2004
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ MODULE.bazel.lock
.vscode
*.code-workspace

# JetBrains
.idea
.idea/**

# BazelCI
bazelci.py

Expand Down
1 change: 1 addition & 0 deletions examples/bzlmod/.bazelversion
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
7.2.1
1 change: 1 addition & 0 deletions examples/bzlmod/all_crate_deps/.bazelversion
1 change: 1 addition & 0 deletions examples/bzlmod/all_crate_deps/.gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
/bazel-*
.DS_Store
1 change: 1 addition & 0 deletions examples/bzlmod/all_deps_vendor/.bazelversion
2 changes: 2 additions & 0 deletions examples/bzlmod/all_deps_vendor/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/bazel-*
.DS_Store
Empty file.
36 changes: 36 additions & 0 deletions examples/bzlmod/all_deps_vendor/MODULE.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
module(
name = "deps_vendored",
version = "0.0.0",
)

###############################################################################
# B A Z E L C E N T R A L R E G I S T R Y # https://registry.bazel.build/
###############################################################################
# https://github.com/bazelbuild/bazel-skylib/releases/
bazel_dep(name = "bazel_skylib", version = "1.7.1")

# https://github.com/bazelbuild/rules_rust/releases
bazel_dep(name = "rules_rust", version = "0.46.0")

###############################################################################
# T O O L C H A I N S
###############################################################################

# Rust toolchain
RUST_EDITION = "2021"

RUST_VERSION = "1.79.0"

rust = use_extension("@rules_rust//rust:extensions.bzl", "rust")
rust.toolchain(
edition = RUST_EDITION,
versions = [RUST_VERSION],
)
use_repo(rust, "rust_toolchains")

register_toolchains("@rust_toolchains//:all")

###############################################################################
# R U S T C R A T E S
###############################################################################
use_extension("@rules_rust//crate_universe:extension.bzl", "crate")
178 changes: 178 additions & 0 deletions examples/bzlmod/all_deps_vendor/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
# Vendored Rust Dependencies

This example shows how to vendor Rust dependencies and use those vendored dependencies in a binary target.
You can run the example vendoring target:

`bazel run //basic/3rdparty:crates_vendor`

And the build target:

`bazel build //...`

## Setup

For the setup,
you need to add the skylib in addition to the rust rules to your MODUE.bazel.

```starlark
module(
name = "deps_vendored",
version = "0.0.0"
)
###############################################################################
# B A Z E L C E N T R A L R E G I S T R Y # https://registry.bazel.build/
###############################################################################
# https://github.com/bazelbuild/bazel-skylib/releases/
bazel_dep(name = "bazel_skylib", version = "1.7.1")

# https://github.com/bazelbuild/rules_rust/releases
bazel_dep(name = "rules_rust", version = "0.46.0")

###############################################################################
# T O O L C H A I N S
###############################################################################

# Rust toolchain
RUST_EDITION = "2021"
RUST_VERSION = "1.79.0"

rust = use_extension("@rules_rust//rust:extensions.bzl", "rust")
rust.toolchain(
edition = RUST_EDITION,
versions = [RUST_VERSION],
)
use_repo(rust, "rust_toolchains")
register_toolchains("@rust_toolchains//:all")

###############################################################################
# R U S T C R A T E S
###############################################################################
crate = use_extension("@rules_rust//crate_universe:extension.bzl", "crate")
```

Note, it is important to load the crate_universe rules otherwise you will get an error
as the rule set is needed in the vendored target.

Assuming you have a package called `basic` in which you want to vendor dependencies,
then you create a folder `basic/3rdparty`. The folder name can be arbitrary,
but by convention, its either thirdparty or 3rdparty to indicate vendored dependencies.
In the 3rdparty folder, you add a target crates_vendor to declare your dependencies to vendor. In the example, we vendor a specific version of bzip2.

```starlark
load("@rules_rust//crate_universe:defs.bzl", "crate", "crates_vendor")

crates_vendor(
name = "crates_vendor",
annotations = {
"bzip2-sys": [crate.annotation(
gen_build_script = True,
)],
},
cargo_lockfile = "Cargo.Bazel.lock",
generate_build_scripts = False,
mode = "remote",
packages = {
"bzip2": crate.spec(
version = "=0.3.3",
),
},
repository_name = "basic",
tags = ["manual"],
)
```

Next, you have to run `Cargo build` to generate a Cargo.lock file with all resolved dependencies.
Then, you rename Cargo.lock to Cargo.Bazel.lock and place it inside the `basic/3rdparty` folder.

At this point, you have the following folder and files:

```
basic
├── 3rdparty
│ ├── BUILD.bazel
│ ├── Cargo.Bazel.lock
```

Now you can run the `crates_vendor` target:

`bazel run //basic/3rdparty:crates_vendor`

This generates a crate folders with all configurations for the vendored dependencies.

```
basic
├── 3rdparty
│ ├── cratea
│ ├── BUILD.bazel
│ ├── Cargo.Bazel.lock
```

## Usage

Suppose you have an application in `basic/src` that is defined in `basic/BUILD.bazel` and
that depends on a vendored dependency. You find a list of all available vendored dependencies
in the BUILD file of the generated folder: `basic/3rdparty/crates/BUILD.bazel`
You declare a vendored dependency in you target as following:

```starlark
load("@rules_rust//rust:defs.bzl", "rust_binary")

rust_binary(
name = "hello_sys",
srcs = ["src/main.rs"],
# Note the `crate_unvierse` dependencies here need to have been loaded
# in the WORKSPACE file. See `//:sys_deps.bzl` for more details.
deps = ["//basic/3rdparty/crates:bzip2"],
visibility = ["//visibility:public"],
)
```
Note, the vendored dependency is not yet accessible.

Before you can build, you have to define how to load the vendored dependencies. For that,
you first create a file `sys_deps.bzl` and add the following content:

```starlark
# rename the default name "crate_repositories" in case you import multiple vendored folders.
load("//basic/3rdparty/crates:defs.bzl", basic_crate_repositories = "crate_repositories")

def sys_deps():
"""
This macro loads dependencies for the `basic` crate examples

Commonly `*-sys` crates are built on top of some existing library and
will have a number of dependencies. The examples here use
[crate_universe](https://bazelbuild.github.io/rules_rust/crate_universe.html)
to gather these dependencies and make them available in the workspace.
"""

# Load the vendored dependencies
basic_crate_repositories()
```

This is straightforward, you import the generated crate_repositories from the crates folder,
rename it to avoid name clashes in case you import from multiple vendored folders, and then
just load the vendored dependencies.

In a WORKSPACE configuration, you would just load and call sys_deps(), but in a MODULE configuration, you cannot do that. Instead, you create a new file `WORKSPACE.bzlmod` and add the following content.

```starlark
load("//:sys_deps.bzl", "sys_deps")
sys_deps()
```

Now, you can build the project as usual:

`bazel build //...`

If you ever see an error referring to some cyclical dependencies in a WORKSPACE, it
is caused because you did not load the bazel_skylib at the top of the MODULE.bazel file.
To fix this error, make sure to have the following entry in your MODULE.bazel file:

```starlark
# ...
# https://github.com/bazelbuild/bazel-skylib/releases/
bazel_dep(name = "bazel_skylib", version = "1.7.1")
# ....
```

Your build will complete once skylib loads.
10 changes: 10 additions & 0 deletions examples/bzlmod/all_deps_vendor/WORKSPACE.bzlmod
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
###############################################################################
# Bzlmod and WORKSPACE can work side by side, which allows migrating dependencies
# from the WORKSPACE file to Bzlmod to be a gradual process.
# https://bazel.build/external/migration#hybrid-mode
###############################################################################
# rule http_archive
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

load("//:sys_deps.bzl", "sys_deps")
sys_deps()
20 changes: 20 additions & 0 deletions examples/bzlmod/all_deps_vendor/basic/3rdparty/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
load("@rules_rust//crate_universe:defs.bzl", "crate", "crates_vendor")

crates_vendor(
name = "crates_vendor",
annotations = {
"bzip2-sys": [crate.annotation(
gen_build_script = True,
)],
},
cargo_lockfile = "Cargo.Bazel.lock",
generate_build_scripts = False,
mode = "remote",
packages = {
"bzip2": crate.spec(
version = "=0.3.3",
),
},
repository_name = "basic",
tags = ["manual"],
)
49 changes: 49 additions & 0 deletions examples/bzlmod/all_deps_vendor/basic/3rdparty/Cargo.Bazel.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading