diff --git a/Cargo.lock b/Cargo.lock index bd63d76..41c5654 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,9 +13,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.17" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -52,19 +52,20 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", + "once_cell", "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.94" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" [[package]] name = "autocfg" @@ -74,24 +75,34 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" dependencies = [ "serde", ] [[package]] name = "bytes" -version = "1.9.0" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "camino" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] [[package]] name = "cargo-gpu" -version = "0.1.0" +version = "0.1.1" dependencies = [ "anyhow", + "cargo_metadata", "chrono", "clap", "crossterm", @@ -108,6 +119,29 @@ dependencies = [ "version_check", ] +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.12", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -116,9 +150,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" dependencies = [ "num-traits", ] @@ -217,9 +251,9 @@ dependencies = [ [[package]] name = "env_filter" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" dependencies = [ "log", ] @@ -245,9 +279,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.5" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" +checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" dependencies = [ "anstream", "anstyle", @@ -257,15 +291,15 @@ dependencies = [ [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" dependencies = [ "libc", "windows-sys 0.59.0", @@ -285,9 +319,9 @@ checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", @@ -296,9 +330,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.1" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "heck" @@ -308,15 +342,15 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" +checksum = "fbd780fe5cc30f81464441920d82ac8740e2e46b29a6fad543ddd075229ce37e" [[package]] name = "http" -version = "1.2.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", "fnv", @@ -325,15 +359,15 @@ dependencies = [ [[package]] name = "humantime" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" [[package]] name = "indexmap" -version = "2.6.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", "hashbrown", @@ -341,13 +375,13 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.13" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" +checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -358,9 +392,9 @@ checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "lazy_static" @@ -370,9 +404,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.161" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libredox" @@ -386,9 +420,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "lock_api" @@ -402,9 +436,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "matchers" @@ -454,9 +488,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.2" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "option-ext" @@ -495,24 +529,24 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "proc-macro2" -version = "1.0.89" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.37" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] @@ -556,9 +590,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.8" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" dependencies = [ "bitflags", ] @@ -571,7 +605,7 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", "libredox", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -582,7 +616,7 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "regex-syntax 0.8.5", ] @@ -597,9 +631,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -635,9 +669,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.42" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ "bitflags", "errno", @@ -648,9 +682,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "scopeguard" @@ -658,20 +692,29 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +dependencies = [ + "serde", +] + [[package]] name = "serde" -version = "1.0.214" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.214" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", @@ -680,9 +723,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", @@ -731,18 +774,18 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" dependencies = [ "libc", ] [[package]] name = "smallvec" -version = "1.13.2" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" [[package]] name = "spirv" @@ -776,9 +819,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "2.0.87" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ "proc-macro2", "quote", @@ -806,20 +849,20 @@ dependencies = [ [[package]] name = "test-log" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dffced63c2b5c7be278154d76b479f9f9920ed34e7574201407f0b14e2bbb93" +checksum = "e7f46083d221181166e5b6f6b1e5f1d499f3a76888826e6cb1d057554157cd0f" dependencies = [ - "env_logger 0.11.5", + "env_logger 0.11.8", "test-log-macros", "tracing-subscriber", ] [[package]] name = "test-log-macros" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5999e24eaa32083191ba4e425deb75cdf25efefabe5aaccb7446dd0d4122a3f5" +checksum = "888d0c3c6db53c0fdab160d2ed5e12ba745383d3e85813f2ea0f2b1475ab553f" dependencies = [ "proc-macro2", "quote", @@ -828,18 +871,38 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.68" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", ] [[package]] name = "thiserror-impl" -version = "1.0.68" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", @@ -858,9 +921,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.19" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +checksum = "900f6c86a685850b1bc9f6223b20125115ee3f31e01207d81655bbcc0aea9231" dependencies = [ "serde", "serde_spanned", @@ -870,26 +933,33 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.22" +version = "0.22.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +checksum = "10558ed0bd2a1562e630926a2d1f0b98c827da99fabd3fe20920a59642504485" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", + "toml_write", "winnow", ] +[[package]] +name = "toml_write" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28391a4201ba7eb1984cfeb6862c0b3ea2cfe23332298967c749dddc0d6cd976" + [[package]] name = "tracing" version = "0.1.41" @@ -940,9 +1010,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "utf8parse" @@ -952,9 +1022,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "valuable" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "version_check" @@ -1149,9 +1219,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.20" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +checksum = "6cb8234a863ea0e8cd7284fcdd4f145233eb00fee02bbdd9861aec44e6477bc5" dependencies = [ "memchr", ] diff --git a/Cargo.toml b/Cargo.toml index 3d16813..e79ac31 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,6 +32,7 @@ serde_json = "1.0.132" toml = "0.8.19" tempdir = "0.3.7" test-log = "0.2.16" +cargo_metadata = "0.19.2" [workspace.lints.rust] missing_docs = "warn" diff --git a/crates/cargo-gpu/Cargo.toml b/crates/cargo-gpu/Cargo.toml index 8373ef4..7851a18 100644 --- a/crates/cargo-gpu/Cargo.toml +++ b/crates/cargo-gpu/Cargo.toml @@ -10,6 +10,7 @@ build = "build.rs" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +cargo_metadata.workspace = true anyhow.workspace = true spirv-builder-cli = { path = "../spirv-builder-cli", default-features = false, features = ["rspirv-latest"] } clap.workspace = true diff --git a/crates/cargo-gpu/src/install.rs b/crates/cargo-gpu/src/install.rs index 9977227..97dbe56 100644 --- a/crates/cargo-gpu/src/install.rs +++ b/crates/cargo-gpu/src/install.rs @@ -1,5 +1,6 @@ //! Install a dedicated per-shader crate that has the `rust-gpu` compiler in it. +use std::fmt::Debug; use std::io::Write as _; use anyhow::Context as _; @@ -148,15 +149,19 @@ impl Install { let replaced_line = match spirv_source { SpirvSource::CratesIO(_) => String::new(), SpirvSource::Git { url, .. } => format!("git = \"{url}\""), - SpirvSource::Path((path, _)) => format!("path = \"{path}\""), + SpirvSource::Path { rust_gpu_path, .. } => { + let mut new_path = rust_gpu_path.to_owned(); + new_path.push("crates/spirv-builder"); + format!("path = \"{new_path}\"") + }, }; return format!("{replaced_line}\n"); } if line.contains("${AUTO-REPLACE-VERSION}") { let replaced_line = match spirv_source { - SpirvSource::CratesIO(version) | SpirvSource::Path((_, version)) => { - format!("version = \"{}\"", version.replace('v', "")) + SpirvSource::CratesIO(version) | SpirvSource::Path { version, ..} => { + format!("version = \"{}\"", version) } SpirvSource::Git { rev, .. } => format!("rev = \"{rev}\""), }; @@ -245,7 +250,8 @@ impl Install { .current_dir(&checkout) .arg(format!("+{}", spirv_version.channel)) .args(["build", "--release"]) - .args(["--no-default-features"]); + .args(["--no-default-features"]) + .env_remove("RUSTC"); build_command.args([ "--features", diff --git a/crates/cargo-gpu/src/spirv_cli.rs b/crates/cargo-gpu/src/spirv_cli.rs index 8a905d1..c1f596e 100644 --- a/crates/cargo-gpu/src/spirv_cli.rs +++ b/crates/cargo-gpu/src/spirv_cli.rs @@ -4,7 +4,7 @@ use std::io::Write as _; use anyhow::Context as _; - +use cargo_metadata::semver::Version; use crate::spirv_source::SpirvSource; /// `Cargo.lock` manifest version 4 became the default in Rust 1.83.0. Conflicting manifest @@ -86,7 +86,7 @@ impl SpirvCli { let mut maybe_spirv_source: Option = None; if let Some(rust_gpu_version) = maybe_rust_gpu_version { - let mut source = SpirvSource::CratesIO(rust_gpu_version.clone()); + let mut source = SpirvSource::CratesIO(Version::parse(&rust_gpu_version)?); if let Some(rust_gpu_source) = maybe_rust_gpu_source { source = SpirvSource::Git { url: rust_gpu_source, @@ -113,7 +113,7 @@ impl SpirvCli { .join(crate::to_dirname(self.to_string().as_ref())); std::fs::create_dir_all(&checkout_dir) .with_context(|| format!("could not create checkout dir '{}'", checkout_dir.display())) - .context("crating directory in cahce dir")?; + .context("crating directory in cache dir")?; Ok(checkout_dir) } @@ -505,7 +505,7 @@ mod test { .map(std::string::ToString::to_string) .unwrap(); assert_eq!( - "https___github_com_Rust-GPU_rust-gpu+82a0f69+nightly-2024-04-24", + "https___github_com_Rust-GPU_rust-gpu+82a0f69008414f51d59184763146caa6850ac588+nightly-2024-04-24", &name ); } diff --git a/crates/cargo-gpu/src/spirv_source.rs b/crates/cargo-gpu/src/spirv_source.rs index c1815d6..ec55d3b 100644 --- a/crates/cargo-gpu/src/spirv_source.rs +++ b/crates/cargo-gpu/src/spirv_source.rs @@ -4,7 +4,12 @@ //! version. Then with that we `git checkout` the `rust-gpu` repo that corresponds to that version. //! From there we can look at the source code to get the required Rust toolchain. -use anyhow::Context as _; +use anyhow::{anyhow, Context as _}; +use cargo_metadata::camino::Utf8PathBuf; +use cargo_metadata::semver::Version; +use cargo_metadata::{MetadataCommand, Package}; +use std::fs; +use std::path::Path; /// The canonical `rust-gpu` URI const RUST_GPU_REPO: &str = "https://github.com/Rust-GPU/rust-gpu"; @@ -16,9 +21,7 @@ const RUST_GPU_REPO: &str = "https://github.com/Rust-GPU/rust-gpu"; pub enum SpirvSource { /// If the shader specifies a simple version like `spirv-std = "0.9.0"` then the source of /// `rust-gpu` is the conventional crates.io version. - /// - /// `String` is the simple version like, "0.9.0" - CratesIO(String), + CratesIO(Version), /// If the shader specifies a version like: /// `spirv-std = { git = "https://github.com..." ... }` /// then the source of `rust-gpu` is `Git`. @@ -31,7 +34,12 @@ pub enum SpirvSource { /// If the shader specifies a version like: /// `spirv-std = { path = "/path/to/rust-gpu" ... }` /// then the source of `rust-gpu` is `Path`. - Path((String, String)), + Path { + /// File path of rust-gpu repository + rust_gpu_path: Utf8PathBuf, + /// Version of specified rust-gpu repository + version: Version, + }, } impl core::fmt::Display for SpirvSource { @@ -41,16 +49,19 @@ impl core::fmt::Display for SpirvSource { )] fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { match self { - Self::CratesIO(version) => f.write_str(version), + Self::CratesIO(version) => version.fmt(f), Self::Git { url, rev } => f.write_str(&format!("{url}+{rev}")), - Self::Path((a, b)) => f.write_str(&format!("{a}+{b}")), + Self::Path { + rust_gpu_path, + version, + } => f.write_str(&format!("{rust_gpu_path}+{version}")), } } } impl SpirvSource { /// Look into the shader crate to get the version of `rust-gpu` it's using. - pub fn get_rust_gpu_deps_from_shader>( + pub fn get_rust_gpu_deps_from_shader>( shader_crate_path: F, ) -> anyhow::Result<(Self, chrono::NaiveDate, String)> { let rust_gpu_source = Self::get_spirv_std_dep_definition(shader_crate_path.as_ref())?; @@ -71,17 +82,18 @@ impl SpirvSource { /// Convert the source to just its version. pub fn to_version(&self) -> String { match self { - Self::CratesIO(version) | Self::Path((_, version)) => version.to_string(), + Self::CratesIO(version) | Self::Path { version, .. } => version.to_string(), Self::Git { rev, .. } => rev.to_string(), } } /// Convert the source to just its repo or path. + /// Must be root of git repository. fn to_repo(&self) -> String { match self { Self::CratesIO(_) => RUST_GPU_REPO.to_owned(), Self::Git { url, .. } => url.to_owned(), - Self::Path((path, _)) => path.to_owned(), + Self::Path { rust_gpu_path, .. } => rust_gpu_path.to_string(), } } @@ -119,20 +131,28 @@ impl SpirvSource { /// Checkout the `rust-gpu` repo to the requested version. fn checkout(&self) -> anyhow::Result<()> { + let Self::Git { rev, .. } = self else { + log::trace!("Skipping checking out rust-gpu",); + return Ok(()); + }; + log::debug!( "Checking out `rust-gpu` repo at {} to {}", self.to_dirname()?.display(), self.to_version() ); - let output_checkout = std::process::Command::new("git") + let mut command_checkout = std::process::Command::new("git"); + command_checkout .current_dir(self.to_dirname()?) - .args(["checkout", self.to_version().as_ref()]) - .output()?; + .args(["checkout", rev]); + log::debug!("Running command {:?}", command_checkout); + let output_checkout = command_checkout.output()?; anyhow::ensure!( output_checkout.status.success(), - "couldn't checkout revision '{}' of `rust-gpu` at {}", + "couldn't checkout revision '{}' of `rust-gpu` at {}. \n Error Output: {}", self.to_version(), - self.to_dirname()?.to_string_lossy() + self.to_dirname()?.to_string_lossy(), + String::from_utf8(output_checkout.stderr).unwrap() ); Ok(()) @@ -154,7 +174,7 @@ impl SpirvSource { "--no-patch", "--format=%cd", format!("--date=format:'{date_format}'").as_ref(), - self.to_version().as_ref(), + "HEAD", ]) .output()?; anyhow::ensure!( @@ -183,7 +203,7 @@ impl SpirvSource { fn get_channel_from_toolchain_toml(path: &std::path::PathBuf) -> anyhow::Result { log::debug!("Parsing `rust-toolchain.toml` at {path:?} for the used toolchain"); - let contents = std::fs::read_to_string(path.join("rust-toolchain.toml"))?; + let contents = fs::read_to_string(path.join("rust-toolchain.toml"))?; let toml: toml::Table = toml::from_str(&contents)?; let Some(toolchain) = toml.get("toolchain") else { anyhow::bail!( @@ -198,130 +218,88 @@ impl SpirvSource { } /// Get the shader crate's resolved `spirv_std = ...` definition in its `Cargo.toml`/`Cargo.lock` - pub fn get_spirv_std_dep_definition( - shader_crate_path: &std::path::Path, - ) -> anyhow::Result { + pub fn get_spirv_std_dep_definition(shader_crate_path: &Path) -> anyhow::Result { let canonical_shader_path = shader_crate_path.to_path_buf(); Self::shader_crate_path_canonical(&mut canonical_shader_path.clone())?; log::debug!( - "Running `cargo tree` on {}", + "Running `cargo metadata` on {}", canonical_shader_path.display() ); - let output_cargo_tree = std::process::Command::new("cargo") - .current_dir(canonical_shader_path.clone()) - .args(["tree", "--workspace", "--prefix", "none"]) - .output()?; - anyhow::ensure!( - output_cargo_tree.status.success(), - format!( - "could not query shader's `Cargo.toml` for `spirv-std` dependency: {}", - String::from_utf8(output_cargo_tree.stderr)? - ) - ); - let cargo_tree_string = String::from_utf8_lossy(&output_cargo_tree.stdout); - - let maybe_spirv_std_def = cargo_tree_string - .lines() - .find(|line| line.contains("spirv-std")); - log::trace!(" found {maybe_spirv_std_def:?}"); - - let Some(spirv_std_def) = maybe_spirv_std_def else { - anyhow::bail!("`spirv-std` not found in shader's `Cargo.toml` at {canonical_shader_path:?}:\n{cargo_tree_string}"); + let metadata = MetadataCommand::new() + .current_dir(&canonical_shader_path) + .exec()?; + + let Some(spirv_std_package) = metadata + .packages + .iter() + .find(|package| package.name.eq("spirv-std")) + else { + anyhow::bail!( + "`spirv-std` not found in shader's `Cargo.toml` at {canonical_shader_path:?}" + ); }; + log::trace!(" found {spirv_std_package:?}"); - Self::parse_spirv_std_source_and_version(spirv_std_def) + Ok(Self::parse_spirv_std_source_and_version(spirv_std_package)?) } /// Parse a string like: /// `spirv-std v0.9.0 (https://github.com/Rust-GPU/rust-gpu?rev=54f6978c#54f6978c) (*)` /// Which would return: /// `SpirvSource::Git("https://github.com/Rust-GPU/rust-gpu", "54f6978c")` - fn parse_spirv_std_source_and_version(spirv_std_def: &str) -> anyhow::Result { - log::trace!("parsing spirv-std source and version from def: '{spirv_std_def}'"); - let parts: Vec = spirv_std_def.split_whitespace().map(String::from).collect(); - let version = parts - .get(1) - .context("Couldn't find `spirv_std` version in shader crate")? - .to_owned(); - let mut source = Self::CratesIO(version.clone()); - - if parts.len() > 2 { - let mut source_string = parts - .get(2) - .context("Couldn't get Uri from dependency string")? - .to_owned(); - source_string = source_string.replace(['(', ')'], ""); - - // Unfortunately Uri ignores the fragment/hash portion of the Uri. - // - // There's been a ticket open for years: - // - // - // So here we'll parse the fragment out of the source string by hand - let uri = source_string.parse::()?; - let maybe_hash = if source_string.contains('#') { - let mut splits = source_string.split('#'); - splits.next_back().map(std::borrow::ToOwned::to_owned) - } else { - None - }; - if uri.scheme().is_some() { - source = Self::parse_git_source(version, &uri, maybe_hash)?; - } else { - source = Self::Path((source_string, version)); - } - } - - log::debug!("Parsed `rust-gpu` source and version: {source:?}"); - - Ok(source) - } - - /// Parse a Git source like: `https://github.com/Rust-GPU/rust-gpu?rev=54f6978c#54f6978c` - fn parse_git_source( - version: String, - uri: &http::Uri, - fragment: Option, - ) -> anyhow::Result { + fn parse_spirv_std_source_and_version(spirv_std_package: &Package) -> anyhow::Result { log::trace!( - "parsing git source from version: '{version}' and uri: '{uri}' and fragment: {}", - fragment.as_deref().unwrap_or("?") - ); - let repo = format!( - "{}://{}{}", - uri.scheme().context("Couldn't parse scheme from Uri")?, - uri.host().context("Couldn't parse host from Uri")?, - uri.path() + "parsing spirv-std source and version from package: '{:?}'", + spirv_std_package ); - let rev = Self::parse_git_revision(uri.query(), fragment, version); - - Ok(Self::Git { url: repo, rev }) - } - - /// Decide the Git revision to use. - fn parse_git_revision( - maybe_query: Option<&str>, - maybe_fragment: Option, - version: String, - ) -> String { - let marker = "rev="; - let maybe_sane_query = maybe_query.and_then(|query| { - // TODO: This might seem a little crude, but it saves adding a whole query parsing dependency. - let sanity_check = query.contains(marker) && query.split('=').count() == 2; - sanity_check.then_some(query) - }); - - if let Some(query) = maybe_sane_query { - return query.replace(marker, ""); - } + let result = match &spirv_std_package.source { + Some(source) => { + let is_git = source.repr.starts_with("git+"); + let is_crates_io = source.is_crates_io(); + + match (is_git, is_crates_io) { + (true, true) => unreachable!(), + (true, false) => { + let link = &source.repr[4..]; + let sharp_index = link.find('#').ok_or(anyhow!( + "Git url of spirv-std package does not contain revision!" + ))?; + let question_mark_index = link.find('?').ok_or(anyhow!( + "Git url of spirv-std package does not contain revision!" + ))?; + let url = link[..question_mark_index].to_string(); + let rev = link[sharp_index + 1..].to_string(); + Self::Git { url, rev } + } + (false, true) => Self::CratesIO(spirv_std_package.version.clone()), + (false, false) => { + anyhow::bail!("Metadata of spirv-std package uses unknown url format!") + } + } + } + None => { + let rust_gpu_path = spirv_std_package + .manifest_path // rust-gpu/crates/spirv-std/Cargo.toml + .parent() + .unwrap() // rust-gpu/crates/spirv-std + .parent() + .unwrap() // rust-gpu/crates + .parent() + .unwrap() // rust-gpu + .to_owned(); + let version = spirv_std_package.version.clone(); + Self::Path { + rust_gpu_path, + version, + } + } + }; - if let Some(fragment) = maybe_fragment { - return fragment; - } + log::debug!("Parsed `rust-gpu` source and version: {result:?}"); - version + Ok(result) } /// `git clone` the `rust-gpu` repo. We use it to get the required Rust toolchain to compile @@ -377,34 +355,7 @@ mod test { source, SpirvSource::Git { url: "https://github.com/Rust-GPU/rust-gpu".to_owned(), - rev: "82a0f69".to_owned() - } - ); - } - - #[test_log::test] - fn parsing_spirv_std_dep_for_git_source() { - let definition = - "spirv-std v9.9.9 (https://github.com/Rust-GPU/rust-gpu?rev=82a0f69#82a0f69) (*)"; - let source = SpirvSource::parse_spirv_std_source_and_version(definition).unwrap(); - assert_eq!( - source, - SpirvSource::Git { - url: "https://github.com/Rust-GPU/rust-gpu".to_owned(), - rev: "82a0f69".to_owned() - } - ); - } - - #[test_log::test] - fn parsing_spirv_std_dep_for_git_source_hash() { - let definition = "spirv-std v9.9.9 (https://github.com/Rust-GPU/rust-gpu#82a0f69) (*)"; - let source = SpirvSource::parse_spirv_std_source_and_version(definition).unwrap(); - assert_eq!( - source, - SpirvSource::Git { - url: "https://github.com/Rust-GPU/rust-gpu".to_owned(), - rev: "82a0f69".to_owned() + rev: "82a0f69008414f51d59184763146caa6850ac588".to_owned() } ); } diff --git a/crates/spirv-builder-cli/src/main.rs b/crates/spirv-builder-cli/src/main.rs index 2a17938..0770c04 100644 --- a/crates/spirv-builder-cli/src/main.rs +++ b/crates/spirv-builder-cli/src/main.rs @@ -17,11 +17,11 @@ use spirv_builder_cli::ShaderModule; const RUSTC_NIGHTLY_CHANNEL: &str = "${CHANNEL}"; fn set_rustup_toolchain() { - log::trace!( - "setting RUSTUP_TOOLCHAIN = '{}'", - RUSTC_NIGHTLY_CHANNEL.trim_matches('"') - ); - std::env::set_var("RUSTUP_TOOLCHAIN", RUSTC_NIGHTLY_CHANNEL.trim_matches('"')); + let toolchain = RUSTC_NIGHTLY_CHANNEL.trim_matches('"'); + + log::trace!("setting RUSTUP_TOOLCHAIN = '{}'", toolchain); + std::env::set_var("RUSTUP_TOOLCHAIN", toolchain); + std::env::remove_var("RUSTC"); } /// Get the OS-dependent ENV variable name for the list of paths pointing to .so/.dll files @@ -43,7 +43,10 @@ fn set_codegen_spirv_location(dylib_path: std::path::PathBuf) { let dylib_path = dylib_path.parent().unwrap().to_path_buf(); dylib_paths.insert(0, dylib_path); - let path = std::env::join_paths(dylib_paths).unwrap().into_string().unwrap(); + let path = std::env::join_paths(dylib_paths) + .unwrap() + .into_string() + .unwrap(); log::debug!("Setting OS-dependent DLL ENV path ({env_var}) to: {path}"); std::env::set_var(env_var, path);