diff --git a/.github/workflows/cross.yml b/.github/workflows/cross.yml index bd799f9d136..cf8a9e5281c 100644 --- a/.github/workflows/cross.yml +++ b/.github/workflows/cross.yml @@ -140,7 +140,7 @@ jobs: aws-lc-rs-windows-gnu: if: github.repository_owner == 'aws' - name: ${{ matrix.target }} ${{ (matrix.ninja == '1' && 'w/ Ninja') || 'w/o Ninja'}} + name: ${{ matrix.target }} runs-on: windows-latest strategy: fail-fast: false @@ -148,17 +148,11 @@ jobs: target: - 'x86_64-pc-windows-gnu' # TODO: 'i686-pc-windows-gnu' - ninja: - - '0' - - '1' steps: - uses: ilammy/setup-nasm@v1 - uses: actions/checkout@v4 with: submodules: 'recursive' - - name: Install ninja-build tool - if: ${{ matrix.ninja == '1' }} - uses: seanmiddleditch/gha-setup-ninja@v4 - uses: dtolnay/rust-toolchain@master id: toolchain with: @@ -171,7 +165,7 @@ jobs: aws-lc-rs-windows-msvc: if: ${{ github.repository_owner == 'aws' }} - name: ${{ matrix.target }} ${{ (matrix.ninja == '1' && 'w/ Ninja') || 'w/o Ninja'}} - ${{ (matrix.crt_static == '1' && '/WX and crt-static') || '/WX' }} + name: ${{ matrix.target }} - ${{ (matrix.crt_static == '1' && 'crt-static and /WX') || '/WX' }} runs-on: windows-latest strategy: fail-fast: false @@ -180,9 +174,6 @@ jobs: - 'x86_64-pc-windows-msvc' - 'i686-pc-windows-msvc' - 'aarch64-pc-windows-msvc' - ninja: - - '0' - - '1' crt_static: - '0' - '1' @@ -194,7 +185,7 @@ jobs: with: submodules: 'recursive' - name: Install ninja-build tool - if: ${{ matrix.ninja == '1' }} + if: ${{ matrix.target == 'aarch64-pc-windows-msvc' }} uses: seanmiddleditch/gha-setup-ninja@v4 - uses: dtolnay/rust-toolchain@master id: toolchain @@ -216,8 +207,6 @@ jobs: echo "RUSTFLAGS=-Clink-arg=/WX" | Out-File -FilePath $env:GITHUB_ENV -Append } - name: Debug build - if: ${{ matrix.target != 'aarch64-pc-windows-msvc' || matrix.ninja == '1' }} run: cargo ${{ env.ACTION_CARGO }} -p aws-lc-rs --all-targets --target ${{ matrix.target }} --features bindgen - name: Release Build for ${{ matrix.target }} - if: ${{ matrix.target != 'aarch64-pc-windows-msvc' || matrix.ninja == '1' }} run: cargo ${{ env.ACTION_CARGO }} --release -p aws-lc-rs --all-targets --target ${{ matrix.target }} diff --git a/aws-lc-fips-sys/builder/main.rs b/aws-lc-fips-sys/builder/main.rs index da6de18856a..ac5d5ed5c93 100644 --- a/aws-lc-fips-sys/builder/main.rs +++ b/aws-lc-fips-sys/builder/main.rs @@ -144,7 +144,7 @@ pub(crate) struct TestCommandResult { status: bool, } -const MAX_CMD_OUTPUT_SIZE: usize = 1 << 14; +const MAX_CMD_OUTPUT_SIZE: usize = 1 << 15; fn execute_command(executable: &OsStr, args: &[&OsStr]) -> TestCommandResult { if let Ok(mut result) = Command::new(executable).args(args).output() { result.stderr.truncate(MAX_CMD_OUTPUT_SIZE); diff --git a/aws-lc-sys/builder/cmake_builder.rs b/aws-lc-sys/builder/cmake_builder.rs index 894919139a2..5a8f541d3af 100644 --- a/aws-lc-sys/builder/cmake_builder.rs +++ b/aws-lc-sys/builder/cmake_builder.rs @@ -6,6 +6,7 @@ use crate::{ cargo_env, emit_warning, execute_command, is_crt_static, is_no_asm, option_env, target, target_arch, target_env, target_os, target_underscored, target_vendor, OutputLibType, }; +use std::collections::HashMap; use std::env; use std::ffi::OsStr; use std::path::PathBuf; @@ -168,23 +169,26 @@ impl CmakeBuilder { } if target_underscored() == "aarch64_pc_windows_msvc" { - //cmake_cfg.generator("Ninja"); - cmake_cfg.define("CMAKE_C_COMPILER", "clang-cl"); - cmake_cfg.define("CMAKE_CXX_COMPILER", "clang-cl"); - cmake_cfg.define("CMAKE_ASM_COMPILER", "clang-cl"); - // If the build host is not aarch64 - #[cfg(not(target_arch = "aarch64"))] - { - // Only needed when cross-compiling - cmake_cfg.define("CMAKE_SYSTEM_PROCESSOR", "ARM64"); - cmake_cfg.define("CMAKE_C_FLAGS_INIT", "--target=arm64-pc-windows-msvc"); - cmake_cfg.define("CMAKE_CXX_FLAGS_INIT", "--target=arm64-pc-windows-msvc"); - cmake_cfg.define("CMAKE_ASM_FLAGS_INIT", "--target=arm64-pc-windows-msvc"); - - cmake_cfg.define("CMAKE_FIND_ROOT_PATH_MODE_PROGRAM", "NEVER"); - cmake_cfg.define("CMAKE_FIND_ROOT_PATH_MODE_LIBRARY", "ONLY"); - cmake_cfg.define("CMAKE_FIND_ROOT_PATH_MODE_INCLUDE", "ONLY"); - cmake_cfg.define("CMAKE_FIND_ROOT_PATH_MODE_INCLUDE", "ONLY"); + cmake_cfg.generator("Ninja"); + cmake_cfg.define("CMAKE_ASM_COMPILER_TARGET", "arm64-pc-windows-msvc"); + // Only needed when cross-compiling + let env_map = self + .collect_vcvarsall_bat() + .map_err(|x| panic!("{}", x)) + .unwrap(); + let mut assembler_set = false; + for (key, value) in env_map { + if key == "VCINSTALLDIR" { + cmake_cfg.define( + "CMAKE_ASM_COMPILER", + format!("{}Tools\\Llvm\\bin\\clang-cl.exe", value), + ); + assembler_set = true; + } + cmake_cfg.env(key, value); + } + if !assembler_set { + panic!("No assmebler set"); } } @@ -210,6 +214,24 @@ impl CmakeBuilder { .configure_arg("--no-warn-unused-cli") .build() } + + fn collect_vcvarsall_bat(&self) -> Result, String> { + let mut map: HashMap = HashMap::new(); + let script_path = self.manifest_dir.join("builder").join("printenv.bat"); + let result = execute_command(script_path.as_os_str(), &[]); + if !result.status { + eprintln!("{}", result.stdout); + return Err("Failed to run vcvarsall.bat.".to_owned()); + } + eprintln!("{}", result.stdout); + let lines = result.stdout.lines(); + for line in lines { + if let Some((var, val)) = line.split_once('=') { + map.insert(var.to_string(), val.to_string()); + } + } + Ok(map) + } } impl crate::Builder for CmakeBuilder { diff --git a/aws-lc-sys/builder/main.rs b/aws-lc-sys/builder/main.rs index bf3e9fffee0..7207df794a2 100644 --- a/aws-lc-sys/builder/main.rs +++ b/aws-lc-sys/builder/main.rs @@ -142,7 +142,7 @@ pub(crate) struct TestCommandResult { status: bool, } -const MAX_CMD_OUTPUT_SIZE: usize = 1 << 12; +const MAX_CMD_OUTPUT_SIZE: usize = 1 << 15; fn execute_command(executable: &OsStr, args: &[&OsStr]) -> TestCommandResult { if let Ok(mut result) = Command::new(executable).args(args).output() { result.stderr.truncate(MAX_CMD_OUTPUT_SIZE); diff --git a/aws-lc-sys/builder/printenv.bat b/aws-lc-sys/builder/printenv.bat new file mode 100644 index 00000000000..b39f13e929c --- /dev/null +++ b/aws-lc-sys/builder/printenv.bat @@ -0,0 +1,44 @@ +@echo off +setlocal EnableDelayedExpansion + +set "TOP_DIR=%ProgramFiles(x86)%\Microsoft Visual Studio" +for /f "usebackq tokens=* delims=" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -property installationPath`) do ( + set "TOP_DIR=%%i" + echo VS Installation: "!TOP_DIR!" + if exist "!TOP_DIR!\VC\Auxiliary\Build\vcvarsall.bat" ( + set "VS_PATH=!TOP_DIR!\VC\Auxiliary\Build\" + echo FOUND in Installation: "!VS_PATH!" + goto FoundVS + ) + goto SearchVS +) + +echo Visual Studio installation not found using vswhere. Searching in default directories... + +:SearchVS +for /R "%TOP_DIR%" %%a in (vcvarsall.bat) do ( + if exist "%%~fa" ( + set "VS_PATH=%%~dpa" + echo FOUND: "!VS_PATH!" + goto FoundVS + ) +) +echo vcvarsall.bat not found. +goto End + +:FoundVS +call "!VS_PATH!vcvarsall.bat" x86_arm64 +if !ERRORLEVEL! neq 0 ( + echo Failed to set Visual Studio environment variables. + echo PATH: "!VS_PATH!vcvarsall.bat" + goto End +) +echo Visual Studio environment variables set for x64. + +set +endlocal +exit /b 0 + +:End +endlocal +exit /b 1