Skip to content

Commit

Permalink
Add aarch64-pc-windows-gnullvm and x86_64-pc-windows-gnullvm targ…
Browse files Browse the repository at this point in the history
…ets (#1883)
  • Loading branch information
mati865 committed Aug 5, 2022
1 parent 4e188c3 commit c55af26
Show file tree
Hide file tree
Showing 19 changed files with 239 additions and 1 deletion.
3 changes: 3 additions & 0 deletions .github/workflows/build.yml
Expand Up @@ -126,10 +126,12 @@ jobs:
cargo clippy -p sample_spellchecker &&
cargo clippy -p sample_uiautomation &&
cargo clippy -p sample_xml &&
cargo clippy -p windows_aarch64_gnullvm &&
cargo clippy -p windows_aarch64_msvc &&
cargo clippy -p windows_i686_gnu &&
cargo clippy -p windows_i686_msvc &&
cargo clippy -p windows_x86_64_gnu &&
cargo clippy -p windows_x86_64_gnullvm &&
cargo clippy -p windows_x86_64_msvc &&
cargo clippy -p test_agile &&
cargo clippy -p test_agile_reference &&
Expand Down Expand Up @@ -184,6 +186,7 @@ jobs:
cargo clippy -p test_winrt &&
cargo clippy -p tool_bindings &&
cargo clippy -p tool_gnu &&
cargo clippy -p tool_gnullvm &&
cargo clippy -p tool_ilrs &&
cargo clippy -p tool_lib &&
cargo clippy -p tool_msvc &&
Expand Down
40 changes: 39 additions & 1 deletion .github/workflows/cross-compile.yml
Expand Up @@ -8,6 +8,7 @@ on:

env:
RUSTFLAGS: -Dwarnings
LLVM-MINGW-TOOLCHAIN-NAME: llvm-mingw-20220323-ucrt-ubuntu-18.04-x86_64

jobs:
test:
Expand All @@ -27,7 +28,7 @@ jobs:
#
image: [macos-latest, ubuntu-latest]
version: [stable, nightly]
target: [x86_64-pc-windows-gnu]
target: [x86_64-pc-windows-gnu, aarch64-pc-windows-gnullvm, x86_64-pc-windows-gnullvm]
runs-on: ${{ matrix.image }}

steps:
Expand All @@ -36,6 +37,13 @@ jobs:

- name: Add toolchain target
run: rustup target add ${{ matrix.target }}
if: contains(matrix.target, 'gnullvm') == false

- name: Add nightly toolchain with rust-src
run: |
rustup default ${{ matrix.version }}
rustup component add rust-src
if: startsWith(matrix.image, 'ubuntu-') && contains(matrix.target, 'gnullvm') && matrix.version == 'nightly'

- name: Install gcc-mingw-w64-x86-64
run: sudo apt-get install -y gcc-mingw-w64-x86-64
Expand All @@ -45,10 +53,40 @@ jobs:
run: brew install mingw-w64
if: startsWith(matrix.image, 'macos-') && matrix.target == 'x86_64-pc-windows-gnu'

- name: LLVM MinGW toolchain cache configuration
id: cache-llvm-mingw-toolchain
uses: actions/cache@v3
if: startsWith(matrix.image, 'ubuntu-') && contains(matrix.target, 'gnullvm') && matrix.version == 'nightly'
with:
path: ${{ env.LLVM-MINGW-TOOLCHAIN-NAME }}
key: ${{ env.LLVM-MINGW-TOOLCHAIN-NAME }}

- name: Install LLVM MinGW toolchain
if: startsWith(matrix.image, 'ubuntu-') && contains(matrix.target, 'gnullvm') && matrix.version == 'nightly' && steps.cache-llvm-mingw-toolchain.outputs.cache-hit != 'true'
run: |
curl -L -o ${{ env.LLVM-MINGW-TOOLCHAIN-NAME }}.tar.xz https://github.com/mstorsjo/llvm-mingw/releases/download/20220323/${{ env.LLVM-MINGW-TOOLCHAIN-NAME }}.tar.xz
tar -xf ${{ env.LLVM-MINGW-TOOLCHAIN-NAME }}.tar.xz
echo "${{ env.LLVM-MINGW-TOOLCHAIN-NAME }}/bin" >> $GITHUB_PATH
- name: Add LLVM MinGW toolchain to PATH
if: startsWith(matrix.image, 'ubuntu-') && contains(matrix.target, 'gnullvm') && matrix.version == 'nightly'
run: |
echo "${{ env.LLVM-MINGW-TOOLCHAIN-NAME }}/bin" >> $GITHUB_PATH
- name: Test
shell: pwsh
run: |
cargo test --no-run --target ${{ matrix.target }} -p test_win32
if (-Not (Resolve-Path "target/*/debug/deps/test_win32-*.exe" | Test-Path)) {
throw "Failed to find test_win32 executable."
}
if: contains(matrix.target, 'gnullvm') == false

- name: Test with build-std
shell: pwsh
run: |
cargo test --no-run --target ${{ matrix.target }} -Z build-std -p test_win32
if (-Not (Resolve-Path "target/*/debug/deps/test_win32-*.exe" | Test-Path)) {
throw "Failed to find test_win32 executable."
}
if: startsWith(matrix.image, 'ubuntu-') && contains(matrix.target, 'gnullvm') && matrix.version == 'nightly'
3 changes: 3 additions & 0 deletions .github/workflows/test.yml
Expand Up @@ -109,10 +109,12 @@ jobs:
cargo test --target ${{ matrix.target }} -p sample_spellchecker &&
cargo test --target ${{ matrix.target }} -p sample_uiautomation &&
cargo test --target ${{ matrix.target }} -p sample_xml &&
cargo test --target ${{ matrix.target }} -p windows_aarch64_gnullvm &&
cargo test --target ${{ matrix.target }} -p windows_aarch64_msvc &&
cargo test --target ${{ matrix.target }} -p windows_i686_gnu &&
cargo test --target ${{ matrix.target }} -p windows_i686_msvc &&
cargo test --target ${{ matrix.target }} -p windows_x86_64_gnu &&
cargo test --target ${{ matrix.target }} -p windows_x86_64_gnullvm &&
cargo test --target ${{ matrix.target }} -p windows_x86_64_msvc &&
cargo test --target ${{ matrix.target }} -p test_agile &&
cargo test --target ${{ matrix.target }} -p test_agile_reference &&
Expand Down Expand Up @@ -168,6 +170,7 @@ jobs:
cargo test --target ${{ matrix.target }} -p test_winrt &&
cargo test --target ${{ matrix.target }} -p tool_bindings &&
cargo test --target ${{ matrix.target }} -p tool_gnu &&
cargo test --target ${{ matrix.target }} -p tool_gnullvm &&
cargo test --target ${{ matrix.target }} -p tool_ilrs &&
cargo test --target ${{ matrix.target }} -p tool_lib &&
cargo test --target ${{ matrix.target }} -p tool_msvc &&
Expand Down
6 changes: 6 additions & 0 deletions crates/libs/sys/Cargo.toml
Expand Up @@ -33,6 +33,9 @@ windows_aarch64_msvc = { path = "../../targets/aarch64_msvc", version = "0.39.0"
[target.aarch64-uwp-windows-msvc.dependencies]
windows_aarch64_msvc = { path = "../../targets/aarch64_msvc", version = "0.39.0" }

[target.aarch64-pc-windows-gnullvm.dependencies]
windows_aarch64_gnullvm = { path = "../../targets/aarch64_gnullvm", version = "0.39.0" }

[target.i686-pc-windows-gnu.dependencies]
windows_i686_gnu = { path = "../../targets/i686_gnu", version = "0.39.0" }

Expand All @@ -45,6 +48,9 @@ windows_x86_64_gnu = { path = "../../targets/x86_64_gnu", version = "0.39.0" }
[target.x86_64-uwp-windows-gnu.dependencies]
windows_x86_64_gnu = { path = "../../targets/x86_64_gnu", version = "0.39.0" }

[target.x86_64-pc-windows-gnullvm.dependencies]
windows_x86_64_gnullvm = { path = "../../targets/x86_64_gnullvm", version = "0.39.0" }

[features]
default = []
deprecated = []
Expand Down
6 changes: 6 additions & 0 deletions crates/libs/windows/Cargo.toml
Expand Up @@ -33,6 +33,9 @@ windows_aarch64_msvc = { path = "../../targets/aarch64_msvc", version = "0.39.0"
[target.aarch64-uwp-windows-msvc.dependencies]
windows_aarch64_msvc = { path = "../../targets/aarch64_msvc", version = "0.39.0" }

[target.aarch64-pc-windows-gnullvm.dependencies]
windows_aarch64_gnullvm = { path = "../../targets/aarch64_gnullvm", version = "0.39.0" }

[target.i686-pc-windows-gnu.dependencies]
windows_i686_gnu = { path = "../../targets/i686_gnu", version = "0.39.0" }

Expand All @@ -45,6 +48,9 @@ windows_x86_64_gnu = { path = "../../targets/x86_64_gnu", version = "0.39.0" }
[target.x86_64-uwp-windows-gnu.dependencies]
windows_x86_64_gnu = { path = "../../targets/x86_64_gnu", version = "0.39.0" }

[target.x86_64-pc-windows-gnullvm.dependencies]
windows_x86_64_gnullvm = { path = "../../targets/x86_64_gnullvm", version = "0.39.0" }

[dependencies]
windows-implement = { path = "../implement", version = "0.39.0", optional = true }
windows-interface = { path = "../interface", version = "0.39.0", optional = true }
Expand Down
12 changes: 12 additions & 0 deletions crates/targets/aarch64_gnullvm/Cargo.toml
@@ -0,0 +1,12 @@
[package]
name = "windows_aarch64_gnullvm"
version = "0.39.0"
authors = ["Microsoft"]
edition = "2018"
license = "MIT OR Apache-2.0"
description = "Code gen support for the windows crate"
repository = "https://github.com/microsoft/windows-rs"

[package.metadata.docs.rs]
default-target = "x86_64-pc-windows-msvc"
targets = []
10 changes: 10 additions & 0 deletions crates/targets/aarch64_gnullvm/build.rs
@@ -0,0 +1,10 @@
fn main() {
let target = std::env::var("TARGET").unwrap();
if target != "aarch64-pc-windows-gnullvm" {
return;
}

let dir = std::env::var("CARGO_MANIFEST_DIR").unwrap();

println!("cargo:rustc-link-search=native={}", std::path::Path::new(&dir).join("lib").display());
}
Binary file added crates/targets/aarch64_gnullvm/lib/libwindows.a
Binary file not shown.
1 change: 1 addition & 0 deletions crates/targets/aarch64_gnullvm/src/lib.rs
@@ -0,0 +1 @@
#![no_std]
12 changes: 12 additions & 0 deletions crates/targets/x86_64_gnullvm/Cargo.toml
@@ -0,0 +1,12 @@
[package]
name = "windows_x86_64_gnullvm"
version = "0.39.0"
authors = ["Microsoft"]
edition = "2018"
license = "MIT OR Apache-2.0"
description = "Code gen support for the windows crate"
repository = "https://github.com/microsoft/windows-rs"

[package.metadata.docs.rs]
default-target = "x86_64-pc-windows-msvc"
targets = []
10 changes: 10 additions & 0 deletions crates/targets/x86_64_gnullvm/build.rs
@@ -0,0 +1,10 @@
fn main() {
let target = std::env::var("TARGET").unwrap();
if target != "x86_64-pc-windows-gnullvm" {
return;
}

let dir = std::env::var("CARGO_MANIFEST_DIR").unwrap();

println!("cargo:rustc-link-search=native={}", std::path::Path::new(&dir).join("lib").display());
}
Binary file added crates/targets/x86_64_gnullvm/lib/libwindows.a
Binary file not shown.
1 change: 1 addition & 0 deletions crates/targets/x86_64_gnullvm/src/lib.rs
@@ -0,0 +1 @@
#![no_std]
8 changes: 8 additions & 0 deletions crates/tools/gnullvm/Cargo.toml
@@ -0,0 +1,8 @@
[package]
name = "tool_gnullvm"
version = "0.0.0"
edition = "2018"
publish = false

[dependencies]
lib = { package = "tool_lib", path = "../lib" }
8 changes: 8 additions & 0 deletions crates/tools/gnullvm/readme.md
@@ -0,0 +1,8 @@
The Windows umbrella lib (targeting mingw-w64 LLVM tooling) is generated using the following steps:

0. Ensure MSYS2 MinGW environment is installed (https://www.mingw-w64.org/downloads/)
1. Execute: `C:\msys64\clang64.exe`
2. Execute: `pacman -Syuu --noconfirm` (repeat until no further updates available)
3. Execute `pacman --needed -S mingw-w64-clang-x86_64-toolchain`
4. Navigate to crate root
5. Execute: `PATH=$(cygpath -u $USERPROFILE)/.cargo/bin:$PATH cargo +nightly run -p tool_gnullvm --target x86_64-pc-windows-gnullvm -Z build-std -- all`
106 changes: 106 additions & 0 deletions crates/tools/gnullvm/src/main.rs
@@ -0,0 +1,106 @@
use std::collections::BTreeMap;
use std::io::prelude::*;

fn main() {
let mut cmd = std::process::Command::new("where");
cmd.arg("llvm-dlltool.exe");

let output = cmd.output().unwrap();

if !output.status.success() {
println!("llvm-dlltool.exe not found");
return;
}

let target = std::env::args().collect::<Vec<_>>();
let mut platform_and_target = vec![];
if target.iter().any(|x| x == "x86_64") || target.iter().any(|x| x == "all") {
platform_and_target.push(("x86_64_gnullvm", "i386:x86-64"));
}
if target.iter().any(|x| x == "aarch64") || target.iter().any(|x| x == "all") {
platform_and_target.push(("aarch64_gnullvm", "arm64"));
}
if platform_and_target.is_empty() {
println!("Please specify at least one architecture or use 'all' argument");
return;
};

let libraries = lib::libraries();

for (platform, dlltool_target) in platform_and_target {
let output = std::path::PathBuf::from(format!("crates/targets/{}/lib", platform));
let _ = std::fs::remove_dir_all(&output);
std::fs::create_dir_all(&output).unwrap();

for (library, functions) in &libraries {
build_library(&output, library, functions, dlltool_target);
}

build_mri(&output, &libraries);

for library in libraries.keys() {
std::fs::remove_file(output.join(format!("lib{}.a", library))).unwrap();
}
}
}

fn build_library(output: &std::path::Path, library: &str, functions: &BTreeMap<String, usize>, dlltool_target: &str) {
println!("{}", library);

// Note that we don't use set_extension as it confuses PathBuf when the library name includes a period.
let def_path = output.join(format!("{}.def", library));
let mut def = std::fs::File::create(&def_path).unwrap();

def.write_all(
format!(
r#"
LIBRARY {}
EXPORTS
"#,
library
)
.as_bytes(),
)
.unwrap();

for function in functions.keys() {
def.write_all(format!("{}\n", function).as_bytes()).unwrap();
}

drop(def);

let mut cmd = std::process::Command::new("llvm-dlltool");
cmd.current_dir(&output);

cmd.arg("-m");
cmd.arg(dlltool_target);
cmd.arg("-d");
cmd.arg(format!("{}.def", library));
cmd.arg("-l");
cmd.arg(format!("lib{}.a", library));
cmd.output().unwrap();

std::fs::remove_file(output.join(format!("{}.def", library))).unwrap();
}

fn build_mri(output: &std::path::Path, libraries: &BTreeMap<String, BTreeMap<String, usize>>) {
let mri_path = output.join("unified.mri");
let mut mri = std::fs::File::create(&mri_path).unwrap();
println!("Generating {}", mri_path.to_string_lossy());

mri.write_all(b"CREATE libwindows.a\n").unwrap();

for library in libraries.keys() {
mri.write_all(format!("ADDLIB lib{}.a\n", library).as_bytes()).unwrap();
}

mri.write_all(b"SAVE\nEND\n").unwrap();

let mut cmd = std::process::Command::new("llvm-ar");
cmd.current_dir(&output);
cmd.arg("-M");
cmd.stdin(std::fs::File::open(&mri_path).unwrap());
cmd.output().unwrap();

std::fs::remove_file(&mri_path).unwrap();
}
6 changes: 6 additions & 0 deletions crates/tools/sys/src/main.rs
Expand Up @@ -73,6 +73,9 @@ windows_aarch64_msvc = { path = "../../targets/aarch64_msvc", version = "0.39.0"
[target.aarch64-uwp-windows-msvc.dependencies]
windows_aarch64_msvc = { path = "../../targets/aarch64_msvc", version = "0.39.0" }
[target.aarch64-pc-windows-gnullvm.dependencies]
windows_aarch64_gnullvm = { path = "../../targets/aarch64_gnullvm", version = "0.39.0" }
[target.i686-pc-windows-gnu.dependencies]
windows_i686_gnu = { path = "../../targets/i686_gnu", version = "0.39.0" }
Expand All @@ -85,6 +88,9 @@ windows_x86_64_gnu = { path = "../../targets/x86_64_gnu", version = "0.39.0" }
[target.x86_64-uwp-windows-gnu.dependencies]
windows_x86_64_gnu = { path = "../../targets/x86_64_gnu", version = "0.39.0" }
[target.x86_64-pc-windows-gnullvm.dependencies]
windows_x86_64_gnullvm = { path = "../../targets/x86_64_gnullvm", version = "0.39.0" }
[features]
default = []
deprecated = []
Expand Down
6 changes: 6 additions & 0 deletions crates/tools/windows/src/main.rs
Expand Up @@ -71,6 +71,9 @@ windows_aarch64_msvc = { path = "../../targets/aarch64_msvc", version = "0.39.0"
[target.aarch64-uwp-windows-msvc.dependencies]
windows_aarch64_msvc = { path = "../../targets/aarch64_msvc", version = "0.39.0" }
[target.aarch64-pc-windows-gnullvm.dependencies]
windows_aarch64_gnullvm = { path = "../../targets/aarch64_gnullvm", version = "0.39.0" }
[target.i686-pc-windows-gnu.dependencies]
windows_i686_gnu = { path = "../../targets/i686_gnu", version = "0.39.0" }
Expand All @@ -83,6 +86,9 @@ windows_x86_64_gnu = { path = "../../targets/x86_64_gnu", version = "0.39.0" }
[target.x86_64-uwp-windows-gnu.dependencies]
windows_x86_64_gnu = { path = "../../targets/x86_64_gnu", version = "0.39.0" }
[target.x86_64-pc-windows-gnullvm.dependencies]
windows_x86_64_gnullvm = { path = "../../targets/x86_64_gnullvm", version = "0.39.0" }
[dependencies]
windows-implement = { path = "../implement", version = "0.39.0", optional = true }
windows-interface = { path = "../interface", version = "0.39.0", optional = true }
Expand Down
2 changes: 2 additions & 0 deletions docs/publish.cmd
@@ -1,7 +1,9 @@
cargo publish -p windows_aarch64_gnullvm
cargo publish -p windows_aarch64_msvc
cargo publish -p windows_i686_gnu
cargo publish -p windows_i686_msvc
cargo publish -p windows_x86_64_gnu
cargo publish -p windows_x86_64_gnullvm
cargo publish -p windows_x86_64_msvc
cargo publish -p windows-tokens
cargo publish -p windows-metadata
Expand Down

0 comments on commit c55af26

Please sign in to comment.