fix(ci): attempt to fix modulo building process on CI for M1 processors

This commit is contained in:
Federico Terzi 2021-10-02 20:58:48 +02:00
parent 82d1b2f4e1
commit e84abc21bc
4 changed files with 72 additions and 15 deletions

View File

@ -59,8 +59,6 @@ jobs:
# limit-access-to-actor: true # limit-access-to-actor: true
- name: Build - name: Build
run: | run: |
SDKROOT=$(xcrun -sdk macosx11.3 --show-sdk-path) \
MACOSX_DEPLOYMENT_TARGET=$(xcrun -sdk macosx11.3 --show-sdk-platform-version) \
cargo make build-macos-arm-binary cargo make build-macos-arm-binary
# TODO: add clippy check # TODO: add clippy check

1
Cargo.lock generated
View File

@ -796,6 +796,7 @@ version = "0.1.0"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"cc", "cc",
"glob",
"lazy_static", "lazy_static",
"log", "log",
"regex", "regex",

View File

@ -19,3 +19,4 @@ cc = "1.0.66"
regex = "1.4.3" regex = "1.4.3"
zip = "0.5.12" zip = "0.5.12"
winres = "0.1.11" winres = "0.1.11"
glob = "0.3.0"

View File

@ -155,6 +155,18 @@ fn build_native() {
let out_dir = PathBuf::from(std::env::var("OUT_DIR").expect("missing OUT_DIR")); let out_dir = PathBuf::from(std::env::var("OUT_DIR").expect("missing OUT_DIR"));
let out_wx_dir = out_dir.join("wx"); let out_wx_dir = out_dir.join("wx");
let target_arch = match std::env::var("CARGO_CFG_TARGET_ARCH")
.expect("unable to read target arch")
.as_str()
{
"x86_64" => "x86_64",
"aarch64" => "arm64",
arch => panic!("unsupported arch {}", arch),
};
let should_use_ci_m1_workaround =
std::env::var("CI").unwrap_or_default() == "true" && target_arch == "arm64";
if !out_wx_dir.is_dir() { if !out_wx_dir.is_dir() {
// Extract the wxWidgets archive // Extract the wxWidgets archive
let wx_archive = let wx_archive =
@ -168,18 +180,9 @@ fn build_native() {
let build_dir = out_wx_dir.join("build-cocoa"); let build_dir = out_wx_dir.join("build-cocoa");
std::fs::create_dir_all(&build_dir).expect("unable to create build-cocoa directory"); std::fs::create_dir_all(&build_dir).expect("unable to create build-cocoa directory");
let target_arch = match std::env::var("CARGO_CFG_TARGET_ARCH") let mut handle = if should_use_ci_m1_workaround {
.expect("unable to read target arch") // Because of a configuration problem on the GitHub CI pipeline,
.as_str() // we need to use a series of workarounds to build for M1 machines.
{
"x86_64" => "x86_64",
"aarch64" => "arm64",
arch => panic!("unsupported arch {}", arch),
};
let mut handle = if std::env::var("CI").unwrap_or_default() == "true" {
// Because of a configuration problem on the GitHub CI pipeline, we need
// to compile for both architectures manually, as well as setting some flags.
// See: https://github.com/actions/virtual-environments/issues/3288#issuecomment-830207746 // See: https://github.com/actions/virtual-environments/issues/3288#issuecomment-830207746
let xcode_sdk_path = Command::new("xcrun") let xcode_sdk_path = Command::new("xcrun")
.args(&["--sdk", "macosx", "--show-sdk-path"]) .args(&["--sdk", "macosx", "--show-sdk-path"])
@ -243,6 +246,12 @@ fn build_native() {
panic!("wxWidgets is not compiled correctly, missing 'build-cocoa/' directory") panic!("wxWidgets is not compiled correctly, missing 'build-cocoa/' directory")
} }
// If using the M1 CI workaround, convert all the universal libraries to arm64 ones
// This is needed until https://github.com/rust-lang/rust/issues/55235 is fixed
if should_use_ci_m1_workaround {
convert_fat_libraries_to_arm(&out_wx_dir.join("build-cocoa").join("lib"));
}
let config_path = out_wx_dir.join("build-cocoa").join("wx-config"); let config_path = out_wx_dir.join("build-cocoa").join("wx-config");
let cpp_flags = get_cpp_flags(&config_path); let cpp_flags = get_cpp_flags(&config_path);
@ -281,6 +290,54 @@ fn build_native() {
} }
} }
#[cfg(target_os = "macos")]
fn convert_fat_libraries_to_arm(lib_dir: &Path) {
for entry in
glob::glob(&format!("{}/*.a", lib_dir.to_string_lossy())).expect("failed to glob lib directory")
{
let path = entry.expect("unable to unwrap glob entry");
if path.file_name().unwrap_or_default().to_string_lossy().contains("-arm.a") {
println!("skipping {} as it's already arm", path.to_string_lossy());
continue;
}
let parent = path.parent().expect("unable to extract parent");
let target_file = parent.join(format!(
"{}-arm.a",
&path.file_name().unwrap_or_default().to_string_lossy()
));
println!(
"converting {} to {}",
path.to_string_lossy(),
target_file.to_string_lossy()
);
let result = std::process::Command::new("lipo")
.args(&[
"-thin",
"arm64",
&path.to_string_lossy().to_string(),
"-output",
&target_file.to_string_lossy().to_string(),
])
.output()
.expect("unable to extract arm64 slice from library");
if !result.status.success() {
panic!("unable to convert fat library to arm64 version");
}
let renamed_file = parent.join(format!(
"{}.old",
&path.file_name().unwrap_or_default().to_string_lossy()
));
std::fs::rename(&path, &renamed_file).expect("unable to rename fat library");
}
}
#[cfg(not(target_os = "windows"))] #[cfg(not(target_os = "windows"))]
fn get_cpp_flags(wx_config_path: &Path) -> Vec<String> { fn get_cpp_flags(wx_config_path: &Path) -> Vec<String> {
let config_output = std::process::Command::new(&wx_config_path) let config_output = std::process::Command::new(&wx_config_path)