diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2190dd55c4b..cbc50ba581f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -233,6 +233,24 @@ jobs: RUSTFLAGS: '--cfg=taproot' RUSTDOCFLAGS: '--cfg=taproot' + check_docs: + runs-on: self-hosted + env: + # While docs.rs builds using a nightly compiler (and we use some nightly features), + # nightly ends up randomly breaking builds occasionally, so we instead use beta + # and set RUSTC_BOOTSTRAP in check-docsrs.sh + TOOLCHAIN: beta + steps: + - name: Checkout source code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Install Rust ${{ env.TOOLCHAIN }} toolchain + run: | + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile=minimal --default-toolchain ${{ env.TOOLCHAIN }} + - name: Simulate docs.rs build + run: ci/check-docsrs.sh + fuzz: runs-on: self-hosted env: diff --git a/ci/check-docsrs.sh b/ci/check-docsrs.sh new file mode 100755 index 00000000000..b8776f8ac57 --- /dev/null +++ b/ci/check-docsrs.sh @@ -0,0 +1,42 @@ +#!/bin/bash +#shellcheck disable=SC2002,SC2086,SC2207 + +set -ex + +# Attempt to simulate the docsrs builds. Sadly its not entirely trivial as +# docs.rs reads metadata out of Cargo.toml which we don't want to have a whole +# parser for. + +WORKSPACE_MEMBERS=( $(cat Cargo.toml | tr '\n' '\r' | sed 's/\r //g' | tr '\r' '\n' | grep '^members =' | sed 's/members.*=.*\[//' | tr -d '"' | tr ',' '\n') ) +echo "${WORKSPACE_MEMBERS[@]}" +for CRATE in "${WORKSPACE_MEMBERS[@]}"; do + pushd "$CRATE" + CARGO_ARGS="" + RUSTDOC_ARGS="" + cat Cargo.toml | grep -A 100 '\[package.metadata.docs.rs\]' | tail -n +2 > /tmp/ldk-docsrs-rustdoc-config.txt + while read -r LINE; do + case "$LINE" in + "["*) break;; + "features"*) + OG_IFS="$IFS" + IFS=',' + for FEATURE in $(echo "$LINE" | sed 's/features.*=.*\[//g' | tr -d '"] '); do + export CARGO_ARGS="$CARGO_ARGS --features $FEATURE" + done + IFS="$OG_IFS" + ;; + "all-features = true") + export CARGO_ARGS="$CARGO_ARGS --all-features" + ;; + "rustdoc-args"*) + RUSTDOC_ARGS="$(echo "$LINE" | sed 's/rustdoc-args.*=.*\[//g' | tr -d '"],')" + ;; + esac + done < /tmp/ldk-docsrs-rustdoc-config.txt + rm /tmp/ldk-docsrs-rustdoc-config.txt + echo "Building $CRATE with args $CARGO_ARGS and flags $RUSTDOC_ARGS" + # We rely on nightly features but want to use a stable release in CI to avoid + # spurous breakage, thus we set RUSTC_BOOTSTRAP=1 here. + RUSTC_BOOTSTRAP=1 cargo rustdoc $CARGO_ARGS -- $RUSTDOC_ARGS + popd +done diff --git a/ci/ci-tests.sh b/ci/ci-tests.sh index f78414052f5..c3637abeb36 100755 --- a/ci/ci-tests.sh +++ b/ci/ci-tests.sh @@ -1,4 +1,5 @@ #!/bin/bash +#shellcheck disable=SC2002,SC2207 set -eox pipefail RUSTC_MINOR_VERSION=$(rustc --version | awk '{ split($2,a,"."); print a[2] }') @@ -41,23 +42,7 @@ export RUST_BACKTRACE=1 echo -e "\n\nChecking the workspace, except lightning-transaction-sync." cargo check --verbose --color always -# When the workspace members change, make sure to update the list here as well -# as in `Cargo.toml`. -WORKSPACE_MEMBERS=( - lightning - lightning-types - lightning-block-sync - lightning-invoice - lightning-net-tokio - lightning-persister - lightning-background-processor - lightning-rapid-gossip-sync - lightning-custom-message - lightning-macros - lightning-dns-resolver - lightning-liquidity - possiblyrandom -) +WORKSPACE_MEMBERS=( $(cat Cargo.toml | tr '\n' '\r' | sed 's/\r //g' | tr '\r' '\n' | grep '^members =' | sed 's/members.*=.*\[//' | tr -d '"' | tr ',' ' ') ) echo -e "\n\nTesting the workspace, except lightning-transaction-sync." cargo test --verbose --color always diff --git a/lightning-background-processor/src/lib.rs b/lightning-background-processor/src/lib.rs index 30343de747b..2b8bfb0c1a2 100644 --- a/lightning-background-processor/src/lib.rs +++ b/lightning-background-processor/src/lib.rs @@ -13,7 +13,7 @@ #![deny(rustdoc::broken_intra_doc_links)] #![deny(rustdoc::private_intra_doc_links)] #![deny(missing_docs)] -#![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #![cfg_attr(all(not(feature = "std"), not(test)), no_std)] #[cfg(any(test, feature = "std"))] diff --git a/lightning-block-sync/src/lib.rs b/lightning-block-sync/src/lib.rs index c1684532181..8656ba6ec6b 100644 --- a/lightning-block-sync/src/lib.rs +++ b/lightning-block-sync/src/lib.rs @@ -17,7 +17,7 @@ #![deny(rustdoc::private_intra_doc_links)] #![deny(missing_docs)] #![deny(unsafe_code)] -#![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #[cfg(any(feature = "rest-client", feature = "rpc-client"))] pub mod http; diff --git a/lightning-invoice/src/lib.rs b/lightning-invoice/src/lib.rs index ecffcf889a7..3634d67f1da 100644 --- a/lightning-invoice/src/lib.rs +++ b/lightning-invoice/src/lib.rs @@ -5,7 +5,7 @@ #![deny(non_camel_case_types)] #![deny(non_snake_case)] #![deny(unused_mut)] -#![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #![cfg_attr(all(not(feature = "std"), not(test)), no_std)] //! This crate provides data structures to represent diff --git a/lightning-liquidity/src/lib.rs b/lightning-liquidity/src/lib.rs index ee081f720c6..2f1d5bd01e7 100644 --- a/lightning-liquidity/src/lib.rs +++ b/lightning-liquidity/src/lib.rs @@ -48,7 +48,7 @@ #![allow(bare_trait_objects)] #![allow(ellipsis_inclusive_range_patterns)] #![allow(clippy::drop_non_drop)] -#![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #![cfg_attr(not(any(test, feature = "std")), no_std)] #[macro_use] diff --git a/lightning-macros/src/lib.rs b/lightning-macros/src/lib.rs index a1df4d49a3c..e784acf72fb 100644 --- a/lightning-macros/src/lib.rs +++ b/lightning-macros/src/lib.rs @@ -16,7 +16,7 @@ #![forbid(unsafe_code)] #![deny(rustdoc::broken_intra_doc_links)] #![deny(rustdoc::private_intra_doc_links)] -#![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] extern crate alloc; diff --git a/lightning-net-tokio/src/lib.rs b/lightning-net-tokio/src/lib.rs index f238a7da5fa..2ec69de3f5d 100644 --- a/lightning-net-tokio/src/lib.rs +++ b/lightning-net-tokio/src/lib.rs @@ -25,7 +25,7 @@ #![deny(rustdoc::broken_intra_doc_links)] #![deny(rustdoc::private_intra_doc_links)] #![deny(missing_docs)] -#![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] use bitcoin::secp256k1::PublicKey; diff --git a/lightning-persister/src/lib.rs b/lightning-persister/src/lib.rs index 9d4df264d24..0e3541e1b27 100644 --- a/lightning-persister/src/lib.rs +++ b/lightning-persister/src/lib.rs @@ -3,7 +3,7 @@ #![deny(rustdoc::broken_intra_doc_links)] #![deny(rustdoc::private_intra_doc_links)] #![deny(missing_docs)] -#![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #[cfg(ldk_bench)] extern crate criterion; diff --git a/lightning-transaction-sync/src/lib.rs b/lightning-transaction-sync/src/lib.rs index d221a1d48a8..baf074a7bca 100644 --- a/lightning-transaction-sync/src/lib.rs +++ b/lightning-transaction-sync/src/lib.rs @@ -69,7 +69,7 @@ #![deny(rustdoc::private_intra_doc_links)] #![deny(missing_docs)] #![deny(unsafe_code)] -#![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #[cfg(any(feature = "esplora-blocking", feature = "esplora-async"))] mod esplora; diff --git a/lightning-types/src/lib.rs b/lightning-types/src/lib.rs index 3c02bb91223..7f72d6d2671 100644 --- a/lightning-types/src/lib.rs +++ b/lightning-types/src/lib.rs @@ -18,7 +18,7 @@ #![forbid(unsafe_code)] #![deny(rustdoc::broken_intra_doc_links)] #![deny(rustdoc::private_intra_doc_links)] -#![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] extern crate alloc; extern crate core; diff --git a/lightning/src/lib.rs b/lightning/src/lib.rs index 4e9d105df5f..ee3b0f47a4d 100644 --- a/lightning/src/lib.rs +++ b/lightning/src/lib.rs @@ -37,7 +37,7 @@ // that don't do anything but annoy us and cant actually ever be resolved. #![allow(bare_trait_objects)] #![allow(ellipsis_inclusive_range_patterns)] -#![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #![cfg_attr(all(not(feature = "std"), not(test)), no_std)] #[cfg(all(fuzzing, test))]