aboutsummaryrefslogtreecommitdiff
path: root/libbuild2/cc
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2024-09-30 16:26:17 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2024-09-30 16:26:17 +0200
commit1fbeda93459ca4f8e326f4c3723a1ecb94c3f45f (patch)
tree84c28d3ebd63c648cff0dedd97e4bee1fcc45384 /libbuild2/cc
parent85d8a34f9ffefa715a174f215262584d7b91b459 (diff)
Add ability to specify custom MSVC /MACHINE value
This, for example, can be used to link for ARM64EC instead of the default ARM64: "config.cxx=cl.exe /arm64EC" config.cc.loptions=/MACHINE:ARM64EC
Diffstat (limited to 'libbuild2/cc')
-rw-r--r--libbuild2/cc/link-rule.cxx34
1 files changed, 24 insertions, 10 deletions
diff --git a/libbuild2/cc/link-rule.cxx b/libbuild2/cc/link-rule.cxx
index d9fbbea..a669f37 100644
--- a/libbuild2/cc/link-rule.cxx
+++ b/libbuild2/cc/link-rule.cxx
@@ -3522,10 +3522,6 @@ namespace build2
//
args.push_back ("/NOLOGO");
- // Add /MACHINE.
- //
- args.push_back (msvc_machine (cast<string> (rs[x_target_cpu])));
-
// For utility libraries use thin archives if possible.
//
// LLVM's lib replacement had the /LLVMLIBTHIN option at least from
@@ -3592,7 +3588,16 @@ namespace build2
{
// Are we using the compiler or the linker (e.g., link.exe) directly?
//
- bool ldc (tsys != "win32-msvc");
+ bool ldc;
+
+ if (tsys == "win32-msvc")
+ {
+ args.push_back ("/NOLOGO");
+ ldc = false;
+ }
+ else
+ ldc = true;
+
if (ldc)
{
@@ -4002,6 +4007,20 @@ namespace build2
if (lt.shared_library () && (tsys == "win32-msvc" || tsys == "mingw32"))
reli = relative (find_adhoc_member<libi> (t)->path ());
+ if (tsys == "win32-msvc")
+ {
+ // Add /MACHINE unless there is a custom value (/MACHINE:ARM64EC).
+ //
+ // Note that we don't bother hashing it since to change its value one
+ // would have to use a different MSVC toolchain (which means things
+ // would be rebuilt from scratch anyway).
+ //
+ if (!find_option_prefix ("/MACHINE:", args, true))
+ {
+ args.push_back (msvc_machine (cast<string> (rs[x_target_cpu])));
+ }
+ }
+
const process_path* ld (nullptr);
if (lt.static_library ())
{
@@ -4025,15 +4044,10 @@ namespace build2
// Using link.exe directly.
//
ld = &cast<process_path> (rs["bin.ld.path"]);
- args.push_back ("/NOLOGO");
if (ot == otype::s)
args.push_back ("/DLL");
- // Add /MACHINE.
- //
- args.push_back (msvc_machine (cast<string> (rs[x_target_cpu])));
-
// Unless explicitly enabled with /INCREMENTAL, disable incremental
// linking (it is implicitly enabled if /DEBUG is specified). The
// reason is the .ilk file: its name cannot be changed and if we