authorbors <bors@rust-lang.org> 2025-04-12 16:54:16 UTC
committerbors <bors@rust-lang.org> 2025-04-12 16:54:16 UTC
log9ffde4b089fe8e43d5891eb517001df27a8443ff
treef79b49a32473e09330f6aad716c3a234c1222596
parent7cd6e2f94e18fa7ef92df03a2ede1b7aa773b27d
parent4362789eb0b3001905f338a6e865c437b4756461

Auto merge of #139242 - jieyouxu:run-make-artifact-names-cross, r=Kobzol

run-make-support: Calculate artifact names for target platform, not host platform This was implemented incorrectly during the porting process, where we relied on std consts. However, `run-make-support` is a host-only library, which meant that these artifact names were for the *host* and not the *target*. Helps with #138066. r? `@Kobzol` try-job: armhf-gnu try-job: test-various try-job: x86_64-msvc-1 try-job: i686-msvc-1 try-job: x86_64-mingw-1 try-job: aarch64-apple try-job: x86_64-apple-1

8 files changed, 81 insertions(+), 19 deletions(-)

src/tools/run-make-support/src/artifact_names.rs+40-13
......@@ -1,11 +1,11 @@
11//! A collection of helpers to construct artifact names, such as names of dynamic or static
2//! librarys which are target-dependent.
3
4// FIXME(jieyouxu): convert these to return `PathBuf`s instead of strings!
2//! libraries which are target-dependent.
53
4use crate::target;
65use crate::targets::is_msvc;
76
87/// Construct the static library name based on the target.
8#[track_caller]
99#[must_use]
1010pub fn static_lib_name(name: &str) -> String {
1111 assert!(!name.contains(char::is_whitespace), "static library name cannot contain whitespace");
......@@ -14,15 +14,34 @@ pub fn static_lib_name(name: &str) -> String {
1414}
1515
1616/// Construct the dynamic library name based on the target.
17#[track_caller]
1718#[must_use]
1819pub fn dynamic_lib_name(name: &str) -> String {
1920 assert!(!name.contains(char::is_whitespace), "dynamic library name cannot contain whitespace");
2021
21 format!("{}{name}.{}", std::env::consts::DLL_PREFIX, std::env::consts::DLL_EXTENSION)
22 format!("{}{name}.{}", dynamic_lib_prefix(), dynamic_lib_extension())
23}
24
25fn dynamic_lib_prefix() -> &'static str {
26 if target().contains("windows") { "" } else { "lib" }
2227}
2328
24/// Construct the name of the import library for the dynamic library, exclusive to MSVC and
25/// accepted by link.exe.
29/// Construct the dynamic library extension based on the target.
30#[must_use]
31pub fn dynamic_lib_extension() -> &'static str {
32 let target = target();
33
34 if target.contains("apple") {
35 "dylib"
36 } else if target.contains("windows") {
37 "dll"
38 } else {
39 "so"
40 }
41}
42
43/// Construct the name of the import library for the dynamic library, exclusive to MSVC and accepted
44/// by link.exe.
2645#[track_caller]
2746#[must_use]
2847pub fn msvc_import_dynamic_lib_name(name: &str) -> String {
......@@ -32,20 +51,28 @@ pub fn msvc_import_dynamic_lib_name(name: &str) -> String {
3251 format!("{name}.dll.lib")
3352}
3453
35/// Construct the dynamic library extension based on the target.
36#[must_use]
37pub fn dynamic_lib_extension() -> &'static str {
38 std::env::consts::DLL_EXTENSION
39}
40
4154/// Construct the name of a rust library (rlib).
55#[track_caller]
4256#[must_use]
4357pub fn rust_lib_name(name: &str) -> String {
4458 format!("lib{name}.rlib")
4559}
4660
4761/// Construct the binary (executable) name based on the target.
62#[track_caller]
4863#[must_use]
4964pub fn bin_name(name: &str) -> String {
50 format!("{name}{}", std::env::consts::EXE_SUFFIX)
65 let target = target();
66
67 if target.contains("windows") {
68 format!("{name}.exe")
69 } else if target.contains("uefi") {
70 format!("{name}.efi")
71 } else if target.contains("wasm") {
72 format!("{name}.wasm")
73 } else if target.contains("nvptx") {
74 format!("{name}.ptx")
75 } else {
76 name.to_string()
77 }
5178}
tests/run-make/crate-data-smoke/rmake.rs+27-5
......@@ -1,9 +1,20 @@
1use run_make_support::{bin_name, rust_lib_name, rustc};
1use run_make_support::{bin_name, rust_lib_name, rustc, target};
22
33fn main() {
4 rustc().print("crate-name").input("crate.rs").run().assert_stdout_equals("foo");
5 rustc().print("file-names").input("crate.rs").run().assert_stdout_equals(bin_name("foo"));
64 rustc()
5 .target(target())
6 .print("crate-name")
7 .input("crate.rs")
8 .run()
9 .assert_stdout_equals("foo");
10 rustc()
11 .target(target())
12 .print("file-names")
13 .input("crate.rs")
14 .run()
15 .assert_stdout_equals(bin_name("foo"));
16 rustc()
17 .target(target())
718 .print("file-names")
819 .crate_type("lib")
920 .arg("--test")
......@@ -11,11 +22,22 @@ fn main() {
1122 .run()
1223 .assert_stdout_equals(bin_name("foo"));
1324 rustc()
25 .target(target())
1426 .print("file-names")
1527 .arg("--test")
1628 .input("lib.rs")
1729 .run()
1830 .assert_stdout_equals(bin_name("mylib"));
19 rustc().print("file-names").input("lib.rs").run().assert_stdout_equals(rust_lib_name("mylib"));
20 rustc().print("file-names").input("rlib.rs").run().assert_stdout_equals(rust_lib_name("mylib"));
31 rustc()
32 .target(target())
33 .print("file-names")
34 .input("lib.rs")
35 .run()
36 .assert_stdout_equals(rust_lib_name("mylib"));
37 rustc()
38 .target(target())
39 .print("file-names")
40 .input("rlib.rs")
41 .run()
42 .assert_stdout_equals(rust_lib_name("mylib"));
2143}
tests/run-make/crate-name-priority/rmake.rs+2
......@@ -4,6 +4,8 @@
44// and the compiler flags, and checks that the flag is favoured each time.
55// See https://github.com/rust-lang/rust/pull/15518
66
7//@ ignore-cross-compile (relocations in generic ELF against `arm-unknown-linux-gnueabihf`)
8
79use run_make_support::{bin_name, rfs, rustc};
810
911fn main() {
tests/run-make/extra-filename-with-temp-outputs/rmake.rs+2
......@@ -6,6 +6,8 @@
66// are named as expected.
77// See https://github.com/rust-lang/rust/pull/15686
88
9//@ ignore-cross-compile (relocations in generic ELF against `arm-unknown-linux-gnueabihf`)
10
911use run_make_support::{bin_name, cwd, has_prefix, has_suffix, rfs, rustc, shallow_find_files};
1012
1113fn main() {
tests/run-make/output-type-permutations/rmake.rs+4
......@@ -4,6 +4,9 @@
44// files are exactly what is expected, no more, no less.
55// See https://github.com/rust-lang/rust/pull/12020
66
7//@ ignore-cross-compile
8// Reason: some cross-compiled targets don't support various crate types and fail to link.
9
710use std::path::PathBuf;
811
912use run_make_support::{
......@@ -17,6 +20,7 @@ use run_make_support::{
1720// `dir`: the name of the directory where the test happens
1821// `rustc_invocation`: the rustc command being tested
1922// Any unexpected output files not listed in `must_exist` or `can_exist` will cause a failure.
23#[track_caller]
2024fn assert_expected_output_files(expectations: Expectations, rustc_invocation: impl Fn()) {
2125 let Expectations { expected_files: must_exist, allowed_files: can_exist, test_dir: dir } =
2226 expectations;
tests/run-make/reproducible-build/rmake.rs+2
......@@ -20,6 +20,8 @@
2020// See https://github.com/rust-lang/rust/pull/32293
2121// Tracking Issue: https://github.com/rust-lang/rust/issues/129080
2222
23//@ ignore-cross-compile (linker binary needs to run)
24
2325use run_make_support::{
2426 bin_name, cwd, diff, is_darwin, is_windows, regex, rfs, run_in_tmpdir, rust_lib_name, rustc,
2527};
tests/run-make/strip/rmake.rs+2-1
......@@ -1,4 +1,5 @@
1//@ ignore-windows Windows does not actually strip
1//@ ignore-windows (Windows does not actually strip)
2//@ ignore-cross-compile (relocations in generic ELF against `arm-unknown-linux-gnueabihf`)
23
34// Test that -Cstrip correctly strips/preserves debuginfo and symbols.
45
tests/run-make/symbols-all-mangled/rmake.rs+2
......@@ -1,5 +1,7 @@
11// Check that all symbols in cdylibs, staticlibs and bins are mangled
22//@ only-elf some object file formats create multiple symbols for each function with different names
3//@ ignore-nvptx64 (needs target std)
4//@ ignore-cross-compile (host-only)
35
46use run_make_support::object::read::{Object, ObjectSymbol};
57use run_make_support::{bin_name, dynamic_lib_name, object, rfs, rustc, static_lib_name};