diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a650213 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.qnx +qnx710 +qnx800 diff --git a/README.md b/README.md index c41000d..32f7503 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,8 @@ # toolchains_rust -Rust toolchains + +Rust toolchains and tools to help build rust apps in S-Core + +## QNX Rust Compiler Builder + +See [tools/qnx_rust_compiler_builder/README.md](tools/qnx_rust_compiler_builder/README.md) for instructions on how to build a Rust Compiler supporting +QNX 7.1 and QNX 8.0 in a docker build. diff --git a/tools/qnx_hello_world/.cargo/config.toml b/tools/qnx_hello_world/.cargo/config.toml new file mode 100644 index 0000000..2132d97 --- /dev/null +++ b/tools/qnx_hello_world/.cargo/config.toml @@ -0,0 +1,2 @@ +[build] +target = "x86_64-pc-nto-qnx710" diff --git a/tools/qnx_hello_world/.devcontainer/devcontainer.json b/tools/qnx_hello_world/.devcontainer/devcontainer.json new file mode 100644 index 0000000..08c3713 --- /dev/null +++ b/tools/qnx_hello_world/.devcontainer/devcontainer.json @@ -0,0 +1,13 @@ +{ + "name": "qnx-rust-container-qnx710", + "image": "qnx-rust-container-qnx710:latest", + "customizations": { + "vscode": { + "extensions": [ + "BarbossHack.crates-io", + "tamasfe.even-better-toml", + "rust-lang.rust-analyzer" + ] + } + } +} \ No newline at end of file diff --git a/tools/qnx_hello_world/Cargo.lock b/tools/qnx_hello_world/Cargo.lock new file mode 100644 index 0000000..35cb70c --- /dev/null +++ b/tools/qnx_hello_world/Cargo.lock @@ -0,0 +1,685 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "axum" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de45108900e1f9b9242f7f2e254aa3e2c029c921c258fe9e6b4217eeebd54288" +dependencies = [ + "axum-core", + "bytes", + "form_urlencoded", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", +] + +[[package]] +name = "hyper-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi", + "windows-sys", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "qnx-hello-world" +version = "0.1.0" +dependencies = [ + "axum", + "tokio", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" +dependencies = [ + "bitflags", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" +dependencies = [ + "itoa", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +dependencies = [ + "libc", +] + +[[package]] +name = "smallvec" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" + +[[package]] +name = "socket2" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "syn" +version = "2.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" + +[[package]] +name = "tokio" +version = "1.44.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "log", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", +] + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/tools/qnx_hello_world/Cargo.toml b/tools/qnx_hello_world/Cargo.toml new file mode 100644 index 0000000..7f9a027 --- /dev/null +++ b/tools/qnx_hello_world/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "qnx-hello-world" +version = "0.1.0" +edition = "2021" +publish = false + +[dependencies] +axum = "*" +tokio = { version = "1.0", features = ["full"] } diff --git a/tools/qnx_hello_world/src/main.rs b/tools/qnx_hello_world/src/main.rs new file mode 100644 index 0000000..d9987ea --- /dev/null +++ b/tools/qnx_hello_world/src/main.rs @@ -0,0 +1,39 @@ +/******************************************************************************** +* Copyright (c) 2025 Contributors to the Eclipse Foundation +* +* See the NOTICE file(s) distributed with this work for additional +* information regarding copyright ownership. +* +* This program and the accompanying materials are made available under the +* terms of the Apache License Version 2.0 which is available at +* https://www.apache.org/licenses/LICENSE-2.0 +* +* SPDX-License-Identifier: Apache-2.0 +********************************************************************************/ + +use axum::{response::Html, routing::get, Router}; + +// By using tokio and axum in this simpel example we can check that +// quite a lot of concepts and libraries (async, tokio runtime, network stack, axum) +// are actually working and there does not seem to be a huge immediate red +// flag for using rust on qnx. Also, building HTTP services with C++ is a pita, +// so being able to do that with Rust is an immediate win on QNX! +#[tokio::main] +async fn main() { + // Build a simple application with a route + let app = Router::new().route("/", get(handler)); + + // Bind to port 3000 on all devices + let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); + + // Ready to listen + println!("listening on {}", listener.local_addr().unwrap()); + + // Actually serve requests + axum::serve(listener, app).await.unwrap(); +} + +async fn handler() -> Html<&'static str> { + println!("responding to request"); + Html("

Hello Eclipse! Rust on QNX is Fun!

") +} diff --git a/tools/qnx_rust_compiler_builder/Dockerfile_qnx710 b/tools/qnx_rust_compiler_builder/Dockerfile_qnx710 new file mode 100644 index 0000000..3d2a81f --- /dev/null +++ b/tools/qnx_rust_compiler_builder/Dockerfile_qnx710 @@ -0,0 +1,110 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + +# ubuntu 24.04 LTS is pretty common, so let's start with that +FROM ubuntu:noble + +# !!! pitfall !!! +# you must set your LM_LICENSE_FILE as build parameter, this will provide a means to connect +# to the license server! (not required for QNX 8.0.0 non-commecial which provides a license file +# but is not yet supported but this build) +ARG LM_LICENSE_FILE +ENV LM_LICENSE_FILE=${LM_LICENSE_FILE} + +# !!! pitfall !!! +# you must set HOST_ARCH build parameter to either x86_64 on x86 hosts (regular x86 linux machines, regualar x86 windows machines with docker desktop, x86 mac with docker desktop) +# or aarch64 on apple silicon or ARM windows systems with docker desktop (does this exist?) or native linux aarch64 systems +ARG HOST_ARCH +ENV HOST_ARCH=${HOST_ARCH} + + +# install compilers and some dependencies for rust, also add libc6-amd64-cross for aarch64 (does not hurt on x86_64) +# and link it so it is available for use in rosetta on apple silicon macs. +# install qemu-user-binfmt for use on non-MAC aarch64 linux systems, so it uses qemu instead to run x86_64 +# QNX linker/compiler! +RUN apt-get update && \ + apt-get -y install build-essential git python3 bash curl pkg-config libssl-dev libc6-amd64-cross qemu-user-binfmt && \ + ln -s /usr/x86_64-linux-gnu/lib64/ /lib64 && \ + useradd -ms /bin/bash builder && chown -R builder /usr/local + +# rosetta was a bit picky about the library path .. so the symlink to /lib64 might look like overdoing it, but +# this seems to be a necessity! +ENV LD_LIBRARY_PATH="/lib64:/usr/x86_64-linux-gnu/lib" + +USER builder + +# add the QNX SDP to the container +ADD qnx710 /home/builder/qnx710 + +# and your settings +ADD .qnx /home/builder/.qnx + +WORKDIR /home/builder + +# use a version tag - be careful when updating, configuration like the config.toml might change! +RUN git clone https://github.com/rust-lang/rust.git -b 1.86.0 --depth 1 + +WORKDIR /home/builder/rust + +# add simple config file that ensures that extended tools like cargo are build +COPY rust_build_config.toml /home/builder/rust/config.toml + +# build all targets that are possibly supported on QNX 7.1 +ENV build_env="\ + CC_aarch64-unknown-nto-qnx710=qcc \ + CFLAGS_aarch64-unknown-nto-qnx710=-Vgcc_ntoaarch64le_cxx \ + CXX_aarch64-unknown-nto-qnx710=qcc \ + AR_aarch64_unknown_nto_qnx710=ntoaarch64-ar \ + CC_x86_64-pc-nto-qnx710=qcc \ + CFLAGS_x86_64-pc-nto-qnx710=-Vgcc_ntox86_64_cxx \ + CXX_x86_64-pc-nto-qnx710=qcc \ + AR_x86_64_pc_nto_qnx710=ntox86_64-ar \ + CC_x86_64-pc-nto-qnx710_iosock=qcc \ + CFLAGS_x86_64-pc-nto-qnx710_iosock=-Vgcc_ntox86_64_cxx \ + CXX_x86_64-pc-nto-qnx710_iosock=qcc \ + AR_x86_64_pc_nto_qnx710_iosock=ntox86_64-ar \ + CC_aarch64-unknown-nto-qnx710_iosock=qcc \ + CFLAGS_aarch64-unknown-nto-qnx710_iosock=-Vgcc_ntoaarch64le_cxx \ + CXX_aarch64-unknown-nto-qnx710_iosock=qcc \ + AR_aarch64_unknown_nto_qnx710_iosock=ntoaarch64-ar \ + " + +# this should be the architecture of this container, so it can build binaries that it can run +ENV NATIVE_TARGET="${HOST_ARCH}-unknown-linux-gnu" + +# qnxsdp-env requires bash O_o (or so the qnxsdp-env script claims) +RUN ["/bin/bash", "-c", ". ~/qnx710/qnxsdp-env.sh && env $build_env ./x.py build --target aarch64-unknown-nto-qnx710,x86_64-pc-nto-qnx710,aarch64-unknown-nto-qnx710_iosock,x86_64-pc-nto-qnx710_iosock,${NATIVE_TARGET} rustc library/core library/alloc library/std library"] + +USER root +# ugly hack to allow builder to install into etc ... +RUN chown -R builder /etc || true +USER builder + +# install +RUN ["/bin/bash", "-c", ". ~/qnx710/qnxsdp-env.sh && env $build_env ./x.py install --target aarch64-unknown-nto-qnx710,x86_64-pc-nto-qnx710,aarch64-unknown-nto-qnx710_iosock,x86_64-pc-nto-qnx710_iosock,${NATIVE_TARGET}"] + + +WORKDIR /home/builder + +# source the qnxsdp environment so qcc is available +RUN . ./qnx710/qnxsdp-env.sh + +# to build your cargo projects for qnx use the following targets: + +# cargo build --target aarch64-unknown-nto-qnx710 +# or for the x86_64 qemu vm (or native? x86_64 targets?) ${NATIVE_TARGET} +# cargo build --target x86_64-pc-nto-qnx710 +# when building to run within the container, for example unit tests or just compiling to check for sanity / compile issues, +# use the ${NATIVE_TARGET}, which is probably x86_64-unknown-linux-gnu on x86 or aarch64-unknown-linux-gnu on Apple Silicon or +# the rare usecase, where you actually have an aarch64 native linux + diff --git a/tools/qnx_rust_compiler_builder/Dockerfile_qnx800 b/tools/qnx_rust_compiler_builder/Dockerfile_qnx800 new file mode 100644 index 0000000..eb9dd26 --- /dev/null +++ b/tools/qnx_rust_compiler_builder/Dockerfile_qnx800 @@ -0,0 +1,99 @@ +# ******************************************************************************* +# Copyright (c) 2025 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# This program and the accompanying materials are made available under the +# terms of the Apache License Version 2.0 which is available at +# https://www.apache.org/licenses/LICENSE-2.0 +# +# SPDX-License-Identifier: Apache-2.0 +# ******************************************************************************* + + +# ubuntu 24.04 LTS is pretty common, so let's start with that +FROM ubuntu:noble + +# No license file parameter for qnx800 as the license file is supposed +# to be part of the .qnx directory + +# !!! pitfall !!! +# you must set HOST_ARCH build parameter to either x86_64 on x86 hosts (regular x86 linux machines, regualar x86 windows machines with docker desktop, x86 mac with docker desktop) +# or aarch64 on apple silicon or ARM windows systems with docker desktop (does this exist?) or native linux aarch64 systems +ARG HOST_ARCH +ENV HOST_ARCH=${HOST_ARCH} + + +# install compilers and some dependencies for rust, also add libc6-amd64-cross for aarch64 (does not hurt on x86_64) +# and link it so it is available for use in rosetta on apple silicon macs. +# install qemu-user-binfmt for use on non-MAC aarch64 linux systems, so it uses qemu instead to run x86_64 +# QNX linker/compiler! +RUN apt-get update && \ + apt-get -y install build-essential git python3 bash curl pkg-config libssl-dev libc6-amd64-cross qemu-user-binfmt && \ + ln -s /usr/x86_64-linux-gnu/lib64/ /lib64 && \ + useradd -ms /bin/bash builder && chown -R builder /usr/local + +# rosetta was a bit picky about the library path .. so the symlink to /lib64 might look like overdoing it, but +# this seems to be a necessity! +ENV LD_LIBRARY_PATH="/lib64:/usr/x86_64-linux-gnu/lib" + +USER builder + +# add the QNX SDP to the container +ADD qnx800 /home/builder/qnx800 + +# and your settings +ADD .qnx /home/builder/.qnx + +WORKDIR /home/builder + +# use a version tag - be careful when updating, configuration like the config.toml might change! +RUN git clone https://github.com/rust-lang/rust.git -b 1.86.0 --depth 1 + +WORKDIR /home/builder/rust + +# add simple config file that ensures that extended tools like cargo are build +COPY rust_build_config.toml /home/builder/rust/config.toml + +# build all targets that are possibly supported on QNX 7.1 +ENV build_env="\ + CC_aarch64-unknown-nto-qnx800=qcc \ + CFLAGS_aarch64-unknown-nto-qnx800=-Vgcc_ntoaarch64le_cxx \ + CXX_aarch64-unknown-nto-qnx800=qcc \ + AR_aarch64_unknown_nto_qnx800=ntoaarch64-ar \ + CC_x86_64-pc-nto-qnx800=qcc \ + CFLAGS_x86_64-pc-nto-qnx800=-Vgcc_ntox86_64_cxx \ + CXX_x86_64-pc-nto-qnx800=qcc \ + AR_x86_64_pc_nto_qnx800=ntox86_64-ar \ + " + +# this should be the architecture of this container, so it can build binaries that it can run +ENV NATIVE_TARGET="${HOST_ARCH}-unknown-linux-gnu" + +# qnxsdp-env requires bash O_o (or so the qnxsdp-env script claims) +RUN ["/bin/bash", "-c", ". ~/qnx800/qnxsdp-env.sh && env $build_env ./x.py build --target aarch64-unknown-nto-qnx800,x86_64-pc-nto-qnx800,${NATIVE_TARGET} rustc library/core library/alloc library/std library"] + +USER root +# ugly hack to allow builder to install into etc ... +RUN chown -R builder /etc || true +USER builder + +# install +RUN ["/bin/bash", "-c", ". ~/qnx800/qnxsdp-env.sh && env $build_env ./x.py install --target aarch64-unknown-nto-qnx800,x86_64-pc-nto-qnx800,${NATIVE_TARGET}"] + + +WORKDIR /home/builder + +# source the qnxsdp environment so qcc is available +RUN . ./qnx800/qnxsdp-env.sh + +# to build your cargo projects for qnx use the following targets: + +# cargo build --target aarch64-unknown-nto-qnx800 +# or for the x86_64 qemu vm (or native? x86_64 targets?) ${NATIVE_TARGET} +# cargo build --target x86_64-pc-nto-qnx800 +# when building to run within the container, for example unit tests or just compiling to check for sanity / compile issues, +# use the ${NATIVE_TARGET}, which is probably x86_64-unknown-linux-gnu on x86 or aarch64-unknown-linux-gnu on Apple Silicon or +# the rare usecase, where you actually have an aarch64 native linux + diff --git a/tools/qnx_rust_compiler_builder/README.md b/tools/qnx_rust_compiler_builder/README.md new file mode 100644 index 0000000..6913730 --- /dev/null +++ b/tools/qnx_rust_compiler_builder/README.md @@ -0,0 +1,67 @@ +# QNX Rust Compiler builder guide + +## Introduction + +As of end of April 2025 there is no readily available rust compile target for any QNX operating system publicly available. + +However, following the rustc book on https://doc.rust-lang.org/rustc/platform-support/nto-qnx.html it's possible to build QNX 7.0 (untested), QNX 7.1 (tested) and QNX 8.0 (tested, but no std support yet) targets. + +Since QNX 7.0 is quite old, it is ignored in this guide. + +Prerequisites: A QNX SDP (Software Development Plattform) is required to build the compiler target and the linker (qcc) is also always required when you compile a program. For QNX 8.0 there are non-commercial licenses available, however, for QNX 7.1 as of April 2025 not. + +To build you need Docker running on a x86_64 or aarch64 system, it is tested on Ubuntu 22.04 LTS, Ubuntu 24.04 LTS on x86_64 and on a Mac M1 (Aarch64). It should also work on regular Linux aarch64, however, not tested yet. In case of non-x86_64 hardware, the rust compiler is built natively on the architecture it runs on, and the linker is then emulated (rosetta or qemu-userland emulation). By doing so, the performance penalty on non-x86_64 systems is minimal. + +Once built, you can use the container to build qnx and local targets. Local target is also build so you can execute unit tests or examples. Also cargo and other tools are build. + +The entire process takes from a couple of minutes on a threadripper class workstation to about an hour on a first generation Mac Mini M1 with 16gb RAM. + +The container is designed to be run in Visual Studio Code as devcontainer. See devcontainer examples in the hello world rust crate suppied in this repo to get you started. + +## One baby step at a time + +### QNX 7.1 + +Copy .qnx and qnx710 into this directory and then execute (on aarch64): + +```sh +docker build -t qnx-rust-container-qnx710 --build-arg LM_LICENSE_FILE=12345@your.floating.license.server.example --build-arg HOST_ARCH=aarch64 -f Dockerfile_qnx710 . +``` + +Or on x86_64: +```sh +docker build -t qnx-rust-container-qnx710 --build-arg LM_LICENSE_FILE=12345@your.floating.license.server.example --build-arg HOST_ARCH=x86_64 -f Dockerfile_qnx710. +``` + +TODO: Arch autodetection would be helpful minimizing errors. + +Check `tools/qnx_hello_world` and the devcontainer there to see how to get started quickly with VSCode. Simly launch vscode in that directory after you build the image and you should be able to compile binaries using cargo. Default target is already set in `.cargo/config.toml`. + +Note: you may need to source the qnx environment variables before using cargo `. ./qnx710/qnxsdp-env.sh` + +TODO: fix this by writing a proper entrypoint that does that already. + +### QNX 8.0 + +Copy .qnx and qnx800 into this directory and then execute (on aarch64): + +```sh +docker build -t qnx-rust-container-qnx800-rust-container --build-arg HOST_ARCH=aarch64 -f Dockerfile_qnx710 . +``` + +Or on x86_64: +```sh +docker build -t qnx-rust-container-qnx800 --build-arg HOST_ARCH=x86_64 -f Dockerfile_qnx710. +``` + +TODO: Arch autodetection would be helpful minimizing errors. + +The resulting compiler is not really useful as std is not yet supported. + +### Testing + +To run a qemu virtual machine, check: +https://doc.rust-lang.org/rustc/platform-support/nto-qnx.html#testing + +It describes how to use mkqnximage to build a virtual disk and launch qemu. + diff --git a/tools/qnx_rust_compiler_builder/build-mercedes-qnx710.sh b/tools/qnx_rust_compiler_builder/build-mercedes-qnx710.sh new file mode 100755 index 0000000..d5550a7 --- /dev/null +++ b/tools/qnx_rust_compiler_builder/build-mercedes-qnx710.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +docker build -f Dockerfile_qnx710 -t qnx-rust-container-qnx710 --build-arg LM_LICENSE_FILE=27057@qnx-dev.swf.i.mercedes-benz.com --build-arg HOST_ARCH=aarch64 . \ No newline at end of file diff --git a/tools/qnx_rust_compiler_builder/build-mercedes-qnx800.sh b/tools/qnx_rust_compiler_builder/build-mercedes-qnx800.sh new file mode 100755 index 0000000..02bd051 --- /dev/null +++ b/tools/qnx_rust_compiler_builder/build-mercedes-qnx800.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +docker build -f Dockerfile_qnx800 -t qnx-rust-container-qnx800 --build-arg HOST_ARCH=aarch64 . \ No newline at end of file diff --git a/tools/qnx_rust_compiler_builder/rust_build_config.toml b/tools/qnx_rust_compiler_builder/rust_build_config.toml new file mode 100644 index 0000000..fa8f638 --- /dev/null +++ b/tools/qnx_rust_compiler_builder/rust_build_config.toml @@ -0,0 +1,2 @@ +[build] +extended = true