#!/bin/bash # Copyright 2018 Google LLC # # Use of this source code is governed by an MIT-style # license that can be found in the LICENSE file or at # https://opensource.org/licenses/MIT. # This script tests that a build with multiple versions of the Mundane crate in # the same build graph works properly. It performs the following steps: # - Create a temporary directory # - Create two copies of Mundane - mundane-v1, and mundane-v2 - which directly # expose the boringssl::ffi module so that dependent crates can access the raw # symbols # - Create two crates, one depending on mundane-v1, and one on mundane-v2, each # of which exposes all of the BoringSSL symbols from Mundane # - Create a top-level program which depends on both of these crates # - Have the top-level program's main link all of the Mundane functions from # each of the crates # - Produce a release build, which forces linking, to make sure that linking # these two versions of the library at the same time works properly set -e # the directory this script lives in readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" CRATE_ROOT="${SCRIPT_DIR}/.." TMP="$(mktemp -d)" trap "rm -rf $TMP" EXIT cd "$TMP" # NOTE: The -L means to follow symlinks cp -LR "$CRATE_ROOT" mundane-v1 cp -LR "$CRATE_ROOT" mundane-v2 echo "$TMP" # # Make Mundane crates # # Update the Cargo.toml versions and names in place to be distinct sed -i'' -e 's/^name =.*/name = "mundane-v1"/' mundane-v1/Cargo.toml sed -i'' -e 's/^version =.*/version = "1.0.0"/' mundane-v1/Cargo.toml sed -i'' -e 's/^name =.*/name = "mundane-v2"/' mundane-v2/Cargo.toml sed -i'' -e 's/^version =.*/version = "2.0.0"/' mundane-v2/Cargo.toml # Update the link directive to use the right version number sed -i'' -e 's/#[link(name = "crypto_[0-9]*_[0-9]*_[0-9]*")]/#[link(name = "crypto_1_0_0")]/' mundane-v1/boringssl/boringssl.rs sed -i'' -e 's/#[link(name = "crypto_[0-9]*_[0-9]*_[0-9]*")]/#[link(name = "crypto_2_0_0")]/' mundane-v2/boringssl/boringssl.rs # Update the link_name directives to use the right version number sed -i'' -e 's/__RUST_MUNDANE_[0-9]*_[0-9]*_[0-9]*_/__RUST_MUNDANE_1_0_0_/' mundane-v1/boringssl/boringssl.rs sed -i'' -e 's/__RUST_MUNDANE_[0-9]*_[0-9]*_[0-9]*_/__RUST_MUNDANE_2_0_0_/' mundane-v2/boringssl/boringssl.rs # Mark the ffi module as public sed -i'' -e 's/^mod ffi;$/pub mod ffi;/' mundane-v1/src/boringssl/mod.rs sed -i'' -e 's/^mod ffi;$/pub mod ffi;/' mundane-v2/src/boringssl/mod.rs # Make Mundane directly expose the ffi module echo "pub use boringssl::ffi;" >> mundane-v1/src/lib.rs echo "pub use boringssl::ffi;" >> mundane-v2/src/lib.rs # # Make crates which depend on Mundane # # Usage: make_crate function make_crate { CRATE_NAME="$1" DEP_NAME="$2" DEP_NAME_RS="$(echo ${DEP_NAME} | tr - _)" mkdir "$CRATE_NAME" mkdir "${CRATE_NAME}/src" # Re-export all symbols from Mundane cat >> "${CRATE_NAME}/src/lib.rs" <> "${CRATE_NAME}/Cargo.toml" <> Cargo.toml <> src/main.rs <> src/main.rs rg -U 'extern "C" \{\n[^\n]*\n pub fn [0-9A-Za-z_]*([^)]*)' "${SCRIPT_DIR}/boringssl.rs" | \ grep '^ *pub fn' | sed -e 's/.*pub fn \([^(]*\).*/println!("{:?}", depends_mundane_v2::\1 as *const ());/' >> src/main.rs echo '}' >> src/main.rs cargo build --release