| # Copyright 2022 Google LLC |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| # This script contains common functions which can be used to help when building |
| # specific components of the beto-rust repo. To load these into your environment |
| # run `source ./scripts/build-script.sh` Then run the functions from root |
| # This can also be sourced to help when writing further build scripts |
| |
| export SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) |
| |
| # Use to generate headers for new source code files |
| gen_headers() { |
| set -e |
| $HOME/go/bin/addlicense -c "Google LLC" -l apache -ignore=**/android/build/** -ignore=target/** -ignore=**/target/** -ignore=".idea/*" -ignore=**/cmake-build/** -ignore="**/java/build/**" . |
| } |
| |
| # Checks the workspace 3rd party crates and makes sure they have a valid license |
| check_crate_licenses(){ |
| set -e |
| cd $SCRIPT_DIR/.. |
| cargo deny --workspace check |
| } |
| |
| # Checks everything in beto-rust |
| check_everything(){ |
| set -e |
| cd $SCRIPT_DIR/.. |
| check_license_headers |
| check_workspace |
| check_boringssl |
| check_ldt_ffi |
| build_fuzzers |
| } |
| |
| # Checks everything included in the top level workspace |
| check_workspace(){ |
| set -e |
| cd $SCRIPT_DIR/.. |
| # ensure formatting is correct (Check for it first because it is fast compared to running tests) |
| cargo fmt --check |
| # make sure everything compiles |
| cargo check --workspace --all-targets |
| # run all the tests |
| cargo test --workspace --quiet |
| # ensure the docs are valid (cross-references to other code, etc) |
| cargo doc --workspace --no-deps |
| cargo clippy --all-targets |
| cargo deny --workspace check |
| # Check the build for targets without using RustCrypto dependencies |
| cargo check --features=openssl --no-default-features |
| } |
| |
| # Checks that the license auditing tool is installed and that all source files in the project contain the needed headers |
| check_license_headers() { |
| set -e |
| cd $SCRIPT_DIR/.. |
| # install location for those following the default instructions |
| ADDLICENSE="$HOME/go/bin/addlicense" |
| if [ ! -x "$ADDLICENSE" ]; then |
| # if not in the default place, assume it's in PATH |
| ADDLICENSE="addlicense" |
| fi |
| |
| # see README for instructions on setting up addlicense tool |
| if ($ADDLICENSE -h >/dev/null 2>&1); then |
| echo "Add license is already installed" |
| else |
| echo "ERROR: addlicense tool is not installed, see instructions in README" |
| exit 1 |
| fi |
| |
| if $ADDLICENSE -check \ |
| -ignore="**/android/build/**" \ |
| -ignore="target/**" \ |
| -ignore="**/target/**" \ |
| -ignore="**/.idea/**" \ |
| -ignore="**/cmake-build/**" \ |
| -ignore="**/java/build/**" \ |
| -ignore="**/java/*/build/**" \ |
| .; then |
| echo "License header check succeeded!" |
| else |
| echo "ERROR: License header missing for above files" |
| exit 1 |
| fi |
| } |
| |
| # Build all fuzz targets |
| build_fuzzers() { |
| set -e |
| cd $SCRIPT_DIR/.. |
| # rust fuzzers |
| for fuzzed_crate in presence/xts_aes presence/ldt presence/ldt_np_adv connections/ukey2/ukey2_connections; do |
| (cd "$fuzzed_crate" && cargo +nightly fuzz build) |
| done |
| |
| # ffi fuzzers |
| rm -Rf presence/ldt_np_adv_ffi_fuzz/cmake-build |
| (cd presence/ldt_np_adv_ffi_fuzz && mkdir -p cmake-build && cd cmake-build && cmake ../.. -DENABLE_FUZZ=true && make) |
| rm -Rf presence/ldt_np_adv_ffi_fuzz/cmake-build |
| } |
| |
| # Builds and runs all tests for all combinations of features for the LDT FFI |
| check_ldt_ffi() { |
| set -e |
| cd $SCRIPT_DIR/.. |
| # We need to handle ldt_np_adv_ffi separately since it requires the nightly toolchain |
| cd presence/ldt_np_adv_ffi |
| cargo fmt --check |
| cargo check |
| # Default build, RustCrypto + no_std |
| cargo build --release |
| # Turn on std, still using RustCrypto |
| cargo build --features=std |
| # Turn off default features and try to build with std |
| cargo build --no-default-features --features=std |
| # Turn off RustCrypto and use openssl |
| cargo build --no-default-features --features=openssl |
| # Turn off RustCrypto and use boringssl |
| cargo build --no-default-features --features=boringssl |
| cargo doc --no-deps |
| cargo clippy --release |
| cargo clippy --features=std |
| cargo clippy --no-default-features --features=openssl |
| cargo clippy --no-default-features --features=boringssl |
| cargo clippy --no-default-features --features=std |
| cargo deny check |
| cd ../ |
| |
| # build C/C++ samples, tests, and benches |
| mkdir -p cmake-build && cd cmake-build |
| cmake .. -DENABLE_TESTS=true |
| make |
| |
| # test with default build settings (rustcrypto, no_std) |
| echo "Testing default features (no_std + rustcrypto)" |
| (cd ../ldt_np_adv_ffi && cargo build --release) |
| (cd ldt_np_c_sample/tests && ctest) |
| |
| # test with std |
| echo "Testing std feature flag" |
| (cd ../ldt_np_adv_ffi && cargo build --features std --release) |
| (cd ldt_np_c_sample/tests && make && ctest) |
| |
| # test with boringssl crypto feature flag |
| echo "Testing boringssl" |
| (cd ../ldt_np_adv_ffi && cargo build --no-default-features --features boringssl --release) |
| (cd ldt_np_c_sample/tests && make && ctest) |
| |
| # test with openssl feature flag |
| echo "Testing openssl" |
| (cd ../ldt_np_adv_ffi && cargo build --no-default-features --features openssl --release) |
| (cd ldt_np_c_sample/tests && make && ctest) |
| |
| # test with std feature flag |
| echo "Testing std with no default features" |
| (cd ../ldt_np_adv_ffi && cargo build --no-default-features --features std --release) |
| (cd ldt_np_c_sample/tests && make && ctest) |
| cd ../ |
| } |
| |
| # Clones boringssl and uses bindgen to generate the rust crate, applies AOSP |
| # specific patches to the 3p `openssl` crate so that it can use a bssl backend |
| prepare_boringssl() { |
| set -e |
| cd $SCRIPT_DIR/../.. |
| projectroot=$PWD |
| mkdir -p boringssl-build && cd boringssl-build |
| |
| if ! git -C boringssl pull origin master; then |
| git clone https://boringssl.googlesource.com/boringssl |
| fi |
| cd boringssl && mkdir -p build && cd build |
| cmake -G Ninja .. -DRUST_BINDINGS="$(gcc -dumpmachine)" && ninja |
| # A valid Rust crate is built under `boringssl-build/boringssl/build/rust/bssl-sys` |
| |
| cd $projectroot/boringssl-build |
| rm -Rf rust-openssl |
| git clone https://github.com/sfackler/rust-openssl.git |
| git -C rust-openssl checkout 11797d9ecb73e94b7f55a49274318abc9dc074d2 |
| git -C rust-openssl branch -f BASE_COMMIT |
| git -C rust-openssl am $projectroot/nearby/scripts/openssl-patches/*.patch |
| |
| cd $projectroot/nearby |
| |
| cat <<'EOF' >&2 |
| ========== |
| Preparation complete. The required repositories are downloaded to `beto-rust/boringssl-build`. If |
| you need to go back to a clean state, you can remove that directory and rerun this script. |
| |
| You can now build and test with boringssl using the following command |
| `cargo --config .cargo/config-boringssl.toml test -p crypto_provider* --features=boringssl,std` |
| ========== |
| EOF |
| echo |
| } |
| |
| # Checks the build and tests for all boringssl related deps |
| # crypto_provider_openssl is used on AOSP |
| # crypto_provider_boringssl is used on Chromium |
| # And we want to verify that both of these are tested in our own repo |
| check_boringssl() { |
| set -e |
| cd $SCRIPT_DIR/../.. |
| # clones boringssl and uses bindgen to generate the sys bindings |
| prepare_boringssl |
| |
| # test the openssl crate with the boringssl feature |
| cargo --config .cargo/config-boringssl.toml test -p crypto_provider_openssl --features=boringssl |
| |
| # test the crypto_provider built on the new bssl crate |
| cd crypto/crypto_provider_boringssl |
| cargo check |
| cargo fmt --check |
| cargo clippy --all-targets |
| cargo test |
| cargo doc --no-deps |
| cd ../../ |
| } |
| |
| # Helper for setting up dependencies on the build machine |
| setup_kokoro_macos () { |
| set -e |
| go install github.com/google/addlicense@latest |
| curl https://sh.rustup.rs -sSf | sh -s -- -y --no-modify-path --default-toolchain 1.68.0 |
| cargo install --locked cargo-deny --color never 2>&1 |
| source "$HOME/.cargo/env" |
| rustup install nightly |
| brew install rapidjson google-benchmark ninja bindgen |
| |
| # Unfortunately CMake is not smart enough to find this on its own, even though |
| # it is in fact there by default on the build machines |
| export OPENSSL_ROOT_DIR="/usr/local/opt/openssl@3" |
| } |