-
Notifications
You must be signed in to change notification settings - Fork 481
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
Comments
Maybe we can require environment variables to be set for customs? We could use |
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. |
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 |
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 |
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. |
Aha so it's not a build-script issue... Maybe you could set |
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... |
As long as value set by |
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. |
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)
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)
…<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
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. |
The entire problem here is that But ofc we don't really want to commit to that JSON format so this is unstable for a good reason... |
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 |
|
Ah, that does work on stable and should also be easier to parse than JSON. :) |
My current preference would be to do target parsing, and not call I'll volunteer to implementing that, but I'll let @NobodyXu make a decision here first. |
Looks good to me, this would fix the -alpine-linux- |
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
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
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
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 latestrustc
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:
*-alpine-linux-musl
custom targets #1407The text was updated successfully, but these errors were encountered: