mirror of
https://github.com/wez/wezterm.git
synced 2024-09-11 14:25:57 +03:00
* feat: use CARGO_BUILD_TARGET_DIR env When building in the presence of a CARGO_BUILD_TARGET_DIR, there is no target dir created inside the repo, so copying to a location within the local repo dir fails, hence we need to copy to the actual target dir that is being used. * fix: environment variable with correct name
186 lines
6.3 KiB
Rust
186 lines
6.3 KiB
Rust
fn main() {
|
|
println!("cargo:rerun-if-changed=build.rs");
|
|
|
|
#[cfg(windows)]
|
|
{
|
|
use anyhow::Context as _;
|
|
use std::io::Write;
|
|
use std::path::Path;
|
|
let profile = std::env::var("PROFILE").unwrap();
|
|
let repo_dir = std::env::current_dir()
|
|
.ok()
|
|
.and_then(|cwd| cwd.parent().map(|p| p.to_path_buf()))
|
|
.unwrap();
|
|
let exe_output_dir = repo_dir.join("target").join(profile);
|
|
let windows_dir = repo_dir.join("assets").join("windows");
|
|
|
|
let conhost_dir = windows_dir.join("conhost");
|
|
for name in &["conpty.dll", "OpenConsole.exe"] {
|
|
let dest_name = exe_output_dir.join(name);
|
|
let src_name = conhost_dir.join(name);
|
|
|
|
if !dest_name.exists() {
|
|
std::fs::copy(&src_name, &dest_name)
|
|
.context(format!(
|
|
"copy {} -> {}",
|
|
src_name.display(),
|
|
dest_name.display()
|
|
))
|
|
.unwrap();
|
|
}
|
|
}
|
|
|
|
let angle_dir = windows_dir.join("angle");
|
|
for name in &["libEGL.dll", "libGLESv2.dll"] {
|
|
let dest_name = exe_output_dir.join(name);
|
|
let src_name = angle_dir.join(name);
|
|
|
|
if !dest_name.exists() {
|
|
std::fs::copy(&src_name, &dest_name)
|
|
.context(format!(
|
|
"copy {} -> {}",
|
|
src_name.display(),
|
|
dest_name.display()
|
|
))
|
|
.unwrap();
|
|
}
|
|
}
|
|
|
|
{
|
|
let dest_mesa = exe_output_dir.join("mesa");
|
|
let _ = std::fs::create_dir(&dest_mesa);
|
|
let dest_name = dest_mesa.join("opengl32.dll");
|
|
let src_name = windows_dir.join("mesa").join("opengl32.dll");
|
|
if !dest_name.exists() {
|
|
std::fs::copy(&src_name, &dest_name)
|
|
.context(format!(
|
|
"copy {} -> {}",
|
|
src_name.display(),
|
|
dest_name.display()
|
|
))
|
|
.unwrap();
|
|
}
|
|
}
|
|
|
|
// If a file named `.tag` is present, we'll take its contents for the
|
|
// version number that we report in wezterm -h.
|
|
let mut ci_tag = String::new();
|
|
if let Ok(tag) = std::fs::read("../.tag") {
|
|
if let Ok(s) = String::from_utf8(tag) {
|
|
ci_tag = s.trim().to_string();
|
|
println!("cargo:rerun-if-changed=../.tag");
|
|
}
|
|
}
|
|
let version = if ci_tag.is_empty() {
|
|
let mut cmd = std::process::Command::new("git");
|
|
cmd.args(&[
|
|
"-c",
|
|
"core.abbrev=8",
|
|
"show",
|
|
"-s",
|
|
"--format=%cd-%h",
|
|
"--date=format:%Y%m%d-%H%M%S",
|
|
]);
|
|
if let Ok(output) = cmd.output() {
|
|
if output.status.success() {
|
|
String::from_utf8_lossy(&output.stdout).trim().to_owned()
|
|
} else {
|
|
"UNKNOWN".to_owned()
|
|
}
|
|
} else {
|
|
"UNKNOWN".to_owned()
|
|
}
|
|
} else {
|
|
ci_tag
|
|
};
|
|
|
|
let rcfile_name = Path::new(&std::env::var_os("OUT_DIR").unwrap()).join("resource.rc");
|
|
let mut rcfile = std::fs::File::create(&rcfile_name).unwrap();
|
|
println!("cargo:rerun-if-changed=../assets/windows/terminal.ico");
|
|
write!(
|
|
rcfile,
|
|
r#"
|
|
#include <winres.h>
|
|
// This ID is coupled with code in window/src/os/windows/window.rs
|
|
#define IDI_ICON 0x101
|
|
1 RT_MANIFEST "{win}\\manifest.manifest"
|
|
IDI_ICON ICON "{win}\\terminal.ico"
|
|
VS_VERSION_INFO VERSIONINFO
|
|
FILEVERSION 1,0,0,0
|
|
PRODUCTVERSION 1,0,0,0
|
|
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
|
|
FILEFLAGS 0
|
|
FILEOS VOS__WINDOWS32
|
|
FILETYPE VFT_APP
|
|
FILESUBTYPE VFT2_UNKNOWN
|
|
BEGIN
|
|
BLOCK "StringFileInfo"
|
|
BEGIN
|
|
BLOCK "040904E4"
|
|
BEGIN
|
|
VALUE "CompanyName", "Wez Furlong\0"
|
|
VALUE "FileDescription", "WezTerm - Wez's Terminal Emulator\0"
|
|
VALUE "FileVersion", "{version}\0"
|
|
VALUE "LegalCopyright", "Wez Furlong, MIT licensed\0"
|
|
VALUE "InternalName", "\0"
|
|
VALUE "OriginalFilename", "\0"
|
|
VALUE "ProductName", "WezTerm\0"
|
|
VALUE "ProductVersion", "{version}\0"
|
|
END
|
|
END
|
|
BLOCK "VarFileInfo"
|
|
BEGIN
|
|
VALUE "Translation", 0x409, 1252
|
|
END
|
|
END
|
|
"#,
|
|
win = windows_dir.display().to_string().replace("\\", "\\\\"),
|
|
version = version,
|
|
)
|
|
.unwrap();
|
|
drop(rcfile);
|
|
|
|
// Obtain MSVC environment so that the rc compiler can find the right headers.
|
|
// https://github.com/nabijaczleweli/rust-embed-resource/issues/11#issuecomment-603655972
|
|
let target = std::env::var("TARGET").unwrap();
|
|
if let Some(tool) = cc::windows_registry::find_tool(target.as_str(), "cl.exe") {
|
|
for (key, value) in tool.env() {
|
|
std::env::set_var(key, value);
|
|
}
|
|
}
|
|
embed_resource::compile(rcfile_name);
|
|
}
|
|
|
|
#[cfg(target_os = "macos")]
|
|
{
|
|
use anyhow::Context as _;
|
|
let profile = std::env::var("PROFILE").unwrap();
|
|
let repo_dir = std::env::current_dir()
|
|
.ok()
|
|
.and_then(|cwd| cwd.parent().map(|p| p.to_path_buf()))
|
|
.unwrap();
|
|
|
|
// We need to copy the plist to avoid the UNUserNotificationCenter asserting
|
|
// due to not finding the application bundle
|
|
let src_plist = repo_dir
|
|
.join("assets")
|
|
.join("macos")
|
|
.join("WezTerm.app")
|
|
.join("Contents")
|
|
.join("Info.plist");
|
|
let build_target_dir = std::env::var("CARGO_TARGET_DIR")
|
|
.and_then(|s| Ok(std::path::PathBuf::from(s)))
|
|
.unwrap_or(repo_dir.join("target").join(profile));
|
|
let dest_plist = build_target_dir.join("Info.plist");
|
|
println!("cargo:rerun-if-changed=assets/macos/WezTerm.app/Contents/Info.plist");
|
|
|
|
std::fs::copy(&src_plist, &dest_plist)
|
|
.context(format!(
|
|
"copy {} -> {}",
|
|
src_plist.display(),
|
|
dest_plist.display()
|
|
))
|
|
.unwrap();
|
|
}
|
|
}
|