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 support for C/C++ compiler for Neutrino QNX: qcc #1319

Merged
merged 1 commit into from
Dec 13, 2024

Conversation

flba-eb
Copy link
Contributor

@flba-eb flba-eb commented Dec 12, 2024

This adds support for using the C/C++ compiler qcc from Neutrino QNX, with the target parameters required.

So far, it was required to set various environment variables.

CC: @jonathanpallant @japaric @gh-tr @AkhilTThomas

Copy link
Collaborator

@NobodyXu NobodyXu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, is it possible to setup CI and a new test to actually use qcc for testing

@flba-eb
Copy link
Contributor Author

flba-eb commented Dec 12, 2024

Unfortunately this is not possible because qcc requires a paid license.

@jonathanpallant
Copy link

jonathanpallant commented Dec 12, 2024

Is this going to let us drop all the CFLAGS_<target> environment variables from the QNX Neutrino libstd builds?

Ah, the link says yes.

@flba-eb
Copy link
Contributor Author

flba-eb commented Dec 12, 2024

Is this going to let us drop all the CFLAGS_<target> environment variables from the QNX Neutrino libstd builds?

Yes, see also rust-lang/rust#134211 😄

src/lib.rs Outdated Show resolved Hide resolved
@NobodyXu
Copy link
Collaborator

Not very familiar with Neutrino QNX, cc @madsmtm can you have a look at this PR please?

src/lib.rs Outdated Show resolved Hide resolved
src/lib.rs Show resolved Hide resolved
src/lib.rs Outdated
@@ -2803,6 +2818,8 @@ impl Build {
format!("arm-kmc-eabi-{}", gnu)
} else if target.arch == "aarch64" && target.vendor == "kmc" {
format!("aarch64-kmc-elf-{}", gnu)
} else if target.os == "nto" {
"qcc".into()
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It sounds like this target only supports compiling with qcc, is that true?

If so, @NobodyXu is this the right place to set this up? This would only select the default compiler, right? What if the user passes cc::Build::new().compiler("clang")? Is the expected behaviour to still try to use Clang, even though we know that'll fail?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It sounds like this target only supports compiling with qcc, is that true?

I think/guess you have to use qcc if you want to include system header files due to license reasons. In other words, usually only qcc is used.
If someone wants to use a very non-default compiler, they can set it via environment variables.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My concern is that if we add the -V flag, then you won't be able to compile with other compilers that don't support that flag

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I get your point. Thinking about my previous statement: It's not just header files, you also cannot link to create executables or shared objects without license violations. I don't think we need to support non-qcc compilers.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cool, thanks for the clarification.

Gonna keep this open pending answer wrt. default vs. required compiler.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think anyone is compiling for QNX Neutrino and not using qcc. If you pay this much for your RTOS, you colour between the lines, not outside.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I meant, I wanted @NobodyXu to confirm that this was the best place to set it up ;)

@madsmtm
Copy link
Collaborator

madsmtm commented Dec 12, 2024

(Also not familiar with Neutrino QNX, I'm fine with deferring to the target maintainers here)

Copy link
Collaborator

@madsmtm madsmtm left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

Final few questions from me:

  • Do we need to do something else to support the io-pkt/io-sock divide? Do we need to pass a special flag or something?
  • Is there a compiler flag for choosing between 7.0, 7.1 and 8.0? E.g. do we actually need to pass e.g. -V7.0,gcc_ntoaarch64le_cxx, or am I misunderstanding that?

@flba-eb
Copy link
Contributor Author

flba-eb commented Dec 12, 2024

Thanks!

Final few questions from me:

  • Do we need to do something else to support the io-pkt/io-sock divide? Do we need to pass a special flag or something?

Only linking requires an additional library search path which is added by rustc when rustc links. As far as I understand cc, it never calls a linker itself. If cc can be used to link shared objects / executables, then it would make sense to investigate.

  • Is there a compiler flag for choosing between 7.0, 7.1 and 8.0? E.g. do we actually need to pass e.g. -V7.0,gcc_ntoaarch64le_cxx, or am I misunderstanding that?

No, I'm only adding -Vgcc_ntoaarch64le_cxx. The version number is optional. Also, this version relates to the used compiler version (e.g. "gcc 8.3"), not the QNX version.

@jonathanpallant
Copy link

The correct compiler is added to your PATH by running a shell script / batch file supplied with the QNX Software Development Platform, so you can't have both QNX SDP 8.0 and QNX SDP 7.1 (for example) versions of qcc in your PATH at the same time.

@jonathanpallant
Copy link

(and the OS is called QNX Neutrino, not Neutrino QNX, fwiw)

@madsmtm
Copy link
Collaborator

madsmtm commented Dec 12, 2024

Only linking requires an additional library search path which is added by rustc when rustc links. As far as I understand cc, it never calls a linker itself. If cc can be used to link shared objects / executables, then it would make sense to investigate.

I think cc does somewhat support this with Build::shared_flag, though I'm not familiar with how well we support it (and I definitely won't block this PR on that).

The correct compiler is added to your PATH by running a shell script / batch file supplied with the QNX Software Development Platform, so you can't have both QNX SDP 8.0 and QNX SDP 7.1 (for example) versions of qcc in your PATH at the same time.

I'm just worried that users might have e.g. QNX SDP 7.1 configured while building the aarch64-unknown-nto-qnx700 target, is there a check against such incompatibilities anywhere?

@flba-eb
Copy link
Contributor Author

flba-eb commented Dec 12, 2024

The correct compiler is added to your PATH by running a shell script / batch file supplied with the QNX Software Development Platform, so you can't have both QNX SDP 8.0 and QNX SDP 7.1 (for example) versions of qcc in your PATH at the same time.

I'm just worried that users might have e.g. QNX SDP 7.1 configured while building the aarch64-unknown-nto-qnx700 target, is there a check against such incompatibilities anywhere?

The toolchain does not reveal the QNX version, unfortunately. You would need to start parsing header files, like I've tried with rust-lang/libc#4192 ... but as also written there:
Even if you are having QNX 7.1 on the target and a QNX 7.1 toolchain, it does not mean they are compatible. Sometimes, values and/or signatures can change in header files between "sub versions" (e.g. which provide special, hardware/project dependent improvements) of e.g. 7.1.

@madsmtm
Copy link
Collaborator

madsmtm commented Dec 12, 2024

Fair, it's unfortunate that that's the state of things, but I guess we don't need to do anything in cc to avoid it then.

src/lib.rs Show resolved Hide resolved
compiler-errors added a commit to compiler-errors/rust that referenced this pull request Dec 13, 2024
…er-errors

On Neutrino QNX, reduce the need to set archiver via environment variables

This adds support for automatically selecting the correct `ar` tool when compiling for Neutrino QNX.
Once rust-lang/cc-rs#1319 is merged and a new cc version is integrated, all environment variables of the [Neutrino documentation](https://github.com/rust-lang/rust/blob/stable/src/doc/rustc/src/platform-support/nto-qnx.md) can be removed.

CC: `@jonathanpallant` `@japaric` `@gh-tr` `@AkhilTThomas`
Zalathar added a commit to Zalathar/rust that referenced this pull request Dec 13, 2024
…er-errors

On Neutrino QNX, reduce the need to set archiver via environment variables

This adds support for automatically selecting the correct `ar` tool when compiling for Neutrino QNX.
Once rust-lang/cc-rs#1319 is merged and a new cc version is integrated, all environment variables of the [Neutrino documentation](https://github.com/rust-lang/rust/blob/stable/src/doc/rustc/src/platform-support/nto-qnx.md) can be removed.

CC: ``@jonathanpallant`` ``@japaric`` ``@gh-tr`` ``@AkhilTThomas``
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request Dec 13, 2024
…er-errors

On Neutrino QNX, reduce the need to set archiver via environment variables

This adds support for automatically selecting the correct `ar` tool when compiling for Neutrino QNX.
Once rust-lang/cc-rs#1319 is merged and a new cc version is integrated, all environment variables of the [Neutrino documentation](https://github.com/rust-lang/rust/blob/stable/src/doc/rustc/src/platform-support/nto-qnx.md) can be removed.

CC: ```@jonathanpallant``` ```@japaric``` ```@gh-tr``` ```@AkhilTThomas```
Copy link
Collaborator

@NobodyXu NobodyXu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you!

@NobodyXu NobodyXu merged commit 82c8c7b into rust-lang:main Dec 13, 2024
27 checks passed
@github-actions github-actions bot mentioned this pull request Dec 13, 2024
@flba-eb flba-eb deleted the set_qcc branch December 13, 2024 10:28
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request Dec 13, 2024
…er-errors

On Neutrino QNX, reduce the need to set archiver via environment variables

This adds support for automatically selecting the correct `ar` tool when compiling for Neutrino QNX.
Once rust-lang/cc-rs#1319 is merged and a new cc version is integrated, all environment variables of the [Neutrino documentation](https://github.com/rust-lang/rust/blob/stable/src/doc/rustc/src/platform-support/nto-qnx.md) can be removed.

CC: ````@jonathanpallant```` ````@japaric```` ````@gh-tr```` ````@AkhilTThomas````
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request Dec 13, 2024
…er-errors

On Neutrino QNX, reduce the need to set archiver via environment variables

This adds support for automatically selecting the correct `ar` tool when compiling for Neutrino QNX.
Once rust-lang/cc-rs#1319 is merged and a new cc version is integrated, all environment variables of the [Neutrino documentation](https://github.com/rust-lang/rust/blob/stable/src/doc/rustc/src/platform-support/nto-qnx.md) can be removed.

CC: `````@jonathanpallant````` `````@japaric````` `````@gh-tr````` `````@AkhilTThomas`````
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request Dec 13, 2024
…er-errors

On Neutrino QNX, reduce the need to set archiver via environment variables

This adds support for automatically selecting the correct `ar` tool when compiling for Neutrino QNX.
Once rust-lang/cc-rs#1319 is merged and a new cc version is integrated, all environment variables of the [Neutrino documentation](https://github.com/rust-lang/rust/blob/stable/src/doc/rustc/src/platform-support/nto-qnx.md) can be removed.

CC: ``````@jonathanpallant`````` ``````@japaric`````` ``````@gh-tr`````` ``````@AkhilTThomas``````
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request Dec 13, 2024
…er-errors

On Neutrino QNX, reduce the need to set archiver via environment variables

This adds support for automatically selecting the correct `ar` tool when compiling for Neutrino QNX.
Once rust-lang/cc-rs#1319 is merged and a new cc version is integrated, all environment variables of the [Neutrino documentation](https://github.com/rust-lang/rust/blob/stable/src/doc/rustc/src/platform-support/nto-qnx.md) can be removed.

CC: ```````@jonathanpallant``````` ```````@japaric``````` ```````@gh-tr``````` ```````@AkhilTThomas```````
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request Dec 14, 2024
…er-errors

On Neutrino QNX, reduce the need to set archiver via environment variables

This adds support for automatically selecting the correct `ar` tool when compiling for Neutrino QNX.
Once rust-lang/cc-rs#1319 is merged and a new cc version is integrated, all environment variables of the [Neutrino documentation](https://github.com/rust-lang/rust/blob/stable/src/doc/rustc/src/platform-support/nto-qnx.md) can be removed.

CC: ````````@jonathanpallant```````` ````````@japaric```````` ````````@gh-tr```````` ````````@AkhilTThomas````````
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Dec 14, 2024
Rollup merge of rust-lang#134211 - flba-eb:add_qnx_archiver, r=compiler-errors

On Neutrino QNX, reduce the need to set archiver via environment variables

This adds support for automatically selecting the correct `ar` tool when compiling for Neutrino QNX.
Once rust-lang/cc-rs#1319 is merged and a new cc version is integrated, all environment variables of the [Neutrino documentation](https://github.com/rust-lang/rust/blob/stable/src/doc/rustc/src/platform-support/nto-qnx.md) can be removed.

CC: ````````@jonathanpallant```````` ````````@japaric```````` ````````@gh-tr```````` ````````@AkhilTThomas````````
github-actions bot pushed a commit to rust-lang/miri that referenced this pull request Dec 15, 2024
On Neutrino QNX, reduce the need to set archiver via environment variables

This adds support for automatically selecting the correct `ar` tool when compiling for Neutrino QNX.
Once rust-lang/cc-rs#1319 is merged and a new cc version is integrated, all environment variables of the [Neutrino documentation](https://github.com/rust-lang/rust/blob/stable/src/doc/rustc/src/platform-support/nto-qnx.md) can be removed.

CC: ````````@jonathanpallant```````` ````````@japaric```````` ````````@gh-tr```````` ````````@AkhilTThomas````````
bors added a commit to rust-lang-ci/rust that referenced this pull request 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
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants