Skip to content

Commit 1c7a1a5

Browse files
authored
Polkadot-SDK Umbrella Crate (#3935)
# Umbrella Crate The Polkadot-SDK "umbrella" is a crate that re-exports all other published crates. This makes it possible to have a very small `Cargo.toml` file that only has one dependency, the umbrella crate. This helps with selecting the right combination of crate versions, since otherwise 3rd party tools are needed to select a compatible set of versions. ## Features The umbrella crate supports no-std builds and can therefore be used in the runtime and node. There are two main features: `runtime` and `node`. The `runtime` feature enables all `no-std` crates, while the `node` feature enables all `std` crates. It should be used like any other crate in the repo, with `default-features = false`. For more fine-grained control, additionally, each crate can be enabled selectively. The umbrella exposes one feature per dependency. For example, if you only want to use the `frame-support` crate, you can enable the `frame-support` feature. The umbrella exposes a few more general features: - `tuples-96`: Needs to be enabled for runtimes that have more than 64 pallets. - `serde`: Specifically enable `serde` en/decoding support. - `experimental`: Experimental enable experimental features - should not yet used in production. - `with-tracing`: Enable tracing support. - `try-runtime`, `runtime-benchmarks` and `std`: These follow the standard conventions. - `runtime`: As described above, enable all `no-std` crates. - `node`: As described above, enable all `std` crates. - There does *not* exist a dedicated docs feature. To generate docs, enable the `runtime` and `node` feature. For docs.rs the manifest contains specific configuration to make it show up all re-exports. There is a specific `zepter` check in place to ensure that the features of the umbrella are correctly configured. This check is run in CI and locally when running `zepter`. ## Generation The umbrella crate needs to be updated every time when a new crate is added or removed from the workspace. It is checked in CI by calling its generation script. The generation script is located in `./scripts/generate-umbrella.py` and needs dependency `cargo_workspace`. Example: `python3 scripts/generate-umbrella.py --sdk . --version 1.9.0` ## Usage > Note: You can see a live example in the `staging-node-cli` and `kitchensink-runtime` crates. The umbrella crate can be added to your runtime crate like this: `polkadot-sdk = { path = "../../../../umbrella", features = ["runtime"], default-features = false}` or for a node: `polkadot-sdk = { path = "../../../../umbrella", features = ["node"], default-features = false }` In the code, it is then possible to bring all dependencies into scope via: `use polkadot_sdk::*;` ### Known Issues The only known issue so far is the fact that the `use` statement brings the dependencies only into the outer module scope - not the global crate scope. For example, the following code would need to be adjusted: ```rust use polkadot_sdk::*; mod foo { // This does sadly not compile: frame_support::parameter_types! { } // Instead, we need to do this (or add an equivalent `use` statement): polkadot_sdk::frame_support::parameter_types! { } } ``` Apart from this, no issues are known. There could be some bugs with how macros locate their own re-exports. Please compile issues that arise from using this crate. ## Dependencies The umbrella crate re-exports all published crates, with a few exceptions: - Runtime crates like `rococo-runtime` etc are not exported. This otherwise leads to very weird compile errors and should not be needed anyway. - Example and fuzzing crates are not exported. This is currently detected by checking the name of the crate for these magic words. In the future, it will utilize custom metadata, as it is done in the `rococo-runtime` crate. - The umbrella crate itself. Should be obvious :) ## Follow Ups - [ ] Re-writing the generator in Rust - the python script is at its limit. - [ ] Using custom metadata to exclude some crates instead of filtering by names. - [ ] Finding a way to setting the version properly. Currently its locked in the CI script. --------- Signed-off-by: Oliver Tale-Yazdi <[email protected]>
1 parent 49bd6a6 commit 1c7a1a5

File tree

39 files changed

+4907
-747
lines changed

39 files changed

+4907
-747
lines changed

.config/lychee.toml

+1
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,6 @@ exclude = [
5151
"https://www.reddit.com/r/rust/comments/3spfh1/does_collect_allocate_more_than_once_while/",
5252
# 403 rate limited:
5353
"https://etherscan.io/block/11090290",
54+
"https://subscan.io/",
5455
"https://substrate.stackexchange.com/.*",
5556
]

.config/zepter.yaml

+5-1
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,13 @@ workflows:
2525
'--show-path',
2626
'--quiet',
2727
]
28-
# Same as `check`, but with the `--fix` flag.
28+
# The umbrella crate uses more features, so we to check those too:
29+
check_umbrella:
30+
- [ $check.0, '--features=serde,experimental,with-tracing,tuples-96,with-tracing', '-p=polkadot-sdk' ]
31+
# Same as `check_*`, but with the `--fix` flag.
2932
default:
3033
- [ $check.0, '--fix' ]
34+
- [ $check_umbrella.0, '--fix' ]
3135

3236
# Will be displayed when any workflow fails:
3337
help:

.github/workflows/check-features.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
- name: Check
1414
uses: hack-ink/cargo-featalign-action@bea88a864d6ca7d0c53c26f1391ce1d431dc7f34 # v0.1.1
1515
with:
16-
crate: substrate/bin/node/runtime
16+
crate: templates/parachain/runtime/
1717
features: std,runtime-benchmarks,try-runtime
1818
ignore: sc-executor
1919
default-std: true

.github/workflows/checks-quick.yml

+30
Original file line numberDiff line numberDiff line change
@@ -116,3 +116,33 @@ jobs:
116116
run: |
117117
echo "Checking markdown formatting. More info: docs/contributor/markdown_linting.md"
118118
markdownlint --config "$CONFIG" --ignore target .
119+
check-umbrella:
120+
runs-on: arc-runners-polkadot-sdk
121+
timeout-minutes: 10
122+
needs: [set-image]
123+
container:
124+
image: ${{ needs.set-image.outputs.IMAGE }}
125+
steps:
126+
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.0 (22. Sep 2023)
127+
- name: install python deps
128+
run: |
129+
sudo apt-get update && sudo apt-get install -y python3-pip python3
130+
pip3 install "cargo-workspace>=1.2.4" toml
131+
- name: check umbrella correctness
132+
run: |
133+
python3 scripts/generate-umbrella.py --sdk . --version 0.1.0
134+
cargo +nightly fmt --all
135+
if [ -n "$(git status --porcelain)" ]; then
136+
cat <<EOF
137+
👋 Hello developer! The SemVer information that you declared in the prdoc file did not match what the CI detected.
138+
139+
Please check the output above and see the following links for more help:
140+
- https://github.com/paritytech/polkadot-sdk/blob/master/docs/contributor/prdoc.md#record-semver-changes
141+
- https://forum.polkadot.network/t/psa-polkadot-sdk-to-use-semver
142+
143+
Otherwise feel free to ask in the Merge Request or in Matrix chat.
144+
EOF
145+
146+
git diff
147+
exit 1
148+
fi

0 commit comments

Comments
 (0)