From 607497d57caf28c3d06adfdd5bca826e9c81205b Mon Sep 17 00:00:00 2001 From: Urgau Date: Sun, 28 Apr 2024 14:44:30 +0200 Subject: [PATCH 1/2] Port print-cfg run-make to Rust-based rmake.rs --- .../tidy/src/allowed_run_make_makefiles.txt | 1 - tests/run-make/print-cfg/Makefile | 37 ------- tests/run-make/print-cfg/rmake.rs | 100 ++++++++++++++++++ tests/run-make/print-to-output/rmake.rs | 67 ++++++++++++ 4 files changed, 167 insertions(+), 38 deletions(-) delete mode 100644 tests/run-make/print-cfg/Makefile create mode 100644 tests/run-make/print-cfg/rmake.rs create mode 100644 tests/run-make/print-to-output/rmake.rs diff --git a/src/tools/tidy/src/allowed_run_make_makefiles.txt b/src/tools/tidy/src/allowed_run_make_makefiles.txt index 1b560ee352c6c..a2179b895b3d6 100644 --- a/src/tools/tidy/src/allowed_run_make_makefiles.txt +++ b/src/tools/tidy/src/allowed_run_make_makefiles.txt @@ -219,7 +219,6 @@ run-make/prefer-rlib/Makefile run-make/pretty-print-to-file/Makefile run-make/pretty-print-with-dep-file/Makefile run-make/print-calling-conventions/Makefile -run-make/print-cfg/Makefile run-make/print-target-list/Makefile run-make/profile/Makefile run-make/prune-link-args/Makefile diff --git a/tests/run-make/print-cfg/Makefile b/tests/run-make/print-cfg/Makefile deleted file mode 100644 index 6b153e5b54edd..0000000000000 --- a/tests/run-make/print-cfg/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -# needs-llvm-components: x86 arm - -include ../tools.mk - -all: default output_to_file - $(RUSTC) --target x86_64-pc-windows-gnu --print cfg | $(CGREP) windows - $(RUSTC) --target x86_64-pc-windows-gnu --print cfg | $(CGREP) x86_64 - $(RUSTC) --target i686-pc-windows-msvc --print cfg | $(CGREP) msvc - $(RUSTC) --target i686-apple-darwin --print cfg | $(CGREP) macos - $(RUSTC) --target i686-unknown-linux-gnu --print cfg | $(CGREP) gnu - $(RUSTC) --target arm-unknown-linux-gnueabihf --print cfg | $(CGREP) target_abi= - $(RUSTC) --target arm-unknown-linux-gnueabihf --print cfg | $(CGREP) eabihf - -output_to_file: - # Backend-independent, printed by rustc_driver_impl/src/lib.rs - $(RUSTC) --target x86_64-pc-windows-gnu --print cfg=$(TMPDIR)/cfg.txt - $(CGREP) windows < $(TMPDIR)/cfg.txt - - # Printed from CodegenBackend trait impl in rustc_codegen_llvm/src/lib.rs - $(RUSTC) --print relocation-models=$(TMPDIR)/relocation-models.txt - $(CGREP) dynamic-no-pic < $(TMPDIR)/relocation-models.txt - - # Printed by compiler/rustc_codegen_llvm/src/llvm_util.rs - $(RUSTC) --target wasm32-unknown-unknown --print target-features=$(TMPDIR)/target-features.txt - $(CGREP) reference-types < $(TMPDIR)/target-features.txt - - # Printed by C++ code in rustc_llvm/llvm-wrapper/PassWrapper.cpp - $(RUSTC) --target wasm32-unknown-unknown --print target-cpus=$(TMPDIR)/target-cpus.txt - $(CGREP) generic < $(TMPDIR)/target-cpus.txt - -ifdef IS_WINDOWS -default: - $(RUSTC) --print cfg | $(CGREP) windows -else -default: - $(RUSTC) --print cfg | $(CGREP) unix -endif diff --git a/tests/run-make/print-cfg/rmake.rs b/tests/run-make/print-cfg/rmake.rs new file mode 100644 index 0000000000000..0f829c9a95fca --- /dev/null +++ b/tests/run-make/print-cfg/rmake.rs @@ -0,0 +1,100 @@ +//! This checks the output of `--print=cfg` +//! +//! Specifically it checks that output is correctly formatted +//! (ie. no duplicated cfgs, values are between "", names are not). +//! +//! It also checks that some targets have the correct set cfgs. + +extern crate run_make_support; + +use std::collections::HashSet; +use std::ffi::OsString; +use std::io::BufRead; +use std::iter::FromIterator; + +use run_make_support::{rustc, tmp_dir}; + +fn main() { + check( + /*target*/ "x86_64-pc-windows-gnu", + /*includes*/ &["windows", "target_arch=\"x86_64\""], + /*disallow*/ &["unix"], + ); + check( + /*target*/ "i686-pc-windows-msvc", + /*includes*/ &["windows", "target_env=\"msvc\""], + /*disallow*/ &["unix"], + ); + check( + /*target*/ "i686-apple-darwin", + /*includes*/ &["unix", "target_os=\"macos\"", "target_vendor=\"apple\""], + /*disallow*/ &["windows"], + ); + check( + /*target*/ "i686-unknown-linux-gnu", + /*includes*/ &["unix", "target_env=\"gnu\""], + /*disallow*/ &["windows"], + ); + check( + /*target*/ "arm-unknown-linux-gnueabihf", + /*includes*/ &["unix", "target_abi=\"eabihf\""], + /*disallow*/ &["windows"], + ); +} + +fn check(target: &str, includes: &[&str], disallow: &[&str]) { + fn _inner(output: &str, includes: &[&str], disallow: &[&str]) { + let mut found = HashSet::::new(); + let mut recorded = HashSet::::new(); + + for l in output.lines() { + assert!(l == l.trim()); + if let Some((left, right)) = l.split_once('=') { + assert!(right.starts_with("\"")); + assert!(right.ends_with("\"")); + assert!(!left.contains("\"")); + } else { + assert!(!l.contains("\"")); + } + + assert!(recorded.insert(l.to_string()), "duplicated: {}", &l); + assert!(!disallow.contains(&l), "found disallowed: {}", &l); + if includes.contains(&l) { + assert!(found.insert(l.to_string()), "duplicated (includes): {}", &l); + } + } + + let should_found = HashSet::::from_iter(includes.iter().map(|s| s.to_string())); + let diff: Vec<_> = should_found.difference(&found).collect(); + + assert!( + diff.is_empty(), + "expected: {:?}, found: {:?} (~ {:?})", + &should_found, + &found, + &diff + ); + } + + // --print=cfg + { + let output = rustc().target(target).print("cfg").run(); + + let stdout = String::from_utf8(output.stdout).unwrap(); + + _inner(&stdout, includes, disallow); + } + + // --print=cfg=PATH + { + let tmp_path = tmp_dir().join(format!("{target}.cfg")); + let mut print_arg = OsString::from("--print=cfg="); + print_arg.push(tmp_path.as_os_str()); + + let output = rustc().target(target).arg(print_arg).run(); + + let output = std::fs::read_to_string(&tmp_path).unwrap(); + + _inner(&output, includes, disallow); + } +} diff --git a/tests/run-make/print-to-output/rmake.rs b/tests/run-make/print-to-output/rmake.rs new file mode 100644 index 0000000000000..91724b492f8d2 --- /dev/null +++ b/tests/run-make/print-to-output/rmake.rs @@ -0,0 +1,67 @@ +//! This checks the output of some `--print` options when +//! output to a file (instead of stdout) + +extern crate run_make_support; + +use std::ffi::OsString; + +use run_make_support::{rustc, target, tmp_dir}; + +fn main() { + // Printed from CodegenBackend trait impl in rustc_codegen_llvm/src/lib.rs + check( + /*target*/ &target(), + /*option*/ "relocation-models", + /*includes*/ &["dynamic-no-pic"], + ); + + // Printed by compiler/rustc_codegen_llvm/src/llvm_util.rs + check( + /*target*/ "wasm32-unknown-unknown", + /*option*/ "target-features", + /*includes*/ &["reference-types"], + ); + + // Printed by C++ code in rustc_llvm/llvm-wrapper/PassWrapper.cpp + check( + /*target*/ "wasm32-unknown-unknown", + /*option*/ "target-cpus", + /*includes*/ &["generic"], + ); +} + +fn check(target: &str, option: &str, includes: &[&str]) { + fn _inner(output: &str, includes: &[&str]) { + for i in includes { + assert!(output.contains(i), "output doesn't contains: {}", i); + } + } + + // --print={option} + let stdout = { + let output = rustc().target(target).print(option).run(); + + let stdout = String::from_utf8(output.stdout).unwrap(); + + _inner(&stdout, includes); + + stdout + }; + + // --print={option}=PATH + let output = { + let tmp_path = tmp_dir().join(format!("{option}.txt")); + let mut print_arg = OsString::from(format!("--print={option}=")); + print_arg.push(tmp_path.as_os_str()); + + let _output = rustc().target(target).arg(print_arg).run(); + + let output = std::fs::read_to_string(&tmp_path).unwrap(); + + _inner(&output, includes); + + output + }; + + assert_eq!(&stdout, &output); +} From 006c94cfa1a4658318f237d87afb2a4434d42b39 Mon Sep 17 00:00:00 2001 From: Urgau Date: Sun, 28 Apr 2024 17:17:18 +0200 Subject: [PATCH 2/2] Use named struct arguments instead of comment named args --- tests/run-make/print-cfg/rmake.rs | 64 ++++++++++++++----------- tests/run-make/print-to-output/rmake.rs | 63 ++++++++++++------------ 2 files changed, 67 insertions(+), 60 deletions(-) diff --git a/tests/run-make/print-cfg/rmake.rs b/tests/run-make/print-cfg/rmake.rs index 0f829c9a95fca..71db7b8a6937e 100644 --- a/tests/run-make/print-cfg/rmake.rs +++ b/tests/run-make/print-cfg/rmake.rs @@ -14,36 +14,42 @@ use std::iter::FromIterator; use run_make_support::{rustc, tmp_dir}; +struct PrintCfg { + target: &'static str, + includes: &'static [&'static str], + disallow: &'static [&'static str], +} + fn main() { - check( - /*target*/ "x86_64-pc-windows-gnu", - /*includes*/ &["windows", "target_arch=\"x86_64\""], - /*disallow*/ &["unix"], - ); - check( - /*target*/ "i686-pc-windows-msvc", - /*includes*/ &["windows", "target_env=\"msvc\""], - /*disallow*/ &["unix"], - ); - check( - /*target*/ "i686-apple-darwin", - /*includes*/ &["unix", "target_os=\"macos\"", "target_vendor=\"apple\""], - /*disallow*/ &["windows"], - ); - check( - /*target*/ "i686-unknown-linux-gnu", - /*includes*/ &["unix", "target_env=\"gnu\""], - /*disallow*/ &["windows"], - ); - check( - /*target*/ "arm-unknown-linux-gnueabihf", - /*includes*/ &["unix", "target_abi=\"eabihf\""], - /*disallow*/ &["windows"], - ); + check(PrintCfg { + target: "x86_64-pc-windows-gnu", + includes: &["windows", "target_arch=\"x86_64\""], + disallow: &["unix"], + }); + check(PrintCfg { + target: "i686-pc-windows-msvc", + includes: &["windows", "target_env=\"msvc\""], + disallow: &["unix"], + }); + check(PrintCfg { + target: "i686-apple-darwin", + includes: &["unix", "target_os=\"macos\"", "target_vendor=\"apple\""], + disallow: &["windows"], + }); + check(PrintCfg { + target: "i686-unknown-linux-gnu", + includes: &["unix", "target_env=\"gnu\""], + disallow: &["windows"], + }); + check(PrintCfg { + target: "arm-unknown-linux-gnueabihf", + includes: &["unix", "target_abi=\"eabihf\""], + disallow: &["windows"], + }); } -fn check(target: &str, includes: &[&str], disallow: &[&str]) { - fn _inner(output: &str, includes: &[&str], disallow: &[&str]) { +fn check(PrintCfg { target, includes, disallow }: PrintCfg) { + fn check_(output: &str, includes: &[&str], disallow: &[&str]) { let mut found = HashSet::::new(); let mut recorded = HashSet::::new(); @@ -82,7 +88,7 @@ fn check(target: &str, includes: &[&str], disallow: &[&str]) { let stdout = String::from_utf8(output.stdout).unwrap(); - _inner(&stdout, includes, disallow); + check_(&stdout, includes, disallow); } // --print=cfg=PATH @@ -95,6 +101,6 @@ fn check(target: &str, includes: &[&str], disallow: &[&str]) { let output = std::fs::read_to_string(&tmp_path).unwrap(); - _inner(&output, includes, disallow); + check_(&output, includes, disallow); } } diff --git a/tests/run-make/print-to-output/rmake.rs b/tests/run-make/print-to-output/rmake.rs index 91724b492f8d2..8595a0c490b34 100644 --- a/tests/run-make/print-to-output/rmake.rs +++ b/tests/run-make/print-to-output/rmake.rs @@ -7,31 +7,37 @@ use std::ffi::OsString; use run_make_support::{rustc, target, tmp_dir}; +struct Option<'a> { + target: &'a str, + option: &'static str, + includes: &'static [&'static str], +} + fn main() { // Printed from CodegenBackend trait impl in rustc_codegen_llvm/src/lib.rs - check( - /*target*/ &target(), - /*option*/ "relocation-models", - /*includes*/ &["dynamic-no-pic"], - ); + check(Option { + target: &target(), + option: "relocation-models", + includes: &["dynamic-no-pic"], + }); // Printed by compiler/rustc_codegen_llvm/src/llvm_util.rs - check( - /*target*/ "wasm32-unknown-unknown", - /*option*/ "target-features", - /*includes*/ &["reference-types"], - ); + check(Option { + target: "wasm32-unknown-unknown", + option: "target-features", + includes: &["reference-types"], + }); // Printed by C++ code in rustc_llvm/llvm-wrapper/PassWrapper.cpp - check( - /*target*/ "wasm32-unknown-unknown", - /*option*/ "target-cpus", - /*includes*/ &["generic"], - ); + check(Option { + target: "wasm32-unknown-unknown", + option: "target-cpus", + includes: &["generic"], + }); } -fn check(target: &str, option: &str, includes: &[&str]) { - fn _inner(output: &str, includes: &[&str]) { +fn check(args: Option) { + fn check_(output: &str, includes: &[&str]) { for i in includes { assert!(output.contains(i), "output doesn't contains: {}", i); } @@ -39,29 +45,24 @@ fn check(target: &str, option: &str, includes: &[&str]) { // --print={option} let stdout = { - let output = rustc().target(target).print(option).run(); - - let stdout = String::from_utf8(output.stdout).unwrap(); - - _inner(&stdout, includes); + let output = rustc().target(args.target).print(args.option).run(); - stdout + String::from_utf8(output.stdout).unwrap() }; // --print={option}=PATH let output = { - let tmp_path = tmp_dir().join(format!("{option}.txt")); - let mut print_arg = OsString::from(format!("--print={option}=")); + let tmp_path = tmp_dir().join(format!("{}.txt", args.option)); + let mut print_arg = OsString::from(format!("--print={}=", args.option)); print_arg.push(tmp_path.as_os_str()); - let _output = rustc().target(target).arg(print_arg).run(); + let _output = rustc().target(args.target).arg(print_arg).run(); - let output = std::fs::read_to_string(&tmp_path).unwrap(); - - _inner(&output, includes); - - output + std::fs::read_to_string(&tmp_path).unwrap() }; + check_(&stdout, args.includes); + check_(&output, args.includes); + assert_eq!(&stdout, &output); }