Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add testing supports tests those need multiple compile commands #1298

Closed
lht opened this issue Dec 14, 2011 · 12 comments
Closed

Add testing supports tests those need multiple compile commands #1298

lht opened this issue Dec 14, 2011 · 12 comments
Assignees
Labels
A-testsuite Area: The testsuite used to check the correctness of rustc

Comments

@lht
Copy link
Contributor

lht commented Dec 14, 2011

For example, I need to test the re-export issue (#1115). Steps are:

  • compile a crate as library, which re-exports a function.
  • call that re-exported function from another crate.
  • verify compile-pass or run-pass, etc.

This requires executing rustc twice, and we don't have this kind of support in the test framework now.

I believe there are more places where combining rustc and shell commands is needed. Like verifying metadata dumped by "rustc --ls". Check rustc generated filenames.

And add missing tests when the infrastructure is ready.

@brson
Copy link
Contributor

brson commented Dec 14, 2011

The main thing we need this for is to compile a crate, then run a test that depends on that crate.

@graydon
Copy link
Contributor

graydon commented Dec 14, 2011

I'm not sure I understand what this bug is about. Can you clarify?

@lht
Copy link
Contributor Author

lht commented Dec 15, 2011

I updated the description. Please feel free to reword it.

@lht
Copy link
Contributor Author

lht commented Dec 16, 2011

Thought about this more... How about put tests in a single file that could be preprocessed by test runner.

When run the test, the test runner will:

  • Create a directory for holding artifacts of this test.
  • Scan and split this input delimited by "file:" directive, and save them to the above directory or feed to rustc directly.
  • Compile to libraries or executable according to the "compile-flags" directive
  • If there is a "run:" directive, execute the command line after compilation and verify the exit code

Below are two examples:

// Test rustc correctly handle input file with relative path
// and outputs properly named library.

// file: foo.rs
// compile-cmd:--lib ./foo.rs
fn main() { }

// run:ls libfoo-8e702f2a2bfac15b-0.0.so
// test re-export works across several crates

// file:foo.rs
// compile-flags:--lib
use std;
mod o {
  fn test() { std::io::println("foo::test"); }
}

// file:bar.rs
// compile-flags:--lib
use foo;
import foo::o::test;
export test;

// file:baz.rs
// compile-flags:--lib
use bar;
import tz = bar::test;
export tz;

// file:main.rs
// compile-flags:-L .
use baz;
fn main() {
  baz::tz();
}

// run:./main

@brson
Copy link
Contributor

brson commented Dec 16, 2011

There are two issues being solved here: 1 is expressing dependencies between test crates, 2 is running arbitrary commands to test various properties.

Let's avoid adding a feature that instructs the test runner to execute arbitrary commands, because it's too open-ended and could make things harder to maintain later.

In your example above where you want to test that rustc names the output correctly, I would suggest that the best way to do this would be to write unit tests in rustc itself. That would verify that the functions that are responsible for naming output produce the correct result. It's true that it wouldn't strictly test that the actual file showed up as expected, but you can still get a lot of guarantees out of fine-grained unit tests.

Frankly, I'm not crazy about having the test runner create a workspace for every test and split them up like that. Not sure why, but it seems like too many moving parts.

For expressing dependencies between crates we could do something like the following:

  1. We create a way to use rustc to query the attributes of source code.
  2. We convert all the current comment-directives to attributes.
  3. We add a #[test_dep] attribute that specifies the name of a different test, which compiletest then uses to establish a build order.
  4. The existing #[crate_type] attribute would direct rustc to build the dependencies as libraries.

This replaces our little but growing comment-language with an existing mechanism.

I'm still not sure this is a good idea either for a few reasons:

  1. The crates which are dependencies would then need to be marked in such a way that compiletest knows they aren't themselves tests. This is potentially fine, since we've had other cases like this - there's at least one file that is marked xfail just so compiletest doesn't run it.
  2. We then have attributes in most every test. This could interfere with tests that are actually trying to test attributes
  3. Attributes depend on the parser, so compile-fail tests that test parser failure would make it difficult to read the attributes.

After writing all those negatives I am less fond of this idea.

@lht
Copy link
Contributor Author

lht commented Dec 17, 2011

I agree with the comment of running arbitrary commands. I prefer testing the functionality as unit tests.

Make a temporary work space for each test creates a "namespace" for crate libraries. So we can have lots of libfoo without wasting time finding new name or solving name collisions. A work space can also be created by putting many source files in one folder, then we need to invent another format for specifying the build order. Writing them all down in one file implies the build order. And it's easier to read when all code are in one file, presumably they are all short enough.

I actually like the "comment directives", it has limitations but it's also more intuitive and self-contained. The compiler is just a hundred lines of code? Attributes may be well used for unit tests, but I feel comment directive serves better when testing the compiler as a black box.

I am thinking this all as one single test. Building a dependent relationship makes things more complex, and maybe unnecessary.

@nikomatsakis
Copy link
Contributor

I really need something like this for CCI. @brson and I discussed it and we were thinking of doing the following, which seems like "the simplest thing that could possibly work":

  • Add a "//build --lib foo/bar.rs" directive. This will cause rustc to be invoked on the given target with the given options.
  • There will be a sibling directory of run-pass, compile-fail, etc called "aux". When you want to write a test that uses multiple modules, you put the main module in run-pass etc as usual, and the other module(s) in aux. The other module(s) must be buildable.
  • The main module can then do //build --lib aux/foo and use foo; as normal. The test runner will add -L aux to the command-line automatically.

@nikomatsakis
Copy link
Contributor

Sorry, that's not quite right: probably the aux directory will be a sub-directory of run-pass and friends? Well, anyway, something like that. I plan to implement this soon.

@nikomatsakis
Copy link
Contributor

Also, //build will probably just take a filename: //build aux/foo.rs. The options will be automatic.

@nikomatsakis
Copy link
Contributor

Sorry for the many small comments... one last thought, probably just //build foo.rs, and let the aux directory be automatically supplied as an argument to the test runner.

@ghost ghost assigned nikomatsakis Apr 12, 2012
@catamorphism
Copy link
Contributor

Is this done? We have the aux-build attribute now, and I can't tell whether there's more beyond that that we want to implement.

@nikomatsakis
Copy link
Contributor

I think it's done enough. Going to close (feel free to re-open).

bjorn3 added a commit to bjorn3/rust that referenced this issue Dec 14, 2022
Introduce CargoProject type and use it where possible
celinval pushed a commit to celinval/rust-dev that referenced this issue Jun 4, 2024
* Also added dockerfiles for AL2, Ubuntu 22.04. Not in CI yet.
Kobzol pushed a commit to Kobzol/rust that referenced this issue Dec 30, 2024
bors pushed a commit to rust-lang-ci/rust that referenced this issue Jan 2, 2025
bors added a commit to rust-lang-ci/rust that referenced this issue Feb 15, 2025
…<try>

Bump bootstrap cc to 1.2.14 and cmake to 0.1.54

## Summary

Bump bootstrap's `cc` and `cmake` deps:

1. To make it easier to add new/unofficial targets. In particular, `cc` v1.2.4+ allows using env vars to pass target parameters to the `cc` crate. This was previously attempted in rust-lang#134344 but ran into macos-cross-to-iOS problems with `cmake` (and also rust-lang#136440, rust-lang#136720). See also discussions in rust-lang/cc-rs#1317.
2. Fix some flag inheritance warnings. Fixes rust-lang#136338.

## `cc` changelogs between `1.2.0` and `1.2.14`

> ## [1.2.14](rust-lang/cc-rs@cc-v1.2.13...cc-v1.2.14) - 2025-02-14
>
> ### Other
>
> - Regenerate target info ([rust-lang#1398](rust-lang/cc-rs#1398))
> - Add support for setting `-gdwarf-{version}` based on RUSTFLAGS ([rust-lang#1395](rust-lang/cc-rs#1395))
> - Add support for alternative network stack io-sock on QNX 7.1 aarch64 and x86_64 ([rust-lang#1312](rust-lang/cc-rs#1312))
>
> ## [1.2.13](rust-lang/cc-rs@cc-v1.2.12...cc-v1.2.13) - 2025-02-08
>
> ### Other
>
> - Fix cross-compiling for Apple platforms ([rust-lang#1389](rust-lang/cc-rs#1389))
>
> ## [1.2.12](rust-lang/cc-rs@cc-v1.2.11...cc-v1.2.12) - 2025-02-04
>
> ### Other
>
> - Split impl Build ([rust-lang#1382](rust-lang/cc-rs#1382))
> - Don't specify both `-target` and `-mtargetos=` on Apple targets ([rust-lang#1384](rust-lang/cc-rs#1384))
>
> ## [1.2.11](rust-lang/cc-rs@cc-v1.2.10...cc-v1.2.11) - 2025-01-31
>
> ### Other
>
> - Fix more flag inheritance ([rust-lang#1380](rust-lang/cc-rs#1380))
> - Include wrapper args. in `stdout` family heuristics to restore classifying `clang --driver-mode=cl` as `Msvc { clang_cl: true }` ([rust-lang#1378](rust-lang/cc-rs#1378))
> - Constrain `-Clto` and `-Cembed-bitcode` flag inheritance to be `clang`-only ([rust-lang#1379](rust-lang/cc-rs#1379))
> - Pass deployment target with `-m*-version-min=` ([rust-lang#1339](rust-lang/cc-rs#1339))
> - Regenerate target info ([rust-lang#1376](rust-lang/cc-rs#1376))
>
> ## [1.2.10](rust-lang/cc-rs@cc-v1.2.9...cc-v1.2.10) - 2025-01-17
>
> ### Other
>
> - Fix CC_FORCE_DISABLE=0 evaluating to true ([rust-lang#1371](rust-lang/cc-rs#1371))
> - Regenerate target info ([rust-lang#1369](rust-lang/cc-rs#1369))
> - Make hidden lifetimes explicit. ([rust-lang#1366](rust-lang/cc-rs#1366))
>
> ## [1.2.9](rust-lang/cc-rs@cc-v1.2.8...cc-v1.2.9) - 2025-01-12
>
> ### Other
>
> - Don't pass inherited PGO flags to GNU compilers (rust-lang#1363)
> - Adjusted zig cc judgment and avoided zigbuild errors([rust-lang#1360](rust-lang/cc-rs#1360)) ([rust-lang#1361](rust-lang/cc-rs#1361))
> - Fix compilation on macOS using clang and fix compilation using zig-cc ([rust-lang#1364](rust-lang/cc-rs#1364))
>
> ## [1.2.8](rust-lang/cc-rs@cc-v1.2.7...cc-v1.2.8) - 2025-01-11
>
> ### Other
>
> - Add `is_like_clang_cl()` getter (rust-lang#1357)
> - Fix clippy error in lib.rs ([rust-lang#1356](rust-lang/cc-rs#1356))
> - Regenerate target info ([rust-lang#1352](rust-lang/cc-rs#1352))
> - Fix compiler family detection issue with clang-cl on macOS ([rust-lang#1328](rust-lang/cc-rs#1328))
> - Update `windows-bindgen` dependency ([rust-lang#1347](rust-lang/cc-rs#1347))
> - Fix clippy warnings ([rust-lang#1346](rust-lang/cc-rs#1346))
>
> ## [1.2.7](rust-lang/cc-rs@cc-v1.2.6...cc-v1.2.7) - 2025-01-03
>
> ### Other
>
> - Regenerate target info ([rust-lang#1342](rust-lang/cc-rs#1342))
> - Document new supported architecture names in windows::find
> - Make is_flag_supported_inner take an &Tool ([rust-lang#1337](rust-lang/cc-rs#1337))
> - Fix is_flag_supported on msvc ([rust-lang#1336](rust-lang/cc-rs#1336))
> - Allow using Visual Studio target names in `find_tool` ([rust-lang#1335](rust-lang/cc-rs#1335))
>
> ## [1.2.6](rust-lang/cc-rs@cc-v1.2.5...cc-v1.2.6) - 2024-12-27
>
> ### Other
>
> - Don't inherit the `/Oy` flag for 64-bit targets ([rust-lang#1330](rust-lang/cc-rs#1330))
>
> ## [1.2.5](rust-lang/cc-rs@cc-v1.2.4...cc-v1.2.5) - 2024-12-19
>
> ### Other
>
> - Check linking when testing if compiler flags are supported ([rust-lang#1322](rust-lang/cc-rs#1322))
>
> ## [1.2.4](rust-lang/cc-rs@cc-v1.2.3...cc-v1.2.4) - 2024-12-13
>
> ### Other
>
> - Add support for C/C++ compiler for Neutrino QNX: `qcc` ([rust-lang#1319](rust-lang/cc-rs#1319))
> - use -maix64 instead of -m64 ([rust-lang#1307](rust-lang/cc-rs#1307))
>
> ## [1.2.3](rust-lang/cc-rs@cc-v1.2.2...cc-v1.2.3) - 2024-12-06
>
> ### Other
>
> - Improve detection of environment when compiling from msbuild or msvc ([rust-lang#1310](rust-lang/cc-rs#1310))
> - Better error message when failing on unknown targets ([rust-lang#1313](rust-lang/cc-rs#1313))
> - Optimize RustcCodegenFlags ([rust-lang#1305](rust-lang/cc-rs#1305))
>
> ## [1.2.2](rust-lang/cc-rs@cc-v1.2.1...cc-v1.2.2) - 2024-11-29
>
> ### Other
>
> - Inherit flags from rustc ([rust-lang#1279](rust-lang/cc-rs#1279))
> - Add support for using sccache wrapper with cuda/nvcc ([rust-lang#1304](rust-lang/cc-rs#1304))
> - Fix msvc stdout not shown on error ([rust-lang#1303](rust-lang/cc-rs#1303))
> - Regenerate target info ([rust-lang#1301](rust-lang/cc-rs#1301))
> - Fix compilation of C++ code for armv7-unknown-linux-gnueabihf ([rust-lang#1298](rust-lang/cc-rs#1298))
> - Fetch target info from Cargo even if `Build::target` is manually set ([rust-lang#1299](rust-lang/cc-rs#1299))
> - Fix two files with different extensions having the same object name ([rust-lang#1295](rust-lang/cc-rs#1295))
> - Allow disabling cc's ability to compile via env var CC_FORCE_DISABLE ([rust-lang#1292](rust-lang/cc-rs#1292))
> - Regenerate target info ([rust-lang#1293](rust-lang/cc-rs#1293))
>
> ## [1.2.1](rust-lang/cc-rs@cc-v1.2.0...cc-v1.2.1) - 2024-11-14
>
> ### Other
>
> - When invoking `cl -?`, set stdin to null ([rust-lang#1288](rust-lang/cc-rs#1288))

## `cmake` changelogs `0.1.51` to `0.1.54`

> ## [0.1.54](rust-lang/cmake-rs@v0.1.53...v0.1.54) - 2025-02-10
>
> ### Other
>
> - Remove workaround for broken `cc-rs` versions ([rust-lang#235](rust-lang/cmake-rs#235))
> - Be more precise in the description of `register_dep` ([rust-lang#238](rust-lang/cmake-rs#238))
>
> ## [0.1.53](rust-lang/cmake-rs@v0.1.52...v0.1.53) - 2025-01-27
>
> ### Other
>
> - Disable broken Make jobserver support on OSX to fix parallel builds ([rust-lang#229](rust-lang/cmake-rs#229))
>
> ## [0.1.52](rust-lang/cmake-rs@v0.1.51...v0.1.52) - 2024-11-25
>
> ### Other
>
> - Expose cc-rs no_default_flags for hassle-free cross-compilation ([rust-lang#225](rust-lang/cmake-rs#225))
> - Add a `success` job to CI
> - Change `--build` to use an absolute path
> - Merge pull request [rust-lang#195](rust-lang/cmake-rs#195) from meowtec/feat/improve-fail-hint
> - Improve hint for cmake not installed in Linux (code 127)
>
> ## [0.1.51](rust-lang/cmake-rs@v0.1.50...v0.1.51) - 2024-08-15
>
> ### Added
>
> - Add JOM generator support ([rust-lang#183](rust-lang/cmake-rs#183))
> - Improve visionOS support ([rust-lang#209](rust-lang/cmake-rs#209))
> - Use `Generic` for bare-metal systems ([rust-lang#187](rust-lang/cmake-rs#187))
>
> ### Fixed
>
> - Fix cross compilation on android armv7 and x86 ([rust-lang#186](rust-lang/cmake-rs#186))

try-job: dist-apple-various
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-testsuite Area: The testsuite used to check the correctness of rustc
Projects
None yet
Development

No branches or pull requests

5 participants