mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-02 16:21:11 +00:00
Introduce --linker flag
This commit is contained in:
parent
2be9825b7b
commit
3daba1f6c0
1 changed files with 26 additions and 29 deletions
|
@ -40,8 +40,7 @@ pub const FLAG_NO_LINK: &str = "no-link";
|
||||||
pub const FLAG_TARGET: &str = "target";
|
pub const FLAG_TARGET: &str = "target";
|
||||||
pub const FLAG_TIME: &str = "time";
|
pub const FLAG_TIME: &str = "time";
|
||||||
pub const FLAG_LINK: &str = "roc-linker";
|
pub const FLAG_LINK: &str = "roc-linker";
|
||||||
pub const FLAG_FORCE_LINK: &str = "force-roc-linker";
|
pub const FLAG_LINKER: &str = "linker";
|
||||||
pub const FLAG_LEGACY_LINK: &str = "legacy-linker";
|
|
||||||
pub const FLAG_PRECOMPILED: &str = "precompiled-host";
|
pub const FLAG_PRECOMPILED: &str = "precompiled-host";
|
||||||
pub const FLAG_VALGRIND: &str = "valgrind";
|
pub const FLAG_VALGRIND: &str = "valgrind";
|
||||||
pub const FLAG_CHECK: &str = "check";
|
pub const FLAG_CHECK: &str = "check";
|
||||||
|
@ -118,15 +117,10 @@ pub fn build_app<'a>() -> App<'a> {
|
||||||
.required(false),
|
.required(false),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new(FLAG_FORCE_LINK)
|
Arg::new(FLAG_LINKER)
|
||||||
.long(FLAG_FORCE_LINK)
|
.long(FLAG_LINKER)
|
||||||
.about("Forces using the roc linker. Useful for trying out the Roc linker on new targets.")
|
.about("Sets which linker to use. The surgical linker is enabeld by default only when building for wasm32 or x86_64 Linux, because those are the only targets it currently supports. Otherwise the legacy linker is used by default.")
|
||||||
.required(false),
|
.possible_values(["surgical", "legacy"])
|
||||||
)
|
|
||||||
.arg(
|
|
||||||
Arg::new(FLAG_LEGACY_LINK)
|
|
||||||
.long(FLAG_LEGACY_LINK)
|
|
||||||
.about("Uses the legacy linker when otherwise the roc linker would be used. (Currently, only Linux x64 uses the Roc linker by default.)")
|
|
||||||
.required(false),
|
.required(false),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
|
@ -223,25 +217,20 @@ pub fn build_app<'a>() -> App<'a> {
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new(FLAG_LINK)
|
Arg::new(FLAG_LINK)
|
||||||
.long(FLAG_LINK)
|
.long(FLAG_LINK)
|
||||||
.about("Deprecated in favor of --force-roc-linker and --legacy-linker")
|
.about("Deprecated in favor of --linker")
|
||||||
.required(false),
|
.required(false),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new(FLAG_FORCE_LINK)
|
Arg::new(FLAG_LINKER)
|
||||||
.long(FLAG_FORCE_LINK)
|
.long(FLAG_LINKER)
|
||||||
.about("Forces using the roc linker. Useful for trying out the Roc linker on new targets.")
|
.about("Sets which linker to use. The surgical linker is enabeld by default only when building for wasm32 or x86_64 Linux, because those are the only targets it currently supports. Otherwise the legacy linker is used by default.")
|
||||||
.required(false),
|
.possible_values(["surgical", "legacy"])
|
||||||
)
|
|
||||||
.arg(
|
|
||||||
Arg::new(FLAG_LEGACY_LINK)
|
|
||||||
.long(FLAG_LEGACY_LINK)
|
|
||||||
.about("Uses the legacy linker when otherwise the roc linker would be used. (Currently, only Linux x64 uses the Roc linker by default.)")
|
|
||||||
.required(false),
|
.required(false),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new(FLAG_PRECOMPILED)
|
Arg::new(FLAG_PRECOMPILED)
|
||||||
.long(FLAG_PRECOMPILED)
|
.long(FLAG_PRECOMPILED)
|
||||||
.about("Assumes the host has been precompiled and skips recompiling the host.")
|
.about("Assumes the host has been precompiled and skips recompiling the host. (Enabled by default when using --target other than --target host)")
|
||||||
.required(false),
|
.required(false),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
|
@ -335,16 +324,23 @@ pub fn build(matches: &ArgMatches, config: BuildConfig) -> io::Result<i32> {
|
||||||
(false, true) => LinkType::None,
|
(false, true) => LinkType::None,
|
||||||
(false, false) => LinkType::Executable,
|
(false, false) => LinkType::Executable,
|
||||||
};
|
};
|
||||||
let surgically_link = matches.is_present(FLAG_LINK);
|
|
||||||
let precompiled = matches.is_present(FLAG_PRECOMPILED);
|
|
||||||
|
|
||||||
if surgically_link && !roc_linker::supported(&link_type, &triple) {
|
// TODO remove FLAG_LINK from the code base anytime after the end of May 2022
|
||||||
panic!(
|
if matches.is_present(FLAG_LINK) {
|
||||||
"Link type, {:?}, with target, {}, not supported by roc linker",
|
eprintln!("ERROR: The --roc-linker flag has been deprecated because the roc linker is now used automatically where it's supported. (Currently that's only x64 Linux.) No need to use --roc-linker anymore, but you can use the --linker flag to switch linkers.");
|
||||||
link_type, triple
|
process::exit(1);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Use surgical linking when supported, or when explicitly requested with --force-roc-linker
|
||||||
|
let surgically_link = if matches.is_present(FLAG_LINKER) {
|
||||||
|
matches.value_of(FLAG_LINKER) == Some("surgical")
|
||||||
|
} else {
|
||||||
|
roc_linker::supported(&link_type, &triple)
|
||||||
|
};
|
||||||
|
|
||||||
|
// When compiling for a different target, we assume a precompiled host.
|
||||||
|
// Otherwise compilation would most likely fail!
|
||||||
|
let precompiled = target != Target::Host || matches.is_present(FLAG_PRECOMPILED);
|
||||||
let path = Path::new(filename);
|
let path = Path::new(filename);
|
||||||
|
|
||||||
// Spawn the root task
|
// Spawn the root task
|
||||||
|
@ -535,6 +531,7 @@ fn run_with_wasmer(_wasm_path: &std::path::Path, _args: &[String]) {
|
||||||
println!("Running wasm files not support");
|
println!("Running wasm files not support");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
||||||
enum Target {
|
enum Target {
|
||||||
Host,
|
Host,
|
||||||
Linux32,
|
Linux32,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue