build.rs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // Copyright 2019-2024 Tauri Programme within The Commons Conservancy
  2. // SPDX-License-Identifier: Apache-2.0
  3. // SPDX-License-Identifier: MIT
  4. //! Build script utilities.
  5. /// Link a Swift library.
  6. #[cfg(target_os = "macos")]
  7. pub fn link_apple_library(name: &str, source: impl AsRef<std::path::Path>) {
  8. if source.as_ref().join("Package.swift").exists() {
  9. link_swift_library(name, source);
  10. } else {
  11. link_xcode_library(name, source);
  12. }
  13. }
  14. /// Link a Swift library.
  15. #[cfg(target_os = "macos")]
  16. fn link_swift_library(name: &str, source: impl AsRef<std::path::Path>) {
  17. let source = source.as_ref();
  18. let sdk_root = std::env::var_os("SDKROOT");
  19. std::env::remove_var("SDKROOT");
  20. swift_rs::SwiftLinker::new(
  21. &std::env::var("MACOSX_DEPLOYMENT_TARGET").unwrap_or_else(|_| "10.13".into()),
  22. )
  23. .with_ios(&std::env::var("IPHONEOS_DEPLOYMENT_TARGET").unwrap_or_else(|_| "13.0".into()))
  24. .with_package(name, source)
  25. .link();
  26. if let Some(root) = sdk_root {
  27. std::env::set_var("SDKROOT", root);
  28. }
  29. }
  30. /// Link a Xcode library.
  31. #[cfg(target_os = "macos")]
  32. fn link_xcode_library(name: &str, source: impl AsRef<std::path::Path>) {
  33. use std::{path::PathBuf, process::Command};
  34. let source = source.as_ref();
  35. let configuration = if std::env::var("DEBUG")
  36. .map(|v| v == "true")
  37. .unwrap_or_default()
  38. {
  39. "Debug"
  40. } else {
  41. "Release"
  42. };
  43. let (sdk, arch) = match std::env::var("TARGET").unwrap().as_str() {
  44. "aarch64-apple-ios" => ("iphoneos", "arm64"),
  45. "aarch64-apple-ios-sim" => ("iphonesimulator", "arm64"),
  46. "x86_64-apple-ios" => ("iphonesimulator", "x86_64"),
  47. _ => return,
  48. };
  49. let out_dir = std::env::var_os("OUT_DIR").map(PathBuf::from).unwrap();
  50. let derived_data_path = out_dir.join(format!("derivedData-{name}"));
  51. let status = Command::new("xcodebuild")
  52. .arg("build")
  53. .arg("-scheme")
  54. .arg(name)
  55. .arg("-configuration")
  56. .arg(configuration)
  57. .arg("-sdk")
  58. .arg(sdk)
  59. .arg("-arch")
  60. .arg(arch)
  61. .arg("-derivedDataPath")
  62. .arg(&derived_data_path)
  63. .arg("BUILD_LIBRARY_FOR_DISTRIBUTION=YES")
  64. .arg("OTHER_SWIFT_FLAGS=-no-verify-emitted-module-interface")
  65. .current_dir(source)
  66. .env_clear()
  67. .status()
  68. .unwrap();
  69. assert!(status.success());
  70. let lib_out_dir = derived_data_path
  71. .join("Build")
  72. .join("Products")
  73. .join(format!("{configuration}-{sdk}"));
  74. println!("cargo:rerun-if-changed={}", source.display());
  75. println!("cargo:rustc-link-search=native={}", lib_out_dir.display());
  76. println!("cargo:rustc-link-lib=static={name}");
  77. }