summaryrefslogtreecommitdiff
path: root/cli
diff options
context:
space:
mode:
Diffstat (limited to 'cli')
-rw-r--r--cli/Cargo.toml2
-rw-r--r--cli/args/flags.rs13
-rw-r--r--cli/standalone/binary.rs24
-rw-r--r--cli/tools/compile.rs2
4 files changed, 36 insertions, 5 deletions
diff --git a/cli/Cargo.toml b/cli/Cargo.toml
index 4ce3f1725..bb6508b55 100644
--- a/cli/Cargo.toml
+++ b/cli/Cargo.toml
@@ -79,7 +79,7 @@ deno_semver = "=0.5.10"
deno_task_shell = "=0.17.0"
deno_terminal.workspace = true
eszip = "=0.73.0"
-libsui = "0.1.0"
+libsui = "0.3.0"
napi_sym.workspace = true
node_resolver.workspace = true
diff --git a/cli/args/flags.rs b/cli/args/flags.rs
index 800d6ff5a..266907b13 100644
--- a/cli/args/flags.rs
+++ b/cli/args/flags.rs
@@ -121,6 +121,7 @@ pub struct CompileFlags {
pub args: Vec<String>,
pub target: Option<String>,
pub no_terminal: bool,
+ pub icon: Option<String>,
pub include: Vec<String>,
}
@@ -1769,6 +1770,12 @@ supported in canary.
.help("Hide terminal on Windows")
.action(ArgAction::SetTrue),
)
+ .arg(
+ Arg::new("icon")
+ .long("icon")
+ .help("Set the icon of the executable on Windows (.ico)")
+ .value_parser(value_parser!(String))
+ )
.arg(executable_ext_arg())
.arg(env_file_arg())
.arg(script_arg().required(true).trailing_var_arg(true))
@@ -3891,6 +3898,7 @@ fn compile_parse(flags: &mut Flags, matches: &mut ArgMatches) {
let args = script.collect();
let output = matches.remove_one::<String>("output");
let target = matches.remove_one::<String>("target");
+ let icon = matches.remove_one::<String>("icon");
let no_terminal = matches.get_flag("no-terminal");
let include = match matches.remove_many::<String>("include") {
Some(f) => f.collect(),
@@ -3904,6 +3912,7 @@ fn compile_parse(flags: &mut Flags, matches: &mut ArgMatches) {
args,
target,
no_terminal,
+ icon,
include,
});
}
@@ -9554,6 +9563,7 @@ mod tests {
args: vec![],
target: None,
no_terminal: false,
+ icon: None,
include: vec![]
}),
type_check_mode: TypeCheckMode::Local,
@@ -9565,7 +9575,7 @@ mod tests {
#[test]
fn compile_with_flags() {
#[rustfmt::skip]
- let r = flags_from_vec(svec!["deno", "compile", "--import-map", "import_map.json", "--no-remote", "--config", "tsconfig.json", "--no-check", "--unsafely-ignore-certificate-errors", "--reload", "--lock", "lock.json", "--lock-write", "--cert", "example.crt", "--cached-only", "--location", "https:foo", "--allow-read", "--allow-net", "--v8-flags=--help", "--seed", "1", "--no-terminal", "--output", "colors", "--env=.example.env", "https://examples.deno.land/color-logging.ts", "foo", "bar", "-p", "8080"]);
+ let r = flags_from_vec(svec!["deno", "compile", "--import-map", "import_map.json", "--no-remote", "--config", "tsconfig.json", "--no-check", "--unsafely-ignore-certificate-errors", "--reload", "--lock", "lock.json", "--lock-write", "--cert", "example.crt", "--cached-only", "--location", "https:foo", "--allow-read", "--allow-net", "--v8-flags=--help", "--seed", "1", "--no-terminal", "--icon", "favicon.ico", "--output", "colors", "--env=.example.env", "https://examples.deno.land/color-logging.ts", "foo", "bar", "-p", "8080"]);
assert_eq!(
r.unwrap(),
Flags {
@@ -9576,6 +9586,7 @@ mod tests {
args: svec!["foo", "bar", "-p", "8080"],
target: None,
no_terminal: true,
+ icon: Some(String::from("favicon.ico")),
include: vec![]
}),
import_map_path: Some("import_map.json".to_string()),
diff --git a/cli/standalone/binary.rs b/cli/standalone/binary.rs
index 78978cefc..9d6d5262e 100644
--- a/cli/standalone/binary.rs
+++ b/cli/standalone/binary.rs
@@ -187,10 +187,19 @@ fn write_binary_bytes(
let target = compile_flags.resolve_target();
if target.contains("linux") {
- libsui::Elf::new(&original_bin).append(&writer, &mut file_writer)?;
+ libsui::Elf::new(&original_bin).append(
+ "d3n0l4nd",
+ &writer,
+ &mut file_writer,
+ )?;
} else if target.contains("windows") {
- libsui::PortableExecutable::from(&original_bin)?
- .write_resource("d3n0l4nd", writer)?
+ let mut pe = libsui::PortableExecutable::from(&original_bin)?;
+ if let Some(icon) = compile_flags.icon.as_ref() {
+ let icon = std::fs::read(icon)?;
+ pe = pe.set_icon(&icon)?;
+ }
+
+ pe.write_resource("d3n0l4nd", writer)?
.build(&mut file_writer)?;
} else if target.contains("darwin") {
libsui::Macho::from(original_bin)?
@@ -370,6 +379,15 @@ impl<'a> DenoCompileBinaryWriter<'a> {
}
set_windows_binary_to_gui(&mut original_binary)?;
}
+ if compile_flags.icon.is_some() {
+ let target = compile_flags.resolve_target();
+ if !target.contains("windows") {
+ bail!(
+ "The `--icon` flag is only available when targeting Windows (current: {})",
+ target,
+ )
+ }
+ }
self.write_standalone_binary(
writer,
original_binary,
diff --git a/cli/tools/compile.rs b/cli/tools/compile.rs
index 6cf2ccf77..90ee0e270 100644
--- a/cli/tools/compile.rs
+++ b/cli/tools/compile.rs
@@ -361,6 +361,7 @@ mod test {
args: Vec::new(),
target: Some("x86_64-unknown-linux-gnu".to_string()),
no_terminal: false,
+ icon: None,
include: vec![],
},
&std::env::current_dir().unwrap(),
@@ -385,6 +386,7 @@ mod test {
args: Vec::new(),
target: Some("x86_64-pc-windows-msvc".to_string()),
include: vec![],
+ icon: None,
no_terminal: false,
},
&std::env::current_dir().unwrap(),