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

Discussion: Reconsider target parsing #1317

Open
madsmtm opened this issue Dec 6, 2024 · 17 comments · May be fixed by #1413
Open

Discussion: Reconsider target parsing #1317

madsmtm opened this issue Dec 6, 2024 · 17 comments · May be fixed by #1413

Comments

@madsmtm
Copy link
Collaborator

madsmtm commented Dec 6, 2024

I'm beginning to regret the decision we took in #1225 (comment) to pre-generate a static list of target information from the current nightly, instead of trying to guess it from the target name.

The gist of the issue is that static data doesn't help us much when using a custom target - but when using custom targets, we usually still need to default to some value (example: the LLVM target). Also, I don't like that you can sometimes use cc in a build script, but not outside.

And yeah, rustc target names are a mess, and they're impossible to parse correctly in general, but we can do a fairly good job at it (that's what I implemented in that PR initially) - especially if we have CI that verifies the parsing code against the latest rustc specs. Of course, manual parsing code is more tedious to update, i.e. the automated GitHub PRs would've instead been turned into a CI failure that we'd have to fix.

Idk., still don't know how I feel about it, but I do know that I was unhappy with #1315, as I felt I kinda had to get the default relocation model guessing correct, and once it was correct, there wasn't any point in the pre-generated data.

Related issues:

@NobodyXu
Copy link
Collaborator

NobodyXu commented Dec 6, 2024

The gist of the issue is that static data doesn't help us much when using a custom target - but when using custom targets, we usually still need to default to some value (example: the LLVM target).

Maybe we can require environment variables to be set for customs?

We could use cc::Build::envs to avoid unsafe set_var

@tronical
Copy link
Contributor

tronical commented Dec 6, 2024

As one of the affected parties, I think what surprised me most is that this came in a minor version and broke existing builds (#1297). I think the change itself makes a lot of sense, but it would have been a lot easier if this was in a new major version so that the transition can be controlled.

Just my two cents. Absolutely love the crate and how responsive you all are as maintainers.

@lasiotus
Copy link

lasiotus commented Dec 14, 2024

Yes, please reconsider target parsing!

Context: Motor OS is a custom Rust target at the moment (not an official Tier-3 target), so it is not part of the pre-generated list of "targets known to rustc". The switch to pre-generated targets keeps us on an older Rust version, which is somewhat unfortunate.

Maybe do target parsing for targets not found in the static/pregenerated list?

Related issue: moturus/motor-os#18

@NobodyXu
Copy link
Collaborator

NobodyXu commented Dec 15, 2024

Maybe do target parsing for targets not found in the static/pregenerated list?

I think that'd be reasonable, but shouldn't cargo already pass environment variables that we could use https://docs.rs/cc/latest/src/cc/target/parser.rs.html

cc @lasiotus

@lasiotus
Copy link

[...] shouldn't cargo already pass environment variables that we could use https://docs.rs/cc/latest/src/cc/target/parser.rs.html

At the moment rustc/stdlib bootstrap calls get_compiler() which kills the process if the target is not recognized.

Essentially we have here a circular dependency: Rust's target bootstrap depends on cc recognizing the target, which does so only for "targets recognized by rustc", if I understand the logic here correctly.

So unofficial targets are now a bit more painful to maintain/work on.

@NobodyXu
Copy link
Collaborator

At the moment rustc/stdlib bootstrap calls get_compiler() which kills the process if the target is not recognized.

Aha so it's not a build-script issue...

Maybe you could set CARGO_* manually?

https://docs.rs/cc/latest/src/cc/target/parser.rs.html

@lasiotus
Copy link

Maybe you could set CARGO_* manually?

It seems this should work - I'll try a bit later; thanks for the suggestion!

@lasiotus
Copy link

Maybe you could set CARGO_* manually?

It seems this should work - I'll try a bit later; thanks for the suggestion!

Doesn't work: rustc bootstrap code sets Build::target string triple prior to calling get_compiler(); but get_compiler() -> get_target() parses cargo env vars only if the target string is not set. The latest cc-rs version even explicitly advises forking itself for unrecognized targets. So now new targets need to fork both rust and cc-rs. Again, seems like a circular dependency...

Probably the bootstrap code can be hacked to not set the target string triple before calling get_compiler(), but this is becoming increasingly fragile...

@NobodyXu
Copy link
Collaborator

Doesn't work: rustc bootstrap code sets Build::target string triple prior to calling get_compiler();

As long as value set by Build::target matches the env variable TARGET it would take the CARGO_* env parsing step

@lasiotus
Copy link

lasiotus commented Dec 15, 2024

As long as value set by Build::target matches the env variable TARGET it would take the CARGO_* env parsing step

That worked, thanks!

As it works only at head, and not at 1.2.0 to which Rust bootstrap is pinned, I created a PR to bump the pin to 1.2.4.

bors added a commit to rust-lang-ci/rust that referenced this issue Dec 16, 2024
Repoint cc dep in bootstrap to its latest version.

v1.2.4 handles new/unofficial targets much better than v1.2.0.

More specifically, v1.2.4 allows using env vars to pass target parameters to cc crate, as discussed in rust-lang/cc-rs#1317. With v1.2.0, unofficial targets like [Motor OS](https://github.com/moturus/motor-os) [cannot](moturus/motor-os#18) easily rebase to the current rust-lang and have to stay at an [older version](https://github.com/moturus/rust/tree/motor-os_2024-10-18).

Also bump cmake's version from 0.1.48 to 0.1.52, as it is linked to cc.

cc-rs changelogs:

[1.2.4](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md#121---2024-11-14)
[1.2.3](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md#123---2024-12-06)
[1.2.2](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md#122---2024-11-29)
[1.2.1](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md#121---2024-11-14)

cmake changelogs/releases:

[0.1.52](https://github.com/rust-lang/cmake-rs/blob/master/CHANGELOG.md#0152---2024-11-25)
[0.1.51](https://github.com/rust-lang/cmake-rs/blob/master/CHANGELOG.md#0151---2024-08-15)
0.1.50: not a release
[0.1.49](https://github.com/rust-lang/cmake-rs/releases/tag/0.1.49)
bors added a commit to rust-lang-ci/rust that referenced this issue Dec 16, 2024
Repoint cc dep in bootstrap to its latest version.

v1.2.4 handles new/unofficial targets much better than v1.2.0.

More specifically, v1.2.4 allows using env vars to pass target parameters to cc crate, as discussed in rust-lang/cc-rs#1317. With v1.2.0, unofficial targets like [Motor OS](https://github.com/moturus/motor-os) [cannot](moturus/motor-os#18) easily rebase to the current rust-lang and have to stay at an [older version](https://github.com/moturus/rust/tree/motor-os_2024-10-18).

Also bump cmake's version from 0.1.48 to 0.1.52, as it is linked to cc.

cc-rs changelogs:

[1.2.4](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md#121---2024-11-14)
[1.2.3](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md#123---2024-12-06)
[1.2.2](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md#122---2024-11-29)
[1.2.1](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md#121---2024-11-14)

cmake changelogs/releases:

[0.1.52](https://github.com/rust-lang/cmake-rs/blob/master/CHANGELOG.md#0152---2024-11-25)
[0.1.51](https://github.com/rust-lang/cmake-rs/blob/master/CHANGELOG.md#0151---2024-08-15)
0.1.50: not a release
[0.1.49](https://github.com/rust-lang/cmake-rs/releases/tag/0.1.49)
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
@sunshowers
Copy link

sunshowers commented Feb 23, 2025

In case it helps, my former coworker wrote (and I maintain) https://docs.rs/target-spec which has support for builtin, heuristic, and custom (JSON-based) target parsing. Feel free to use it or grab code from there as required.

@RalfJung
Copy link
Member

The entire problem here is that rustc --print target-spec-json is unstable, right? If that was stable you could just run rustc with suitable flags and parse the JSON to get the required info in a structured way?

But ofc we don't really want to commit to that JSON format so this is unstable for a good reason...

@NobodyXu
Copy link
Collaborator

The entire problem here is that rustc --print target-spec-json is unstable, right?

If we are running cc-rs on a nightly toolchain, perhaps we could run this instead of using pre-parsed information?

The only problem with this is that we would need a json parser now

@madsmtm
Copy link
Collaborator Author

madsmtm commented Feb 23, 2025

The entire problem here is that rustc --print target-spec-json is unstable, right?

rustc --print cfg would probably be an option for most of what we need today.

@RalfJung
Copy link
Member

Ah, that does work on stable and should also be easier to parse than JSON. :)

@madsmtm
Copy link
Collaborator Author

madsmtm commented Feb 24, 2025

My current preference would be to do target parsing, and not call rustc --print cfg except for in tests. Possibly with a script / GitHub action that periodically opens a new issue if the test doesn't work.

I'll volunteer to implementing that, but I'll let @NobodyXu make a decision here first.

@madsmtm madsmtm closed this as completed Feb 24, 2025
@madsmtm madsmtm reopened this Feb 24, 2025
@NobodyXu
Copy link
Collaborator

My current preference would be to do target parsing, and not call rustc --print cfg except for in tests.

Looks good to me, this would fix the -alpine-linux-

@madsmtm madsmtm linked a pull request Feb 24, 2025 that will close this issue
fmease added a commit to fmease/rust that referenced this issue Feb 25, 2025
downgrade bootstrap `cc`

Current `cc` version causing bootstrap to fail on custom targets. See rust-lang/cc-rs#1317 for more context.

Fixes (after beta and stable backports): rust-lang#137064 and rust-lang#135271
fmease added a commit to fmease/rust that referenced this issue Feb 25, 2025
downgrade bootstrap `cc`

Current `cc` version causing bootstrap to fail on custom targets. See rust-lang/cc-rs#1317 for more context.

Fixes (after beta and stable backports): rust-lang#137064 and rust-lang#135271
rust-timer added a commit to rust-lang-ci/rust that referenced this issue Feb 25, 2025
Rollup merge of rust-lang#137460 - onur-ozkan:downgrade-cc, r=jieyouxu

downgrade bootstrap `cc`

Current `cc` version causing bootstrap to fail on custom targets. See rust-lang/cc-rs#1317 for more context.

Fixes (after beta and stable backports): rust-lang#137064 and rust-lang#135271
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

6 participants