diff --git a/pkgs/applications/office/espanso/default.nix b/pkgs/applications/office/espanso/default.nix index 811c7548caa..30bea3e55bd 100644 --- a/pkgs/applications/office/espanso/default.nix +++ b/pkgs/applications/office/espanso/default.nix @@ -21,6 +21,12 @@ , Cocoa , Foundation , IOKit +, Kernel +, AVFoundation +, Carbon +, QTKit +, AVKit +, WebKit , waylandSupport ? false , x11Support ? stdenv.isLinux , testers @@ -48,6 +54,10 @@ rustPlatform.buildRustPackage rec { }; }; + cargoPatches = lib.optionals stdenv.isDarwin [ + ./inject-wx-on-darwin.patch + ]; + nativeBuildInputs = [ extra-cmake-modules pkg-config @@ -79,6 +89,12 @@ rustPlatform.buildRustPackage rec { Cocoa Foundation IOKit + Kernel + AVFoundation + Carbon + QTKit + AVKit + WebKit ] ++ lib.optionals waylandSupport [ wl-clipboard ] ++ lib.optionals x11Support [ diff --git a/pkgs/applications/office/espanso/inject-wx-on-darwin.patch b/pkgs/applications/office/espanso/inject-wx-on-darwin.patch new file mode 100644 index 00000000000..34b71121192 --- /dev/null +++ b/pkgs/applications/office/espanso/inject-wx-on-darwin.patch @@ -0,0 +1,223 @@ +From 6a7400c20831c5ff502c7336d6db2be743f156be Mon Sep 17 00:00:00 2001 +From: Nikola Knezevic +Date: Tue, 16 Aug 2022 22:28:46 +0200 +Subject: [PATCH] Build using system wx on darwin + +--- + espanso-modulo/build.rs | 174 ++++------------------------------------ + 1 file changed, 17 insertions(+), 157 deletions(-) + +diff --git a/espanso-modulo/build.rs b/espanso-modulo/build.rs +index b8b889a..5d972ec 100644 +--- a/espanso-modulo/build.rs ++++ b/espanso-modulo/build.rs +@@ -156,161 +156,6 @@ fn build_native() { + ); + } + +-#[cfg(target_os = "macos")] +-fn build_native() { +- use std::process::Command; +- +- let project_dir = +- PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").expect("missing CARGO_MANIFEST_DIR")); +- let wx_archive = project_dir.join("vendor").join(WX_WIDGETS_ARCHIVE_NAME); +- if !wx_archive.is_file() { +- panic!("could not find wxWidgets archive!"); +- } +- +- let out_dir = if let Ok(out_path) = std::env::var(WX_WIDGETS_BUILD_OUT_DIR_ENV_NAME) { +- println!( +- "detected wxWidgets build output directory override: {}", +- out_path +- ); +- let path = PathBuf::from(out_path); +- std::fs::create_dir_all(&path).expect("unable to create wxWidgets out dir"); +- path +- } else { +- PathBuf::from(std::env::var("OUT_DIR").expect("missing OUT_DIR")) +- }; +- let out_wx_dir = out_dir.join("wx"); +- println!("wxWidgets will be compiled into: {}", out_wx_dir.display()); +- +- 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() { +- // Extract the wxWidgets archive +- let wx_archive = +- std::fs::File::open(&wx_archive).expect("unable to open wxWidgets source archive"); +- let mut archive = zip::ZipArchive::new(wx_archive).expect("unable to read wxWidgets archive"); +- archive +- .extract(&out_wx_dir) +- .expect("unable to extract wxWidgets source dir"); +- +- // Compile wxWidgets +- let build_dir = out_wx_dir.join("build-cocoa"); +- std::fs::create_dir_all(&build_dir).expect("unable to create build-cocoa directory"); +- +- let mut handle = if should_use_ci_m1_workaround { +- // Because of a configuration problem on the GitHub CI pipeline, +- // we need to use a series of workarounds to build for M1 machines. +- // See: https://github.com/actions/virtual-environments/issues/3288#issuecomment-830207746 +- Command::new(out_wx_dir.join("configure")) +- .current_dir(build_dir.to_string_lossy().to_string()) +- .args(&[ +- "--disable-shared", +- "--without-libtiff", +- "--without-liblzma", +- "--with-libjpeg=builtin", +- "--with-libpng=builtin", +- "--enable-universal-binary=arm64,x86_64", +- ]) +- .spawn() +- .expect("failed to execute configure") +- } else { +- Command::new(out_wx_dir.join("configure")) +- .current_dir(build_dir.to_string_lossy().to_string()) +- .args(&[ +- "--disable-shared", +- "--without-libtiff", +- "--without-liblzma", +- "--with-libjpeg=builtin", +- "--with-libpng=builtin", +- &format!("--enable-macosx_arch={}", target_arch), +- ]) +- .spawn() +- .expect("failed to execute configure") +- }; +- +- if !handle +- .wait() +- .expect("unable to wait for configure command") +- .success() +- { +- panic!("configure returned non-zero exit code!"); +- } +- +- let mut handle = Command::new("make") +- .current_dir(build_dir.to_string_lossy().to_string()) +- .args(&["-j8"]) +- .spawn() +- .expect("failed to execute make"); +- if !handle +- .wait() +- .expect("unable to wait for make command") +- .success() +- { +- panic!("make returned non-zero exit code!"); +- } +- } +- +- // Make sure wxWidgets is compiled +- if !out_wx_dir.join("build-cocoa").is_dir() { +- 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")); +- convert_fat_libraries_to_arm(&out_wx_dir.join("build-cocoa")); +- } +- +- let config_path = out_wx_dir.join("build-cocoa").join("wx-config"); +- let cpp_flags = get_cpp_flags(&config_path); +- +- let mut build = cc::Build::new(); +- build +- .cpp(true) +- .file("src/sys/form/form.cpp") +- .file("src/sys/common/common.cpp") +- .file("src/sys/search/search.cpp") +- .file("src/sys/wizard/wizard.cpp") +- .file("src/sys/wizard/wizard_gui.cpp") +- .file("src/sys/welcome/welcome.cpp") +- .file("src/sys/welcome/welcome_gui.cpp") +- .file("src/sys/textview/textview.cpp") +- .file("src/sys/textview/textview_gui.cpp") +- .file("src/sys/troubleshooting/troubleshooting.cpp") +- .file("src/sys/troubleshooting/troubleshooting_gui.cpp") +- .file("src/sys/common/mac.mm"); +- build.flag("-std=c++17"); +- +- for flag in cpp_flags { +- build.flag(&flag); +- } +- +- build.compile("espansomodulosys"); +- +- // Render linker flags +- +- generate_linker_flags(&config_path); +- +- // On (older) OSX we need to link against the clang runtime, +- // which is hidden in some non-default path. +- // +- // More details at https://github.com/alexcrichton/curl-rust/issues/279. +- if let Some(path) = macos_link_search_path() { +- println!("cargo:rustc-link-lib=clang_rt.osx"); +- println!("cargo:rustc-link-search={}", path); +- } +-} +- + #[cfg(target_os = "macos")] + fn convert_fat_libraries_to_arm(lib_dir: &Path) { + for entry in +@@ -440,12 +285,17 @@ fn macos_link_search_path() -> Option { + None + } + ++#[cfg(not(target_os = "macos"))] ++fn macos_link_search_path() -> Option { ++ return None ++} ++ + // TODO: add documentation for linux + // Install wxWidgets: + // sudo apt install libwxgtk3.0-0v5 libwxgtk3.0-dev + // + // cargo run +-#[cfg(target_os = "linux")] ++#[cfg(not(target_os = "windows"))] + fn build_native() { + // Make sure wxWidgets is installed + // Depending on the installation package, the 'wx-config' command might also be available as 'wx-config-gtk3', +@@ -483,7 +333,8 @@ fn build_native() { + .file("src/sys/textview/textview.cpp") + .file("src/sys/textview/textview_gui.cpp") + .file("src/sys/troubleshooting/troubleshooting.cpp") +- .file("src/sys/troubleshooting/troubleshooting_gui.cpp"); ++ .file("src/sys/troubleshooting/troubleshooting_gui.cpp") ++ .file("src/sys/common/mac.mm"); + build.flag("-std=c++17"); + + for flag in cpp_flags { +@@ -495,6 +346,15 @@ fn build_native() { + // Render linker flags + + generate_linker_flags(&config_path); ++ ++ // On (older) OSX we need to link against the clang runtime, ++ // which is hidden in some non-default path. ++ // ++ // More details at https://github.com/alexcrichton/curl-rust/issues/279. ++ if let Some(path) = macos_link_search_path() { ++ println!("cargo:rustc-link-lib=clang_rt.osx"); ++ println!("cargo:rustc-link-search={}", path); ++ } + } + + fn main() { +-- +2.37.1 + diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index fc1b8274838..dd7a86f3673 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -4765,7 +4765,7 @@ with pkgs; eschalot = callPackage ../tools/security/eschalot { }; espanso = callPackage ../applications/office/espanso { - inherit (darwin.apple_sdk.frameworks) AppKit Cocoa Foundation IOKit Kernel AVFoundation; + inherit (darwin.apple_sdk.frameworks) AppKit Cocoa Foundation IOKit Kernel AVFoundation Carbon QTKit AVKit WebKit; }; espanso-wayland = espanso.override { x11Support = false;