diff --git a/.github/workflows/cross.yml b/.github/workflows/cross.yml index 2fd645a37c3..7b60e637c8f 100644 --- a/.github/workflows/cross.yml +++ b/.github/workflows/cross.yml @@ -21,12 +21,11 @@ env: jobs: aws-lc-rs-cross-test: if: github.repository_owner == 'aws' - name: aws-lc-rs cross tests - runs-on: ${{ matrix.os }} + name: cross tests ${{ matrix.target }} + runs-on: ubuntu-22.04 strategy: fail-fast: false matrix: - os: [ ubuntu-22.04 ] target: - aarch64-linux-android - aarch64-unknown-linux-gnu @@ -51,18 +50,21 @@ jobs: with: toolchain: 'stable' - name: Install cross - run: cargo install cross ${{ (matrix.target == 'riscv64gc-unknown-linux-gnu' && '--locked') || '' }} --git https://github.com/cross-rs/cross + run: cargo install cross --git https://github.com/cross-rs/cross - uses: dtolnay/rust-toolchain@master id: toolchain with: - toolchain: ${{ (matrix.target == 'riscv64gc-unknown-linux-gnu' && '1.72.1') || 'stable' }} + toolchain: 'stable' target: ${{ matrix.target }} - name: Set Rust toolchain override run: rustup override set ${{ steps.toolchain.outputs.name }} + # The flag below is set to avoid the following error with GCC 11.4.0 on the riscv64 platform: + # /home/runner/work/aws-lc-rs/aws-lc-rs/aws-lc-sys/aws-lc/crypto/pem/pem_lib.c:707:11: error: 'strncmp' of strings of length 1 and 9 and bound of 9 evaluates to nonzero [-Werror=string-compare] + # 707 | if (strncmp(buf, "-----END ", 9) == 0) { + # | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ - if: ${{ matrix.target == 'riscv64gc-unknown-linux-gnu' }} run: | - cargo update - cargo update -p clap --precise 4.4.18 + echo 'AWS_LC_SYS_CFLAGS="-Wno-string-compare"' >> "$GITHUB_ENV" - name: Cross-compilation (build debug) run: cross build -p aws-lc-rs --features unstable --target ${{ matrix.target }} - name: Cross-compilation (test release) diff --git a/Cross.toml b/Cross.toml index 027a609beea..6b2c7012f34 100644 --- a/Cross.toml +++ b/Cross.toml @@ -27,5 +27,5 @@ passthrough = [ "AWS_LC_SYS_EXTERNAL_BINDGEN", "AWS_LC_FIPS_SYS_EXTERNAL_BINDGEN", "AWS_LC_SYS_STATIC", "AWS_LC_FIPS_SYS_STATIC", "AWS_LC_SYS_CMAKE_BUILDER", "AWS_LC_SYS_CC_SRC_COLLECTOR", - "GOPROXY", + "GOPROXY", "AWS_LC_SYS_CFLAGS" ] diff --git a/aws-lc-sys/builder/cc_builder.rs b/aws-lc-sys/builder/cc_builder.rs index fc9c720cc6b..bbad2a209f6 100644 --- a/aws-lc-sys/builder/cc_builder.rs +++ b/aws-lc-sys/builder/cc_builder.rs @@ -14,8 +14,8 @@ mod x86_64_unknown_linux_gnu; mod x86_64_unknown_linux_musl; use crate::{ - cargo_env, env_var_to_bool, execute_command, out_dir, target, target_arch, target_os, - target_vendor, OutputLibType, + cargo_env, env_var_to_bool, execute_command, get_cflags, out_dir, target, target_arch, + target_os, target_vendor, OutputLibType, }; use std::path::PathBuf; @@ -125,6 +125,12 @@ impl CcBuilder { } } + if !get_cflags().is_empty() { + get_cflags().split(' ').for_each(|flag| { + cc_build.flag_if_supported(flag); + }); + } + self.add_includes(&mut cc_build); cc_build } diff --git a/aws-lc-sys/builder/cmake_builder.rs b/aws-lc-sys/builder/cmake_builder.rs index e25cecb4432..71068c17ea4 100644 --- a/aws-lc-sys/builder/cmake_builder.rs +++ b/aws-lc-sys/builder/cmake_builder.rs @@ -3,8 +3,8 @@ use crate::OutputLib::{Crypto, RustWrapper, Ssl}; use crate::{ - cargo_env, emit_warning, execute_command, is_crt_static, is_no_asm, option_env, target, - target_arch, target_env, target_family, target_os, target_underscored, target_vendor, + cargo_env, emit_warning, execute_command, get_cflags, is_crt_static, is_no_asm, option_env, + target, target_arch, target_env, target_family, target_os, target_underscored, target_vendor, OutputLibType, }; use std::env; @@ -140,6 +140,10 @@ impl CmakeBuilder { cmake_cfg.define("ASAN", "1"); } + if !get_cflags().is_empty() { + cmake_cfg.cflag(get_cflags()); + } + // Allow environment to specify CMake toolchain. if let Some(toolchain) = option_env("CMAKE_TOOLCHAIN_FILE").or(option_env(format!( "CMAKE_TOOLCHAIN_FILE_{}", diff --git a/aws-lc-sys/builder/main.rs b/aws-lc-sys/builder/main.rs index 6f93b1c5e75..050d06c842c 100644 --- a/aws-lc-sys/builder/main.rs +++ b/aws-lc-sys/builder/main.rs @@ -204,8 +204,8 @@ fn generate_src_bindings(manifest_dir: &Path, prefix: &Option, src_bindi ..Default::default() }, ) - .write_to_file(src_bindings_path.join(format!("{}.rs", target_platform_prefix("crypto")))) - .expect("write bindings"); + .write_to_file(src_bindings_path.join(format!("{}.rs", target_platform_prefix("crypto")))) + .expect("write bindings"); bindgen::generate_bindings( manifest_dir, @@ -215,8 +215,8 @@ fn generate_src_bindings(manifest_dir: &Path, prefix: &Option, src_bindi ..Default::default() }, ) - .write_to_file(src_bindings_path.join(format!("{}.rs", target_platform_prefix("crypto_ssl")))) - .expect("write bindings"); + .write_to_file(src_bindings_path.join(format!("{}.rs", target_platform_prefix("crypto_ssl")))) + .expect("write bindings"); } fn emit_rustc_cfg(cfg: &str) { @@ -318,6 +318,7 @@ static mut AWS_LC_SYS_NO_PREFIX: bool = false; static mut AWS_LC_SYS_INTERNAL_BINDGEN: bool = false; static mut AWS_LC_SYS_EXTERNAL_BINDGEN: bool = false; static mut AWS_LC_SYS_NO_ASM: bool = false; +static mut AWS_LC_SYS_CFLAGS: String = String::new(); fn initialize() { unsafe { @@ -327,6 +328,7 @@ fn initialize() { AWS_LC_SYS_EXTERNAL_BINDGEN = env_var_to_bool("AWS_LC_SYS_EXTERNAL_BINDGEN").unwrap_or(false); AWS_LC_SYS_NO_ASM = env_var_to_bool("AWS_LC_SYS_NO_ASM").unwrap_or(false); + AWS_LC_SYS_CFLAGS = option_env("AWS_LC_SYS_CFLAGS").unwrap_or(String::new()); } if !is_external_bindgen() && (is_internal_bindgen() || !has_bindgen_feature()) { @@ -381,6 +383,10 @@ fn is_no_asm() -> bool { unsafe { AWS_LC_SYS_NO_ASM } } +fn get_cflags() -> &'static str { + unsafe { AWS_LC_SYS_CFLAGS.as_str() } +} + fn has_bindgen_feature() -> bool { cfg!(feature = "bindgen") } diff --git a/docker/linux-cross/Dockerfile b/docker/linux-cross/Dockerfile index d25fc4eefa2..31e4e5e52c8 100644 --- a/docker/linux-cross/Dockerfile +++ b/docker/linux-cross/Dockerfile @@ -4,7 +4,7 @@ FROM $CROSS_BASE_IMAGE ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update && \ - apt-get install --assume-yes --no-install-recommends software-properties-common && \ + apt-get install --assume-yes --no-install-recommends gpg-agent software-properties-common && \ add-apt-repository --yes ppa:longsleep/golang-backports && \ apt-get update && \ apt-get install --assume-yes --no-install-recommends build-essential cmake golang-go clang && \