From 0ec1e1dd7867c3dedcbea76c9b6e847d6b388c03 Mon Sep 17 00:00:00 2001 From: V3n3RiX Date: Tue, 11 Feb 2025 00:12:38 +0000 Subject: gentoo auto-resync : 11:02:2025 - 00:12:37 --- dev-lang/Manifest.gz | Bin 22659 -> 22648 bytes dev-lang/go/Manifest | 4 +- dev-lang/go/go-1.22.12.ebuild | 2 +- dev-lang/go/go-1.23.6.ebuild | 2 +- dev-lang/mmix/Manifest | 4 +- .../mmix/files/mmix-20160804-implicit-int.patch | 27 + dev-lang/mmix/mmix-20160804-r1.ebuild | 17 +- dev-lang/mmix/mmix-20160804-r2.ebuild | 49 + dev-lang/rust-bin/Manifest | 34 +- dev-lang/rust-bin/rust-bin-1.71.1-r100.ebuild | 234 ----- dev-lang/rust-bin/rust-bin-1.71.1-r101.ebuild | 234 ----- dev-lang/rust-bin/rust-bin-1.71.1-r102.ebuild | 233 +++++ dev-lang/rust-bin/rust-bin-1.74.1-r100.ebuild | 244 ----- dev-lang/rust-bin/rust-bin-1.74.1-r101.ebuild | 244 ----- dev-lang/rust-bin/rust-bin-1.74.1-r102.ebuild | 243 +++++ dev-lang/rust-bin/rust-bin-1.75.0-r100.ebuild | 244 ----- dev-lang/rust-bin/rust-bin-1.75.0-r101.ebuild | 244 ----- dev-lang/rust-bin/rust-bin-1.75.0-r102.ebuild | 243 +++++ dev-lang/rust-bin/rust-bin-1.76.0-r100.ebuild | 233 ----- dev-lang/rust-bin/rust-bin-1.76.0-r101.ebuild | 232 +++++ dev-lang/rust-bin/rust-bin-1.77.1-r100.ebuild | 246 ----- dev-lang/rust-bin/rust-bin-1.77.1-r101.ebuild | 246 ----- dev-lang/rust-bin/rust-bin-1.77.1-r102.ebuild | 245 +++++ dev-lang/rust-bin/rust-bin-1.78.0-r100.ebuild | 249 ----- dev-lang/rust-bin/rust-bin-1.78.0-r101.ebuild | 248 +++++ dev-lang/rust-bin/rust-bin-1.79.0-r100.ebuild | 249 ----- dev-lang/rust-bin/rust-bin-1.79.0-r101.ebuild | 249 ----- dev-lang/rust-bin/rust-bin-1.79.0-r102.ebuild | 248 +++++ dev-lang/rust-bin/rust-bin-1.80.1-r100.ebuild | 253 ----- dev-lang/rust-bin/rust-bin-1.80.1-r101.ebuild | 253 ----- dev-lang/rust-bin/rust-bin-1.80.1-r102.ebuild | 252 +++++ dev-lang/rust-bin/rust-bin-1.81.0-r100.ebuild | 251 ----- dev-lang/rust-bin/rust-bin-1.81.0-r101.ebuild | 251 ----- dev-lang/rust-bin/rust-bin-1.81.0-r102.ebuild | 250 +++++ dev-lang/rust-bin/rust-bin-1.82.0-r100.ebuild | 253 ----- dev-lang/rust-bin/rust-bin-1.82.0-r101.ebuild | 253 ----- dev-lang/rust-bin/rust-bin-1.82.0-r102.ebuild | 252 +++++ dev-lang/rust-bin/rust-bin-1.83.0-r1.ebuild | 252 +++++ dev-lang/rust-bin/rust-bin-1.83.0.ebuild | 253 ----- dev-lang/rust-bin/rust-bin-1.84.0-r1.ebuild | 252 +++++ dev-lang/rust-bin/rust-bin-1.84.0.ebuild | 253 ----- dev-lang/rust-bin/rust-bin-1.84.1-r1.ebuild | 252 +++++ dev-lang/rust-bin/rust-bin-1.84.1.ebuild | 253 ----- dev-lang/rust/Manifest | 27 +- dev-lang/rust/rust-1.71.1-r100.ebuild | 711 -------------- dev-lang/rust/rust-1.71.1-r101.ebuild | 710 ++++++++++++++ dev-lang/rust/rust-1.74.1-r100.ebuild | 1023 -------------------- dev-lang/rust/rust-1.74.1-r101.ebuild | 1022 +++++++++++++++++++ dev-lang/rust/rust-1.75.0-r100.ebuild | 743 -------------- dev-lang/rust/rust-1.75.0-r101.ebuild | 742 ++++++++++++++ dev-lang/rust/rust-1.76.0-r100.ebuild | 660 ------------- dev-lang/rust/rust-1.76.0-r101.ebuild | 659 +++++++++++++ dev-lang/rust/rust-1.77.1-r100.ebuild | 742 -------------- dev-lang/rust/rust-1.77.1-r101.ebuild | 741 ++++++++++++++ dev-lang/rust/rust-1.78.0-r100.ebuild | 745 -------------- dev-lang/rust/rust-1.78.0-r101.ebuild | 744 ++++++++++++++ dev-lang/rust/rust-1.79.0-r100.ebuild | 745 -------------- dev-lang/rust/rust-1.79.0-r101.ebuild | 744 ++++++++++++++ dev-lang/rust/rust-1.80.1-r100.ebuild | 742 -------------- dev-lang/rust/rust-1.80.1-r101.ebuild | 741 ++++++++++++++ dev-lang/rust/rust-1.81.0-r100.ebuild | 746 -------------- dev-lang/rust/rust-1.81.0-r101.ebuild | 745 ++++++++++++++ dev-lang/rust/rust-1.82.0-r100.ebuild | 756 --------------- dev-lang/rust/rust-1.82.0-r101.ebuild | 757 --------------- dev-lang/rust/rust-1.82.0-r102.ebuild | 756 +++++++++++++++ dev-lang/rust/rust-1.83.0-r1.ebuild | 739 -------------- dev-lang/rust/rust-1.83.0-r2.ebuild | 738 ++++++++++++++ dev-lang/rust/rust-1.84.0-r1.ebuild | 704 ++++++++++++++ dev-lang/rust/rust-1.84.0.ebuild | 741 -------------- dev-lang/rust/rust-1.84.1-r1.ebuild | 704 ++++++++++++++ dev-lang/rust/rust-1.84.1.ebuild | 741 -------------- 71 files changed, 13070 insertions(+), 15828 deletions(-) create mode 100644 dev-lang/mmix/files/mmix-20160804-implicit-int.patch create mode 100644 dev-lang/mmix/mmix-20160804-r2.ebuild delete mode 100644 dev-lang/rust-bin/rust-bin-1.71.1-r100.ebuild delete mode 100644 dev-lang/rust-bin/rust-bin-1.71.1-r101.ebuild create mode 100644 dev-lang/rust-bin/rust-bin-1.71.1-r102.ebuild delete mode 100644 dev-lang/rust-bin/rust-bin-1.74.1-r100.ebuild delete mode 100644 dev-lang/rust-bin/rust-bin-1.74.1-r101.ebuild create mode 100644 dev-lang/rust-bin/rust-bin-1.74.1-r102.ebuild delete mode 100644 dev-lang/rust-bin/rust-bin-1.75.0-r100.ebuild delete mode 100644 dev-lang/rust-bin/rust-bin-1.75.0-r101.ebuild create mode 100644 dev-lang/rust-bin/rust-bin-1.75.0-r102.ebuild delete mode 100644 dev-lang/rust-bin/rust-bin-1.76.0-r100.ebuild create mode 100644 dev-lang/rust-bin/rust-bin-1.76.0-r101.ebuild delete mode 100644 dev-lang/rust-bin/rust-bin-1.77.1-r100.ebuild delete mode 100644 dev-lang/rust-bin/rust-bin-1.77.1-r101.ebuild create mode 100644 dev-lang/rust-bin/rust-bin-1.77.1-r102.ebuild delete mode 100644 dev-lang/rust-bin/rust-bin-1.78.0-r100.ebuild create mode 100644 dev-lang/rust-bin/rust-bin-1.78.0-r101.ebuild delete mode 100644 dev-lang/rust-bin/rust-bin-1.79.0-r100.ebuild delete mode 100644 dev-lang/rust-bin/rust-bin-1.79.0-r101.ebuild create mode 100644 dev-lang/rust-bin/rust-bin-1.79.0-r102.ebuild delete mode 100644 dev-lang/rust-bin/rust-bin-1.80.1-r100.ebuild delete mode 100644 dev-lang/rust-bin/rust-bin-1.80.1-r101.ebuild create mode 100644 dev-lang/rust-bin/rust-bin-1.80.1-r102.ebuild delete mode 100644 dev-lang/rust-bin/rust-bin-1.81.0-r100.ebuild delete mode 100644 dev-lang/rust-bin/rust-bin-1.81.0-r101.ebuild create mode 100644 dev-lang/rust-bin/rust-bin-1.81.0-r102.ebuild delete mode 100644 dev-lang/rust-bin/rust-bin-1.82.0-r100.ebuild delete mode 100644 dev-lang/rust-bin/rust-bin-1.82.0-r101.ebuild create mode 100644 dev-lang/rust-bin/rust-bin-1.82.0-r102.ebuild create mode 100644 dev-lang/rust-bin/rust-bin-1.83.0-r1.ebuild delete mode 100644 dev-lang/rust-bin/rust-bin-1.83.0.ebuild create mode 100644 dev-lang/rust-bin/rust-bin-1.84.0-r1.ebuild delete mode 100644 dev-lang/rust-bin/rust-bin-1.84.0.ebuild create mode 100644 dev-lang/rust-bin/rust-bin-1.84.1-r1.ebuild delete mode 100644 dev-lang/rust-bin/rust-bin-1.84.1.ebuild delete mode 100644 dev-lang/rust/rust-1.71.1-r100.ebuild create mode 100644 dev-lang/rust/rust-1.71.1-r101.ebuild delete mode 100644 dev-lang/rust/rust-1.74.1-r100.ebuild create mode 100644 dev-lang/rust/rust-1.74.1-r101.ebuild delete mode 100644 dev-lang/rust/rust-1.75.0-r100.ebuild create mode 100644 dev-lang/rust/rust-1.75.0-r101.ebuild delete mode 100644 dev-lang/rust/rust-1.76.0-r100.ebuild create mode 100644 dev-lang/rust/rust-1.76.0-r101.ebuild delete mode 100644 dev-lang/rust/rust-1.77.1-r100.ebuild create mode 100644 dev-lang/rust/rust-1.77.1-r101.ebuild delete mode 100644 dev-lang/rust/rust-1.78.0-r100.ebuild create mode 100644 dev-lang/rust/rust-1.78.0-r101.ebuild delete mode 100644 dev-lang/rust/rust-1.79.0-r100.ebuild create mode 100644 dev-lang/rust/rust-1.79.0-r101.ebuild delete mode 100644 dev-lang/rust/rust-1.80.1-r100.ebuild create mode 100644 dev-lang/rust/rust-1.80.1-r101.ebuild delete mode 100644 dev-lang/rust/rust-1.81.0-r100.ebuild create mode 100644 dev-lang/rust/rust-1.81.0-r101.ebuild delete mode 100644 dev-lang/rust/rust-1.82.0-r100.ebuild delete mode 100644 dev-lang/rust/rust-1.82.0-r101.ebuild create mode 100644 dev-lang/rust/rust-1.82.0-r102.ebuild delete mode 100644 dev-lang/rust/rust-1.83.0-r1.ebuild create mode 100644 dev-lang/rust/rust-1.83.0-r2.ebuild create mode 100644 dev-lang/rust/rust-1.84.0-r1.ebuild delete mode 100644 dev-lang/rust/rust-1.84.0.ebuild create mode 100644 dev-lang/rust/rust-1.84.1-r1.ebuild delete mode 100644 dev-lang/rust/rust-1.84.1.ebuild (limited to 'dev-lang') diff --git a/dev-lang/Manifest.gz b/dev-lang/Manifest.gz index 3113c3b74231..aadfcd60052e 100644 Binary files a/dev-lang/Manifest.gz and b/dev-lang/Manifest.gz differ diff --git a/dev-lang/go/Manifest b/dev-lang/go/Manifest index 7c9074a728e1..7fc27ab928a1 100644 --- a/dev-lang/go/Manifest +++ b/dev-lang/go/Manifest @@ -5,8 +5,8 @@ DIST go1.22.12.src.tar.gz 27566409 BLAKE2B ea8ce4abd7d6548aef14c0803a07b4beba872 DIST go1.23.5.src.tar.gz 28179014 BLAKE2B 6fe6101054a0c10ce415aea65367a48ef8397c88d66bad01b7c72107a6c60daf0b9a47f7c1cd6c8da9855ab04309f25941cc867e6a9f90ac51d1ab0c54662313 SHA512 b04317afeab2d0ced7c36b8682dd32ac085d95d874cf3f614daa34859d7f7f2b75138132e7a64e237c6b4d711d5b03a4d20533f92a44840915630f4ea7cfafa2 DIST go1.23.6.src.tar.gz 28179132 BLAKE2B 25c988547604c35de65aedfdee5af9f35f7a1c43f634c0147373d9c86baf2bb10068463f70013ef60acd3088149eb16502958b1ca63d7cee310e32eaddf1578a SHA512 c504476d42cdbcd1b6afe53c0974e82c19eb0efac974bc06d41c1641440676891cfe6416455a0cfc81fe82902a9b82ea0a1d95089c676667d05487e45f5e04e3 EBUILD go-1.22.11-r1.ebuild 4275 BLAKE2B b6bbced3829a2dfc6febff014bddd55e895316008726e61a0c297fceec9e531e8b32defb3fbd6c1dbdb61c6e86fb65433f507e476df7294a695d24bfed7bd4b8 SHA512 f484f8b86479d936350eaf13bdd7797fb26454d09b62c0408748d3eb1e4d162b4a89d044dc40f277ec7d270b08b64cce913e6654ee5567c770d069332fed089b -EBUILD go-1.22.12.ebuild 4280 BLAKE2B 66dc07da733ece8d53cea1f7a9b908578127702f6356298d97ec39c1e346e3656b4e79784dc15247433dfd75e69868e7f83669d702710c942869242e218deb50 SHA512 feb8ed4d4933174944337cc316a4659ef9bbf8acb4a385bbef0d6436f7fd2e291fc6d82c5c1a1a28d13fb0d25d1f2f86cbae21e03d6d8998e1e958de92815c26 +EBUILD go-1.22.12.ebuild 4279 BLAKE2B 7552c89cc57cc348b1c2596faf9e4813723038de8fa4b6f86bc804acb74420166d1e552c217e87bff1dcc82a36e4dfe7cb8fe8875a2a856fc891769e8e3e18f5 SHA512 8fb237ae4b4797304bb9629369591e9b3918c68823477ccd6ff0c1ad22f394c10f8791dff8182d0a0e77b7eda4281646120ad60cfc378a02341cb1836b7b8319 EBUILD go-1.23.5-r1.ebuild 4175 BLAKE2B d1e34e725ea51929715268d3009f5035967231a4a35c59779c898d352d3d0d9a8a6b03fee8a847215ff2b057bdf980fb11b6b905b33ee3ccc8a215eb348d5317 SHA512 8d792f83f8abf11353fa5009fa29a946cc7e0c8a2f2df7cf90e5acae8aaa68c2cd239ef03c324a61316bb217ea14f0b6d7514101c5d158f3b3bc3beb74dade27 -EBUILD go-1.23.6.ebuild 4180 BLAKE2B e8e1f354167d88bf01a7b4b338a1f026bbd23f789c16e917ba38e1f73a474897e7cd18f9192936b6211e89bd91aa81435b1b2f4956d80f1cebabd36f7db22825 SHA512 6abc1ed892888e315449bcbb19f030136c0f44fbd3c4c24e267f2b8483fb9ab2393713c1641ef64dfebf421d44f5fc4f509499e43dc8580b46b5f2f08fca3b97 +EBUILD go-1.23.6.ebuild 4179 BLAKE2B f98a28b82fd2277a7dd8d07d0a2c3f5cc1d7705ab4c429f93f6567b265fa1f3f6b2a9597333188aa304982285ac1ce6abc6388d899b1a608f708f1915f3c117b SHA512 afc824cbd3d5b70df77b21ad5851952b5ea660e70a4f38c56556e6f8643f2eced12fec6e4333f6ffddb19ffab1fbbf2363375bfc345693d00867b3fbe5eec6b9 EBUILD go-9999.ebuild 4281 BLAKE2B 7213df19f71554d13dc3510253a906962a217a193ce0461975f946e2c5277eee889150c588f83f0be14eccf26249488c90151ae155633c91695cd3d35c869c95 SHA512 f747c67f574e1d7c19f3eb7c03b74599652744fdd989a964d2da778134461cd31cc861b9f63ee8a11b665f1aea468412bea64cc19df6b141cf468c39b7194c3f MISC metadata.xml 589 BLAKE2B 341e4c0e91d73ca668c1795035e1223eed60f85c724afd989ef1f8fb69649f7f6eaaf8a5228f6c8f587ffcc40a438c47d332fbe6866839f5a0829872a983f642 SHA512 fe58ddddfbd4d0d060516cb035592a80c0f48e125bb59c95d3c6fac0c182271e2a9ec9bd055b9cc8e6cb8c449e6c483bff4a23c362f532c24255febfdefc273a diff --git a/dev-lang/go/go-1.22.12.ebuild b/dev-lang/go/go-1.22.12.ebuild index 57a3e9a8de86..9ea7cd6c0feb 100644 --- a/dev-lang/go/go-1.22.12.ebuild +++ b/dev-lang/go/go-1.22.12.ebuild @@ -23,7 +23,7 @@ case ${PV} in case ${PV} in *_beta*|*_rc*) ;; *) - KEYWORDS="-* ~amd64 ~arm ~arm64 ~loong ~mips ~ppc64 ~riscv ~s390 ~x86 ~amd64-linux ~x86-linux ~x64-macos ~x64-solaris" + KEYWORDS="-* amd64 ~arm ~arm64 ~loong ~mips ~ppc64 ~riscv ~s390 ~x86 ~amd64-linux ~x86-linux ~x64-macos ~x64-solaris" ;; esac esac diff --git a/dev-lang/go/go-1.23.6.ebuild b/dev-lang/go/go-1.23.6.ebuild index bdfada7c265e..ce6eb102c49e 100644 --- a/dev-lang/go/go-1.23.6.ebuild +++ b/dev-lang/go/go-1.23.6.ebuild @@ -23,7 +23,7 @@ case ${PV} in case ${PV} in *_beta*|*_rc*) ;; *) - KEYWORDS="-* ~amd64 ~arm ~arm64 ~loong ~mips ~ppc64 ~riscv ~s390 ~x86 ~amd64-linux ~x86-linux ~x64-macos ~x64-solaris" + KEYWORDS="-* amd64 ~arm ~arm64 ~loong ~mips ~ppc64 ~riscv ~s390 ~x86 ~amd64-linux ~x86-linux ~x64-macos ~x64-solaris" ;; esac esac diff --git a/dev-lang/mmix/Manifest b/dev-lang/mmix/Manifest index b76811fa8699..755915f541c9 100644 --- a/dev-lang/mmix/Manifest +++ b/dev-lang/mmix/Manifest @@ -1,6 +1,8 @@ AUX mmix-20110420-makefile.patch 1636 BLAKE2B f4acfc952dea9671ec5507f4d86a1462131dae835318362b17f341e9575fe1dccda5cd44d257127a27232a197e05f79de5d7a8200d7a2b943161fa38de83937f SHA512 e5cd4944847c00ad7c6b3a87fa6f9a242f7f0b13c31f82e80c49b3b9ec07d7c0106669dce2868705dca073774826c5acc6f8ea1464c1a5c739145f1c2b28eb10 AUX mmix-20131017-format-security.patch 2256 BLAKE2B 2481c33c024d84af03b289ec9f22c9b98cb27537c32ea9ef020943aa424efac5267d81326241b2d764eb292f373ed51cc30c3ddbdb55f8fa444154cf6cc5fe0d SHA512 e77cdf3d196356cc0cb09f322cc979e4c603592c8f9421764d6830df27fe627958badbd6726021f97bc42a0d9551e4d3b39ca7b1d677b44a543ffcc04028eaea AUX mmix-20160804-gcc-10.patch 822 BLAKE2B 182ff974d458e06ac5c90aa44f0255f20a97c7702a49f3b36ba541c6414f63f8d2c1d3f56e6abe624e06be198b963d018ba3403baac0773b114946d96fa9272c SHA512 65fb04add6fa1441f9cc699af09cc84b67701113db1406d7ec582ac2023221f02dd1972393c3114fa0801a9f686b24d8e5daededa469e155da33aaafee72a22c +AUX mmix-20160804-implicit-int.patch 816 BLAKE2B 62731ffbbd025dbd830398db747b2e7993ee7aee4efbd058faffaff610abceff15d4bd91cd326a919677529d11507af43c9af833a6ef16356df294330814ff80 SHA512 29b07ad6d6a77bf43e9fddd7c6e2a803d5758be012fc18b079a01c84719db65c0865e2bceb0565963fef4106adcf10fad12eb917b9480551379f9c6b2c0d86f2 DIST mmix-20160804.tgz 308410 BLAKE2B 8bbde51921fe23f016e35bd51346e6445d530815e5e87bff44cf17e081c6b8e55dd6bd24f1ce1621851d2eac309fa44d71aa33d93d3ddfce5213c6643181d38c SHA512 35c518227a4ee40d0aa3be02eda2ab8b2a27696fa789f5007a978419d07b3deebb7f391895e63e3556aeb38dc1ded3bddf2b860125ebf8f7848375e90dc7af75 -EBUILD mmix-20160804-r1.ebuild 979 BLAKE2B 910d90c29ad16935be723b746ef22291e4414c9acaf324e54d6d3b0ea42d9d384f9c2397f7b5ebcd42bb3bfd4923fa7b7ed43e92c58b7b4ca9b7f9a673817bdb SHA512 f51695ba780a6253ba771731b6df3cde7aacaffd1d3e4e1e8c32ad0cff9b6bda3c406074246fb3655c2159faf88d80415df8d4dffd69753c01bef43b922c93fe +EBUILD mmix-20160804-r1.ebuild 982 BLAKE2B fa6196b52bf66531430494fb29ba2c205a0e41afcb1d0ea174f9c1d3f6d78643fad9294addabebb77192a845e0b9a65a29a5eaf020e83c0b2f5cf4e2297c8a5e SHA512 33ffe26f82a2f69ca46437648afdc5074800637571ade3c0606e6f63050387a2bfcac70db2b3bcbed5b94d35d734eb754c34b91234da250d41de02c14b82727d +EBUILD mmix-20160804-r2.ebuild 1069 BLAKE2B ddcc0f3f70deb79eafc4c7f968ef37b3d43d81c7f0ec128d4a9c75d4cfff277e7883806790be91219f003c8e9735add95e49f3ab313b6e97f44d5ed1906ca43c SHA512 919d4fa388613466f5726d9b6d233c3f9a67e814ef568ae9689d547c30b5b023fe02075f0c44006f98dd5dcc2ec73d064b86233b4a7a0b0f4bad3169c7954fac MISC metadata.xml 248 BLAKE2B cdc66ee780cce8b539d2c619893b5a5121982e3cde1ea6308f7795eac4b3d2247922b5900e7908213297c90bec9a63118312ee9349394becfc67a316aa3f5ca9 SHA512 276b07770aef3fc094cdf356ec54c492c34d515e426d47825a8a2df2331e71876b8a0f87f9549d279958e58a6624c1452092d9b185b4233a973096e1d1bd0301 diff --git a/dev-lang/mmix/files/mmix-20160804-implicit-int.patch b/dev-lang/mmix/files/mmix-20160804-implicit-int.patch new file mode 100644 index 000000000000..5da26a43c4fa --- /dev/null +++ b/dev-lang/mmix/files/mmix-20160804-implicit-int.patch @@ -0,0 +1,27 @@ +Fix function definition to be modern C +https://bugs.gentoo.org/883275 +diff '--color=auto' -ru work.old/abstime.w work/abstime.w +--- a/abstime.w 2025-01-19 17:06:19.952342044 +0400 ++++ b/abstime.w 2025-01-19 17:10:33.521811824 +0400 +@@ -18,7 +18,7 @@ + #include + #include + @# +-main() ++int main(void) + { + printf("#define ABSTIME %ld\n",time(NULL)); + return 0; +Additional dependency in build graph +https://bugs.gentoo.org/818889 +--- a/Makefile 2025-01-19 17:19:21.271627004 +0400 ++++ b/Makefile 2025-01-19 17:21:03.933007472 +0400 +@@ -81,6 +81,8 @@ + + mmix-config.o: mmix-pipe.o + ++mmix-mem.o: mmix-pipe.o ++ + mmmix: mmix-arith.o mmix-pipe.o mmix-config.o mmix-mem.o mmix-io.o mmmix.c + $(CC) $(CFLAGS) $(LDFLAGS) mmmix.c \ + mmix-arith.o mmix-pipe.o mmix-config.o mmix-mem.o mmix-io.o -o mmmix diff --git a/dev-lang/mmix/mmix-20160804-r1.ebuild b/dev-lang/mmix/mmix-20160804-r1.ebuild index 174120e453df..1aaec878cb1b 100644 --- a/dev-lang/mmix/mmix-20160804-r1.ebuild +++ b/dev-lang/mmix/mmix-20160804-r1.ebuild @@ -1,4 +1,4 @@ -# Copyright 1999-2022 Gentoo Authors +# Copyright 1999-2025 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 EAPI=7 @@ -8,18 +8,19 @@ inherit toolchain-funcs DESCRIPTION="Donald Knuth's MMIX Assembler and Simulator" HOMEPAGE="https://www-cs-faculty.stanford.edu/~knuth/mmix.html http://mmix.cs.hm.edu" SRC_URI="http://mmix.cs.hm.edu/src/${P}.tgz" +S="${WORKDIR}" -DEPEND="virtual/tex-base - doc? ( dev-texlive/texlive-plaingeneric )" -# media-sound/mmix and dev-lang/mmix both install 'mmix' binary, bug #426874 -RDEPEND="!!media-sound/mmix" - -SLOT="0" LICENSE="mmix" +SLOT="0" KEYWORDS="amd64 x86" IUSE="doc" -S="${WORKDIR}" +BDEPEND=" + virtual/tex-base + doc? ( dev-texlive/texlive-plaingeneric ) +" +# media-sound/mmix and dev-lang/mmix both install 'mmix' binary, bug #426874 +RDEPEND="!!media-sound/mmix" PATCHES=( "${FILESDIR}"/${PN}-20110420-makefile.patch diff --git a/dev-lang/mmix/mmix-20160804-r2.ebuild b/dev-lang/mmix/mmix-20160804-r2.ebuild new file mode 100644 index 000000000000..62ffe565a5e1 --- /dev/null +++ b/dev-lang/mmix/mmix-20160804-r2.ebuild @@ -0,0 +1,49 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +inherit toolchain-funcs flag-o-matic + +DESCRIPTION="Donald Knuth's MMIX Assembler and Simulator" +HOMEPAGE="https://www-cs-faculty.stanford.edu/~knuth/mmix.html http://mmix.cs.hm.edu" +SRC_URI="http://mmix.cs.hm.edu/src/${P}.tgz" +S="${WORKDIR}" + +LICENSE="mmix" +SLOT="0" +KEYWORDS="amd64 x86" +IUSE="doc" + +BDEPEND=" + virtual/tex-base + doc? ( dev-texlive/texlive-plaingeneric ) +" +# media-sound/mmix and dev-lang/mmix both install 'mmix' binary, bug #426874 +RDEPEND="!!media-sound/mmix" + +PATCHES=( + "${FILESDIR}"/${PN}-20110420-makefile.patch + "${FILESDIR}"/${PN}-20131017-format-security.patch + "${FILESDIR}"/${PN}-20160804-gcc-10.patch + "${FILESDIR}"/${PN}-20160804-implicit-int.patch +) + +src_compile() { + append-flags -std=gnu17 + export VARTEXFONTS=${T}/fonts + emake all \ + CFLAGS="${CFLAGS}" \ + CC="$(tc-getCC)" + + if use doc ; then + emake doc + fi +} + +src_install() { + dobin ${PN} ${PN}al m${PN} mmotype abstime + dodoc README ${PN}.1 + + use doc && dodoc *.ps +} diff --git a/dev-lang/rust-bin/Manifest b/dev-lang/rust-bin/Manifest index e4829cabbf7e..17a9c27e5222 100644 --- a/dev-lang/rust-bin/Manifest +++ b/dev-lang/rust-bin/Manifest @@ -451,25 +451,17 @@ DIST rust-src-1.82.0.tar.xz 2966368 BLAKE2B 4162e7393ac21a095ac1541ea7b62fafa561 DIST rust-src-1.83.0.tar.xz 2998424 BLAKE2B de758c5bfb29865a3ab7ab02d17b0282272fa7d1cf5da333a6a19d6a16813320317785e9bab02e3ba9ca6ee9f26e0c96b00a117f33b74c82b13ece44133e3130 SHA512 e1f0ccae1fd4202d86cde1f1e2f4491983ec49fafb2b9eaca6260e9173bea0e0cc2567946e48e3ce48f0a620f63dc44d30334f06c935628158de110d43c7d53b DIST rust-src-1.84.0.tar.xz 3016148 BLAKE2B e948d4edb88f81ecfb49f56a3ca6331c4e9de17bd9f56af823e1cefdc5098abebc2bb013d7c12ca1713a43fec588f33befcb7146713eeade1511914f70146d62 SHA512 ccb45d57c7cdac311478a5b4689144297717e6404f9c4fb168127804f13f72c15433b32765f90ce56e6f34435229e754241cb3656b28a4b33c6070b6f79b7c53 DIST rust-src-1.84.1.tar.xz 3016012 BLAKE2B c9edeaf0797a22e384c54b3fe3e7c833464c09f8828474e05400a561a369d836626387caa495689e4b14fad691a85d6859098c84347211a6f79e2ef2c8d9d6f2 SHA512 564c440a05b67fd3a5dcb4dea21800d32ae65ca12230b804b5efa4bd468fe1b185bd7ed89041782018f70f60afd7554d7755edbe20e9cdc930a9fad390deb317 -EBUILD rust-bin-1.71.1-r100.ebuild 7172 BLAKE2B f8b6f4910cf00212f0d7288d10d29c72d88826728fddfc77f47a782103564a88252837931c699ea9cf7586e4d9507bdae2a3354df262414c368af95a2d0bbfb8 SHA512 24aa046084a58816a2d3a949826945e294ab2ddacbc1e2ccb4cf1914065f3e52f7c3f680330939194b29149a3384c711efa09a261277d4b2dec6aff6660142a9 -EBUILD rust-bin-1.71.1-r101.ebuild 7172 BLAKE2B f8b6f4910cf00212f0d7288d10d29c72d88826728fddfc77f47a782103564a88252837931c699ea9cf7586e4d9507bdae2a3354df262414c368af95a2d0bbfb8 SHA512 24aa046084a58816a2d3a949826945e294ab2ddacbc1e2ccb4cf1914065f3e52f7c3f680330939194b29149a3384c711efa09a261277d4b2dec6aff6660142a9 -EBUILD rust-bin-1.74.1-r100.ebuild 7515 BLAKE2B eabe846ec482e04cfe068420c8315eead88dbe229bedf5f2809b492dc360bf5f34023c89a68b62d1f92c5a3ba628bfd8c861e83980925f74c61d95d3f106db2e SHA512 e40c66befee2c16b579b630de2e0aae00eb5bd72680bd6ee724ab52f434dfc725b2c377d725d95a3500be818acad973202e9b802762adcb1b54cab0251280d2b -EBUILD rust-bin-1.74.1-r101.ebuild 7515 BLAKE2B eabe846ec482e04cfe068420c8315eead88dbe229bedf5f2809b492dc360bf5f34023c89a68b62d1f92c5a3ba628bfd8c861e83980925f74c61d95d3f106db2e SHA512 e40c66befee2c16b579b630de2e0aae00eb5bd72680bd6ee724ab52f434dfc725b2c377d725d95a3500be818acad973202e9b802762adcb1b54cab0251280d2b -EBUILD rust-bin-1.75.0-r100.ebuild 7515 BLAKE2B fdf3b9befaf1983494e42fe9ad17eb52dd14b0551f113a0d7d276dde05402d53d0d59a9ff1547e6df22e12a7845bda581239badeb5d80bcb144201d473227042 SHA512 88b9790f929d48440533b82aa9fe3300ecce75ca74f517076186a1cff3cf360aaa38f06b454ad93b429dfbf69e482af0add2ae1ca9ed1ee8e085ba9b3ea0eecf -EBUILD rust-bin-1.75.0-r101.ebuild 7515 BLAKE2B fdf3b9befaf1983494e42fe9ad17eb52dd14b0551f113a0d7d276dde05402d53d0d59a9ff1547e6df22e12a7845bda581239badeb5d80bcb144201d473227042 SHA512 88b9790f929d48440533b82aa9fe3300ecce75ca74f517076186a1cff3cf360aaa38f06b454ad93b429dfbf69e482af0add2ae1ca9ed1ee8e085ba9b3ea0eecf -EBUILD rust-bin-1.76.0-r100.ebuild 6888 BLAKE2B bd2c113dc06a5db834e0955110a9f81fcc7897b74c5e41b25521b01b8eec6180fc0785eb2f2a00562dc473a3935bb5b85fe3d904a2bad057288672402232d674 SHA512 41bbbd4ead8a4eca64f78116d47659e884d23dac551b333f05fc6a873a1677a4b8f4770115b35bcc6bf18cd400a679983e639be1d87bcacbe7acc0d31c8e4798 -EBUILD rust-bin-1.77.1-r100.ebuild 7554 BLAKE2B f758b72f8e36eb8dfb9df428344e6bbf445dc3fcab2f1aa30712c957e3fba85d283277790f39f7fd1270bdbf576ece89bc148cca2defbcc312b2863403122404 SHA512 b3effcf3c371c52f0c6d6f82c3ebf712bade202d2e8df45d886ee6077b3b0e5cb5fb102f55743ea13795b1a0c4a79e093c5a0e9bfb0c8127961d5779e0a21be4 -EBUILD rust-bin-1.77.1-r101.ebuild 7554 BLAKE2B f758b72f8e36eb8dfb9df428344e6bbf445dc3fcab2f1aa30712c957e3fba85d283277790f39f7fd1270bdbf576ece89bc148cca2defbcc312b2863403122404 SHA512 b3effcf3c371c52f0c6d6f82c3ebf712bade202d2e8df45d886ee6077b3b0e5cb5fb102f55743ea13795b1a0c4a79e093c5a0e9bfb0c8127961d5779e0a21be4 -EBUILD rust-bin-1.78.0-r100.ebuild 7661 BLAKE2B d9b43e4bd25938edcf9c0aa8bc68dd7a4cf14313602c7ebb5d616f5a2409f5f3c15dcffd8dfe24c581fe2fcf79cb7df6dfd04b57c9ba7410ab6b7bbdbcc1984c SHA512 0d6871a894c48936a56733e6edea73cf9a197618c4238f79df253846cf9cc619ac755bb27d67fd130871e40c3e91dcac9ba960a958fabe409469bebde52d1646 -EBUILD rust-bin-1.79.0-r100.ebuild 7661 BLAKE2B 0c003da9b7ef5b5fe204735836da0e2c0bac283486eb0382defe27598f9a0ea0e38dd67e57d4fa90567f8ce6f4e59602d6b2d1afe83f582b2eb8e0da9e5d14fc SHA512 1434345f981e692f50840d27140e8a8e9b2d9eb557e7250f032db02321d839fde70609399645ae38f2e78cf79049eabf447d96340c43cb03891a186d1fe07439 -EBUILD rust-bin-1.79.0-r101.ebuild 7661 BLAKE2B 0c003da9b7ef5b5fe204735836da0e2c0bac283486eb0382defe27598f9a0ea0e38dd67e57d4fa90567f8ce6f4e59602d6b2d1afe83f582b2eb8e0da9e5d14fc SHA512 1434345f981e692f50840d27140e8a8e9b2d9eb557e7250f032db02321d839fde70609399645ae38f2e78cf79049eabf447d96340c43cb03891a186d1fe07439 -EBUILD rust-bin-1.80.1-r100.ebuild 7870 BLAKE2B 335d40c75cd61578b055a6ad5d03a182304bfb94b8df09503a802fda905e9c40cfa968e138fb6170734339e5af3d1794b38600b9df6b25abdd5c5a40d4d5637d SHA512 b7dd088309c9da903b1ed24d94c2ac697c1c800ed1c5708572afa5ac3497636811efc5123c390b545e8100a5a8140dc9a49a682ac43fac4821e52c7e8528dad4 -EBUILD rust-bin-1.80.1-r101.ebuild 7870 BLAKE2B 335d40c75cd61578b055a6ad5d03a182304bfb94b8df09503a802fda905e9c40cfa968e138fb6170734339e5af3d1794b38600b9df6b25abdd5c5a40d4d5637d SHA512 b7dd088309c9da903b1ed24d94c2ac697c1c800ed1c5708572afa5ac3497636811efc5123c390b545e8100a5a8140dc9a49a682ac43fac4821e52c7e8528dad4 -EBUILD rust-bin-1.81.0-r100.ebuild 7796 BLAKE2B d4fa84b38416621e531c0fa8721d7d4c351da246324a691cceaebcc8379c5c9003dc5a0c95353b94ab8b1ab1905fb9578d3d951d1c8a986dd720d2282ac76b12 SHA512 4972eef30629e93301d931f56354008a1184acf209740d1cfde93440023e9ca0c8ffb4d7c218ab6930724b827a796f102d56eef73feb378f3be5a7eafe55cf35 -EBUILD rust-bin-1.81.0-r101.ebuild 7796 BLAKE2B d4fa84b38416621e531c0fa8721d7d4c351da246324a691cceaebcc8379c5c9003dc5a0c95353b94ab8b1ab1905fb9578d3d951d1c8a986dd720d2282ac76b12 SHA512 4972eef30629e93301d931f56354008a1184acf209740d1cfde93440023e9ca0c8ffb4d7c218ab6930724b827a796f102d56eef73feb378f3be5a7eafe55cf35 -EBUILD rust-bin-1.82.0-r100.ebuild 7824 BLAKE2B c62734b23b47f074ec71ef4c9ef362551a94a0d8e2949573433a34809647d93e86ff7afca3d017dab587f5789a36789fb955776641d96c32acfb58fc4845a526 SHA512 af1536ddff50283b2712f8d383daedf3397705a26a9b8d8f1ce802cb5e5c2e04fdd23fa1ff87dc4ef9a9be597504bf828fed578c22d87bd57f93055177656c19 -EBUILD rust-bin-1.82.0-r101.ebuild 7824 BLAKE2B c62734b23b47f074ec71ef4c9ef362551a94a0d8e2949573433a34809647d93e86ff7afca3d017dab587f5789a36789fb955776641d96c32acfb58fc4845a526 SHA512 af1536ddff50283b2712f8d383daedf3397705a26a9b8d8f1ce802cb5e5c2e04fdd23fa1ff87dc4ef9a9be597504bf828fed578c22d87bd57f93055177656c19 -EBUILD rust-bin-1.83.0.ebuild 7810 BLAKE2B 484806eca705b0b19f0c99fd9c131fed70c1b64e516a92fe7b7d54935757f1e2ea150269cb105bf6436e462ef1cecbab277786113f6d0201b46c92a7b71e043c SHA512 f1ee0bac3e9895824a918a83a96027bdc8acb5d61aef72ada1c416b4fe11460523ed24944e9ecd3ecedad18a6d656023d6882d6808562f5d62d7d6563b2a6936 -EBUILD rust-bin-1.84.0.ebuild 7817 BLAKE2B b037a3419c1de744417db49366f198de35ff73f3ea3d9aefe5c0d00c3f9bd6f438ed35f6258fe184857788864797b204ffd0e2bb6df07ff3308f4b568cd59497 SHA512 f6c12ce632f940528478f04678a15c5bc8f8368fb2613e6d8347dff29e05efb449d9e8ee878d71f93fb3f78f3ee328cc9d04154d1c3aac115d834121fd196017 -EBUILD rust-bin-1.84.1.ebuild 7817 BLAKE2B f46a594d7f526d7a1775896d61a2e11b63847bda9c754c36f1dfbae63d1f5b640287366ca4d30586c0b508e1f8c70398611361de02ff5396b032bf15581e9fa1 SHA512 f872163012b02cac27206138db1b6e62737f443babf7b2cb8725092bb80d686666873b075f9069bac33ecb97f9ccfd0917c8b0547b5ffde1d32099c666a41094 +EBUILD rust-bin-1.71.1-r102.ebuild 7125 BLAKE2B 4f226bdd5c82b47d60aeed8d8215f076c696ce4bdebb2e2dcfa13fcb19e546f97a3d6bcd1e7ef002651ef850e300a7d464245867c7dc4af54201f0b5e547c85a SHA512 a03f353252f08a583aeaab293a26f6f0cf2fddc61daf7705fa9c4153ca2db9499b68ca42fbcc8ecb3d24c9846642af0c962b3f2ac99e70328eafb85930a88868 +EBUILD rust-bin-1.74.1-r102.ebuild 7468 BLAKE2B f8e0ef5f3a53f862c10c100ffd886eee06c1b7543856e154756884467f8115bdaa39569a47d789166d625f68f53a657eb535b29ba76aa363d15699ae65c0b3c4 SHA512 9df89cf28b5300a0023915138a05d74b6219632d6e95b056f412070302270e4101b7de5edcb881f917e5c32b787711996b7fb05355d915174764257d75735083 +EBUILD rust-bin-1.75.0-r102.ebuild 7468 BLAKE2B 026bd2e1337b6f6e4922e857d9ab07d4aa2311688aa9743c1b8c6a04ae63605bb5d66f429b03196f1fb4adbd64007f5421f0c26f3b04ee544926296a4e4c3499 SHA512 984d8dcc758db097f013864d619f70509ff32b530bdc77d92c45aee0ae097b612dd2fe0f0e82570fb8fb753645c530b44e02b87465e6f95490ac08789ae123f7 +EBUILD rust-bin-1.76.0-r101.ebuild 6841 BLAKE2B 0a2f4c01bf5f77264e0d879ecb42535fd70b1167cd96be38cc5f25098fbbac36ebaa786290b8ca08e95218c4de2339bb2bf7f1c4aba87bf9a5b54c6bfb19210e SHA512 918f8e38f0740606b0537c45810b91fd8eddbadcec63018d22981ede24f493ecebbcf54aa936300c3f56ef1d2ce93fe0a47d86c862b9a6b465dddf6043667054 +EBUILD rust-bin-1.77.1-r102.ebuild 7507 BLAKE2B 50bdfc349a1969d1c23a48171fc8e1672e19d0156d931c75d6a70e6ba2055973d578227971677d68f6a83ab20d6a379a61ee495261837eb0e2030ad8ff83cc7b SHA512 d75cd61fcb9f823b8d86dfd065af8a1ad29f0a677c22d5401a2eafc00d5da3ee21f1eca984b3cb12d01bcc579c5b936c19b50116355e7ecb3fe9af5ac8293e43 +EBUILD rust-bin-1.78.0-r101.ebuild 7614 BLAKE2B a99ed2092f625f6e9e4c9b3f7d06b4f39be30fb1584182f14ae2234040aba09418553376d6cce128dea8bac2a4f5a966f6cd3012754162eaa15b75cf674521bb SHA512 93dafdd389d1657e6953c040ec99680fe8c6a116f1ba4894c883d4fd757445fc08027b49b2ba86041d8d7a5cd7150fc6b5bfd61f6924ade43daa8741bca6ec45 +EBUILD rust-bin-1.79.0-r102.ebuild 7614 BLAKE2B 0d55d4d416175b4e0dc032a1aa93c6b638c2c58eb684f6886c6a843f89810177b82aded64ce3a2f68b963482e14bc96f1254f4a4904e65a5604dd3aeb34ed1a6 SHA512 c33cd897ea2747e5d06543ef36dac9cfdbf898587dc90f1b848709544e769862d4c8777dae9be7811469b0d2edbcdecb7ba2872777577b92a7ad548614f945c4 +EBUILD rust-bin-1.80.1-r102.ebuild 7823 BLAKE2B 083c1f6904ab41feafa4f6d1b317769fa51e1920ceb79fa9f38e045ca7384784377b98e309fb47f906553ffaed34abd3d9552fb1e51b3d51c59ac72d7c90f017 SHA512 a7e522e5c35febbf42f16e14ab92688446ef82bb6a01c248a73e574a1bc017c123947457b6f183d8e34c73b56e997540a7d29e7c95c4ba7c963f0a6d8fb8cefc +EBUILD rust-bin-1.81.0-r102.ebuild 7749 BLAKE2B 77cd61ad9ccc5302c06b4460b90dd2a04a1841d590332dc214cecd0078dfc34d40d900c6288f8788d93a54e99604a8c45931a5a0c0bd62ad80294a27e6b5f841 SHA512 583e55308794c5273edaefffbfe3fb571b7a9990bed17553750ee412d85cde899346e504fda63e201a96e8b2fb9cf1544a552fcaafc1aaef7db2b6ad92bf7099 +EBUILD rust-bin-1.82.0-r102.ebuild 7777 BLAKE2B c7d315460151cf1196ebc36dcb99a94dce5f27ac465d72ba66952304438a15802e53c029bb4c142adc593f527daa0f6a75dab8cf7edc44a26ea22b512135f1c1 SHA512 f1da44327074a71ed9aba95d48017d3451b8582a3e053cb90a2407e12a887e6c9b608b58bb7aad4a79c7fe29815f7df5f3bcb11996249453a84f58d5d12af467 +EBUILD rust-bin-1.83.0-r1.ebuild 7763 BLAKE2B 636b5c4bd4a3bf9efd6c1acd85f53a0cd8c3c2f7ab077f0ab9994dbb7468a8ad19fd1eb19c74b613d83e0a126390b1009af57e26a950e0827a800c6d85bc6c59 SHA512 ee5ee66dc7568a1211bcf01f439f82ef6fb1eb4c8ad4d317a2601238bb3288da9c172282088409a8e86d9aa037b09848dcb3b62fc991ee1c8399fc03dddd43c3 +EBUILD rust-bin-1.84.0-r1.ebuild 7770 BLAKE2B 3c2042a394f3607f97aa99eddeb45f343b84cb7c8580d716268ca1c81a21ebadbce293d208f4c18680b63fa9b1174dc1e13caa3a983af204fd90a61e2c479ab3 SHA512 802f792e94a88e1d9bde71e85362e89cb4b41681cbe93c6c145ee5870356d6ac4e64e9c3b3071c2553b4aef4f1e2b7a2fe9e0c8006e4321bdff02a28027eed41 +EBUILD rust-bin-1.84.1-r1.ebuild 7770 BLAKE2B 4e16521f39caabaed65b64682566c93260a3e3d8c4dc1bb3d679b74768516b4df8e06437b1d02edf2f91d6890f68cd705fc3d09ad0d7bc469c66a5e819d8b09c SHA512 f3d8b20983d29c9997c486d65316f2ca58d78e484f51141bdcb9f1d7af8a655ff591b6c75b81c8f26e85496e439a6087ad26dd38486a64fe1a0f297218307927 MISC metadata.xml 1062 BLAKE2B de2d2adcb691a3e614457dd9a7f5d4a8eddffd548b2de8a229b6d397ae79f7e24484512a1fb2a85e02aa98c240ae73420dbe48e45790c0cd3f6381ef5a4ac24b SHA512 ee4d08b8eec8abd89e051ee5ec6cc928bfde7039b815d4539558d71d7c0576aea939b7781b4998d3fcf2c2e8752791d53c0ba6115df07fc2243c470b2a7467b9 diff --git a/dev-lang/rust-bin/rust-bin-1.71.1-r100.ebuild b/dev-lang/rust-bin/rust-bin-1.71.1-r100.ebuild deleted file mode 100644 index 9e716ace2e5b..000000000000 --- a/dev-lang/rust-bin/rust-bin-1.71.1-r100.ebuild +++ /dev/null @@ -1,234 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 16 ) -LLVM_OPTIONAL="yes" - -inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal - -MY_P="rust-${PV}" -# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" -MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2023-08-03/rust-src-${PV}.tar.xz" -GENTOO_BIN_BASEURI="https://dev.gentoo.org/~sam/distfiles/${CATEGORY}/${PN}" # omit leading slash - -DESCRIPTION="Language empowering everyone to build reliable and efficient software" -HOMEPAGE="https://www.rust-lang.org/" -SRC_URI="$(rust_all_arch_uris ${MY_P}) - rust-src? ( ${MY_SRC_URI} ) -" -# Keep this separate to allow easy commenting out if not yet built -SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz -> ${MY_P}-sparc64-unknown-linux-gnu.sam.tar.xz ) " - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4 UoI-NCSA" -SLOT="${PV}" -KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv ~s390 sparc x86" -IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" - -RDEPEND=" - >=app-eselect/eselect-rust-20190311 - dev-libs/openssl - sys-apps/lsb-release - sys-devel/gcc:* - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" -BDEPEND=" - prefix? ( dev-util/patchelf ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" - -# stripping rust may break it (at least on x86_64) -# https://github.com/rust-lang/rust/issues/112286 -RESTRICT="strip" - -QA_PREBUILT=" - opt/${P}/bin/.* - opt/${P}/lib/.*.so - opt/${P}/libexec/.* - opt/${P}/lib/rustlib/.*/bin/.* - opt/${P}/lib/rustlib/.*/lib/.* -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" - -pkg_pretend() { - if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then - die "${CHOST} is not supported by upstream Rust. You must use a hard float version." - fi -} - -src_unpack() { - # sadly rust-src tarball does not have corresponding .asc file - # so do partial verification - if use verify-sig; then - for f in ${A}; do - if [[ -f ${DISTDIR}/${f}.asc ]]; then - verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" - fi - done - fi - - default_src_unpack - - mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die -} - -patchelf_for_bin() { - local filetype=$(file -b ${1}) - if [[ ${filetype} == *ELF*interpreter* ]]; then - einfo "${1}'s interpreter changed" - patchelf ${1} --set-interpreter ${2} || die - elif [[ ${filetype} == *script* ]]; then - hprefixify ${1} - fi -} - -multilib_src_install() { - if multilib_is_native_abi; then - - # start native abi install - pushd "${S}" >/dev/null || die - local analysis std - analysis="$(grep 'analysis' ./components)" - std="$(grep 'std' ./components)" - local components="rustc,cargo,${std}" - use doc && components="${components},rust-docs" - use clippy && components="${components},clippy-preview" - use rustfmt && components="${components},rustfmt-preview" - use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" - # Rust component 'rust-src' is extracted from separate archive - if use rust-src; then - einfo "Combining rust and rust-src installers" - mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die - echo rust-src >> ./components || die - components="${components},rust-src" - fi - ./install.sh \ - --components="${components}" \ - --disable-verify \ - --prefix="${ED}/opt/${P}" \ - --mandir="${ED}/opt/${P}/man" \ - --disable-ldconfig \ - || die - - if use prefix; then - local interpreter=$(patchelf --print-interpreter "${EPREFIX}/bin/bash") - ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" - find "${ED}/opt/${P}/bin" -type f -print0 | \ - while IFS= read -r -d '' filename; do - patchelf_for_bin ${filename} ${interpreter} \; || die - done - eend ${PIPESTATUS[0]} - fi - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- - local ver_i="${i}-bin-${PV}" - ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die - dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" - dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" - dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" - dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" - - # make all capital underscored variable - local CARGO_TRIPLET="$(rust_abi)" - CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" - CARGO_TRIPLET="${CARGO_TRIPLET^^}" - cat <<-_EOF_ > "${T}/50${P}" - LDPATH="${EPREFIX}/usr/lib/rust/lib-bin-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" - $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") - _EOF_ - doenvd "${T}/50${P}" - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - popd >/dev/null || die - #end native abi install - - else - local rust_target - rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" - dodir "/opt/${P}/lib/rustlib" - cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ - "${ED}/opt/${P}/lib/rustlib" || die - fi - - # BUG: installs x86_64 binary on other arches - rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die -} - -pkg_postinst() { - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - if has_version app-editors/emacs; then - elog "install app-emacs/rust-mode to get emacs support for rust." - fi - - if has_version app-editors/gvim || has_version app-editors/vim; then - elog "install app-vim/rust-vim to get vim support for rust." - fi -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust-bin/rust-bin-1.71.1-r101.ebuild b/dev-lang/rust-bin/rust-bin-1.71.1-r101.ebuild deleted file mode 100644 index 9e716ace2e5b..000000000000 --- a/dev-lang/rust-bin/rust-bin-1.71.1-r101.ebuild +++ /dev/null @@ -1,234 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 16 ) -LLVM_OPTIONAL="yes" - -inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal - -MY_P="rust-${PV}" -# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" -MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2023-08-03/rust-src-${PV}.tar.xz" -GENTOO_BIN_BASEURI="https://dev.gentoo.org/~sam/distfiles/${CATEGORY}/${PN}" # omit leading slash - -DESCRIPTION="Language empowering everyone to build reliable and efficient software" -HOMEPAGE="https://www.rust-lang.org/" -SRC_URI="$(rust_all_arch_uris ${MY_P}) - rust-src? ( ${MY_SRC_URI} ) -" -# Keep this separate to allow easy commenting out if not yet built -SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz -> ${MY_P}-sparc64-unknown-linux-gnu.sam.tar.xz ) " - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4 UoI-NCSA" -SLOT="${PV}" -KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv ~s390 sparc x86" -IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" - -RDEPEND=" - >=app-eselect/eselect-rust-20190311 - dev-libs/openssl - sys-apps/lsb-release - sys-devel/gcc:* - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" -BDEPEND=" - prefix? ( dev-util/patchelf ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" - -# stripping rust may break it (at least on x86_64) -# https://github.com/rust-lang/rust/issues/112286 -RESTRICT="strip" - -QA_PREBUILT=" - opt/${P}/bin/.* - opt/${P}/lib/.*.so - opt/${P}/libexec/.* - opt/${P}/lib/rustlib/.*/bin/.* - opt/${P}/lib/rustlib/.*/lib/.* -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" - -pkg_pretend() { - if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then - die "${CHOST} is not supported by upstream Rust. You must use a hard float version." - fi -} - -src_unpack() { - # sadly rust-src tarball does not have corresponding .asc file - # so do partial verification - if use verify-sig; then - for f in ${A}; do - if [[ -f ${DISTDIR}/${f}.asc ]]; then - verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" - fi - done - fi - - default_src_unpack - - mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die -} - -patchelf_for_bin() { - local filetype=$(file -b ${1}) - if [[ ${filetype} == *ELF*interpreter* ]]; then - einfo "${1}'s interpreter changed" - patchelf ${1} --set-interpreter ${2} || die - elif [[ ${filetype} == *script* ]]; then - hprefixify ${1} - fi -} - -multilib_src_install() { - if multilib_is_native_abi; then - - # start native abi install - pushd "${S}" >/dev/null || die - local analysis std - analysis="$(grep 'analysis' ./components)" - std="$(grep 'std' ./components)" - local components="rustc,cargo,${std}" - use doc && components="${components},rust-docs" - use clippy && components="${components},clippy-preview" - use rustfmt && components="${components},rustfmt-preview" - use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" - # Rust component 'rust-src' is extracted from separate archive - if use rust-src; then - einfo "Combining rust and rust-src installers" - mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die - echo rust-src >> ./components || die - components="${components},rust-src" - fi - ./install.sh \ - --components="${components}" \ - --disable-verify \ - --prefix="${ED}/opt/${P}" \ - --mandir="${ED}/opt/${P}/man" \ - --disable-ldconfig \ - || die - - if use prefix; then - local interpreter=$(patchelf --print-interpreter "${EPREFIX}/bin/bash") - ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" - find "${ED}/opt/${P}/bin" -type f -print0 | \ - while IFS= read -r -d '' filename; do - patchelf_for_bin ${filename} ${interpreter} \; || die - done - eend ${PIPESTATUS[0]} - fi - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- - local ver_i="${i}-bin-${PV}" - ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die - dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" - dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" - dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" - dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" - - # make all capital underscored variable - local CARGO_TRIPLET="$(rust_abi)" - CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" - CARGO_TRIPLET="${CARGO_TRIPLET^^}" - cat <<-_EOF_ > "${T}/50${P}" - LDPATH="${EPREFIX}/usr/lib/rust/lib-bin-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" - $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") - _EOF_ - doenvd "${T}/50${P}" - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - popd >/dev/null || die - #end native abi install - - else - local rust_target - rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" - dodir "/opt/${P}/lib/rustlib" - cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ - "${ED}/opt/${P}/lib/rustlib" || die - fi - - # BUG: installs x86_64 binary on other arches - rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die -} - -pkg_postinst() { - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - if has_version app-editors/emacs; then - elog "install app-emacs/rust-mode to get emacs support for rust." - fi - - if has_version app-editors/gvim || has_version app-editors/vim; then - elog "install app-vim/rust-vim to get vim support for rust." - fi -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust-bin/rust-bin-1.71.1-r102.ebuild b/dev-lang/rust-bin/rust-bin-1.71.1-r102.ebuild new file mode 100644 index 000000000000..a631c26c9948 --- /dev/null +++ b/dev-lang/rust-bin/rust-bin-1.71.1-r102.ebuild @@ -0,0 +1,233 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 16 ) +LLVM_OPTIONAL="yes" + +inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal + +MY_P="rust-${PV}" +# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" +MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2023-08-03/rust-src-${PV}.tar.xz" +GENTOO_BIN_BASEURI="https://dev.gentoo.org/~sam/distfiles/${CATEGORY}/${PN}" # omit leading slash + +DESCRIPTION="Language empowering everyone to build reliable and efficient software" +HOMEPAGE="https://www.rust-lang.org/" +SRC_URI="$(rust_all_arch_uris ${MY_P}) + rust-src? ( ${MY_SRC_URI} ) +" +# Keep this separate to allow easy commenting out if not yet built +SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz -> ${MY_P}-sparc64-unknown-linux-gnu.sam.tar.xz ) " + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4 UoI-NCSA" +SLOT="${PV}" +KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv ~s390 sparc x86" +IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" + +RDEPEND=" + >=app-eselect/eselect-rust-20190311 + dev-libs/openssl + sys-apps/lsb-release + sys-devel/gcc:* + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" +BDEPEND=" + prefix? ( dev-util/patchelf ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" + +# stripping rust may break it (at least on x86_64) +# https://github.com/rust-lang/rust/issues/112286 +RESTRICT="strip" + +QA_PREBUILT=" + opt/${P}/bin/.* + opt/${P}/lib/.*.so + opt/${P}/libexec/.* + opt/${P}/lib/rustlib/.*/bin/.* + opt/${P}/lib/rustlib/.*/lib/.* +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" + +pkg_pretend() { + if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then + die "${CHOST} is not supported by upstream Rust. You must use a hard float version." + fi +} + +src_unpack() { + # sadly rust-src tarball does not have corresponding .asc file + # so do partial verification + if use verify-sig; then + for f in ${A}; do + if [[ -f ${DISTDIR}/${f}.asc ]]; then + verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" + fi + done + fi + + default_src_unpack + + mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die +} + +patchelf_for_bin() { + local filetype=$(file -b ${1}) + if [[ ${filetype} == *ELF*interpreter* ]]; then + einfo "${1}'s interpreter changed" + patchelf ${1} --set-interpreter ${2} || die + elif [[ ${filetype} == *script* ]]; then + hprefixify ${1} + fi +} + +multilib_src_install() { + if multilib_is_native_abi; then + + # start native abi install + pushd "${S}" >/dev/null || die + local analysis std + analysis="$(grep 'analysis' ./components)" + std="$(grep 'std' ./components)" + local components="rustc,cargo,${std}" + use doc && components="${components},rust-docs" + use clippy && components="${components},clippy-preview" + use rustfmt && components="${components},rustfmt-preview" + use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" + # Rust component 'rust-src' is extracted from separate archive + if use rust-src; then + einfo "Combining rust and rust-src installers" + mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die + echo rust-src >> ./components || die + components="${components},rust-src" + fi + ./install.sh \ + --components="${components}" \ + --disable-verify \ + --prefix="${ED}/opt/${P}" \ + --mandir="${ED}/opt/${P}/man" \ + --disable-ldconfig \ + || die + + if use prefix; then + local interpreter=$(patchelf --print-interpreter "${EPREFIX}/bin/bash") + ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" + find "${ED}/opt/${P}/bin" -type f -print0 | \ + while IFS= read -r -d '' filename; do + patchelf_for_bin ${filename} ${interpreter} \; || die + done + eend ${PIPESTATUS[0]} + fi + + local symlinks=( + cargo + rustc + rustdoc + rust-gdb + rust-gdbgui + rust-lldb + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- + local ver_i="${i}-bin-${PV}" + ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die + dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" + dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" + dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" + dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" + + # make all capital underscored variable + local CARGO_TRIPLET="$(rust_abi)" + CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" + CARGO_TRIPLET="${CARGO_TRIPLET^^}" + cat <<-_EOF_ > "${T}/50${P}" + MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" + $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") + _EOF_ + doenvd "${T}/50${P}" + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + popd >/dev/null || die + #end native abi install + + else + local rust_target + rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" + dodir "/opt/${P}/lib/rustlib" + cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ + "${ED}/opt/${P}/lib/rustlib" || die + fi + + # BUG: installs x86_64 binary on other arches + rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die +} + +pkg_postinst() { + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + if has_version app-editors/emacs; then + elog "install app-emacs/rust-mode to get emacs support for rust." + fi + + if has_version app-editors/gvim || has_version app-editors/vim; then + elog "install app-vim/rust-vim to get vim support for rust." + fi +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust-bin/rust-bin-1.74.1-r100.ebuild b/dev-lang/rust-bin/rust-bin-1.74.1-r100.ebuild deleted file mode 100644 index 23d2616783ae..000000000000 --- a/dev-lang/rust-bin/rust-bin-1.74.1-r100.ebuild +++ /dev/null @@ -1,244 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 17 ) -LLVM_OPTIONAL="yes" - -inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal - -MY_P="rust-${PV}" -# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" -MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2023-12-07/rust-src-${PV}.tar.xz" -GENTOO_BIN_BASEURI="https://dev.gentoo.org/~sam/distfiles/${CATEGORY}/${PN}" # omit leading slash - -DESCRIPTION="Language empowering everyone to build reliable and efficient software" -HOMEPAGE="https://www.rust-lang.org/" -SRC_URI="$(rust_all_arch_uris ${MY_P}) - rust-src? ( ${MY_SRC_URI} ) -" -# Keep this separate to allow easy commenting out if not yet built -SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " -#SRC_URI+=" mips? ( -# abi_mips_o32? ( -# big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) -# !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) -# ) -# abi_mips_n64? ( -# big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) -# !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) -# ) -#)" - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" -KEYWORDS="amd64 arm arm64 ~loong ppc ppc64 ~riscv ~s390 sparc x86" -IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" - -RDEPEND=" - >=app-eselect/eselect-rust-20190311 - dev-libs/openssl - sys-apps/lsb-release - sys-devel/gcc:* - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" -BDEPEND=" - prefix? ( dev-util/patchelf ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" - -# stripping rust may break it (at least on x86_64) -# https://github.com/rust-lang/rust/issues/112286 -RESTRICT="strip" - -QA_PREBUILT=" - opt/${P}/bin/.* - opt/${P}/lib/.*.so - opt/${P}/libexec/.* - opt/${P}/lib/rustlib/.*/bin/.* - opt/${P}/lib/rustlib/.*/lib/.* -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" - -pkg_pretend() { - if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then - die "${CHOST} is not supported by upstream Rust. You must use a hard float version." - fi -} - -src_unpack() { - # sadly rust-src tarball does not have corresponding .asc file - # so do partial verification - if use verify-sig; then - for f in ${A}; do - if [[ -f ${DISTDIR}/${f}.asc ]]; then - verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" - fi - done - fi - - default_src_unpack - - mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die -} - -patchelf_for_bin() { - local filetype=$(file -b ${1}) - if [[ ${filetype} == *ELF*interpreter* ]]; then - einfo "${1}'s interpreter changed" - patchelf ${1} --set-interpreter ${2} || die - elif [[ ${filetype} == *script* ]]; then - hprefixify ${1} - fi -} - -multilib_src_install() { - if multilib_is_native_abi; then - - # start native abi install - pushd "${S}" >/dev/null || die - local analysis std - analysis="$(grep 'analysis' ./components)" - std="$(grep 'std' ./components)" - local components="rustc,cargo,${std}" - use doc && components="${components},rust-docs" - use clippy && components="${components},clippy-preview" - use rustfmt && components="${components},rustfmt-preview" - use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" - # Rust component 'rust-src' is extracted from separate archive - if use rust-src; then - einfo "Combining rust and rust-src installers" - mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die - echo rust-src >> ./components || die - components="${components},rust-src" - fi - ./install.sh \ - --components="${components}" \ - --disable-verify \ - --prefix="${ED}/opt/${P}" \ - --mandir="${ED}/opt/${P}/man" \ - --disable-ldconfig \ - || die - - if use prefix; then - local interpreter=$(patchelf --print-interpreter "${EPREFIX}/bin/bash") - ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" - find "${ED}/opt/${P}/bin" -type f -print0 | \ - while IFS= read -r -d '' filename; do - patchelf_for_bin ${filename} ${interpreter} \; || die - done - eend ${PIPESTATUS[0]} - fi - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- - local ver_i="${i}-bin-${PV}" - ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die - dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" - dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" - dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" - dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" - - # make all capital underscored variable - local CARGO_TRIPLET="$(rust_abi)" - CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" - CARGO_TRIPLET="${CARGO_TRIPLET^^}" - cat <<-_EOF_ > "${T}/50${P}" - LDPATH="${EPREFIX}/usr/lib/rust/lib-bin-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" - $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") - _EOF_ - doenvd "${T}/50${P}" - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - popd >/dev/null || die - #end native abi install - - else - local rust_target - rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" - dodir "/opt/${P}/lib/rustlib" - cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ - "${ED}/opt/${P}/lib/rustlib" || die - fi - - # BUG: installs x86_64 binary on other arches - rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die -} - -pkg_postinst() { - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - if has_version app-editors/emacs; then - elog "install app-emacs/rust-mode to get emacs support for rust." - fi - - if has_version app-editors/gvim || has_version app-editors/vim; then - elog "install app-vim/rust-vim to get vim support for rust." - fi -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust-bin/rust-bin-1.74.1-r101.ebuild b/dev-lang/rust-bin/rust-bin-1.74.1-r101.ebuild deleted file mode 100644 index 23d2616783ae..000000000000 --- a/dev-lang/rust-bin/rust-bin-1.74.1-r101.ebuild +++ /dev/null @@ -1,244 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 17 ) -LLVM_OPTIONAL="yes" - -inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal - -MY_P="rust-${PV}" -# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" -MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2023-12-07/rust-src-${PV}.tar.xz" -GENTOO_BIN_BASEURI="https://dev.gentoo.org/~sam/distfiles/${CATEGORY}/${PN}" # omit leading slash - -DESCRIPTION="Language empowering everyone to build reliable and efficient software" -HOMEPAGE="https://www.rust-lang.org/" -SRC_URI="$(rust_all_arch_uris ${MY_P}) - rust-src? ( ${MY_SRC_URI} ) -" -# Keep this separate to allow easy commenting out if not yet built -SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " -#SRC_URI+=" mips? ( -# abi_mips_o32? ( -# big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) -# !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) -# ) -# abi_mips_n64? ( -# big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) -# !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) -# ) -#)" - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" -KEYWORDS="amd64 arm arm64 ~loong ppc ppc64 ~riscv ~s390 sparc x86" -IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" - -RDEPEND=" - >=app-eselect/eselect-rust-20190311 - dev-libs/openssl - sys-apps/lsb-release - sys-devel/gcc:* - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" -BDEPEND=" - prefix? ( dev-util/patchelf ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" - -# stripping rust may break it (at least on x86_64) -# https://github.com/rust-lang/rust/issues/112286 -RESTRICT="strip" - -QA_PREBUILT=" - opt/${P}/bin/.* - opt/${P}/lib/.*.so - opt/${P}/libexec/.* - opt/${P}/lib/rustlib/.*/bin/.* - opt/${P}/lib/rustlib/.*/lib/.* -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" - -pkg_pretend() { - if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then - die "${CHOST} is not supported by upstream Rust. You must use a hard float version." - fi -} - -src_unpack() { - # sadly rust-src tarball does not have corresponding .asc file - # so do partial verification - if use verify-sig; then - for f in ${A}; do - if [[ -f ${DISTDIR}/${f}.asc ]]; then - verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" - fi - done - fi - - default_src_unpack - - mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die -} - -patchelf_for_bin() { - local filetype=$(file -b ${1}) - if [[ ${filetype} == *ELF*interpreter* ]]; then - einfo "${1}'s interpreter changed" - patchelf ${1} --set-interpreter ${2} || die - elif [[ ${filetype} == *script* ]]; then - hprefixify ${1} - fi -} - -multilib_src_install() { - if multilib_is_native_abi; then - - # start native abi install - pushd "${S}" >/dev/null || die - local analysis std - analysis="$(grep 'analysis' ./components)" - std="$(grep 'std' ./components)" - local components="rustc,cargo,${std}" - use doc && components="${components},rust-docs" - use clippy && components="${components},clippy-preview" - use rustfmt && components="${components},rustfmt-preview" - use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" - # Rust component 'rust-src' is extracted from separate archive - if use rust-src; then - einfo "Combining rust and rust-src installers" - mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die - echo rust-src >> ./components || die - components="${components},rust-src" - fi - ./install.sh \ - --components="${components}" \ - --disable-verify \ - --prefix="${ED}/opt/${P}" \ - --mandir="${ED}/opt/${P}/man" \ - --disable-ldconfig \ - || die - - if use prefix; then - local interpreter=$(patchelf --print-interpreter "${EPREFIX}/bin/bash") - ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" - find "${ED}/opt/${P}/bin" -type f -print0 | \ - while IFS= read -r -d '' filename; do - patchelf_for_bin ${filename} ${interpreter} \; || die - done - eend ${PIPESTATUS[0]} - fi - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- - local ver_i="${i}-bin-${PV}" - ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die - dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" - dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" - dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" - dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" - - # make all capital underscored variable - local CARGO_TRIPLET="$(rust_abi)" - CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" - CARGO_TRIPLET="${CARGO_TRIPLET^^}" - cat <<-_EOF_ > "${T}/50${P}" - LDPATH="${EPREFIX}/usr/lib/rust/lib-bin-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" - $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") - _EOF_ - doenvd "${T}/50${P}" - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - popd >/dev/null || die - #end native abi install - - else - local rust_target - rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" - dodir "/opt/${P}/lib/rustlib" - cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ - "${ED}/opt/${P}/lib/rustlib" || die - fi - - # BUG: installs x86_64 binary on other arches - rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die -} - -pkg_postinst() { - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - if has_version app-editors/emacs; then - elog "install app-emacs/rust-mode to get emacs support for rust." - fi - - if has_version app-editors/gvim || has_version app-editors/vim; then - elog "install app-vim/rust-vim to get vim support for rust." - fi -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust-bin/rust-bin-1.74.1-r102.ebuild b/dev-lang/rust-bin/rust-bin-1.74.1-r102.ebuild new file mode 100644 index 000000000000..e7490ef7bbbf --- /dev/null +++ b/dev-lang/rust-bin/rust-bin-1.74.1-r102.ebuild @@ -0,0 +1,243 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 17 ) +LLVM_OPTIONAL="yes" + +inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal + +MY_P="rust-${PV}" +# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" +MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2023-12-07/rust-src-${PV}.tar.xz" +GENTOO_BIN_BASEURI="https://dev.gentoo.org/~sam/distfiles/${CATEGORY}/${PN}" # omit leading slash + +DESCRIPTION="Language empowering everyone to build reliable and efficient software" +HOMEPAGE="https://www.rust-lang.org/" +SRC_URI="$(rust_all_arch_uris ${MY_P}) + rust-src? ( ${MY_SRC_URI} ) +" +# Keep this separate to allow easy commenting out if not yet built +SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " +#SRC_URI+=" mips? ( +# abi_mips_o32? ( +# big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) +# !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) +# ) +# abi_mips_n64? ( +# big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) +# !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) +# ) +#)" + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" +SLOT="${PV}" +KEYWORDS="amd64 arm arm64 ~loong ppc ppc64 ~riscv ~s390 sparc x86" +IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" + +RDEPEND=" + >=app-eselect/eselect-rust-20190311 + dev-libs/openssl + sys-apps/lsb-release + sys-devel/gcc:* + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" +BDEPEND=" + prefix? ( dev-util/patchelf ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" + +# stripping rust may break it (at least on x86_64) +# https://github.com/rust-lang/rust/issues/112286 +RESTRICT="strip" + +QA_PREBUILT=" + opt/${P}/bin/.* + opt/${P}/lib/.*.so + opt/${P}/libexec/.* + opt/${P}/lib/rustlib/.*/bin/.* + opt/${P}/lib/rustlib/.*/lib/.* +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" + +pkg_pretend() { + if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then + die "${CHOST} is not supported by upstream Rust. You must use a hard float version." + fi +} + +src_unpack() { + # sadly rust-src tarball does not have corresponding .asc file + # so do partial verification + if use verify-sig; then + for f in ${A}; do + if [[ -f ${DISTDIR}/${f}.asc ]]; then + verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" + fi + done + fi + + default_src_unpack + + mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die +} + +patchelf_for_bin() { + local filetype=$(file -b ${1}) + if [[ ${filetype} == *ELF*interpreter* ]]; then + einfo "${1}'s interpreter changed" + patchelf ${1} --set-interpreter ${2} || die + elif [[ ${filetype} == *script* ]]; then + hprefixify ${1} + fi +} + +multilib_src_install() { + if multilib_is_native_abi; then + + # start native abi install + pushd "${S}" >/dev/null || die + local analysis std + analysis="$(grep 'analysis' ./components)" + std="$(grep 'std' ./components)" + local components="rustc,cargo,${std}" + use doc && components="${components},rust-docs" + use clippy && components="${components},clippy-preview" + use rustfmt && components="${components},rustfmt-preview" + use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" + # Rust component 'rust-src' is extracted from separate archive + if use rust-src; then + einfo "Combining rust and rust-src installers" + mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die + echo rust-src >> ./components || die + components="${components},rust-src" + fi + ./install.sh \ + --components="${components}" \ + --disable-verify \ + --prefix="${ED}/opt/${P}" \ + --mandir="${ED}/opt/${P}/man" \ + --disable-ldconfig \ + || die + + if use prefix; then + local interpreter=$(patchelf --print-interpreter "${EPREFIX}/bin/bash") + ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" + find "${ED}/opt/${P}/bin" -type f -print0 | \ + while IFS= read -r -d '' filename; do + patchelf_for_bin ${filename} ${interpreter} \; || die + done + eend ${PIPESTATUS[0]} + fi + + local symlinks=( + cargo + rustc + rustdoc + rust-gdb + rust-gdbgui + rust-lldb + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- + local ver_i="${i}-bin-${PV}" + ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die + dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" + dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" + dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" + dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" + + # make all capital underscored variable + local CARGO_TRIPLET="$(rust_abi)" + CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" + CARGO_TRIPLET="${CARGO_TRIPLET^^}" + cat <<-_EOF_ > "${T}/50${P}" + MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" + $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") + _EOF_ + doenvd "${T}/50${P}" + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + popd >/dev/null || die + #end native abi install + + else + local rust_target + rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" + dodir "/opt/${P}/lib/rustlib" + cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ + "${ED}/opt/${P}/lib/rustlib" || die + fi + + # BUG: installs x86_64 binary on other arches + rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die +} + +pkg_postinst() { + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + if has_version app-editors/emacs; then + elog "install app-emacs/rust-mode to get emacs support for rust." + fi + + if has_version app-editors/gvim || has_version app-editors/vim; then + elog "install app-vim/rust-vim to get vim support for rust." + fi +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust-bin/rust-bin-1.75.0-r100.ebuild b/dev-lang/rust-bin/rust-bin-1.75.0-r100.ebuild deleted file mode 100644 index 9bb32c144c66..000000000000 --- a/dev-lang/rust-bin/rust-bin-1.75.0-r100.ebuild +++ /dev/null @@ -1,244 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 17 ) -LLVM_OPTIONAL="yes" - -inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal - -MY_P="rust-${PV}" -# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" -MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2023-12-28/rust-src-${PV}.tar.xz" -GENTOO_BIN_BASEURI="https://dev.gentoo.org/~sam/distfiles/${CATEGORY}/${PN}" # omit leading slash - -DESCRIPTION="Language empowering everyone to build reliable and efficient software" -HOMEPAGE="https://www.rust-lang.org/" -SRC_URI="$(rust_all_arch_uris ${MY_P}) - rust-src? ( ${MY_SRC_URI} ) -" -# Keep this separate to allow easy commenting out if not yet built -SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " -#SRC_URI+=" mips? ( -# abi_mips_o32? ( -# big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) -# !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) -# ) -# abi_mips_n64? ( -# big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) -# !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) -# ) -#)" - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" -KEYWORDS="amd64 arm arm64 ~loong ppc ppc64 ~riscv ~s390 sparc x86" -IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" - -RDEPEND=" - >=app-eselect/eselect-rust-20190311 - dev-libs/openssl - sys-apps/lsb-release - sys-devel/gcc:* - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" -BDEPEND=" - prefix? ( dev-util/patchelf ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" - -# stripping rust may break it (at least on x86_64) -# https://github.com/rust-lang/rust/issues/112286 -RESTRICT="strip" - -QA_PREBUILT=" - opt/${P}/bin/.* - opt/${P}/lib/.*.so - opt/${P}/libexec/.* - opt/${P}/lib/rustlib/.*/bin/.* - opt/${P}/lib/rustlib/.*/lib/.* -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" - -pkg_pretend() { - if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then - die "${CHOST} is not supported by upstream Rust. You must use a hard float version." - fi -} - -src_unpack() { - # sadly rust-src tarball does not have corresponding .asc file - # so do partial verification - if use verify-sig; then - for f in ${A}; do - if [[ -f ${DISTDIR}/${f}.asc ]]; then - verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" - fi - done - fi - - default_src_unpack - - mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die -} - -patchelf_for_bin() { - local filetype=$(file -b ${1}) - if [[ ${filetype} == *ELF*interpreter* ]]; then - einfo "${1}'s interpreter changed" - patchelf ${1} --set-interpreter ${2} || die - elif [[ ${filetype} == *script* ]]; then - hprefixify ${1} - fi -} - -multilib_src_install() { - if multilib_is_native_abi; then - - # start native abi install - pushd "${S}" >/dev/null || die - local analysis std - analysis="$(grep 'analysis' ./components)" - std="$(grep 'std' ./components)" - local components="rustc,cargo,${std}" - use doc && components="${components},rust-docs" - use clippy && components="${components},clippy-preview" - use rustfmt && components="${components},rustfmt-preview" - use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" - # Rust component 'rust-src' is extracted from separate archive - if use rust-src; then - einfo "Combining rust and rust-src installers" - mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die - echo rust-src >> ./components || die - components="${components},rust-src" - fi - ./install.sh \ - --components="${components}" \ - --disable-verify \ - --prefix="${ED}/opt/${P}" \ - --mandir="${ED}/opt/${P}/man" \ - --disable-ldconfig \ - || die - - if use prefix; then - local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) - ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" - find "${ED}/opt/${P}/bin" -type f -print0 | \ - while IFS= read -r -d '' filename; do - patchelf_for_bin ${filename} ${interpreter} \; || die - done - eend ${PIPESTATUS[0]} - fi - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- - local ver_i="${i}-bin-${PV}" - ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die - dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" - dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" - dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" - dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" - - # make all capital underscored variable - local CARGO_TRIPLET="$(rust_abi)" - CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" - CARGO_TRIPLET="${CARGO_TRIPLET^^}" - cat <<-_EOF_ > "${T}/50${P}" - LDPATH="${EPREFIX}/usr/lib/rust/lib-bin-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" - $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") - _EOF_ - doenvd "${T}/50${P}" - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - popd >/dev/null || die - #end native abi install - - else - local rust_target - rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" - dodir "/opt/${P}/lib/rustlib" - cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ - "${ED}/opt/${P}/lib/rustlib" || die - fi - - # BUG: installs x86_64 binary on other arches - rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die -} - -pkg_postinst() { - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - if has_version app-editors/emacs; then - elog "install app-emacs/rust-mode to get emacs support for rust." - fi - - if has_version app-editors/gvim || has_version app-editors/vim; then - elog "install app-vim/rust-vim to get vim support for rust." - fi -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust-bin/rust-bin-1.75.0-r101.ebuild b/dev-lang/rust-bin/rust-bin-1.75.0-r101.ebuild deleted file mode 100644 index 9bb32c144c66..000000000000 --- a/dev-lang/rust-bin/rust-bin-1.75.0-r101.ebuild +++ /dev/null @@ -1,244 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 17 ) -LLVM_OPTIONAL="yes" - -inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal - -MY_P="rust-${PV}" -# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" -MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2023-12-28/rust-src-${PV}.tar.xz" -GENTOO_BIN_BASEURI="https://dev.gentoo.org/~sam/distfiles/${CATEGORY}/${PN}" # omit leading slash - -DESCRIPTION="Language empowering everyone to build reliable and efficient software" -HOMEPAGE="https://www.rust-lang.org/" -SRC_URI="$(rust_all_arch_uris ${MY_P}) - rust-src? ( ${MY_SRC_URI} ) -" -# Keep this separate to allow easy commenting out if not yet built -SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " -#SRC_URI+=" mips? ( -# abi_mips_o32? ( -# big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) -# !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) -# ) -# abi_mips_n64? ( -# big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) -# !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) -# ) -#)" - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" -KEYWORDS="amd64 arm arm64 ~loong ppc ppc64 ~riscv ~s390 sparc x86" -IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" - -RDEPEND=" - >=app-eselect/eselect-rust-20190311 - dev-libs/openssl - sys-apps/lsb-release - sys-devel/gcc:* - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" -BDEPEND=" - prefix? ( dev-util/patchelf ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" - -# stripping rust may break it (at least on x86_64) -# https://github.com/rust-lang/rust/issues/112286 -RESTRICT="strip" - -QA_PREBUILT=" - opt/${P}/bin/.* - opt/${P}/lib/.*.so - opt/${P}/libexec/.* - opt/${P}/lib/rustlib/.*/bin/.* - opt/${P}/lib/rustlib/.*/lib/.* -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" - -pkg_pretend() { - if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then - die "${CHOST} is not supported by upstream Rust. You must use a hard float version." - fi -} - -src_unpack() { - # sadly rust-src tarball does not have corresponding .asc file - # so do partial verification - if use verify-sig; then - for f in ${A}; do - if [[ -f ${DISTDIR}/${f}.asc ]]; then - verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" - fi - done - fi - - default_src_unpack - - mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die -} - -patchelf_for_bin() { - local filetype=$(file -b ${1}) - if [[ ${filetype} == *ELF*interpreter* ]]; then - einfo "${1}'s interpreter changed" - patchelf ${1} --set-interpreter ${2} || die - elif [[ ${filetype} == *script* ]]; then - hprefixify ${1} - fi -} - -multilib_src_install() { - if multilib_is_native_abi; then - - # start native abi install - pushd "${S}" >/dev/null || die - local analysis std - analysis="$(grep 'analysis' ./components)" - std="$(grep 'std' ./components)" - local components="rustc,cargo,${std}" - use doc && components="${components},rust-docs" - use clippy && components="${components},clippy-preview" - use rustfmt && components="${components},rustfmt-preview" - use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" - # Rust component 'rust-src' is extracted from separate archive - if use rust-src; then - einfo "Combining rust and rust-src installers" - mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die - echo rust-src >> ./components || die - components="${components},rust-src" - fi - ./install.sh \ - --components="${components}" \ - --disable-verify \ - --prefix="${ED}/opt/${P}" \ - --mandir="${ED}/opt/${P}/man" \ - --disable-ldconfig \ - || die - - if use prefix; then - local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) - ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" - find "${ED}/opt/${P}/bin" -type f -print0 | \ - while IFS= read -r -d '' filename; do - patchelf_for_bin ${filename} ${interpreter} \; || die - done - eend ${PIPESTATUS[0]} - fi - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- - local ver_i="${i}-bin-${PV}" - ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die - dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" - dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" - dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" - dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" - - # make all capital underscored variable - local CARGO_TRIPLET="$(rust_abi)" - CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" - CARGO_TRIPLET="${CARGO_TRIPLET^^}" - cat <<-_EOF_ > "${T}/50${P}" - LDPATH="${EPREFIX}/usr/lib/rust/lib-bin-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" - $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") - _EOF_ - doenvd "${T}/50${P}" - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - popd >/dev/null || die - #end native abi install - - else - local rust_target - rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" - dodir "/opt/${P}/lib/rustlib" - cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ - "${ED}/opt/${P}/lib/rustlib" || die - fi - - # BUG: installs x86_64 binary on other arches - rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die -} - -pkg_postinst() { - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - if has_version app-editors/emacs; then - elog "install app-emacs/rust-mode to get emacs support for rust." - fi - - if has_version app-editors/gvim || has_version app-editors/vim; then - elog "install app-vim/rust-vim to get vim support for rust." - fi -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust-bin/rust-bin-1.75.0-r102.ebuild b/dev-lang/rust-bin/rust-bin-1.75.0-r102.ebuild new file mode 100644 index 000000000000..bb60f0c714ad --- /dev/null +++ b/dev-lang/rust-bin/rust-bin-1.75.0-r102.ebuild @@ -0,0 +1,243 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 17 ) +LLVM_OPTIONAL="yes" + +inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal + +MY_P="rust-${PV}" +# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" +MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2023-12-28/rust-src-${PV}.tar.xz" +GENTOO_BIN_BASEURI="https://dev.gentoo.org/~sam/distfiles/${CATEGORY}/${PN}" # omit leading slash + +DESCRIPTION="Language empowering everyone to build reliable and efficient software" +HOMEPAGE="https://www.rust-lang.org/" +SRC_URI="$(rust_all_arch_uris ${MY_P}) + rust-src? ( ${MY_SRC_URI} ) +" +# Keep this separate to allow easy commenting out if not yet built +SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " +#SRC_URI+=" mips? ( +# abi_mips_o32? ( +# big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) +# !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) +# ) +# abi_mips_n64? ( +# big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) +# !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) +# ) +#)" + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" +SLOT="${PV}" +KEYWORDS="amd64 arm arm64 ~loong ppc ppc64 ~riscv ~s390 sparc x86" +IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" + +RDEPEND=" + >=app-eselect/eselect-rust-20190311 + dev-libs/openssl + sys-apps/lsb-release + sys-devel/gcc:* + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" +BDEPEND=" + prefix? ( dev-util/patchelf ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" + +# stripping rust may break it (at least on x86_64) +# https://github.com/rust-lang/rust/issues/112286 +RESTRICT="strip" + +QA_PREBUILT=" + opt/${P}/bin/.* + opt/${P}/lib/.*.so + opt/${P}/libexec/.* + opt/${P}/lib/rustlib/.*/bin/.* + opt/${P}/lib/rustlib/.*/lib/.* +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" + +pkg_pretend() { + if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then + die "${CHOST} is not supported by upstream Rust. You must use a hard float version." + fi +} + +src_unpack() { + # sadly rust-src tarball does not have corresponding .asc file + # so do partial verification + if use verify-sig; then + for f in ${A}; do + if [[ -f ${DISTDIR}/${f}.asc ]]; then + verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" + fi + done + fi + + default_src_unpack + + mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die +} + +patchelf_for_bin() { + local filetype=$(file -b ${1}) + if [[ ${filetype} == *ELF*interpreter* ]]; then + einfo "${1}'s interpreter changed" + patchelf ${1} --set-interpreter ${2} || die + elif [[ ${filetype} == *script* ]]; then + hprefixify ${1} + fi +} + +multilib_src_install() { + if multilib_is_native_abi; then + + # start native abi install + pushd "${S}" >/dev/null || die + local analysis std + analysis="$(grep 'analysis' ./components)" + std="$(grep 'std' ./components)" + local components="rustc,cargo,${std}" + use doc && components="${components},rust-docs" + use clippy && components="${components},clippy-preview" + use rustfmt && components="${components},rustfmt-preview" + use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" + # Rust component 'rust-src' is extracted from separate archive + if use rust-src; then + einfo "Combining rust and rust-src installers" + mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die + echo rust-src >> ./components || die + components="${components},rust-src" + fi + ./install.sh \ + --components="${components}" \ + --disable-verify \ + --prefix="${ED}/opt/${P}" \ + --mandir="${ED}/opt/${P}/man" \ + --disable-ldconfig \ + || die + + if use prefix; then + local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) + ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" + find "${ED}/opt/${P}/bin" -type f -print0 | \ + while IFS= read -r -d '' filename; do + patchelf_for_bin ${filename} ${interpreter} \; || die + done + eend ${PIPESTATUS[0]} + fi + + local symlinks=( + cargo + rustc + rustdoc + rust-gdb + rust-gdbgui + rust-lldb + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- + local ver_i="${i}-bin-${PV}" + ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die + dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" + dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" + dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" + dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" + + # make all capital underscored variable + local CARGO_TRIPLET="$(rust_abi)" + CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" + CARGO_TRIPLET="${CARGO_TRIPLET^^}" + cat <<-_EOF_ > "${T}/50${P}" + MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" + $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") + _EOF_ + doenvd "${T}/50${P}" + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + popd >/dev/null || die + #end native abi install + + else + local rust_target + rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" + dodir "/opt/${P}/lib/rustlib" + cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ + "${ED}/opt/${P}/lib/rustlib" || die + fi + + # BUG: installs x86_64 binary on other arches + rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die +} + +pkg_postinst() { + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + if has_version app-editors/emacs; then + elog "install app-emacs/rust-mode to get emacs support for rust." + fi + + if has_version app-editors/gvim || has_version app-editors/vim; then + elog "install app-vim/rust-vim to get vim support for rust." + fi +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust-bin/rust-bin-1.76.0-r100.ebuild b/dev-lang/rust-bin/rust-bin-1.76.0-r100.ebuild deleted file mode 100644 index 1768a0889eaf..000000000000 --- a/dev-lang/rust-bin/rust-bin-1.76.0-r100.ebuild +++ /dev/null @@ -1,233 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 17 ) -LLVM_OPTIONAL="yes" - -inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal - -MY_P="rust-${PV}" -# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" -MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2024-02-08/rust-src-${PV}.tar.xz" - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" -SRC_URI="$(rust_all_arch_uris ${MY_P}) - rust-src? ( ${MY_SRC_URI} ) -" - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" -KEYWORDS="amd64 arm arm64 ~loong ppc ppc64 ~riscv ~s390 x86" -IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" - -RDEPEND=" - >=app-eselect/eselect-rust-20190311 - dev-libs/openssl - sys-apps/lsb-release - sys-devel/gcc:* - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" -BDEPEND=" - prefix? ( dev-util/patchelf ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" - -# stripping rust may break it (at least on x86_64) -# https://github.com/rust-lang/rust/issues/112286 -RESTRICT="strip" - -QA_PREBUILT=" - opt/${P}/bin/.* - opt/${P}/lib/.*.so - opt/${P}/libexec/.* - opt/${P}/lib/rustlib/.*/bin/.* - opt/${P}/lib/rustlib/.*/lib/.* -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" - -pkg_pretend() { - if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then - die "${CHOST} is not supported by upstream Rust. You must use a hard float version." - fi -} - -src_unpack() { - # sadly rust-src tarball does not have corresponding .asc file - # so do partial verification - if use verify-sig; then - for f in ${A}; do - if [[ -f ${DISTDIR}/${f}.asc ]]; then - verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" - fi - done - fi - - default_src_unpack - - mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die -} - -patchelf_for_bin() { - local filetype=$(file -b ${1}) - if [[ ${filetype} == *ELF*interpreter* ]]; then - einfo "${1}'s interpreter changed" - patchelf ${1} --set-interpreter ${2} || die - elif [[ ${filetype} == *script* ]]; then - hprefixify ${1} - fi -} - -multilib_src_install() { - if multilib_is_native_abi; then - - # start native abi install - pushd "${S}" >/dev/null || die - local analysis std - analysis="$(grep 'analysis' ./components)" - std="$(grep 'std' ./components)" - local components="rustc,cargo,rust-demangler-preview,${std}" - use doc && components="${components},rust-docs" - use clippy && components="${components},clippy-preview" - use rustfmt && components="${components},rustfmt-preview" - use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" - # Rust component 'rust-src' is extracted from separate archive - if use rust-src; then - einfo "Combining rust and rust-src installers" - mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die - echo rust-src >> ./components || die - components="${components},rust-src" - fi - ./install.sh \ - --components="${components}" \ - --disable-verify \ - --prefix="${ED}/opt/${P}" \ - --mandir="${ED}/opt/${P}/man" \ - --disable-ldconfig \ - || die - - if use prefix; then - local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) - ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" - find "${ED}/opt/${P}/bin" -type f -print0 | \ - while IFS= read -r -d '' filename; do - patchelf_for_bin ${filename} ${interpreter} \; || die - done - eend ${PIPESTATUS[0]} - fi - - local symlinks=( - cargo - rustc - rustdoc - rust-demangler - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- - local ver_i="${i}-bin-${PV}" - ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die - dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" - dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" - dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" - dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" - - # make all capital underscored variable - local CARGO_TRIPLET="$(rust_abi)" - CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" - CARGO_TRIPLET="${CARGO_TRIPLET^^}" - cat <<-_EOF_ > "${T}/50${P}" - LDPATH="${EPREFIX}/usr/lib/rust/lib-bin-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" - $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") - _EOF_ - doenvd "${T}/50${P}" - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-demangler - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - popd >/dev/null || die - #end native abi install - - else - local rust_target - rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" - dodir "/opt/${P}/lib/rustlib" - cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ - "${ED}/opt/${P}/lib/rustlib" || die - fi - - # BUG: installs x86_64 binary on other arches - rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die -} - -pkg_postinst() { - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - if has_version app-editors/emacs; then - elog "install app-emacs/rust-mode to get emacs support for rust." - fi - - if has_version app-editors/gvim || has_version app-editors/vim; then - elog "install app-vim/rust-vim to get vim support for rust." - fi -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust-bin/rust-bin-1.76.0-r101.ebuild b/dev-lang/rust-bin/rust-bin-1.76.0-r101.ebuild new file mode 100644 index 000000000000..a1a14f630402 --- /dev/null +++ b/dev-lang/rust-bin/rust-bin-1.76.0-r101.ebuild @@ -0,0 +1,232 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 17 ) +LLVM_OPTIONAL="yes" + +inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal + +MY_P="rust-${PV}" +# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" +MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2024-02-08/rust-src-${PV}.tar.xz" + +DESCRIPTION="Systems programming language from Mozilla" +HOMEPAGE="https://www.rust-lang.org/" +SRC_URI="$(rust_all_arch_uris ${MY_P}) + rust-src? ( ${MY_SRC_URI} ) +" + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" +SLOT="${PV}" +KEYWORDS="amd64 arm arm64 ~loong ppc ppc64 ~riscv ~s390 x86" +IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" + +RDEPEND=" + >=app-eselect/eselect-rust-20190311 + dev-libs/openssl + sys-apps/lsb-release + sys-devel/gcc:* + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" +BDEPEND=" + prefix? ( dev-util/patchelf ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" + +# stripping rust may break it (at least on x86_64) +# https://github.com/rust-lang/rust/issues/112286 +RESTRICT="strip" + +QA_PREBUILT=" + opt/${P}/bin/.* + opt/${P}/lib/.*.so + opt/${P}/libexec/.* + opt/${P}/lib/rustlib/.*/bin/.* + opt/${P}/lib/rustlib/.*/lib/.* +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" + +pkg_pretend() { + if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then + die "${CHOST} is not supported by upstream Rust. You must use a hard float version." + fi +} + +src_unpack() { + # sadly rust-src tarball does not have corresponding .asc file + # so do partial verification + if use verify-sig; then + for f in ${A}; do + if [[ -f ${DISTDIR}/${f}.asc ]]; then + verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" + fi + done + fi + + default_src_unpack + + mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die +} + +patchelf_for_bin() { + local filetype=$(file -b ${1}) + if [[ ${filetype} == *ELF*interpreter* ]]; then + einfo "${1}'s interpreter changed" + patchelf ${1} --set-interpreter ${2} || die + elif [[ ${filetype} == *script* ]]; then + hprefixify ${1} + fi +} + +multilib_src_install() { + if multilib_is_native_abi; then + + # start native abi install + pushd "${S}" >/dev/null || die + local analysis std + analysis="$(grep 'analysis' ./components)" + std="$(grep 'std' ./components)" + local components="rustc,cargo,rust-demangler-preview,${std}" + use doc && components="${components},rust-docs" + use clippy && components="${components},clippy-preview" + use rustfmt && components="${components},rustfmt-preview" + use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" + # Rust component 'rust-src' is extracted from separate archive + if use rust-src; then + einfo "Combining rust and rust-src installers" + mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die + echo rust-src >> ./components || die + components="${components},rust-src" + fi + ./install.sh \ + --components="${components}" \ + --disable-verify \ + --prefix="${ED}/opt/${P}" \ + --mandir="${ED}/opt/${P}/man" \ + --disable-ldconfig \ + || die + + if use prefix; then + local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) + ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" + find "${ED}/opt/${P}/bin" -type f -print0 | \ + while IFS= read -r -d '' filename; do + patchelf_for_bin ${filename} ${interpreter} \; || die + done + eend ${PIPESTATUS[0]} + fi + + local symlinks=( + cargo + rustc + rustdoc + rust-demangler + rust-gdb + rust-gdbgui + rust-lldb + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- + local ver_i="${i}-bin-${PV}" + ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die + dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" + dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" + dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" + dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" + + # make all capital underscored variable + local CARGO_TRIPLET="$(rust_abi)" + CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" + CARGO_TRIPLET="${CARGO_TRIPLET^^}" + cat <<-_EOF_ > "${T}/50${P}" + MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" + $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") + _EOF_ + doenvd "${T}/50${P}" + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-demangler + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + popd >/dev/null || die + #end native abi install + + else + local rust_target + rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" + dodir "/opt/${P}/lib/rustlib" + cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ + "${ED}/opt/${P}/lib/rustlib" || die + fi + + # BUG: installs x86_64 binary on other arches + rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die +} + +pkg_postinst() { + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + if has_version app-editors/emacs; then + elog "install app-emacs/rust-mode to get emacs support for rust." + fi + + if has_version app-editors/gvim || has_version app-editors/vim; then + elog "install app-vim/rust-vim to get vim support for rust." + fi +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust-bin/rust-bin-1.77.1-r100.ebuild b/dev-lang/rust-bin/rust-bin-1.77.1-r100.ebuild deleted file mode 100644 index 5eb6567f5cdd..000000000000 --- a/dev-lang/rust-bin/rust-bin-1.77.1-r100.ebuild +++ /dev/null @@ -1,246 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 17 ) -LLVM_OPTIONAL="yes" - -inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal - -MY_P="rust-${PV}" -# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" -MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2024-03-28/rust-src-${PV}.tar.xz" -GENTOO_BIN_BASEURI="https://dev.gentoo.org/~arthurzam/distfiles/${CATEGORY}/${PN}" # omit leading slash - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" -SRC_URI="$(rust_all_arch_uris ${MY_P}) - rust-src? ( ${MY_SRC_URI} ) -" -# Keep this separate to allow easy commenting out if not yet built -SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " -SRC_URI+=" mips? ( - abi_mips_o32? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) - ) - abi_mips_n64? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) - ) -)" - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" -KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv ~s390 sparc x86" -IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" - -RDEPEND=" - >=app-eselect/eselect-rust-20190311 - dev-libs/openssl - sys-apps/lsb-release - sys-devel/gcc:* - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" -BDEPEND=" - prefix? ( dev-util/patchelf ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" - -# stripping rust may break it (at least on x86_64) -# https://github.com/rust-lang/rust/issues/112286 -RESTRICT="strip" - -QA_PREBUILT=" - opt/${P}/bin/.* - opt/${P}/lib/.*.so - opt/${P}/libexec/.* - opt/${P}/lib/rustlib/.*/bin/.* - opt/${P}/lib/rustlib/.*/lib/.* -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" - -pkg_pretend() { - if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then - die "${CHOST} is not supported by upstream Rust. You must use a hard float version." - fi -} - -src_unpack() { - # sadly rust-src tarball does not have corresponding .asc file - # so do partial verification - if use verify-sig; then - for f in ${A}; do - if [[ -f ${DISTDIR}/${f}.asc ]]; then - verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" - fi - done - fi - - default_src_unpack - - mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die -} - -patchelf_for_bin() { - local filetype=$(file -b ${1}) - if [[ ${filetype} == *ELF*interpreter* ]]; then - einfo "${1}'s interpreter changed" - patchelf ${1} --set-interpreter ${2} || die - elif [[ ${filetype} == *script* ]]; then - hprefixify ${1} - fi -} - -multilib_src_install() { - if multilib_is_native_abi; then - - # start native abi install - pushd "${S}" >/dev/null || die - local analysis std - analysis="$(grep 'analysis' ./components)" - std="$(grep 'std' ./components)" - local components="rustc,cargo,rust-demangler-preview,${std}" - use doc && components="${components},rust-docs" - use clippy && components="${components},clippy-preview" - use rustfmt && components="${components},rustfmt-preview" - use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" - # Rust component 'rust-src' is extracted from separate archive - if use rust-src; then - einfo "Combining rust and rust-src installers" - mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die - echo rust-src >> ./components || die - components="${components},rust-src" - fi - ./install.sh \ - --components="${components}" \ - --disable-verify \ - --prefix="${ED}/opt/${P}" \ - --mandir="${ED}/opt/${P}/man" \ - --disable-ldconfig \ - || die - - if use prefix; then - local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) - ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" - find "${ED}/opt/${P}/bin" -type f -print0 | \ - while IFS= read -r -d '' filename; do - patchelf_for_bin ${filename} ${interpreter} \; || die - done - eend ${PIPESTATUS[0]} - fi - - local symlinks=( - cargo - rustc - rustdoc - rust-demangler - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- - local ver_i="${i}-bin-${PV}" - ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die - dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" - dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" - dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" - dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" - - # make all capital underscored variable - local CARGO_TRIPLET="$(rust_abi)" - CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" - CARGO_TRIPLET="${CARGO_TRIPLET^^}" - cat <<-_EOF_ > "${T}/50${P}" - LDPATH="${EPREFIX}/usr/lib/rust/lib-bin-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" - $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") - _EOF_ - doenvd "${T}/50${P}" - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-demangler - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - popd >/dev/null || die - #end native abi install - - else - local rust_target - rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" - dodir "/opt/${P}/lib/rustlib" - cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ - "${ED}/opt/${P}/lib/rustlib" || die - fi - - # BUG: installs x86_64 binary on other arches - rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die -} - -pkg_postinst() { - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - if has_version app-editors/emacs; then - elog "install app-emacs/rust-mode to get emacs support for rust." - fi - - if has_version app-editors/gvim || has_version app-editors/vim; then - elog "install app-vim/rust-vim to get vim support for rust." - fi -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust-bin/rust-bin-1.77.1-r101.ebuild b/dev-lang/rust-bin/rust-bin-1.77.1-r101.ebuild deleted file mode 100644 index 5eb6567f5cdd..000000000000 --- a/dev-lang/rust-bin/rust-bin-1.77.1-r101.ebuild +++ /dev/null @@ -1,246 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 17 ) -LLVM_OPTIONAL="yes" - -inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal - -MY_P="rust-${PV}" -# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" -MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2024-03-28/rust-src-${PV}.tar.xz" -GENTOO_BIN_BASEURI="https://dev.gentoo.org/~arthurzam/distfiles/${CATEGORY}/${PN}" # omit leading slash - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" -SRC_URI="$(rust_all_arch_uris ${MY_P}) - rust-src? ( ${MY_SRC_URI} ) -" -# Keep this separate to allow easy commenting out if not yet built -SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " -SRC_URI+=" mips? ( - abi_mips_o32? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) - ) - abi_mips_n64? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) - ) -)" - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" -KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv ~s390 sparc x86" -IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" - -RDEPEND=" - >=app-eselect/eselect-rust-20190311 - dev-libs/openssl - sys-apps/lsb-release - sys-devel/gcc:* - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" -BDEPEND=" - prefix? ( dev-util/patchelf ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" - -# stripping rust may break it (at least on x86_64) -# https://github.com/rust-lang/rust/issues/112286 -RESTRICT="strip" - -QA_PREBUILT=" - opt/${P}/bin/.* - opt/${P}/lib/.*.so - opt/${P}/libexec/.* - opt/${P}/lib/rustlib/.*/bin/.* - opt/${P}/lib/rustlib/.*/lib/.* -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" - -pkg_pretend() { - if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then - die "${CHOST} is not supported by upstream Rust. You must use a hard float version." - fi -} - -src_unpack() { - # sadly rust-src tarball does not have corresponding .asc file - # so do partial verification - if use verify-sig; then - for f in ${A}; do - if [[ -f ${DISTDIR}/${f}.asc ]]; then - verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" - fi - done - fi - - default_src_unpack - - mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die -} - -patchelf_for_bin() { - local filetype=$(file -b ${1}) - if [[ ${filetype} == *ELF*interpreter* ]]; then - einfo "${1}'s interpreter changed" - patchelf ${1} --set-interpreter ${2} || die - elif [[ ${filetype} == *script* ]]; then - hprefixify ${1} - fi -} - -multilib_src_install() { - if multilib_is_native_abi; then - - # start native abi install - pushd "${S}" >/dev/null || die - local analysis std - analysis="$(grep 'analysis' ./components)" - std="$(grep 'std' ./components)" - local components="rustc,cargo,rust-demangler-preview,${std}" - use doc && components="${components},rust-docs" - use clippy && components="${components},clippy-preview" - use rustfmt && components="${components},rustfmt-preview" - use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" - # Rust component 'rust-src' is extracted from separate archive - if use rust-src; then - einfo "Combining rust and rust-src installers" - mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die - echo rust-src >> ./components || die - components="${components},rust-src" - fi - ./install.sh \ - --components="${components}" \ - --disable-verify \ - --prefix="${ED}/opt/${P}" \ - --mandir="${ED}/opt/${P}/man" \ - --disable-ldconfig \ - || die - - if use prefix; then - local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) - ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" - find "${ED}/opt/${P}/bin" -type f -print0 | \ - while IFS= read -r -d '' filename; do - patchelf_for_bin ${filename} ${interpreter} \; || die - done - eend ${PIPESTATUS[0]} - fi - - local symlinks=( - cargo - rustc - rustdoc - rust-demangler - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- - local ver_i="${i}-bin-${PV}" - ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die - dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" - dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" - dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" - dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" - - # make all capital underscored variable - local CARGO_TRIPLET="$(rust_abi)" - CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" - CARGO_TRIPLET="${CARGO_TRIPLET^^}" - cat <<-_EOF_ > "${T}/50${P}" - LDPATH="${EPREFIX}/usr/lib/rust/lib-bin-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" - $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") - _EOF_ - doenvd "${T}/50${P}" - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-demangler - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - popd >/dev/null || die - #end native abi install - - else - local rust_target - rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" - dodir "/opt/${P}/lib/rustlib" - cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ - "${ED}/opt/${P}/lib/rustlib" || die - fi - - # BUG: installs x86_64 binary on other arches - rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die -} - -pkg_postinst() { - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - if has_version app-editors/emacs; then - elog "install app-emacs/rust-mode to get emacs support for rust." - fi - - if has_version app-editors/gvim || has_version app-editors/vim; then - elog "install app-vim/rust-vim to get vim support for rust." - fi -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust-bin/rust-bin-1.77.1-r102.ebuild b/dev-lang/rust-bin/rust-bin-1.77.1-r102.ebuild new file mode 100644 index 000000000000..701e6ea24605 --- /dev/null +++ b/dev-lang/rust-bin/rust-bin-1.77.1-r102.ebuild @@ -0,0 +1,245 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 17 ) +LLVM_OPTIONAL="yes" + +inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal + +MY_P="rust-${PV}" +# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" +MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2024-03-28/rust-src-${PV}.tar.xz" +GENTOO_BIN_BASEURI="https://dev.gentoo.org/~arthurzam/distfiles/${CATEGORY}/${PN}" # omit leading slash + +DESCRIPTION="Systems programming language from Mozilla" +HOMEPAGE="https://www.rust-lang.org/" +SRC_URI="$(rust_all_arch_uris ${MY_P}) + rust-src? ( ${MY_SRC_URI} ) +" +# Keep this separate to allow easy commenting out if not yet built +SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " +SRC_URI+=" mips? ( + abi_mips_o32? ( + big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) + !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) + ) + abi_mips_n64? ( + big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) + !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) + ) +)" + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" +SLOT="${PV}" +KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv ~s390 sparc x86" +IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" + +RDEPEND=" + >=app-eselect/eselect-rust-20190311 + dev-libs/openssl + sys-apps/lsb-release + sys-devel/gcc:* + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" +BDEPEND=" + prefix? ( dev-util/patchelf ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" + +# stripping rust may break it (at least on x86_64) +# https://github.com/rust-lang/rust/issues/112286 +RESTRICT="strip" + +QA_PREBUILT=" + opt/${P}/bin/.* + opt/${P}/lib/.*.so + opt/${P}/libexec/.* + opt/${P}/lib/rustlib/.*/bin/.* + opt/${P}/lib/rustlib/.*/lib/.* +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" + +pkg_pretend() { + if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then + die "${CHOST} is not supported by upstream Rust. You must use a hard float version." + fi +} + +src_unpack() { + # sadly rust-src tarball does not have corresponding .asc file + # so do partial verification + if use verify-sig; then + for f in ${A}; do + if [[ -f ${DISTDIR}/${f}.asc ]]; then + verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" + fi + done + fi + + default_src_unpack + + mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die +} + +patchelf_for_bin() { + local filetype=$(file -b ${1}) + if [[ ${filetype} == *ELF*interpreter* ]]; then + einfo "${1}'s interpreter changed" + patchelf ${1} --set-interpreter ${2} || die + elif [[ ${filetype} == *script* ]]; then + hprefixify ${1} + fi +} + +multilib_src_install() { + if multilib_is_native_abi; then + + # start native abi install + pushd "${S}" >/dev/null || die + local analysis std + analysis="$(grep 'analysis' ./components)" + std="$(grep 'std' ./components)" + local components="rustc,cargo,rust-demangler-preview,${std}" + use doc && components="${components},rust-docs" + use clippy && components="${components},clippy-preview" + use rustfmt && components="${components},rustfmt-preview" + use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" + # Rust component 'rust-src' is extracted from separate archive + if use rust-src; then + einfo "Combining rust and rust-src installers" + mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die + echo rust-src >> ./components || die + components="${components},rust-src" + fi + ./install.sh \ + --components="${components}" \ + --disable-verify \ + --prefix="${ED}/opt/${P}" \ + --mandir="${ED}/opt/${P}/man" \ + --disable-ldconfig \ + || die + + if use prefix; then + local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) + ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" + find "${ED}/opt/${P}/bin" -type f -print0 | \ + while IFS= read -r -d '' filename; do + patchelf_for_bin ${filename} ${interpreter} \; || die + done + eend ${PIPESTATUS[0]} + fi + + local symlinks=( + cargo + rustc + rustdoc + rust-demangler + rust-gdb + rust-gdbgui + rust-lldb + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- + local ver_i="${i}-bin-${PV}" + ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die + dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" + dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" + dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" + dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" + + # make all capital underscored variable + local CARGO_TRIPLET="$(rust_abi)" + CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" + CARGO_TRIPLET="${CARGO_TRIPLET^^}" + cat <<-_EOF_ > "${T}/50${P}" + MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" + $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") + _EOF_ + doenvd "${T}/50${P}" + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-demangler + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + popd >/dev/null || die + #end native abi install + + else + local rust_target + rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" + dodir "/opt/${P}/lib/rustlib" + cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ + "${ED}/opt/${P}/lib/rustlib" || die + fi + + # BUG: installs x86_64 binary on other arches + rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die +} + +pkg_postinst() { + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + if has_version app-editors/emacs; then + elog "install app-emacs/rust-mode to get emacs support for rust." + fi + + if has_version app-editors/gvim || has_version app-editors/vim; then + elog "install app-vim/rust-vim to get vim support for rust." + fi +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust-bin/rust-bin-1.78.0-r100.ebuild b/dev-lang/rust-bin/rust-bin-1.78.0-r100.ebuild deleted file mode 100644 index 80ef90b24dd2..000000000000 --- a/dev-lang/rust-bin/rust-bin-1.78.0-r100.ebuild +++ /dev/null @@ -1,249 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 18 ) -LLVM_OPTIONAL="yes" - -inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal - -MY_P="rust-${PV}" -# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" -MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2024-05-02/rust-src-${PV}.tar.xz" -GENTOO_BIN_BASEURI="https://dev.gentoo.org/~arthurzam/distfiles/${CATEGORY}/${PN}" # omit leading slash - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" -SRC_URI="$(rust_all_arch_uris ${MY_P}) - rust-src? ( ${MY_SRC_URI} ) -" -# Keep this separate to allow easy commenting out if not yet built -SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " -SRC_URI+=" mips? ( - abi_mips_o32? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) - ) - abi_mips_n64? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) - ) -)" -SRC_URI+=" riscv? ( - elibc_musl? ( ${GENTOO_BIN_BASEURI}/${MY_P}-riscv64gc-unknown-linux-musl.tar.xz ) -)" - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" -KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv ~s390 sparc x86" -IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" - -RDEPEND=" - >=app-eselect/eselect-rust-20190311 - dev-libs/openssl - sys-apps/lsb-release - sys-devel/gcc:* - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" -BDEPEND=" - prefix? ( dev-util/patchelf ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" - -# stripping rust may break it (at least on x86_64) -# https://github.com/rust-lang/rust/issues/112286 -RESTRICT="strip" - -QA_PREBUILT=" - opt/${P}/bin/.* - opt/${P}/lib/.*.so* - opt/${P}/libexec/.* - opt/${P}/lib/rustlib/.*/bin/.* - opt/${P}/lib/rustlib/.*/lib/.* -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" - -pkg_pretend() { - if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then - die "${CHOST} is not supported by upstream Rust. You must use a hard float version." - fi -} - -src_unpack() { - # sadly rust-src tarball does not have corresponding .asc file - # so do partial verification - if use verify-sig; then - for f in ${A}; do - if [[ -f ${DISTDIR}/${f}.asc ]]; then - verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" - fi - done - fi - - default_src_unpack - - mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die -} - -patchelf_for_bin() { - local filetype=$(file -b ${1}) - if [[ ${filetype} == *ELF*interpreter* ]]; then - einfo "${1}'s interpreter changed" - patchelf ${1} --set-interpreter ${2} || die - elif [[ ${filetype} == *script* ]]; then - hprefixify ${1} - fi -} - -multilib_src_install() { - if multilib_is_native_abi; then - - # start native abi install - pushd "${S}" >/dev/null || die - local analysis std - analysis="$(grep 'analysis' ./components)" - std="$(grep 'std' ./components)" - local components="rustc,cargo,rust-demangler-preview,${std}" - use doc && components="${components},rust-docs" - use clippy && components="${components},clippy-preview" - use rustfmt && components="${components},rustfmt-preview" - use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" - # Rust component 'rust-src' is extracted from separate archive - if use rust-src; then - einfo "Combining rust and rust-src installers" - mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die - echo rust-src >> ./components || die - components="${components},rust-src" - fi - ./install.sh \ - --components="${components}" \ - --disable-verify \ - --prefix="${ED}/opt/${P}" \ - --mandir="${ED}/opt/${P}/man" \ - --disable-ldconfig \ - || die - - if use prefix; then - local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) - ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" - find "${ED}/opt/${P}/bin" -type f -print0 | \ - while IFS= read -r -d '' filename; do - patchelf_for_bin ${filename} ${interpreter} \; || die - done - eend ${PIPESTATUS[0]} - fi - - local symlinks=( - cargo - rustc - rustdoc - rust-demangler - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- - local ver_i="${i}-bin-${PV}" - ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die - dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" - dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" - dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" - dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" - - # make all capital underscored variable - local CARGO_TRIPLET="$(rust_abi)" - CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" - CARGO_TRIPLET="${CARGO_TRIPLET^^}" - cat <<-_EOF_ > "${T}/50${P}" - LDPATH="${EPREFIX}/usr/lib/rust/lib-bin-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" - $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") - _EOF_ - doenvd "${T}/50${P}" - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-demangler - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - popd >/dev/null || die - #end native abi install - - else - local rust_target - rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" - dodir "/opt/${P}/lib/rustlib" - cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ - "${ED}/opt/${P}/lib/rustlib" || die - fi - - # BUG: installs x86_64 binary on other arches - rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die -} - -pkg_postinst() { - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - if has_version app-editors/emacs; then - elog "install app-emacs/rust-mode to get emacs support for rust." - fi - - if has_version app-editors/gvim || has_version app-editors/vim; then - elog "install app-vim/rust-vim to get vim support for rust." - fi -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust-bin/rust-bin-1.78.0-r101.ebuild b/dev-lang/rust-bin/rust-bin-1.78.0-r101.ebuild new file mode 100644 index 000000000000..28e01814d176 --- /dev/null +++ b/dev-lang/rust-bin/rust-bin-1.78.0-r101.ebuild @@ -0,0 +1,248 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 18 ) +LLVM_OPTIONAL="yes" + +inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal + +MY_P="rust-${PV}" +# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" +MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2024-05-02/rust-src-${PV}.tar.xz" +GENTOO_BIN_BASEURI="https://dev.gentoo.org/~arthurzam/distfiles/${CATEGORY}/${PN}" # omit leading slash + +DESCRIPTION="Systems programming language from Mozilla" +HOMEPAGE="https://www.rust-lang.org/" +SRC_URI="$(rust_all_arch_uris ${MY_P}) + rust-src? ( ${MY_SRC_URI} ) +" +# Keep this separate to allow easy commenting out if not yet built +SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " +SRC_URI+=" mips? ( + abi_mips_o32? ( + big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) + !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) + ) + abi_mips_n64? ( + big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) + !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) + ) +)" +SRC_URI+=" riscv? ( + elibc_musl? ( ${GENTOO_BIN_BASEURI}/${MY_P}-riscv64gc-unknown-linux-musl.tar.xz ) +)" + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" +SLOT="${PV}" +KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv ~s390 sparc x86" +IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" + +RDEPEND=" + >=app-eselect/eselect-rust-20190311 + dev-libs/openssl + sys-apps/lsb-release + sys-devel/gcc:* + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" +BDEPEND=" + prefix? ( dev-util/patchelf ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" + +# stripping rust may break it (at least on x86_64) +# https://github.com/rust-lang/rust/issues/112286 +RESTRICT="strip" + +QA_PREBUILT=" + opt/${P}/bin/.* + opt/${P}/lib/.*.so* + opt/${P}/libexec/.* + opt/${P}/lib/rustlib/.*/bin/.* + opt/${P}/lib/rustlib/.*/lib/.* +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" + +pkg_pretend() { + if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then + die "${CHOST} is not supported by upstream Rust. You must use a hard float version." + fi +} + +src_unpack() { + # sadly rust-src tarball does not have corresponding .asc file + # so do partial verification + if use verify-sig; then + for f in ${A}; do + if [[ -f ${DISTDIR}/${f}.asc ]]; then + verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" + fi + done + fi + + default_src_unpack + + mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die +} + +patchelf_for_bin() { + local filetype=$(file -b ${1}) + if [[ ${filetype} == *ELF*interpreter* ]]; then + einfo "${1}'s interpreter changed" + patchelf ${1} --set-interpreter ${2} || die + elif [[ ${filetype} == *script* ]]; then + hprefixify ${1} + fi +} + +multilib_src_install() { + if multilib_is_native_abi; then + + # start native abi install + pushd "${S}" >/dev/null || die + local analysis std + analysis="$(grep 'analysis' ./components)" + std="$(grep 'std' ./components)" + local components="rustc,cargo,rust-demangler-preview,${std}" + use doc && components="${components},rust-docs" + use clippy && components="${components},clippy-preview" + use rustfmt && components="${components},rustfmt-preview" + use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" + # Rust component 'rust-src' is extracted from separate archive + if use rust-src; then + einfo "Combining rust and rust-src installers" + mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die + echo rust-src >> ./components || die + components="${components},rust-src" + fi + ./install.sh \ + --components="${components}" \ + --disable-verify \ + --prefix="${ED}/opt/${P}" \ + --mandir="${ED}/opt/${P}/man" \ + --disable-ldconfig \ + || die + + if use prefix; then + local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) + ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" + find "${ED}/opt/${P}/bin" -type f -print0 | \ + while IFS= read -r -d '' filename; do + patchelf_for_bin ${filename} ${interpreter} \; || die + done + eend ${PIPESTATUS[0]} + fi + + local symlinks=( + cargo + rustc + rustdoc + rust-demangler + rust-gdb + rust-gdbgui + rust-lldb + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- + local ver_i="${i}-bin-${PV}" + ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die + dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" + dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" + dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" + dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" + + # make all capital underscored variable + local CARGO_TRIPLET="$(rust_abi)" + CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" + CARGO_TRIPLET="${CARGO_TRIPLET^^}" + cat <<-_EOF_ > "${T}/50${P}" + MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" + $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") + _EOF_ + doenvd "${T}/50${P}" + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-demangler + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + popd >/dev/null || die + #end native abi install + + else + local rust_target + rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" + dodir "/opt/${P}/lib/rustlib" + cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ + "${ED}/opt/${P}/lib/rustlib" || die + fi + + # BUG: installs x86_64 binary on other arches + rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die +} + +pkg_postinst() { + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + if has_version app-editors/emacs; then + elog "install app-emacs/rust-mode to get emacs support for rust." + fi + + if has_version app-editors/gvim || has_version app-editors/vim; then + elog "install app-vim/rust-vim to get vim support for rust." + fi +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust-bin/rust-bin-1.79.0-r100.ebuild b/dev-lang/rust-bin/rust-bin-1.79.0-r100.ebuild deleted file mode 100644 index 55b9d0d15962..000000000000 --- a/dev-lang/rust-bin/rust-bin-1.79.0-r100.ebuild +++ /dev/null @@ -1,249 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 18 ) -LLVM_OPTIONAL="yes" - -inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal - -MY_P="rust-${PV}" -# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" -MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2024-06-13/rust-src-${PV}.tar.xz" -GENTOO_BIN_BASEURI="https://dev.gentoo.org/~arthurzam/distfiles/${CATEGORY}/${PN}" # omit leading slash - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" -SRC_URI="$(rust_all_arch_uris ${MY_P}) - rust-src? ( ${MY_SRC_URI} ) -" -# Keep this separate to allow easy commenting out if not yet built -SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " -SRC_URI+=" mips? ( - abi_mips_o32? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) - ) - abi_mips_n64? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) - ) -)" -SRC_URI+=" riscv? ( - elibc_musl? ( ${GENTOO_BIN_BASEURI}/${MY_P}-riscv64gc-unknown-linux-musl.tar.xz ) -)" - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" -KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv ~s390 sparc x86" -IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" - -RDEPEND=" - >=app-eselect/eselect-rust-20190311 - dev-libs/openssl - sys-apps/lsb-release - sys-devel/gcc:* - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" -BDEPEND=" - prefix? ( dev-util/patchelf ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" - -# stripping rust may break it (at least on x86_64) -# https://github.com/rust-lang/rust/issues/112286 -RESTRICT="strip" - -QA_PREBUILT=" - opt/${P}/bin/.* - opt/${P}/lib/.*.so* - opt/${P}/libexec/.* - opt/${P}/lib/rustlib/.*/bin/.* - opt/${P}/lib/rustlib/.*/lib/.* -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" - -pkg_pretend() { - if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then - die "${CHOST} is not supported by upstream Rust. You must use a hard float version." - fi -} - -src_unpack() { - # sadly rust-src tarball does not have corresponding .asc file - # so do partial verification - if use verify-sig; then - for f in ${A}; do - if [[ -f ${DISTDIR}/${f}.asc ]]; then - verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" - fi - done - fi - - default_src_unpack - - mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die -} - -patchelf_for_bin() { - local filetype=$(file -b ${1}) - if [[ ${filetype} == *ELF*interpreter* ]]; then - einfo "${1}'s interpreter changed" - patchelf ${1} --set-interpreter ${2} || die - elif [[ ${filetype} == *script* ]]; then - hprefixify ${1} - fi -} - -multilib_src_install() { - if multilib_is_native_abi; then - - # start native abi install - pushd "${S}" >/dev/null || die - local analysis std - analysis="$(grep 'analysis' ./components)" - std="$(grep 'std' ./components)" - local components="rustc,cargo,rust-demangler-preview,${std}" - use doc && components="${components},rust-docs" - use clippy && components="${components},clippy-preview" - use rustfmt && components="${components},rustfmt-preview" - use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" - # Rust component 'rust-src' is extracted from separate archive - if use rust-src; then - einfo "Combining rust and rust-src installers" - mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die - echo rust-src >> ./components || die - components="${components},rust-src" - fi - ./install.sh \ - --components="${components}" \ - --disable-verify \ - --prefix="${ED}/opt/${P}" \ - --mandir="${ED}/opt/${P}/man" \ - --disable-ldconfig \ - || die - - if use prefix; then - local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) - ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" - find "${ED}/opt/${P}/bin" -type f -print0 | \ - while IFS= read -r -d '' filename; do - patchelf_for_bin ${filename} ${interpreter} \; || die - done - eend ${PIPESTATUS[0]} - fi - - local symlinks=( - cargo - rustc - rustdoc - rust-demangler - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- - local ver_i="${i}-bin-${PV}" - ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die - dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" - dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" - dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" - dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" - - # make all capital underscored variable - local CARGO_TRIPLET="$(rust_abi)" - CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" - CARGO_TRIPLET="${CARGO_TRIPLET^^}" - cat <<-_EOF_ > "${T}/50${P}" - LDPATH="${EPREFIX}/usr/lib/rust/lib-bin-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" - $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") - _EOF_ - doenvd "${T}/50${P}" - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-demangler - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - popd >/dev/null || die - #end native abi install - - else - local rust_target - rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" - dodir "/opt/${P}/lib/rustlib" - cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ - "${ED}/opt/${P}/lib/rustlib" || die - fi - - # BUG: installs x86_64 binary on other arches - rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die -} - -pkg_postinst() { - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - if has_version app-editors/emacs; then - elog "install app-emacs/rust-mode to get emacs support for rust." - fi - - if has_version app-editors/gvim || has_version app-editors/vim; then - elog "install app-vim/rust-vim to get vim support for rust." - fi -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust-bin/rust-bin-1.79.0-r101.ebuild b/dev-lang/rust-bin/rust-bin-1.79.0-r101.ebuild deleted file mode 100644 index 55b9d0d15962..000000000000 --- a/dev-lang/rust-bin/rust-bin-1.79.0-r101.ebuild +++ /dev/null @@ -1,249 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 18 ) -LLVM_OPTIONAL="yes" - -inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal - -MY_P="rust-${PV}" -# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" -MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2024-06-13/rust-src-${PV}.tar.xz" -GENTOO_BIN_BASEURI="https://dev.gentoo.org/~arthurzam/distfiles/${CATEGORY}/${PN}" # omit leading slash - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" -SRC_URI="$(rust_all_arch_uris ${MY_P}) - rust-src? ( ${MY_SRC_URI} ) -" -# Keep this separate to allow easy commenting out if not yet built -SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " -SRC_URI+=" mips? ( - abi_mips_o32? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) - ) - abi_mips_n64? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) - ) -)" -SRC_URI+=" riscv? ( - elibc_musl? ( ${GENTOO_BIN_BASEURI}/${MY_P}-riscv64gc-unknown-linux-musl.tar.xz ) -)" - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" -KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv ~s390 sparc x86" -IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" - -RDEPEND=" - >=app-eselect/eselect-rust-20190311 - dev-libs/openssl - sys-apps/lsb-release - sys-devel/gcc:* - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" -BDEPEND=" - prefix? ( dev-util/patchelf ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" - -# stripping rust may break it (at least on x86_64) -# https://github.com/rust-lang/rust/issues/112286 -RESTRICT="strip" - -QA_PREBUILT=" - opt/${P}/bin/.* - opt/${P}/lib/.*.so* - opt/${P}/libexec/.* - opt/${P}/lib/rustlib/.*/bin/.* - opt/${P}/lib/rustlib/.*/lib/.* -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" - -pkg_pretend() { - if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then - die "${CHOST} is not supported by upstream Rust. You must use a hard float version." - fi -} - -src_unpack() { - # sadly rust-src tarball does not have corresponding .asc file - # so do partial verification - if use verify-sig; then - for f in ${A}; do - if [[ -f ${DISTDIR}/${f}.asc ]]; then - verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" - fi - done - fi - - default_src_unpack - - mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die -} - -patchelf_for_bin() { - local filetype=$(file -b ${1}) - if [[ ${filetype} == *ELF*interpreter* ]]; then - einfo "${1}'s interpreter changed" - patchelf ${1} --set-interpreter ${2} || die - elif [[ ${filetype} == *script* ]]; then - hprefixify ${1} - fi -} - -multilib_src_install() { - if multilib_is_native_abi; then - - # start native abi install - pushd "${S}" >/dev/null || die - local analysis std - analysis="$(grep 'analysis' ./components)" - std="$(grep 'std' ./components)" - local components="rustc,cargo,rust-demangler-preview,${std}" - use doc && components="${components},rust-docs" - use clippy && components="${components},clippy-preview" - use rustfmt && components="${components},rustfmt-preview" - use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" - # Rust component 'rust-src' is extracted from separate archive - if use rust-src; then - einfo "Combining rust and rust-src installers" - mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die - echo rust-src >> ./components || die - components="${components},rust-src" - fi - ./install.sh \ - --components="${components}" \ - --disable-verify \ - --prefix="${ED}/opt/${P}" \ - --mandir="${ED}/opt/${P}/man" \ - --disable-ldconfig \ - || die - - if use prefix; then - local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) - ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" - find "${ED}/opt/${P}/bin" -type f -print0 | \ - while IFS= read -r -d '' filename; do - patchelf_for_bin ${filename} ${interpreter} \; || die - done - eend ${PIPESTATUS[0]} - fi - - local symlinks=( - cargo - rustc - rustdoc - rust-demangler - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- - local ver_i="${i}-bin-${PV}" - ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die - dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" - dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" - dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" - dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" - - # make all capital underscored variable - local CARGO_TRIPLET="$(rust_abi)" - CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" - CARGO_TRIPLET="${CARGO_TRIPLET^^}" - cat <<-_EOF_ > "${T}/50${P}" - LDPATH="${EPREFIX}/usr/lib/rust/lib-bin-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" - $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") - _EOF_ - doenvd "${T}/50${P}" - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-demangler - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - popd >/dev/null || die - #end native abi install - - else - local rust_target - rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" - dodir "/opt/${P}/lib/rustlib" - cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ - "${ED}/opt/${P}/lib/rustlib" || die - fi - - # BUG: installs x86_64 binary on other arches - rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die -} - -pkg_postinst() { - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - if has_version app-editors/emacs; then - elog "install app-emacs/rust-mode to get emacs support for rust." - fi - - if has_version app-editors/gvim || has_version app-editors/vim; then - elog "install app-vim/rust-vim to get vim support for rust." - fi -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust-bin/rust-bin-1.79.0-r102.ebuild b/dev-lang/rust-bin/rust-bin-1.79.0-r102.ebuild new file mode 100644 index 000000000000..069025b78ef4 --- /dev/null +++ b/dev-lang/rust-bin/rust-bin-1.79.0-r102.ebuild @@ -0,0 +1,248 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 18 ) +LLVM_OPTIONAL="yes" + +inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal + +MY_P="rust-${PV}" +# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" +MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2024-06-13/rust-src-${PV}.tar.xz" +GENTOO_BIN_BASEURI="https://dev.gentoo.org/~arthurzam/distfiles/${CATEGORY}/${PN}" # omit leading slash + +DESCRIPTION="Systems programming language from Mozilla" +HOMEPAGE="https://www.rust-lang.org/" +SRC_URI="$(rust_all_arch_uris ${MY_P}) + rust-src? ( ${MY_SRC_URI} ) +" +# Keep this separate to allow easy commenting out if not yet built +SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " +SRC_URI+=" mips? ( + abi_mips_o32? ( + big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) + !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) + ) + abi_mips_n64? ( + big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) + !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) + ) +)" +SRC_URI+=" riscv? ( + elibc_musl? ( ${GENTOO_BIN_BASEURI}/${MY_P}-riscv64gc-unknown-linux-musl.tar.xz ) +)" + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" +SLOT="${PV}" +KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv ~s390 sparc x86" +IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" + +RDEPEND=" + >=app-eselect/eselect-rust-20190311 + dev-libs/openssl + sys-apps/lsb-release + sys-devel/gcc:* + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" +BDEPEND=" + prefix? ( dev-util/patchelf ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" + +# stripping rust may break it (at least on x86_64) +# https://github.com/rust-lang/rust/issues/112286 +RESTRICT="strip" + +QA_PREBUILT=" + opt/${P}/bin/.* + opt/${P}/lib/.*.so* + opt/${P}/libexec/.* + opt/${P}/lib/rustlib/.*/bin/.* + opt/${P}/lib/rustlib/.*/lib/.* +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" + +pkg_pretend() { + if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then + die "${CHOST} is not supported by upstream Rust. You must use a hard float version." + fi +} + +src_unpack() { + # sadly rust-src tarball does not have corresponding .asc file + # so do partial verification + if use verify-sig; then + for f in ${A}; do + if [[ -f ${DISTDIR}/${f}.asc ]]; then + verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" + fi + done + fi + + default_src_unpack + + mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die +} + +patchelf_for_bin() { + local filetype=$(file -b ${1}) + if [[ ${filetype} == *ELF*interpreter* ]]; then + einfo "${1}'s interpreter changed" + patchelf ${1} --set-interpreter ${2} || die + elif [[ ${filetype} == *script* ]]; then + hprefixify ${1} + fi +} + +multilib_src_install() { + if multilib_is_native_abi; then + + # start native abi install + pushd "${S}" >/dev/null || die + local analysis std + analysis="$(grep 'analysis' ./components)" + std="$(grep 'std' ./components)" + local components="rustc,cargo,rust-demangler-preview,${std}" + use doc && components="${components},rust-docs" + use clippy && components="${components},clippy-preview" + use rustfmt && components="${components},rustfmt-preview" + use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" + # Rust component 'rust-src' is extracted from separate archive + if use rust-src; then + einfo "Combining rust and rust-src installers" + mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die + echo rust-src >> ./components || die + components="${components},rust-src" + fi + ./install.sh \ + --components="${components}" \ + --disable-verify \ + --prefix="${ED}/opt/${P}" \ + --mandir="${ED}/opt/${P}/man" \ + --disable-ldconfig \ + || die + + if use prefix; then + local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) + ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" + find "${ED}/opt/${P}/bin" -type f -print0 | \ + while IFS= read -r -d '' filename; do + patchelf_for_bin ${filename} ${interpreter} \; || die + done + eend ${PIPESTATUS[0]} + fi + + local symlinks=( + cargo + rustc + rustdoc + rust-demangler + rust-gdb + rust-gdbgui + rust-lldb + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- + local ver_i="${i}-bin-${PV}" + ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die + dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" + dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" + dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" + dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" + + # make all capital underscored variable + local CARGO_TRIPLET="$(rust_abi)" + CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" + CARGO_TRIPLET="${CARGO_TRIPLET^^}" + cat <<-_EOF_ > "${T}/50${P}" + MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" + $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") + _EOF_ + doenvd "${T}/50${P}" + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-demangler + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + popd >/dev/null || die + #end native abi install + + else + local rust_target + rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" + dodir "/opt/${P}/lib/rustlib" + cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ + "${ED}/opt/${P}/lib/rustlib" || die + fi + + # BUG: installs x86_64 binary on other arches + rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die +} + +pkg_postinst() { + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + if has_version app-editors/emacs; then + elog "install app-emacs/rust-mode to get emacs support for rust." + fi + + if has_version app-editors/gvim || has_version app-editors/vim; then + elog "install app-vim/rust-vim to get vim support for rust." + fi +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust-bin/rust-bin-1.80.1-r100.ebuild b/dev-lang/rust-bin/rust-bin-1.80.1-r100.ebuild deleted file mode 100644 index 8b3aab679bda..000000000000 --- a/dev-lang/rust-bin/rust-bin-1.80.1-r100.ebuild +++ /dev/null @@ -1,253 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 18 ) -LLVM_OPTIONAL="yes" - -inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal - -MY_P="rust-${PV}" -# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" -MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2024-08-08/rust-src-${PV}.tar.xz" -GENTOO_BIN_BASEURI="https://dev.gentoo.org/~arthurzam/distfiles/${CATEGORY}/${PN}" # omit leading slash - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" -SRC_URI="$(rust_all_arch_uris ${MY_P}) - rust-src? ( ${MY_SRC_URI} ) -" -# Keep this separate to allow easy commenting out if not yet built -SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " -SRC_URI+=" mips? ( - abi_mips_o32? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) - ) - abi_mips_n64? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) - ) -)" -SRC_URI+=" riscv? ( - elibc_musl? ( ${GENTOO_BIN_BASEURI}/${MY_P}-riscv64gc-unknown-linux-musl.tar.xz ) -)" -SRC_URI+=" ppc64? ( elibc_musl? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64-unknown-linux-musl.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64le-unknown-linux-musl.tar.xz ) -) )" - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" -KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv ~s390 sparc x86" -IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" - -RDEPEND=" - >=app-eselect/eselect-rust-20190311 - dev-libs/openssl - sys-apps/lsb-release - sys-devel/gcc:* - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" -BDEPEND=" - prefix? ( dev-util/patchelf ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" - -# stripping rust may break it (at least on x86_64) -# https://github.com/rust-lang/rust/issues/112286 -RESTRICT="strip" - -QA_PREBUILT=" - opt/${P}/bin/.* - opt/${P}/lib/.*.so* - opt/${P}/libexec/.* - opt/${P}/lib/rustlib/.*/bin/.* - opt/${P}/lib/rustlib/.*/lib/.* -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" - -pkg_pretend() { - if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then - die "${CHOST} is not supported by upstream Rust. You must use a hard float version." - fi -} - -src_unpack() { - # sadly rust-src tarball does not have corresponding .asc file - # so do partial verification - if use verify-sig; then - for f in ${A}; do - if [[ -f ${DISTDIR}/${f}.asc ]]; then - verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" - fi - done - fi - - default_src_unpack - - mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die -} - -patchelf_for_bin() { - local filetype=$(file -b ${1}) - if [[ ${filetype} == *ELF*interpreter* ]]; then - einfo "${1}'s interpreter changed" - patchelf ${1} --set-interpreter ${2} || die - elif [[ ${filetype} == *script* ]]; then - hprefixify ${1} - fi -} - -multilib_src_install() { - if multilib_is_native_abi; then - - # start native abi install - pushd "${S}" >/dev/null || die - local analysis std - analysis="$(grep 'analysis' ./components)" - std="$(grep 'std' ./components)" - local components="rustc,cargo,rust-demangler-preview,${std}" - use doc && components="${components},rust-docs" - use clippy && components="${components},clippy-preview" - use rustfmt && components="${components},rustfmt-preview" - use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" - # Rust component 'rust-src' is extracted from separate archive - if use rust-src; then - einfo "Combining rust and rust-src installers" - mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die - echo rust-src >> ./components || die - components="${components},rust-src" - fi - ./install.sh \ - --components="${components}" \ - --disable-verify \ - --prefix="${ED}/opt/${P}" \ - --mandir="${ED}/opt/${P}/man" \ - --disable-ldconfig \ - || die - - if use prefix; then - local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) - ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" - find "${ED}/opt/${P}/bin" -type f -print0 | \ - while IFS= read -r -d '' filename; do - patchelf_for_bin ${filename} ${interpreter} \; || die - done - eend ${PIPESTATUS[0]} - fi - - local symlinks=( - cargo - rustc - rustdoc - rust-demangler - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- - local ver_i="${i}-bin-${PV}" - ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die - dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" - dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" - dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" - dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" - - # make all capital underscored variable - local CARGO_TRIPLET="$(rust_abi)" - CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" - CARGO_TRIPLET="${CARGO_TRIPLET^^}" - cat <<-_EOF_ > "${T}/50${P}" - LDPATH="${EPREFIX}/usr/lib/rust/lib-bin-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" - $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") - _EOF_ - doenvd "${T}/50${P}" - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-demangler - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - popd >/dev/null || die - #end native abi install - - else - local rust_target - rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" - dodir "/opt/${P}/lib/rustlib" - cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ - "${ED}/opt/${P}/lib/rustlib" || die - fi - - # BUG: installs x86_64 binary on other arches - rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die -} - -pkg_postinst() { - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - if has_version app-editors/emacs; then - elog "install app-emacs/rust-mode to get emacs support for rust." - fi - - if has_version app-editors/gvim || has_version app-editors/vim; then - elog "install app-vim/rust-vim to get vim support for rust." - fi -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust-bin/rust-bin-1.80.1-r101.ebuild b/dev-lang/rust-bin/rust-bin-1.80.1-r101.ebuild deleted file mode 100644 index 8b3aab679bda..000000000000 --- a/dev-lang/rust-bin/rust-bin-1.80.1-r101.ebuild +++ /dev/null @@ -1,253 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 18 ) -LLVM_OPTIONAL="yes" - -inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal - -MY_P="rust-${PV}" -# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" -MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2024-08-08/rust-src-${PV}.tar.xz" -GENTOO_BIN_BASEURI="https://dev.gentoo.org/~arthurzam/distfiles/${CATEGORY}/${PN}" # omit leading slash - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" -SRC_URI="$(rust_all_arch_uris ${MY_P}) - rust-src? ( ${MY_SRC_URI} ) -" -# Keep this separate to allow easy commenting out if not yet built -SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " -SRC_URI+=" mips? ( - abi_mips_o32? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) - ) - abi_mips_n64? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) - ) -)" -SRC_URI+=" riscv? ( - elibc_musl? ( ${GENTOO_BIN_BASEURI}/${MY_P}-riscv64gc-unknown-linux-musl.tar.xz ) -)" -SRC_URI+=" ppc64? ( elibc_musl? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64-unknown-linux-musl.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64le-unknown-linux-musl.tar.xz ) -) )" - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" -KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv ~s390 sparc x86" -IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" - -RDEPEND=" - >=app-eselect/eselect-rust-20190311 - dev-libs/openssl - sys-apps/lsb-release - sys-devel/gcc:* - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" -BDEPEND=" - prefix? ( dev-util/patchelf ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" - -# stripping rust may break it (at least on x86_64) -# https://github.com/rust-lang/rust/issues/112286 -RESTRICT="strip" - -QA_PREBUILT=" - opt/${P}/bin/.* - opt/${P}/lib/.*.so* - opt/${P}/libexec/.* - opt/${P}/lib/rustlib/.*/bin/.* - opt/${P}/lib/rustlib/.*/lib/.* -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" - -pkg_pretend() { - if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then - die "${CHOST} is not supported by upstream Rust. You must use a hard float version." - fi -} - -src_unpack() { - # sadly rust-src tarball does not have corresponding .asc file - # so do partial verification - if use verify-sig; then - for f in ${A}; do - if [[ -f ${DISTDIR}/${f}.asc ]]; then - verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" - fi - done - fi - - default_src_unpack - - mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die -} - -patchelf_for_bin() { - local filetype=$(file -b ${1}) - if [[ ${filetype} == *ELF*interpreter* ]]; then - einfo "${1}'s interpreter changed" - patchelf ${1} --set-interpreter ${2} || die - elif [[ ${filetype} == *script* ]]; then - hprefixify ${1} - fi -} - -multilib_src_install() { - if multilib_is_native_abi; then - - # start native abi install - pushd "${S}" >/dev/null || die - local analysis std - analysis="$(grep 'analysis' ./components)" - std="$(grep 'std' ./components)" - local components="rustc,cargo,rust-demangler-preview,${std}" - use doc && components="${components},rust-docs" - use clippy && components="${components},clippy-preview" - use rustfmt && components="${components},rustfmt-preview" - use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" - # Rust component 'rust-src' is extracted from separate archive - if use rust-src; then - einfo "Combining rust and rust-src installers" - mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die - echo rust-src >> ./components || die - components="${components},rust-src" - fi - ./install.sh \ - --components="${components}" \ - --disable-verify \ - --prefix="${ED}/opt/${P}" \ - --mandir="${ED}/opt/${P}/man" \ - --disable-ldconfig \ - || die - - if use prefix; then - local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) - ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" - find "${ED}/opt/${P}/bin" -type f -print0 | \ - while IFS= read -r -d '' filename; do - patchelf_for_bin ${filename} ${interpreter} \; || die - done - eend ${PIPESTATUS[0]} - fi - - local symlinks=( - cargo - rustc - rustdoc - rust-demangler - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- - local ver_i="${i}-bin-${PV}" - ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die - dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" - dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" - dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" - dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" - - # make all capital underscored variable - local CARGO_TRIPLET="$(rust_abi)" - CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" - CARGO_TRIPLET="${CARGO_TRIPLET^^}" - cat <<-_EOF_ > "${T}/50${P}" - LDPATH="${EPREFIX}/usr/lib/rust/lib-bin-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" - $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") - _EOF_ - doenvd "${T}/50${P}" - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-demangler - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - popd >/dev/null || die - #end native abi install - - else - local rust_target - rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" - dodir "/opt/${P}/lib/rustlib" - cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ - "${ED}/opt/${P}/lib/rustlib" || die - fi - - # BUG: installs x86_64 binary on other arches - rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die -} - -pkg_postinst() { - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - if has_version app-editors/emacs; then - elog "install app-emacs/rust-mode to get emacs support for rust." - fi - - if has_version app-editors/gvim || has_version app-editors/vim; then - elog "install app-vim/rust-vim to get vim support for rust." - fi -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust-bin/rust-bin-1.80.1-r102.ebuild b/dev-lang/rust-bin/rust-bin-1.80.1-r102.ebuild new file mode 100644 index 000000000000..327beab66968 --- /dev/null +++ b/dev-lang/rust-bin/rust-bin-1.80.1-r102.ebuild @@ -0,0 +1,252 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 18 ) +LLVM_OPTIONAL="yes" + +inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal + +MY_P="rust-${PV}" +# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" +MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2024-08-08/rust-src-${PV}.tar.xz" +GENTOO_BIN_BASEURI="https://dev.gentoo.org/~arthurzam/distfiles/${CATEGORY}/${PN}" # omit leading slash + +DESCRIPTION="Systems programming language from Mozilla" +HOMEPAGE="https://www.rust-lang.org/" +SRC_URI="$(rust_all_arch_uris ${MY_P}) + rust-src? ( ${MY_SRC_URI} ) +" +# Keep this separate to allow easy commenting out if not yet built +SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " +SRC_URI+=" mips? ( + abi_mips_o32? ( + big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) + !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) + ) + abi_mips_n64? ( + big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) + !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) + ) +)" +SRC_URI+=" riscv? ( + elibc_musl? ( ${GENTOO_BIN_BASEURI}/${MY_P}-riscv64gc-unknown-linux-musl.tar.xz ) +)" +SRC_URI+=" ppc64? ( elibc_musl? ( + big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64-unknown-linux-musl.tar.xz ) + !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64le-unknown-linux-musl.tar.xz ) +) )" + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" +SLOT="${PV}" +KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv ~s390 sparc x86" +IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" + +RDEPEND=" + >=app-eselect/eselect-rust-20190311 + dev-libs/openssl + sys-apps/lsb-release + sys-devel/gcc:* + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" +BDEPEND=" + prefix? ( dev-util/patchelf ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" + +# stripping rust may break it (at least on x86_64) +# https://github.com/rust-lang/rust/issues/112286 +RESTRICT="strip" + +QA_PREBUILT=" + opt/${P}/bin/.* + opt/${P}/lib/.*.so* + opt/${P}/libexec/.* + opt/${P}/lib/rustlib/.*/bin/.* + opt/${P}/lib/rustlib/.*/lib/.* +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" + +pkg_pretend() { + if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then + die "${CHOST} is not supported by upstream Rust. You must use a hard float version." + fi +} + +src_unpack() { + # sadly rust-src tarball does not have corresponding .asc file + # so do partial verification + if use verify-sig; then + for f in ${A}; do + if [[ -f ${DISTDIR}/${f}.asc ]]; then + verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" + fi + done + fi + + default_src_unpack + + mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die +} + +patchelf_for_bin() { + local filetype=$(file -b ${1}) + if [[ ${filetype} == *ELF*interpreter* ]]; then + einfo "${1}'s interpreter changed" + patchelf ${1} --set-interpreter ${2} || die + elif [[ ${filetype} == *script* ]]; then + hprefixify ${1} + fi +} + +multilib_src_install() { + if multilib_is_native_abi; then + + # start native abi install + pushd "${S}" >/dev/null || die + local analysis std + analysis="$(grep 'analysis' ./components)" + std="$(grep 'std' ./components)" + local components="rustc,cargo,rust-demangler-preview,${std}" + use doc && components="${components},rust-docs" + use clippy && components="${components},clippy-preview" + use rustfmt && components="${components},rustfmt-preview" + use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" + # Rust component 'rust-src' is extracted from separate archive + if use rust-src; then + einfo "Combining rust and rust-src installers" + mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die + echo rust-src >> ./components || die + components="${components},rust-src" + fi + ./install.sh \ + --components="${components}" \ + --disable-verify \ + --prefix="${ED}/opt/${P}" \ + --mandir="${ED}/opt/${P}/man" \ + --disable-ldconfig \ + || die + + if use prefix; then + local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) + ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" + find "${ED}/opt/${P}/bin" -type f -print0 | \ + while IFS= read -r -d '' filename; do + patchelf_for_bin ${filename} ${interpreter} \; || die + done + eend ${PIPESTATUS[0]} + fi + + local symlinks=( + cargo + rustc + rustdoc + rust-demangler + rust-gdb + rust-gdbgui + rust-lldb + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- + local ver_i="${i}-bin-${PV}" + ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die + dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" + dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" + dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" + dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" + + # make all capital underscored variable + local CARGO_TRIPLET="$(rust_abi)" + CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" + CARGO_TRIPLET="${CARGO_TRIPLET^^}" + cat <<-_EOF_ > "${T}/50${P}" + MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" + $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") + _EOF_ + doenvd "${T}/50${P}" + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-demangler + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + popd >/dev/null || die + #end native abi install + + else + local rust_target + rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" + dodir "/opt/${P}/lib/rustlib" + cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ + "${ED}/opt/${P}/lib/rustlib" || die + fi + + # BUG: installs x86_64 binary on other arches + rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die +} + +pkg_postinst() { + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + if has_version app-editors/emacs; then + elog "install app-emacs/rust-mode to get emacs support for rust." + fi + + if has_version app-editors/gvim || has_version app-editors/vim; then + elog "install app-vim/rust-vim to get vim support for rust." + fi +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust-bin/rust-bin-1.81.0-r100.ebuild b/dev-lang/rust-bin/rust-bin-1.81.0-r100.ebuild deleted file mode 100644 index aabb1ed9c384..000000000000 --- a/dev-lang/rust-bin/rust-bin-1.81.0-r100.ebuild +++ /dev/null @@ -1,251 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 18 ) -LLVM_OPTIONAL="yes" - -inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal optfeature - -MY_P="rust-${PV}" -# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" -MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2024-09-05/rust-src-${PV}.tar.xz" -GENTOO_BIN_BASEURI="https://dev.gentoo.org/~arthurzam/distfiles/${CATEGORY}/${PN}" # omit leading slash - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" -SRC_URI="$(rust_all_arch_uris ${MY_P}) - rust-src? ( ${MY_SRC_URI} ) -" -# Keep this separate to allow easy commenting out if not yet built -SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " -SRC_URI+=" mips? ( - abi_mips_o32? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) - ) - abi_mips_n64? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) - ) -)" -SRC_URI+=" riscv? ( - elibc_musl? ( ${GENTOO_BIN_BASEURI}/${MY_P}-riscv64gc-unknown-linux-musl.tar.xz ) -)" -SRC_URI+=" ppc64? ( elibc_musl? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64-unknown-linux-musl.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64le-unknown-linux-musl.tar.xz ) -) )" - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" -KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv ~s390 sparc x86" -IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" - -RDEPEND=" - >=app-eselect/eselect-rust-20190311 - dev-libs/openssl - sys-apps/lsb-release - sys-devel/gcc:* - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" -BDEPEND=" - prefix? ( dev-util/patchelf ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" - -# stripping rust may break it (at least on x86_64) -# https://github.com/rust-lang/rust/issues/112286 -RESTRICT="strip" - -QA_PREBUILT=" - opt/${P}/bin/.* - opt/${P}/lib/.*.so* - opt/${P}/libexec/.* - opt/${P}/lib/rustlib/.*/bin/.* - opt/${P}/lib/rustlib/.*/lib/.* -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" - -pkg_pretend() { - if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then - die "${CHOST} is not supported by upstream Rust. You must use a hard float version." - fi -} - -src_unpack() { - # sadly rust-src tarball does not have corresponding .asc file - # so do partial verification - if use verify-sig; then - for f in ${A}; do - if [[ -f ${DISTDIR}/${f}.asc ]]; then - verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" - fi - done - fi - - default_src_unpack - - mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die -} - -patchelf_for_bin() { - local filetype=$(file -b ${1}) - if [[ ${filetype} == *ELF*interpreter* ]]; then - einfo "${1}'s interpreter changed" - patchelf ${1} --set-interpreter ${2} || die - elif [[ ${filetype} == *script* ]]; then - hprefixify ${1} - fi -} - -multilib_src_install() { - if multilib_is_native_abi; then - - # start native abi install - pushd "${S}" >/dev/null || die - local analysis std - analysis="$(grep 'analysis' ./components)" - std="$(grep 'std' ./components)" - local components="rustc,cargo,${std}" - use doc && components="${components},rust-docs" - use clippy && components="${components},clippy-preview" - use rustfmt && components="${components},rustfmt-preview" - use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" - # Rust component 'rust-src' is extracted from separate archive - if use rust-src; then - einfo "Combining rust and rust-src installers" - mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die - echo rust-src >> ./components || die - components="${components},rust-src" - fi - ./install.sh \ - --components="${components}" \ - --disable-verify \ - --prefix="${ED}/opt/${P}" \ - --mandir="${ED}/opt/${P}/man" \ - --disable-ldconfig \ - || die - - if use prefix; then - local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) - ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" - find "${ED}/opt/${P}/bin" -type f -print0 | \ - while IFS= read -r -d '' filename; do - patchelf_for_bin ${filename} ${interpreter} \; || die - done - eend ${PIPESTATUS[0]} - fi - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- - local ver_i="${i}-bin-${PV}" - ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die - dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" - dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" - dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" - dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" - - # make all capital underscored variable - local CARGO_TRIPLET="$(rust_abi)" - CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" - CARGO_TRIPLET="${CARGO_TRIPLET^^}" - cat <<-_EOF_ > "${T}/50${P}" - LDPATH="${EPREFIX}/usr/lib/rust/lib-bin-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" - $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") - _EOF_ - doenvd "${T}/50${P}" - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - popd >/dev/null || die - #end native abi install - - else - local rust_target - rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" - dodir "/opt/${P}/lib/rustlib" - cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ - "${ED}/opt/${P}/lib/rustlib" || die - fi - - # BUG: installs x86_64 binary on other arches - rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die -} - -pkg_postinst() { - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - if has_version app-editors/emacs; then - optfeature "emacs support for rust" app-emacs/rust-mode - fi - - if has_version app-editors/gvim || has_version app-editors/vim; then - optfeature "vim support for rust" app-vim/rust-vim - fi -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust-bin/rust-bin-1.81.0-r101.ebuild b/dev-lang/rust-bin/rust-bin-1.81.0-r101.ebuild deleted file mode 100644 index aabb1ed9c384..000000000000 --- a/dev-lang/rust-bin/rust-bin-1.81.0-r101.ebuild +++ /dev/null @@ -1,251 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 18 ) -LLVM_OPTIONAL="yes" - -inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal optfeature - -MY_P="rust-${PV}" -# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" -MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2024-09-05/rust-src-${PV}.tar.xz" -GENTOO_BIN_BASEURI="https://dev.gentoo.org/~arthurzam/distfiles/${CATEGORY}/${PN}" # omit leading slash - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" -SRC_URI="$(rust_all_arch_uris ${MY_P}) - rust-src? ( ${MY_SRC_URI} ) -" -# Keep this separate to allow easy commenting out if not yet built -SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " -SRC_URI+=" mips? ( - abi_mips_o32? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) - ) - abi_mips_n64? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) - ) -)" -SRC_URI+=" riscv? ( - elibc_musl? ( ${GENTOO_BIN_BASEURI}/${MY_P}-riscv64gc-unknown-linux-musl.tar.xz ) -)" -SRC_URI+=" ppc64? ( elibc_musl? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64-unknown-linux-musl.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64le-unknown-linux-musl.tar.xz ) -) )" - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" -KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv ~s390 sparc x86" -IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" - -RDEPEND=" - >=app-eselect/eselect-rust-20190311 - dev-libs/openssl - sys-apps/lsb-release - sys-devel/gcc:* - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" -BDEPEND=" - prefix? ( dev-util/patchelf ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" - -# stripping rust may break it (at least on x86_64) -# https://github.com/rust-lang/rust/issues/112286 -RESTRICT="strip" - -QA_PREBUILT=" - opt/${P}/bin/.* - opt/${P}/lib/.*.so* - opt/${P}/libexec/.* - opt/${P}/lib/rustlib/.*/bin/.* - opt/${P}/lib/rustlib/.*/lib/.* -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" - -pkg_pretend() { - if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then - die "${CHOST} is not supported by upstream Rust. You must use a hard float version." - fi -} - -src_unpack() { - # sadly rust-src tarball does not have corresponding .asc file - # so do partial verification - if use verify-sig; then - for f in ${A}; do - if [[ -f ${DISTDIR}/${f}.asc ]]; then - verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" - fi - done - fi - - default_src_unpack - - mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die -} - -patchelf_for_bin() { - local filetype=$(file -b ${1}) - if [[ ${filetype} == *ELF*interpreter* ]]; then - einfo "${1}'s interpreter changed" - patchelf ${1} --set-interpreter ${2} || die - elif [[ ${filetype} == *script* ]]; then - hprefixify ${1} - fi -} - -multilib_src_install() { - if multilib_is_native_abi; then - - # start native abi install - pushd "${S}" >/dev/null || die - local analysis std - analysis="$(grep 'analysis' ./components)" - std="$(grep 'std' ./components)" - local components="rustc,cargo,${std}" - use doc && components="${components},rust-docs" - use clippy && components="${components},clippy-preview" - use rustfmt && components="${components},rustfmt-preview" - use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" - # Rust component 'rust-src' is extracted from separate archive - if use rust-src; then - einfo "Combining rust and rust-src installers" - mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die - echo rust-src >> ./components || die - components="${components},rust-src" - fi - ./install.sh \ - --components="${components}" \ - --disable-verify \ - --prefix="${ED}/opt/${P}" \ - --mandir="${ED}/opt/${P}/man" \ - --disable-ldconfig \ - || die - - if use prefix; then - local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) - ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" - find "${ED}/opt/${P}/bin" -type f -print0 | \ - while IFS= read -r -d '' filename; do - patchelf_for_bin ${filename} ${interpreter} \; || die - done - eend ${PIPESTATUS[0]} - fi - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- - local ver_i="${i}-bin-${PV}" - ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die - dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" - dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" - dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" - dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" - - # make all capital underscored variable - local CARGO_TRIPLET="$(rust_abi)" - CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" - CARGO_TRIPLET="${CARGO_TRIPLET^^}" - cat <<-_EOF_ > "${T}/50${P}" - LDPATH="${EPREFIX}/usr/lib/rust/lib-bin-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" - $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") - _EOF_ - doenvd "${T}/50${P}" - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - popd >/dev/null || die - #end native abi install - - else - local rust_target - rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" - dodir "/opt/${P}/lib/rustlib" - cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ - "${ED}/opt/${P}/lib/rustlib" || die - fi - - # BUG: installs x86_64 binary on other arches - rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die -} - -pkg_postinst() { - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - if has_version app-editors/emacs; then - optfeature "emacs support for rust" app-emacs/rust-mode - fi - - if has_version app-editors/gvim || has_version app-editors/vim; then - optfeature "vim support for rust" app-vim/rust-vim - fi -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust-bin/rust-bin-1.81.0-r102.ebuild b/dev-lang/rust-bin/rust-bin-1.81.0-r102.ebuild new file mode 100644 index 000000000000..f139c60a5392 --- /dev/null +++ b/dev-lang/rust-bin/rust-bin-1.81.0-r102.ebuild @@ -0,0 +1,250 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 18 ) +LLVM_OPTIONAL="yes" + +inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal optfeature + +MY_P="rust-${PV}" +# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" +MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2024-09-05/rust-src-${PV}.tar.xz" +GENTOO_BIN_BASEURI="https://dev.gentoo.org/~arthurzam/distfiles/${CATEGORY}/${PN}" # omit leading slash + +DESCRIPTION="Systems programming language from Mozilla" +HOMEPAGE="https://www.rust-lang.org/" +SRC_URI="$(rust_all_arch_uris ${MY_P}) + rust-src? ( ${MY_SRC_URI} ) +" +# Keep this separate to allow easy commenting out if not yet built +SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " +SRC_URI+=" mips? ( + abi_mips_o32? ( + big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) + !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) + ) + abi_mips_n64? ( + big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) + !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) + ) +)" +SRC_URI+=" riscv? ( + elibc_musl? ( ${GENTOO_BIN_BASEURI}/${MY_P}-riscv64gc-unknown-linux-musl.tar.xz ) +)" +SRC_URI+=" ppc64? ( elibc_musl? ( + big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64-unknown-linux-musl.tar.xz ) + !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64le-unknown-linux-musl.tar.xz ) +) )" + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" +SLOT="${PV}" +KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv ~s390 sparc x86" +IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" + +RDEPEND=" + >=app-eselect/eselect-rust-20190311 + dev-libs/openssl + sys-apps/lsb-release + sys-devel/gcc:* + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" +BDEPEND=" + prefix? ( dev-util/patchelf ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" + +# stripping rust may break it (at least on x86_64) +# https://github.com/rust-lang/rust/issues/112286 +RESTRICT="strip" + +QA_PREBUILT=" + opt/${P}/bin/.* + opt/${P}/lib/.*.so* + opt/${P}/libexec/.* + opt/${P}/lib/rustlib/.*/bin/.* + opt/${P}/lib/rustlib/.*/lib/.* +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" + +pkg_pretend() { + if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then + die "${CHOST} is not supported by upstream Rust. You must use a hard float version." + fi +} + +src_unpack() { + # sadly rust-src tarball does not have corresponding .asc file + # so do partial verification + if use verify-sig; then + for f in ${A}; do + if [[ -f ${DISTDIR}/${f}.asc ]]; then + verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" + fi + done + fi + + default_src_unpack + + mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die +} + +patchelf_for_bin() { + local filetype=$(file -b ${1}) + if [[ ${filetype} == *ELF*interpreter* ]]; then + einfo "${1}'s interpreter changed" + patchelf ${1} --set-interpreter ${2} || die + elif [[ ${filetype} == *script* ]]; then + hprefixify ${1} + fi +} + +multilib_src_install() { + if multilib_is_native_abi; then + + # start native abi install + pushd "${S}" >/dev/null || die + local analysis std + analysis="$(grep 'analysis' ./components)" + std="$(grep 'std' ./components)" + local components="rustc,cargo,${std}" + use doc && components="${components},rust-docs" + use clippy && components="${components},clippy-preview" + use rustfmt && components="${components},rustfmt-preview" + use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" + # Rust component 'rust-src' is extracted from separate archive + if use rust-src; then + einfo "Combining rust and rust-src installers" + mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die + echo rust-src >> ./components || die + components="${components},rust-src" + fi + ./install.sh \ + --components="${components}" \ + --disable-verify \ + --prefix="${ED}/opt/${P}" \ + --mandir="${ED}/opt/${P}/man" \ + --disable-ldconfig \ + || die + + if use prefix; then + local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) + ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" + find "${ED}/opt/${P}/bin" -type f -print0 | \ + while IFS= read -r -d '' filename; do + patchelf_for_bin ${filename} ${interpreter} \; || die + done + eend ${PIPESTATUS[0]} + fi + + local symlinks=( + cargo + rustc + rustdoc + rust-gdb + rust-gdbgui + rust-lldb + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- + local ver_i="${i}-bin-${PV}" + ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die + dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" + dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" + dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" + dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" + + # make all capital underscored variable + local CARGO_TRIPLET="$(rust_abi)" + CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" + CARGO_TRIPLET="${CARGO_TRIPLET^^}" + cat <<-_EOF_ > "${T}/50${P}" + MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" + $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") + _EOF_ + doenvd "${T}/50${P}" + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + popd >/dev/null || die + #end native abi install + + else + local rust_target + rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" + dodir "/opt/${P}/lib/rustlib" + cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ + "${ED}/opt/${P}/lib/rustlib" || die + fi + + # BUG: installs x86_64 binary on other arches + rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die +} + +pkg_postinst() { + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + if has_version app-editors/emacs; then + optfeature "emacs support for rust" app-emacs/rust-mode + fi + + if has_version app-editors/gvim || has_version app-editors/vim; then + optfeature "vim support for rust" app-vim/rust-vim + fi +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust-bin/rust-bin-1.82.0-r100.ebuild b/dev-lang/rust-bin/rust-bin-1.82.0-r100.ebuild deleted file mode 100644 index b1a1d5f9037b..000000000000 --- a/dev-lang/rust-bin/rust-bin-1.82.0-r100.ebuild +++ /dev/null @@ -1,253 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 19 ) -LLVM_OPTIONAL="yes" - -inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal optfeature - -MY_P="rust-${PV}" -# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" -MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2024-10-17/rust-src-${PV}.tar.xz" -GENTOO_BIN_BASEURI="https://dev.gentoo.org/~arthurzam/distfiles/${CATEGORY}/${PN}" # omit leading slash - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" -SRC_URI="$(rust_all_arch_uris ${MY_P}) - rust-src? ( ${MY_SRC_URI} ) -" -# Keep this separate to allow easy commenting out if not yet built -SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " -SRC_URI+=" mips? ( - abi_mips_o32? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) - ) - abi_mips_n64? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) - ) -)" -SRC_URI+=" riscv? ( - elibc_musl? ( ${GENTOO_BIN_BASEURI}/${MY_P}-riscv64gc-unknown-linux-musl.tar.xz ) -)" -SRC_URI+=" ppc64? ( elibc_musl? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64-unknown-linux-musl.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64le-unknown-linux-musl.tar.xz ) -) )" - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" -KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv ~s390 sparc x86" -IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" - -RDEPEND=" - >=app-eselect/eselect-rust-20190311 - dev-libs/openssl - sys-apps/lsb-release - sys-devel/gcc:* - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" -BDEPEND=" - prefix? ( dev-util/patchelf ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" - -# stripping rust may break it (at least on x86_64) -# https://github.com/rust-lang/rust/issues/112286 -RESTRICT="strip" - -QA_PREBUILT=" - opt/${P}/bin/.* - opt/${P}/lib/.*.so* - opt/${P}/libexec/.* - opt/${P}/lib/rustlib/.*/bin/.* - opt/${P}/lib/rustlib/.*/lib/.* -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" - -pkg_pretend() { - if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then - die "${CHOST} is not supported by upstream Rust. You must use a hard float version." - fi -} - -src_unpack() { - # sadly rust-src tarball does not have corresponding .asc file - # so do partial verification - if use verify-sig; then - for f in ${A}; do - if [[ -f ${DISTDIR}/${f}.asc ]]; then - verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" - fi - done - fi - - default_src_unpack - - mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die -} - -patchelf_for_bin() { - local filetype=$(file -b ${1}) - if [[ ${filetype} == *ELF*interpreter* ]]; then - einfo "${1}'s interpreter changed" - patchelf ${1} --set-interpreter ${2} || die - elif [[ ${filetype} == *script* ]]; then - hprefixify ${1} - fi -} - -multilib_src_install() { - if multilib_is_native_abi; then - - # start native abi install - pushd "${S}" >/dev/null || die - local analysis std - analysis="$(grep 'analysis' ./components)" - std="$(grep 'std' ./components)" - local components="rustc,cargo,${std}" - use doc && components="${components},rust-docs" - use clippy && components="${components},clippy-preview" - use rustfmt && components="${components},rustfmt-preview" - use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" - # Rust component 'rust-src' is extracted from separate archive - if use rust-src; then - einfo "Combining rust and rust-src installers" - mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die - echo rust-src >> ./components || die - components="${components},rust-src" - fi - ./install.sh \ - --components="${components}" \ - --disable-verify \ - --prefix="${ED}/opt/${P}" \ - --mandir="${ED}/opt/${P}/man" \ - --disable-ldconfig \ - || die - - docompress /opt/${P}/man/ - - if use prefix; then - local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) - ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" - find "${ED}/opt/${P}/bin" -type f -print0 | \ - while IFS= read -r -d '' filename; do - patchelf_for_bin ${filename} ${interpreter} \; || die - done - eend ${PIPESTATUS[0]} - fi - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- - local ver_i="${i}-bin-${PV}" - ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die - dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" - dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" - dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" - dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" - - # make all capital underscored variable - local CARGO_TRIPLET="$(rust_abi)" - CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" - CARGO_TRIPLET="${CARGO_TRIPLET^^}" - cat <<-_EOF_ > "${T}/50${P}" - LDPATH="${EPREFIX}/usr/lib/rust/lib-bin-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" - $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") - _EOF_ - doenvd "${T}/50${P}" - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - popd >/dev/null || die - #end native abi install - - else - local rust_target - rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" - dodir "/opt/${P}/lib/rustlib" - cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ - "${ED}/opt/${P}/lib/rustlib" || die - fi - - # BUG: installs x86_64 binary on other arches - rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die -} - -pkg_postinst() { - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - if has_version app-editors/emacs; then - optfeature "emacs support for rust" app-emacs/rust-mode - fi - - if has_version app-editors/gvim || has_version app-editors/vim; then - optfeature "vim support for rust" app-vim/rust-vim - fi -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust-bin/rust-bin-1.82.0-r101.ebuild b/dev-lang/rust-bin/rust-bin-1.82.0-r101.ebuild deleted file mode 100644 index b1a1d5f9037b..000000000000 --- a/dev-lang/rust-bin/rust-bin-1.82.0-r101.ebuild +++ /dev/null @@ -1,253 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 19 ) -LLVM_OPTIONAL="yes" - -inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal optfeature - -MY_P="rust-${PV}" -# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" -MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2024-10-17/rust-src-${PV}.tar.xz" -GENTOO_BIN_BASEURI="https://dev.gentoo.org/~arthurzam/distfiles/${CATEGORY}/${PN}" # omit leading slash - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" -SRC_URI="$(rust_all_arch_uris ${MY_P}) - rust-src? ( ${MY_SRC_URI} ) -" -# Keep this separate to allow easy commenting out if not yet built -SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " -SRC_URI+=" mips? ( - abi_mips_o32? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) - ) - abi_mips_n64? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) - ) -)" -SRC_URI+=" riscv? ( - elibc_musl? ( ${GENTOO_BIN_BASEURI}/${MY_P}-riscv64gc-unknown-linux-musl.tar.xz ) -)" -SRC_URI+=" ppc64? ( elibc_musl? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64-unknown-linux-musl.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64le-unknown-linux-musl.tar.xz ) -) )" - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" -KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv ~s390 sparc x86" -IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" - -RDEPEND=" - >=app-eselect/eselect-rust-20190311 - dev-libs/openssl - sys-apps/lsb-release - sys-devel/gcc:* - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" -BDEPEND=" - prefix? ( dev-util/patchelf ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" - -# stripping rust may break it (at least on x86_64) -# https://github.com/rust-lang/rust/issues/112286 -RESTRICT="strip" - -QA_PREBUILT=" - opt/${P}/bin/.* - opt/${P}/lib/.*.so* - opt/${P}/libexec/.* - opt/${P}/lib/rustlib/.*/bin/.* - opt/${P}/lib/rustlib/.*/lib/.* -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" - -pkg_pretend() { - if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then - die "${CHOST} is not supported by upstream Rust. You must use a hard float version." - fi -} - -src_unpack() { - # sadly rust-src tarball does not have corresponding .asc file - # so do partial verification - if use verify-sig; then - for f in ${A}; do - if [[ -f ${DISTDIR}/${f}.asc ]]; then - verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" - fi - done - fi - - default_src_unpack - - mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die -} - -patchelf_for_bin() { - local filetype=$(file -b ${1}) - if [[ ${filetype} == *ELF*interpreter* ]]; then - einfo "${1}'s interpreter changed" - patchelf ${1} --set-interpreter ${2} || die - elif [[ ${filetype} == *script* ]]; then - hprefixify ${1} - fi -} - -multilib_src_install() { - if multilib_is_native_abi; then - - # start native abi install - pushd "${S}" >/dev/null || die - local analysis std - analysis="$(grep 'analysis' ./components)" - std="$(grep 'std' ./components)" - local components="rustc,cargo,${std}" - use doc && components="${components},rust-docs" - use clippy && components="${components},clippy-preview" - use rustfmt && components="${components},rustfmt-preview" - use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" - # Rust component 'rust-src' is extracted from separate archive - if use rust-src; then - einfo "Combining rust and rust-src installers" - mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die - echo rust-src >> ./components || die - components="${components},rust-src" - fi - ./install.sh \ - --components="${components}" \ - --disable-verify \ - --prefix="${ED}/opt/${P}" \ - --mandir="${ED}/opt/${P}/man" \ - --disable-ldconfig \ - || die - - docompress /opt/${P}/man/ - - if use prefix; then - local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) - ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" - find "${ED}/opt/${P}/bin" -type f -print0 | \ - while IFS= read -r -d '' filename; do - patchelf_for_bin ${filename} ${interpreter} \; || die - done - eend ${PIPESTATUS[0]} - fi - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- - local ver_i="${i}-bin-${PV}" - ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die - dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" - dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" - dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" - dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" - - # make all capital underscored variable - local CARGO_TRIPLET="$(rust_abi)" - CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" - CARGO_TRIPLET="${CARGO_TRIPLET^^}" - cat <<-_EOF_ > "${T}/50${P}" - LDPATH="${EPREFIX}/usr/lib/rust/lib-bin-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" - $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") - _EOF_ - doenvd "${T}/50${P}" - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - popd >/dev/null || die - #end native abi install - - else - local rust_target - rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" - dodir "/opt/${P}/lib/rustlib" - cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ - "${ED}/opt/${P}/lib/rustlib" || die - fi - - # BUG: installs x86_64 binary on other arches - rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die -} - -pkg_postinst() { - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - if has_version app-editors/emacs; then - optfeature "emacs support for rust" app-emacs/rust-mode - fi - - if has_version app-editors/gvim || has_version app-editors/vim; then - optfeature "vim support for rust" app-vim/rust-vim - fi -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust-bin/rust-bin-1.82.0-r102.ebuild b/dev-lang/rust-bin/rust-bin-1.82.0-r102.ebuild new file mode 100644 index 000000000000..535a893ad011 --- /dev/null +++ b/dev-lang/rust-bin/rust-bin-1.82.0-r102.ebuild @@ -0,0 +1,252 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 19 ) +LLVM_OPTIONAL="yes" + +inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal optfeature + +MY_P="rust-${PV}" +# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" +MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2024-10-17/rust-src-${PV}.tar.xz" +GENTOO_BIN_BASEURI="https://dev.gentoo.org/~arthurzam/distfiles/${CATEGORY}/${PN}" # omit leading slash + +DESCRIPTION="Systems programming language from Mozilla" +HOMEPAGE="https://www.rust-lang.org/" +SRC_URI="$(rust_all_arch_uris ${MY_P}) + rust-src? ( ${MY_SRC_URI} ) +" +# Keep this separate to allow easy commenting out if not yet built +SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " +SRC_URI+=" mips? ( + abi_mips_o32? ( + big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) + !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) + ) + abi_mips_n64? ( + big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) + !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) + ) +)" +SRC_URI+=" riscv? ( + elibc_musl? ( ${GENTOO_BIN_BASEURI}/${MY_P}-riscv64gc-unknown-linux-musl.tar.xz ) +)" +SRC_URI+=" ppc64? ( elibc_musl? ( + big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64-unknown-linux-musl.tar.xz ) + !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64le-unknown-linux-musl.tar.xz ) +) )" + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" +SLOT="${PV}" +KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv ~s390 sparc x86" +IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" + +RDEPEND=" + >=app-eselect/eselect-rust-20190311 + dev-libs/openssl + sys-apps/lsb-release + sys-devel/gcc:* + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" +BDEPEND=" + prefix? ( dev-util/patchelf ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" + +# stripping rust may break it (at least on x86_64) +# https://github.com/rust-lang/rust/issues/112286 +RESTRICT="strip" + +QA_PREBUILT=" + opt/${P}/bin/.* + opt/${P}/lib/.*.so* + opt/${P}/libexec/.* + opt/${P}/lib/rustlib/.*/bin/.* + opt/${P}/lib/rustlib/.*/lib/.* +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" + +pkg_pretend() { + if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then + die "${CHOST} is not supported by upstream Rust. You must use a hard float version." + fi +} + +src_unpack() { + # sadly rust-src tarball does not have corresponding .asc file + # so do partial verification + if use verify-sig; then + for f in ${A}; do + if [[ -f ${DISTDIR}/${f}.asc ]]; then + verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" + fi + done + fi + + default_src_unpack + + mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die +} + +patchelf_for_bin() { + local filetype=$(file -b ${1}) + if [[ ${filetype} == *ELF*interpreter* ]]; then + einfo "${1}'s interpreter changed" + patchelf ${1} --set-interpreter ${2} || die + elif [[ ${filetype} == *script* ]]; then + hprefixify ${1} + fi +} + +multilib_src_install() { + if multilib_is_native_abi; then + + # start native abi install + pushd "${S}" >/dev/null || die + local analysis std + analysis="$(grep 'analysis' ./components)" + std="$(grep 'std' ./components)" + local components="rustc,cargo,${std}" + use doc && components="${components},rust-docs" + use clippy && components="${components},clippy-preview" + use rustfmt && components="${components},rustfmt-preview" + use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" + # Rust component 'rust-src' is extracted from separate archive + if use rust-src; then + einfo "Combining rust and rust-src installers" + mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die + echo rust-src >> ./components || die + components="${components},rust-src" + fi + ./install.sh \ + --components="${components}" \ + --disable-verify \ + --prefix="${ED}/opt/${P}" \ + --mandir="${ED}/opt/${P}/man" \ + --disable-ldconfig \ + || die + + docompress /opt/${P}/man/ + + if use prefix; then + local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) + ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" + find "${ED}/opt/${P}/bin" -type f -print0 | \ + while IFS= read -r -d '' filename; do + patchelf_for_bin ${filename} ${interpreter} \; || die + done + eend ${PIPESTATUS[0]} + fi + + local symlinks=( + cargo + rustc + rustdoc + rust-gdb + rust-gdbgui + rust-lldb + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- + local ver_i="${i}-bin-${PV}" + ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die + dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" + dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" + dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" + dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" + + # make all capital underscored variable + local CARGO_TRIPLET="$(rust_abi)" + CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" + CARGO_TRIPLET="${CARGO_TRIPLET^^}" + cat <<-_EOF_ > "${T}/50${P}" + MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" + $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") + _EOF_ + doenvd "${T}/50${P}" + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + popd >/dev/null || die + #end native abi install + + else + local rust_target + rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" + dodir "/opt/${P}/lib/rustlib" + cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ + "${ED}/opt/${P}/lib/rustlib" || die + fi + + # BUG: installs x86_64 binary on other arches + rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die +} + +pkg_postinst() { + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + if has_version app-editors/emacs; then + optfeature "emacs support for rust" app-emacs/rust-mode + fi + + if has_version app-editors/gvim || has_version app-editors/vim; then + optfeature "vim support for rust" app-vim/rust-vim + fi +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust-bin/rust-bin-1.83.0-r1.ebuild b/dev-lang/rust-bin/rust-bin-1.83.0-r1.ebuild new file mode 100644 index 000000000000..ad77ff518f18 --- /dev/null +++ b/dev-lang/rust-bin/rust-bin-1.83.0-r1.ebuild @@ -0,0 +1,252 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 19 ) +LLVM_OPTIONAL="yes" + +inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal optfeature + +MY_P="rust-${PV}" +# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" +MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2024-11-28/rust-src-${PV}.tar.xz" +GENTOO_BIN_BASEURI="https://dev.gentoo.org/~arthurzam/distfiles/${CATEGORY}/${PN}" # omit leading slash + +DESCRIPTION="Systems programming language from Mozilla" +HOMEPAGE="https://www.rust-lang.org/" +SRC_URI="$(rust_all_arch_uris ${MY_P}) + rust-src? ( ${MY_SRC_URI} ) +" +# Keep this separate to allow easy commenting out if not yet built +SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " +SRC_URI+=" mips? ( + abi_mips_o32? ( + big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) + !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) + ) + abi_mips_n64? ( + big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) + !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) + ) +)" +SRC_URI+=" riscv? ( + elibc_musl? ( ${GENTOO_BIN_BASEURI}/${MY_P}-riscv64gc-unknown-linux-musl.tar.xz ) +)" +SRC_URI+=" ppc64? ( elibc_musl? ( + big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64-unknown-linux-musl.tar.xz ) + !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64le-unknown-linux-musl.tar.xz ) +) )" + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" +SLOT="${PV}" +KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv ~s390 sparc x86" +IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" + +RDEPEND=" + >=app-eselect/eselect-rust-20190311 + dev-libs/openssl + sys-apps/lsb-release + sys-devel/gcc:* + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" +BDEPEND=" + prefix? ( dev-util/patchelf ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" + +# stripping rust may break it (at least on x86_64) +# https://github.com/rust-lang/rust/issues/112286 +RESTRICT="strip" + +QA_PREBUILT=" + opt/${P}/bin/.* + opt/${P}/lib/.*.so* + opt/${P}/libexec/.* + opt/${P}/lib/rustlib/.*/bin/.* + opt/${P}/lib/rustlib/.*/lib/.* +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" + +pkg_pretend() { + if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then + die "${CHOST} is not supported by upstream Rust. You must use a hard float version." + fi +} + +src_unpack() { + # sadly rust-src tarball does not have corresponding .asc file + # so do partial verification + if use verify-sig; then + for f in ${A}; do + if [[ -f ${DISTDIR}/${f}.asc ]]; then + verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" + fi + done + fi + + default_src_unpack + + mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die +} + +patchelf_for_bin() { + local filetype=$(file -b ${1}) + if [[ ${filetype} == *ELF*interpreter* ]]; then + einfo "${1}'s interpreter changed" + patchelf ${1} --set-interpreter ${2} || die + elif [[ ${filetype} == *script* ]]; then + hprefixify ${1} + fi +} + +multilib_src_install() { + if multilib_is_native_abi; then + + # start native abi install + pushd "${S}" >/dev/null || die + local analysis std + analysis="$(grep 'analysis' ./components)" + std="$(grep 'std' ./components)" + local components="rustc,cargo,${std}" + use doc && components="${components},rust-docs" + use clippy && components="${components},clippy-preview" + use rustfmt && components="${components},rustfmt-preview" + use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" + # Rust component 'rust-src' is extracted from separate archive + if use rust-src; then + einfo "Combining rust and rust-src installers" + mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die + echo rust-src >> ./components || die + components="${components},rust-src" + fi + ./install.sh \ + --components="${components}" \ + --disable-verify \ + --prefix="${ED}/opt/${P}" \ + --mandir="${ED}/opt/${P}/man" \ + --disable-ldconfig \ + || die + + docompress /opt/${P}/man/ + + if use prefix; then + local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) + ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" + find "${ED}/opt/${P}/bin" -type f -print0 | \ + while IFS= read -r -d '' filename; do + patchelf_for_bin ${filename} ${interpreter} \; || die + done + eend $? + fi + + local symlinks=( + cargo + rustc + rustdoc + rust-gdb + rust-gdbgui + rust-lldb + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- + local ver_i="${i}-bin-${PV}" + ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die + dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" + dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" + dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" + dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" + + # make all capital underscored variable + local CARGO_TRIPLET="$(rust_abi)" + CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" + CARGO_TRIPLET="${CARGO_TRIPLET^^}" + cat <<-_EOF_ > "${T}/50${P}" + MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" + $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") + _EOF_ + doenvd "${T}/50${P}" + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + popd >/dev/null || die + #end native abi install + + else + local rust_target + rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" + dodir "/opt/${P}/lib/rustlib" + cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ + "${ED}/opt/${P}/lib/rustlib" || die + fi + + # BUG: installs x86_64 binary on other arches + rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die +} + +pkg_postinst() { + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + if has_version app-editors/emacs; then + optfeature "emacs support for rust" app-emacs/rust-mode + fi + + if has_version app-editors/gvim || has_version app-editors/vim; then + optfeature "vim support for rust" app-vim/rust-vim + fi +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust-bin/rust-bin-1.83.0.ebuild b/dev-lang/rust-bin/rust-bin-1.83.0.ebuild deleted file mode 100644 index eae591d46115..000000000000 --- a/dev-lang/rust-bin/rust-bin-1.83.0.ebuild +++ /dev/null @@ -1,253 +0,0 @@ -# Copyright 1999-2025 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 19 ) -LLVM_OPTIONAL="yes" - -inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal optfeature - -MY_P="rust-${PV}" -# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" -MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2024-11-28/rust-src-${PV}.tar.xz" -GENTOO_BIN_BASEURI="https://dev.gentoo.org/~arthurzam/distfiles/${CATEGORY}/${PN}" # omit leading slash - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" -SRC_URI="$(rust_all_arch_uris ${MY_P}) - rust-src? ( ${MY_SRC_URI} ) -" -# Keep this separate to allow easy commenting out if not yet built -SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " -SRC_URI+=" mips? ( - abi_mips_o32? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) - ) - abi_mips_n64? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) - ) -)" -SRC_URI+=" riscv? ( - elibc_musl? ( ${GENTOO_BIN_BASEURI}/${MY_P}-riscv64gc-unknown-linux-musl.tar.xz ) -)" -SRC_URI+=" ppc64? ( elibc_musl? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64-unknown-linux-musl.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64le-unknown-linux-musl.tar.xz ) -) )" - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" -KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv ~s390 sparc x86" -IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" - -RDEPEND=" - >=app-eselect/eselect-rust-20190311 - dev-libs/openssl - sys-apps/lsb-release - sys-devel/gcc:* - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" -BDEPEND=" - prefix? ( dev-util/patchelf ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" - -# stripping rust may break it (at least on x86_64) -# https://github.com/rust-lang/rust/issues/112286 -RESTRICT="strip" - -QA_PREBUILT=" - opt/${P}/bin/.* - opt/${P}/lib/.*.so* - opt/${P}/libexec/.* - opt/${P}/lib/rustlib/.*/bin/.* - opt/${P}/lib/rustlib/.*/lib/.* -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" - -pkg_pretend() { - if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then - die "${CHOST} is not supported by upstream Rust. You must use a hard float version." - fi -} - -src_unpack() { - # sadly rust-src tarball does not have corresponding .asc file - # so do partial verification - if use verify-sig; then - for f in ${A}; do - if [[ -f ${DISTDIR}/${f}.asc ]]; then - verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" - fi - done - fi - - default_src_unpack - - mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die -} - -patchelf_for_bin() { - local filetype=$(file -b ${1}) - if [[ ${filetype} == *ELF*interpreter* ]]; then - einfo "${1}'s interpreter changed" - patchelf ${1} --set-interpreter ${2} || die - elif [[ ${filetype} == *script* ]]; then - hprefixify ${1} - fi -} - -multilib_src_install() { - if multilib_is_native_abi; then - - # start native abi install - pushd "${S}" >/dev/null || die - local analysis std - analysis="$(grep 'analysis' ./components)" - std="$(grep 'std' ./components)" - local components="rustc,cargo,${std}" - use doc && components="${components},rust-docs" - use clippy && components="${components},clippy-preview" - use rustfmt && components="${components},rustfmt-preview" - use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" - # Rust component 'rust-src' is extracted from separate archive - if use rust-src; then - einfo "Combining rust and rust-src installers" - mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die - echo rust-src >> ./components || die - components="${components},rust-src" - fi - ./install.sh \ - --components="${components}" \ - --disable-verify \ - --prefix="${ED}/opt/${P}" \ - --mandir="${ED}/opt/${P}/man" \ - --disable-ldconfig \ - || die - - docompress /opt/${P}/man/ - - if use prefix; then - local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) - ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" - find "${ED}/opt/${P}/bin" -type f -print0 | \ - while IFS= read -r -d '' filename; do - patchelf_for_bin ${filename} ${interpreter} \; || die - done - eend $? - fi - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- - local ver_i="${i}-bin-${PV}" - ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die - dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" - dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" - dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" - dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" - - # make all capital underscored variable - local CARGO_TRIPLET="$(rust_abi)" - CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" - CARGO_TRIPLET="${CARGO_TRIPLET^^}" - cat <<-_EOF_ > "${T}/50${P}" - LDPATH="${EPREFIX}/usr/lib/rust/lib-bin-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" - $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") - _EOF_ - doenvd "${T}/50${P}" - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - popd >/dev/null || die - #end native abi install - - else - local rust_target - rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" - dodir "/opt/${P}/lib/rustlib" - cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ - "${ED}/opt/${P}/lib/rustlib" || die - fi - - # BUG: installs x86_64 binary on other arches - rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die -} - -pkg_postinst() { - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - if has_version app-editors/emacs; then - optfeature "emacs support for rust" app-emacs/rust-mode - fi - - if has_version app-editors/gvim || has_version app-editors/vim; then - optfeature "vim support for rust" app-vim/rust-vim - fi -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust-bin/rust-bin-1.84.0-r1.ebuild b/dev-lang/rust-bin/rust-bin-1.84.0-r1.ebuild new file mode 100644 index 000000000000..33c87f94a214 --- /dev/null +++ b/dev-lang/rust-bin/rust-bin-1.84.0-r1.ebuild @@ -0,0 +1,252 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 19 ) +LLVM_OPTIONAL="yes" + +inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal optfeature + +MY_P="rust-${PV}" +# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" +MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2025-01-09/rust-src-${PV}.tar.xz" +GENTOO_BIN_BASEURI="https://dev.gentoo.org/~arthurzam/distfiles/${CATEGORY}/${PN}" # omit leading slash + +DESCRIPTION="Systems programming language from Mozilla" +HOMEPAGE="https://www.rust-lang.org/" +SRC_URI="$(rust_all_arch_uris ${MY_P}) + rust-src? ( ${MY_SRC_URI} ) +" +# Keep this separate to allow easy commenting out if not yet built +SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " +SRC_URI+=" mips? ( + abi_mips_o32? ( + big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) + !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) + ) + abi_mips_n64? ( + big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) + !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) + ) +)" +SRC_URI+=" riscv? ( + elibc_musl? ( ${GENTOO_BIN_BASEURI}/${MY_P}-riscv64gc-unknown-linux-musl.tar.xz ) +)" +SRC_URI+=" ppc64? ( elibc_musl? ( + big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64-unknown-linux-musl.tar.xz ) + !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64le-unknown-linux-musl.tar.xz ) +) )" + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" +SLOT="${PV}" +KEYWORDS="~amd64 ~arm ~arm64 ~loong ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86" +IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" + +RDEPEND=" + >=app-eselect/eselect-rust-20190311 + dev-libs/openssl + sys-apps/lsb-release + sys-devel/gcc:* + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" +BDEPEND=" + prefix? ( dev-util/patchelf ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" + +# stripping rust may break it (at least on x86_64) +# https://github.com/rust-lang/rust/issues/112286 +RESTRICT="strip" + +QA_PREBUILT=" + opt/${P}/bin/.* + opt/${P}/lib/.*.so* + opt/${P}/libexec/.* + opt/${P}/lib/rustlib/.*/bin/.* + opt/${P}/lib/rustlib/.*/lib/.* +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" + +pkg_pretend() { + if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then + die "${CHOST} is not supported by upstream Rust. You must use a hard float version." + fi +} + +src_unpack() { + # sadly rust-src tarball does not have corresponding .asc file + # so do partial verification + if use verify-sig; then + for f in ${A}; do + if [[ -f ${DISTDIR}/${f}.asc ]]; then + verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" + fi + done + fi + + default_src_unpack + + mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die +} + +patchelf_for_bin() { + local filetype=$(file -b ${1}) + if [[ ${filetype} == *ELF*interpreter* ]]; then + einfo "${1}'s interpreter changed" + patchelf ${1} --set-interpreter ${2} || die + elif [[ ${filetype} == *script* ]]; then + hprefixify ${1} + fi +} + +multilib_src_install() { + if multilib_is_native_abi; then + + # start native abi install + pushd "${S}" >/dev/null || die + local analysis std + analysis="$(grep 'analysis' ./components)" + std="$(grep 'std' ./components)" + local components="rustc,cargo,${std}" + use doc && components="${components},rust-docs" + use clippy && components="${components},clippy-preview" + use rustfmt && components="${components},rustfmt-preview" + use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" + # Rust component 'rust-src' is extracted from separate archive + if use rust-src; then + einfo "Combining rust and rust-src installers" + mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die + echo rust-src >> ./components || die + components="${components},rust-src" + fi + ./install.sh \ + --components="${components}" \ + --disable-verify \ + --prefix="${ED}/opt/${P}" \ + --mandir="${ED}/opt/${P}/man" \ + --disable-ldconfig \ + || die + + docompress /opt/${P}/man/ + + if use prefix; then + local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) + ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" + find "${ED}/opt/${P}/bin" -type f -print0 | \ + while IFS= read -r -d '' filename; do + patchelf_for_bin ${filename} ${interpreter} \; || die + done + eend $? + fi + + local symlinks=( + cargo + rustc + rustdoc + rust-gdb + rust-gdbgui + rust-lldb + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- + local ver_i="${i}-bin-${PV}" + ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die + dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" + dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" + dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" + dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" + + # make all capital underscored variable + local CARGO_TRIPLET="$(rust_abi)" + CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" + CARGO_TRIPLET="${CARGO_TRIPLET^^}" + cat <<-_EOF_ > "${T}/50${P}" + MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" + $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") + _EOF_ + doenvd "${T}/50${P}" + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + popd >/dev/null || die + #end native abi install + + else + local rust_target + rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" + dodir "/opt/${P}/lib/rustlib" + cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ + "${ED}/opt/${P}/lib/rustlib" || die + fi + + # BUG: installs x86_64 binary on other arches + rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die +} + +pkg_postinst() { + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + if has_version app-editors/emacs; then + optfeature "emacs support for rust" app-emacs/rust-mode + fi + + if has_version app-editors/gvim || has_version app-editors/vim; then + optfeature "vim support for rust" app-vim/rust-vim + fi +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust-bin/rust-bin-1.84.0.ebuild b/dev-lang/rust-bin/rust-bin-1.84.0.ebuild deleted file mode 100644 index 48da1d3e8bd5..000000000000 --- a/dev-lang/rust-bin/rust-bin-1.84.0.ebuild +++ /dev/null @@ -1,253 +0,0 @@ -# Copyright 1999-2025 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 19 ) -LLVM_OPTIONAL="yes" - -inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal optfeature - -MY_P="rust-${PV}" -# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" -MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2025-01-09/rust-src-${PV}.tar.xz" -GENTOO_BIN_BASEURI="https://dev.gentoo.org/~arthurzam/distfiles/${CATEGORY}/${PN}" # omit leading slash - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" -SRC_URI="$(rust_all_arch_uris ${MY_P}) - rust-src? ( ${MY_SRC_URI} ) -" -# Keep this separate to allow easy commenting out if not yet built -SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " -SRC_URI+=" mips? ( - abi_mips_o32? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) - ) - abi_mips_n64? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) - ) -)" -SRC_URI+=" riscv? ( - elibc_musl? ( ${GENTOO_BIN_BASEURI}/${MY_P}-riscv64gc-unknown-linux-musl.tar.xz ) -)" -SRC_URI+=" ppc64? ( elibc_musl? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64-unknown-linux-musl.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64le-unknown-linux-musl.tar.xz ) -) )" - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" -KEYWORDS="~amd64 ~arm ~arm64 ~loong ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86" -IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" - -RDEPEND=" - >=app-eselect/eselect-rust-20190311 - dev-libs/openssl - sys-apps/lsb-release - sys-devel/gcc:* - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" -BDEPEND=" - prefix? ( dev-util/patchelf ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" - -# stripping rust may break it (at least on x86_64) -# https://github.com/rust-lang/rust/issues/112286 -RESTRICT="strip" - -QA_PREBUILT=" - opt/${P}/bin/.* - opt/${P}/lib/.*.so* - opt/${P}/libexec/.* - opt/${P}/lib/rustlib/.*/bin/.* - opt/${P}/lib/rustlib/.*/lib/.* -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" - -pkg_pretend() { - if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then - die "${CHOST} is not supported by upstream Rust. You must use a hard float version." - fi -} - -src_unpack() { - # sadly rust-src tarball does not have corresponding .asc file - # so do partial verification - if use verify-sig; then - for f in ${A}; do - if [[ -f ${DISTDIR}/${f}.asc ]]; then - verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" - fi - done - fi - - default_src_unpack - - mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die -} - -patchelf_for_bin() { - local filetype=$(file -b ${1}) - if [[ ${filetype} == *ELF*interpreter* ]]; then - einfo "${1}'s interpreter changed" - patchelf ${1} --set-interpreter ${2} || die - elif [[ ${filetype} == *script* ]]; then - hprefixify ${1} - fi -} - -multilib_src_install() { - if multilib_is_native_abi; then - - # start native abi install - pushd "${S}" >/dev/null || die - local analysis std - analysis="$(grep 'analysis' ./components)" - std="$(grep 'std' ./components)" - local components="rustc,cargo,${std}" - use doc && components="${components},rust-docs" - use clippy && components="${components},clippy-preview" - use rustfmt && components="${components},rustfmt-preview" - use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" - # Rust component 'rust-src' is extracted from separate archive - if use rust-src; then - einfo "Combining rust and rust-src installers" - mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die - echo rust-src >> ./components || die - components="${components},rust-src" - fi - ./install.sh \ - --components="${components}" \ - --disable-verify \ - --prefix="${ED}/opt/${P}" \ - --mandir="${ED}/opt/${P}/man" \ - --disable-ldconfig \ - || die - - docompress /opt/${P}/man/ - - if use prefix; then - local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) - ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" - find "${ED}/opt/${P}/bin" -type f -print0 | \ - while IFS= read -r -d '' filename; do - patchelf_for_bin ${filename} ${interpreter} \; || die - done - eend $? - fi - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- - local ver_i="${i}-bin-${PV}" - ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die - dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" - dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" - dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" - dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" - - # make all capital underscored variable - local CARGO_TRIPLET="$(rust_abi)" - CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" - CARGO_TRIPLET="${CARGO_TRIPLET^^}" - cat <<-_EOF_ > "${T}/50${P}" - LDPATH="${EPREFIX}/usr/lib/rust/lib-bin-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" - $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") - _EOF_ - doenvd "${T}/50${P}" - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - popd >/dev/null || die - #end native abi install - - else - local rust_target - rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" - dodir "/opt/${P}/lib/rustlib" - cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ - "${ED}/opt/${P}/lib/rustlib" || die - fi - - # BUG: installs x86_64 binary on other arches - rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die -} - -pkg_postinst() { - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - if has_version app-editors/emacs; then - optfeature "emacs support for rust" app-emacs/rust-mode - fi - - if has_version app-editors/gvim || has_version app-editors/vim; then - optfeature "vim support for rust" app-vim/rust-vim - fi -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust-bin/rust-bin-1.84.1-r1.ebuild b/dev-lang/rust-bin/rust-bin-1.84.1-r1.ebuild new file mode 100644 index 000000000000..dc92f0547909 --- /dev/null +++ b/dev-lang/rust-bin/rust-bin-1.84.1-r1.ebuild @@ -0,0 +1,252 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 19 ) +LLVM_OPTIONAL="yes" + +inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal optfeature + +MY_P="rust-${PV}" +# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" +MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2025-01-30/rust-src-${PV}.tar.xz" +GENTOO_BIN_BASEURI="https://dev.gentoo.org/~arthurzam/distfiles/${CATEGORY}/${PN}" # omit leading slash + +DESCRIPTION="Systems programming language from Mozilla" +HOMEPAGE="https://www.rust-lang.org/" +SRC_URI="$(rust_all_arch_uris ${MY_P}) + rust-src? ( ${MY_SRC_URI} ) +" +# Keep this separate to allow easy commenting out if not yet built +SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " +SRC_URI+=" mips? ( + abi_mips_o32? ( + big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) + !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) + ) + abi_mips_n64? ( + big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) + !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) + ) +)" +SRC_URI+=" riscv? ( + elibc_musl? ( ${GENTOO_BIN_BASEURI}/${MY_P}-riscv64gc-unknown-linux-musl.tar.xz ) +)" +SRC_URI+=" ppc64? ( elibc_musl? ( + big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64-unknown-linux-musl.tar.xz ) + !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64le-unknown-linux-musl.tar.xz ) +) )" + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" +SLOT="${PV}" +KEYWORDS="~amd64 ~arm ~arm64 ~loong ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86" +IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" + +RDEPEND=" + >=app-eselect/eselect-rust-20190311 + dev-libs/openssl + sys-apps/lsb-release + sys-devel/gcc:* + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" +BDEPEND=" + prefix? ( dev-util/patchelf ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" + +# stripping rust may break it (at least on x86_64) +# https://github.com/rust-lang/rust/issues/112286 +RESTRICT="strip" + +QA_PREBUILT=" + opt/${P}/bin/.* + opt/${P}/lib/.*.so* + opt/${P}/libexec/.* + opt/${P}/lib/rustlib/.*/bin/.* + opt/${P}/lib/rustlib/.*/lib/.* +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" + +pkg_pretend() { + if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then + die "${CHOST} is not supported by upstream Rust. You must use a hard float version." + fi +} + +src_unpack() { + # sadly rust-src tarball does not have corresponding .asc file + # so do partial verification + if use verify-sig; then + for f in ${A}; do + if [[ -f ${DISTDIR}/${f}.asc ]]; then + verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" + fi + done + fi + + default_src_unpack + + mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die +} + +patchelf_for_bin() { + local filetype=$(file -b ${1}) + if [[ ${filetype} == *ELF*interpreter* ]]; then + einfo "${1}'s interpreter changed" + patchelf ${1} --set-interpreter ${2} || die + elif [[ ${filetype} == *script* ]]; then + hprefixify ${1} + fi +} + +multilib_src_install() { + if multilib_is_native_abi; then + + # start native abi install + pushd "${S}" >/dev/null || die + local analysis std + analysis="$(grep 'analysis' ./components)" + std="$(grep 'std' ./components)" + local components="rustc,cargo,${std}" + use doc && components="${components},rust-docs" + use clippy && components="${components},clippy-preview" + use rustfmt && components="${components},rustfmt-preview" + use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" + # Rust component 'rust-src' is extracted from separate archive + if use rust-src; then + einfo "Combining rust and rust-src installers" + mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die + echo rust-src >> ./components || die + components="${components},rust-src" + fi + ./install.sh \ + --components="${components}" \ + --disable-verify \ + --prefix="${ED}/opt/${P}" \ + --mandir="${ED}/opt/${P}/man" \ + --disable-ldconfig \ + || die + + docompress /opt/${P}/man/ + + if use prefix; then + local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) + ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" + find "${ED}/opt/${P}/bin" -type f -print0 | \ + while IFS= read -r -d '' filename; do + patchelf_for_bin ${filename} ${interpreter} \; || die + done + eend $? + fi + + local symlinks=( + cargo + rustc + rustdoc + rust-gdb + rust-gdbgui + rust-lldb + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- + local ver_i="${i}-bin-${PV}" + ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die + dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" + dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" + dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" + dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" + + # make all capital underscored variable + local CARGO_TRIPLET="$(rust_abi)" + CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" + CARGO_TRIPLET="${CARGO_TRIPLET^^}" + cat <<-_EOF_ > "${T}/50${P}" + MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" + $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") + _EOF_ + doenvd "${T}/50${P}" + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + popd >/dev/null || die + #end native abi install + + else + local rust_target + rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" + dodir "/opt/${P}/lib/rustlib" + cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ + "${ED}/opt/${P}/lib/rustlib" || die + fi + + # BUG: installs x86_64 binary on other arches + rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die +} + +pkg_postinst() { + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + if has_version app-editors/emacs; then + optfeature "emacs support for rust" app-emacs/rust-mode + fi + + if has_version app-editors/gvim || has_version app-editors/vim; then + optfeature "vim support for rust" app-vim/rust-vim + fi +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust-bin/rust-bin-1.84.1.ebuild b/dev-lang/rust-bin/rust-bin-1.84.1.ebuild deleted file mode 100644 index 338e50f2b5d5..000000000000 --- a/dev-lang/rust-bin/rust-bin-1.84.1.ebuild +++ /dev/null @@ -1,253 +0,0 @@ -# Copyright 1999-2025 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 19 ) -LLVM_OPTIONAL="yes" - -inherit llvm-r1 multilib prefix rust-toolchain toolchain-funcs verify-sig multilib-minimal optfeature - -MY_P="rust-${PV}" -# curl -L static.rust-lang.org/dist/channel-rust-${PV}.toml 2>/dev/null | grep "xz_url.*rust-src" -MY_SRC_URI="${RUST_TOOLCHAIN_BASEURL%/}/2025-01-30/rust-src-${PV}.tar.xz" -GENTOO_BIN_BASEURI="https://dev.gentoo.org/~arthurzam/distfiles/${CATEGORY}/${PN}" # omit leading slash - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" -SRC_URI="$(rust_all_arch_uris ${MY_P}) - rust-src? ( ${MY_SRC_URI} ) -" -# Keep this separate to allow easy commenting out if not yet built -SRC_URI+=" sparc? ( ${GENTOO_BIN_BASEURI}/${MY_P}-sparc64-unknown-linux-gnu.tar.xz ) " -SRC_URI+=" mips? ( - abi_mips_o32? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips-unknown-linux-gnu.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mipsel-unknown-linux-gnu.tar.xz ) - ) - abi_mips_n64? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64-unknown-linux-gnuabi64.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-mips64el-unknown-linux-gnuabi64.tar.xz ) - ) -)" -SRC_URI+=" riscv? ( - elibc_musl? ( ${GENTOO_BIN_BASEURI}/${MY_P}-riscv64gc-unknown-linux-musl.tar.xz ) -)" -SRC_URI+=" ppc64? ( elibc_musl? ( - big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64-unknown-linux-musl.tar.xz ) - !big-endian? ( ${GENTOO_BIN_BASEURI}/${MY_P}-powerpc64le-unknown-linux-musl.tar.xz ) -) )" - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" -KEYWORDS="~amd64 ~arm ~arm64 ~loong ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86" -IUSE="big-endian clippy cpu_flags_x86_sse2 doc prefix rust-analyzer rust-src rustfmt" - -RDEPEND=" - >=app-eselect/eselect-rust-20190311 - dev-libs/openssl - sys-apps/lsb-release - sys-devel/gcc:* - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" -BDEPEND=" - prefix? ( dev-util/patchelf ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -REQUIRED_USE="x86? ( cpu_flags_x86_sse2 )" - -# stripping rust may break it (at least on x86_64) -# https://github.com/rust-lang/rust/issues/112286 -RESTRICT="strip" - -QA_PREBUILT=" - opt/${P}/bin/.* - opt/${P}/lib/.*.so* - opt/${P}/libexec/.* - opt/${P}/lib/rustlib/.*/bin/.* - opt/${P}/lib/rustlib/.*/lib/.* -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="opt/${P}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/rust.asc" - -pkg_pretend() { - if [[ "$(tc-is-softfloat)" != "no" ]] && [[ ${CHOST} == armv7* ]]; then - die "${CHOST} is not supported by upstream Rust. You must use a hard float version." - fi -} - -src_unpack() { - # sadly rust-src tarball does not have corresponding .asc file - # so do partial verification - if use verify-sig; then - for f in ${A}; do - if [[ -f ${DISTDIR}/${f}.asc ]]; then - verify-sig_verify_detached "${DISTDIR}/${f}" "${DISTDIR}/${f}.asc" - fi - done - fi - - default_src_unpack - - mv "${WORKDIR}/${MY_P}-$(rust_abi)" "${S}" || die -} - -patchelf_for_bin() { - local filetype=$(file -b ${1}) - if [[ ${filetype} == *ELF*interpreter* ]]; then - einfo "${1}'s interpreter changed" - patchelf ${1} --set-interpreter ${2} || die - elif [[ ${filetype} == *script* ]]; then - hprefixify ${1} - fi -} - -multilib_src_install() { - if multilib_is_native_abi; then - - # start native abi install - pushd "${S}" >/dev/null || die - local analysis std - analysis="$(grep 'analysis' ./components)" - std="$(grep 'std' ./components)" - local components="rustc,cargo,${std}" - use doc && components="${components},rust-docs" - use clippy && components="${components},clippy-preview" - use rustfmt && components="${components},rustfmt-preview" - use rust-analyzer && components="${components},rust-analyzer-preview,${analysis}" - # Rust component 'rust-src' is extracted from separate archive - if use rust-src; then - einfo "Combining rust and rust-src installers" - mv -v "${WORKDIR}/rust-src-${PV}/rust-src" "${S}" || die - echo rust-src >> ./components || die - components="${components},rust-src" - fi - ./install.sh \ - --components="${components}" \ - --disable-verify \ - --prefix="${ED}/opt/${P}" \ - --mandir="${ED}/opt/${P}/man" \ - --disable-ldconfig \ - || die - - docompress /opt/${P}/man/ - - if use prefix; then - local interpreter=$(patchelf --print-interpreter "${EPREFIX}"/bin/bash) - ebegin "Changing interpreter to ${interpreter} for Gentoo prefix at ${ED}/opt/${P}/bin" - find "${ED}/opt/${P}/bin" -type f -print0 | \ - while IFS= read -r -d '' filename; do - patchelf_for_bin ${filename} ${interpreter} \; || die - done - eend $? - fi - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /opt/rust-bin-/bin/rustc- - local ver_i="${i}-bin-${PV}" - ln -v "${ED}/opt/${P}/bin/${i}" "${ED}/opt/${P}/bin/${ver_i}" || die - dosym "../../opt/${P}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "../../../opt/${P}/lib" "/usr/lib/rust/lib-bin-${PV}" - dosym "../../../opt/${P}/man" "/usr/lib/rust/man-bin-${PV}" - dosym "../../opt/${P}/lib/rustlib" "/usr/lib/rustlib-bin-${PV}" - dosym "../../../opt/${P}/share/doc/rust" "/usr/share/doc/${P}" - - # make all capital underscored variable - local CARGO_TRIPLET="$(rust_abi)" - CARGO_TRIPLET="${CARGO_TRIPLET//-/_}" - CARGO_TRIPLET="${CARGO_TRIPLET^^}" - cat <<-_EOF_ > "${T}/50${P}" - LDPATH="${EPREFIX}/usr/lib/rust/lib-bin-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-bin-${PV}" - $(usev elibc_musl "CARGO_TARGET_${CARGO_TRIPLET}_RUSTFLAGS=\"-C target-feature=-crt-static\"") - _EOF_ - doenvd "${T}/50${P}" - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - popd >/dev/null || die - #end native abi install - - else - local rust_target - rust_target="$(rust_abi $(get_abi_CHOST ${v##*.}))" - dodir "/opt/${P}/lib/rustlib" - cp -vr "${WORKDIR}/rust-${PV}-${rust_target}/rust-std-${rust_target}/lib/rustlib/${rust_target}"\ - "${ED}/opt/${P}/lib/rustlib" || die - fi - - # BUG: installs x86_64 binary on other arches - rm -f "${ED}/opt/${P}/lib/rustlib/"*/bin/rust-llvm-dwp || die -} - -pkg_postinst() { - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - if has_version app-editors/emacs; then - optfeature "emacs support for rust" app-emacs/rust-mode - fi - - if has_version app-editors/gvim || has_version app-editors/vim; then - optfeature "vim support for rust" app-vim/rust-vim - fi -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust/Manifest b/dev-lang/rust/Manifest index 49d2ac443c33..3d08c8e892b6 100644 --- a/dev-lang/rust/Manifest +++ b/dev-lang/rust/Manifest @@ -44,18 +44,17 @@ DIST rustc-1.84.0-src.tar.xz 354993944 BLAKE2B e4697d8a9f42484556ed490390aef535b DIST rustc-1.84.0-src.tar.xz.asc 801 BLAKE2B b1846702f36b92c479499f5eb704ce1e272131fc1b6b625c8d64c873a82ed79b1de8cceb1f21ae4b9dccf81e258547debf367b7b769ac94ed10a59dee18f79f1 SHA512 5ada0e0fed9901044eaa0d7cb657f685c7e183e91245714abe4a0a8bf3062a7de281932c7de7587220df0542511f6011d057bd8bed19d98c755eab74091cdfdb DIST rustc-1.84.1-src.tar.xz 355078168 BLAKE2B 849e8c909493bf76ce9749b9dcb1967180223b91a41d690bc477e78557d4e24949c9a8d8276d824af8c54ad62bc4a998e7a8efbc0bbd2008a4f64f51a7690d48 SHA512 f1cc4765736551508408126e44086988e8ddc30c1a929bf7b61c6be85ad0d65928dd5fb1041cfaeee8eb37d2208f2c1917e276aef2bc9a8e40e34f6713b349e1 DIST rustc-1.84.1-src.tar.xz.asc 801 BLAKE2B f3decd3470fd1eff33adbb376490a30eb8db28dd4176bde0fefe4f60acf79c3dd0e1a330d519b5319360136ea7d0a124f6720dea08617202d9e9298da992ccf6 SHA512 a241fe3efba293f3e872b74f09dd0d184e0239afd1416326d57bf1134d92721c65b187f5c99962b51671877a539f18e82d2d797c76af42615c11a8bb3905f796 -EBUILD rust-1.71.1-r100.ebuild 22077 BLAKE2B 1082eec69086f44922a4d9b4d7d0fbee5104c4653fe6320764748638389871081c5812aa0bed84ecd36f6d764e38a257c640518b3ca190797ca595506106739f SHA512 461a0bd207a4424c2512ee404202b14fdc8bf6d4bd628e38f325584ff4e452de0f3615e3a3683b2d1eae0b9498443eccb10f6800cf3c6be862f1643b9203c017 -EBUILD rust-1.74.1-r100.ebuild 37690 BLAKE2B 93ff1451143f5282ef231911a3b820649052300b933a9e6fd602ce6dcbf6f88af118e2835e59d3b520ba7f09a292d71d1f9b7b7a48bbbeadaaf880ff0a0dc3ea SHA512 2709d8377472eda62ebd2d0c296b1b678c106e6cc33268823391f0e2072f06551e1bb9094017077f4bd56aa0a34bee3a329d0a6f27fd1f8304af6abcc9e9b241 -EBUILD rust-1.75.0-r100.ebuild 23584 BLAKE2B ec9b5d0dc286ce5f1931df6e60817531f3ce6002a3916e47355c557693b19bdacdefd3e01d309880c8e48e53d4fc9082bab4aa2ed9da34c51df8b8c25e60305f SHA512 f759a9db473a3d19571b20669b9631446b71c508ba9cf42edc126e1da03ce8ad34478b6712f48711ee152001841d31662ea6f227faacec1fb51b625522415e64 -EBUILD rust-1.76.0-r100.ebuild 20091 BLAKE2B c9132c08aa051dcd3412909472312db21db79db7215beacc564c2d58e00b2dbd758f4bfa3a81d2a5dfa70a1bbf9ec82a96dbd7042e561d05c5e3cb7a699d240c SHA512 c9a821bfb2f693ab5d628eff20dcdea32bc1f29540e22c465275f89a6559f6db6d9ab93fd2cabba30f20b5bdd9cb24645d4f73f9b1976bb113b06544ea4746c2 -EBUILD rust-1.77.1-r100.ebuild 23547 BLAKE2B dfa0b1105be8a58c88afd4fe184381bc83516f9935e6ac533d8f44bc0953b3da9305cbfdd44915810d87fc89cd2aee76f06e30d617ed4425cd01cbe429e5e8c4 SHA512 9ce03c548c77382a8fd91690a6071bf082f468e5807cd132a0b8206208580336a61991f7d563b5d12629d920753e2b2d59d099e7f7afad17d259717a17af6cd5 -EBUILD rust-1.78.0-r100.ebuild 23782 BLAKE2B 82f2bbdc80f99f3636683e406bd3263f4759418552fcacf071668451a3dcd89f636b0205559638fab834327ef841cf477d43e6ac945313f5ba60c34305d930fa SHA512 2c65b01e2e31e97f9a1e06d177345b8f2024a60806514516376e9d5be43cd5f3a2f2d4d31f097016dd31b65ba282c0b69dc54e6549738e898fa47add58892ff2 -EBUILD rust-1.79.0-r100.ebuild 23782 BLAKE2B 82f2bbdc80f99f3636683e406bd3263f4759418552fcacf071668451a3dcd89f636b0205559638fab834327ef841cf477d43e6ac945313f5ba60c34305d930fa SHA512 2c65b01e2e31e97f9a1e06d177345b8f2024a60806514516376e9d5be43cd5f3a2f2d4d31f097016dd31b65ba282c0b69dc54e6549738e898fa47add58892ff2 -EBUILD rust-1.80.1-r100.ebuild 23654 BLAKE2B 10e70066371a07ff8e0618533ad210c5080e2cfcba87fb69535c7845b508e62825d9d392068d1ee264fcf951c20c9bbe815e4868ac08d0f97b68a6a77a03417e SHA512 e1869237eb35a8f27ed1b540b679c58aee3303e21d7f6f96af8828171c1bfd1d32c7c0a3b94e15fc2ca4bc0e0840ee9e79fd5a93b5c3e8e2e9b1fe70965c875a -EBUILD rust-1.81.0-r100.ebuild 23851 BLAKE2B 03c31a2fca18dbddce10b8652bba84d86fcde844a24c3bb4c1981f7ef549627c03008c4df82fe0529368e4e7af632ed605a49502a79ff8c670e680a5ae94c10b SHA512 b313e6de5b77854bc2c2afb6ae1347f85a0dbbec86111b8f266ed6f3e92d0eee461588b209b1cead0caa433336c7c63040d08fd00de3272c51cf68c5d2ba3ff1 -EBUILD rust-1.82.0-r100.ebuild 23997 BLAKE2B 227d902466e31d42551be544e88839814ffb05e43fdcebdcdf43e6afa9019ea398ac9123a6e38f73f7b7772891a504a425d570401937d43667d2cead70597c46 SHA512 cbff12c735f0a0bd1f098a27f69212affce60da38b79409da4b10b256d9bb8ebdd4129b78786354bac9fba63c4889e5a58e10d522e928901e7ff20c921925da4 -EBUILD rust-1.82.0-r101.ebuild 24046 BLAKE2B d132b0109d9d1e68ded0357221609102f0e638069e4ec2bf61e53fb94b388fe67e97b5cb5ee3f29ecdc3a9f4c18a4ad6cef0e08addc248289ae3178c2e04aa04 SHA512 31f3e5bfa8345bcad487474bd8e0570c31e51a7e477d030f2fe61148e4598f069211139504a43958367b740cf38b18ff92e46e49d6080b7df8177453e9dae14e -EBUILD rust-1.83.0-r1.ebuild 23279 BLAKE2B 183f2a6f686030c2efad110709d52b68c655dc374faa748f83c5d33ced7e44b81d5c321e843e8ffcd6c4d248bb8b6452986eb9f1e0b636e199404668f3a54518 SHA512 8220054d98db8bb50d9abd765ffefaafd360ad13ee566485e2f82930a8821b32c7b5e33080127e8fea5dbe655a81c8edd1563d0efa5c78be4c41d8bd4af22050 -EBUILD rust-1.84.0.ebuild 23404 BLAKE2B 88d74e3cddb102b4350def9572ff051b7f87819a8fe0b261e0583e10671ec79e0bee6b900aa5314629f0800ade3b94eff8676db7b913b2cbcf926e57ac3e7b97 SHA512 47ea8bf8f6e2b39902cf53558bb33a90be1ae5182e076904e243201057e0ca239e775fd30b3365078bd2e7406987eeb6251cedca43421ee52faa70c23066278d -EBUILD rust-1.84.1.ebuild 23389 BLAKE2B 2ad9acb5b85e5e2a991cc78fe7389eaf41772e4e068e26a196931b6825ed62472659cdde3ec6bb381aa7738f53123cc10fbf0d655f8eb39d59c17b88f86e600d SHA512 6ab88695cc1f8420e4b45914a29fc9e5f21618ecb1c202141c156624d95bfce4e341a80553928c3b541c795fef7c309b4040607487109b3d71d3d3e615f1f556 +EBUILD rust-1.71.1-r101.ebuild 22030 BLAKE2B 58e75a73001d98eb55cbe015daf1a25b432594dcd455b7a068695d149ae22ac4934e05494716d25c45976f8c17f826d0022d38044710f4a7f0c1aeea46a875ad SHA512 51b9c7898587ace9e812b51db86e3fdc51e53eba29bb65ab6dd903da417adab07b15cad5f99cabbe541c08391043ba06bcdf7da8b20d45817fb5bc6cfc30f77c +EBUILD rust-1.74.1-r101.ebuild 37643 BLAKE2B 3c25e40a1c7a2e2b6223e544f5c5dd041715b04dec89d0afd25e072ebb5f836b91943330d0010f3b6a17e728811718cbaf344a5dabf001227f48788b157a6851 SHA512 3e89d30915b7c92f2edb164f1a3fe1e2fea47a4a952717f2a110379852f85cf3f4013ef2436f003a79b60ccc76888056a15da2c8eccc19e502bfede9f4ebd7b4 +EBUILD rust-1.75.0-r101.ebuild 23537 BLAKE2B 3314232dbba9bd04f761e50f963f95db91f45eab4ee4dbbf578c05bed09e079edc27ee37a7d71aa9b6969e1ed32d2ff91ee5cdff3cd7676e60bfba0344f4aba2 SHA512 e09ecdbbbb53a872b0a628610585239c3e53165e8ca5737bcbcfff74e1f5418ca818a1f3ba38227cd477a630993ecb05fed20c8010c9a1b56c2efa32c88a6d65 +EBUILD rust-1.76.0-r101.ebuild 20045 BLAKE2B b7d74577b9491930c6f950bfd4bcaec6bbf25c938f67d293f85ca818b56791ed7a64b7a8fc0ea5f15be00a4bfb384c91725a200061bce16a188b83659881bdf4 SHA512 c272ce7816b9ca45fc7f86019ca0c37944191632d5d6491489ead86b7ff7b6b35a65b85bf97ef0a8415d29e6b9cd53649a3d93c6670fd22f734a4bb96d0c2b75 +EBUILD rust-1.77.1-r101.ebuild 23501 BLAKE2B 29040b14df7538cf8cd450a6a6b4bcfed4d40e507327dae34287363c3069b151ee55eb53f4e5df14954a9b81de74484a05fc48f44bd71139d45d74e21014d1fd SHA512 aedaa5c9c7c400fc3d76e8eb99e93c5ed7f5419f97cb0516f6f065c90919df4309235cd6ed10264d02f36cc470152e355a6c90cf4c6b937347115f198bc686bf +EBUILD rust-1.78.0-r101.ebuild 23736 BLAKE2B 555bab47f61ab8520369a7878ae5ab644eeaeef46cf87b2b38783b2c04e2778e844d6aae1de85bde4a9c0be4dda25e22829fd4cbf71bf9915ddb4ef90d94995a SHA512 3d0b3f539e509c9d4436a150a3b0598cdc7e30d57b2eb41e9371ff824a05bb28ff031e604c7936f4b2c492d3153f602acc2ed5c821cea757b992c5a4faa4d36a +EBUILD rust-1.79.0-r101.ebuild 23736 BLAKE2B 555bab47f61ab8520369a7878ae5ab644eeaeef46cf87b2b38783b2c04e2778e844d6aae1de85bde4a9c0be4dda25e22829fd4cbf71bf9915ddb4ef90d94995a SHA512 3d0b3f539e509c9d4436a150a3b0598cdc7e30d57b2eb41e9371ff824a05bb28ff031e604c7936f4b2c492d3153f602acc2ed5c821cea757b992c5a4faa4d36a +EBUILD rust-1.80.1-r101.ebuild 23608 BLAKE2B 418beedaf87e3c1dfefdce12564dde1e10ff6722690f4d7a60faff0aa89bc1953c0a3fddbae5de131cd386f7d0c0c1377ecaa6acbdba3f3c0aeedd4f4fe75067 SHA512 3006aab0d8138ba6dcf5715386d69bfaafc1767dcc8019253f27e615e198588b3ff0b7d98b7bb70a05804dda846572c49f9590ca0f228481c4168456e27af1b7 +EBUILD rust-1.81.0-r101.ebuild 23805 BLAKE2B 682aa0f041d84310e3fe85f2b92ef476090207c619d92d75c84173b63b86c14b052ae93d105d85a6ddcc1fa887dd791dcd9d3af3c4b9302af27f5902fb190dcf SHA512 fafe7c8b80c5a5c6c0783a113c2dce3c96dc5c8684da29241836ff59d266b0ea0e1d4d34ceb0c1c94f79f66bfc2221ea23b2d6aeb797e348d0e465ca1c5297f0 +EBUILD rust-1.82.0-r102.ebuild 24000 BLAKE2B a40774735acbe3af636566bd83c799422bb365f5b3cbc16f35ee4a13cd2415f3a2aade6ae59c910e8aa6671d26a5387eb66acf3aa9a38b494bae90a5171dc1ba SHA512 7be689a92fd46a71425088f388cb5fc380a5baf82f85119450b1c8a7464f8435e49b2ba4cf4479c728bc8c4d250455d33bd77262952b9f0143ed2a0ccdb4638d +EBUILD rust-1.83.0-r2.ebuild 23233 BLAKE2B b85425b5ed8eb8e344df196f4728e5d4d3606a0fb4c4ead41b9d8ff631736c566ffb8559579c0ee00675a4b1457c4b19d54cd06ff63abe3d997ad46b07028551 SHA512 767ccf3e9ee1812b70268239123f1ebdf45be6be3ae498d359b9b09ad2f095da1c21fbe519ce7971850aee2760826655576e0ef560e93b0f5432ef25cc180ef6 +EBUILD rust-1.84.0-r1.ebuild 21926 BLAKE2B 66c3092a1e85825a1f1cebdca4a565b8cac89dc48c52d39fa594dec33c95bbb2b9567a3160d3b632643dc9e46fdbd416511d6560179639343437d68d95ef9c52 SHA512 b23b45a6bd4faa321a953ecb8b202edb03cce2a29905f272eeefcd52d4626350487300cbef91306f0cf6f3c919a59c318ca54e637b31dc97d0d3439f87a58265 +EBUILD rust-1.84.1-r1.ebuild 21911 BLAKE2B fdaf45f702f65a7050fd14b960437c476063706127d82bc154234f8be1ec5058874baee6f4043c43ee45b7e473a88dcac7efe3ba61b49bef48052e24c740f16c SHA512 839b6ee0d8ce2fc139bfbaca64008ba55fee0728c9c004c1e79a5f9adec6159eaeb7e054054fcf4dc6f2687ffeff31a5aa5ed0ef5b46dc7ff01352bbcd765b3a MISC metadata.xml 1841 BLAKE2B 48a8167ae44a7f4892b917895298627ac920af6c488180980e65bdeec53b650455fc6d7dddad0a7a8257d473080082377fb6b6df6a834b294b6e6485e6784a1e SHA512 1f5fd792b65ccac89a61233004980d9f7cbaecea5d05f35f9cc2dc9cab4e3ccfcd46828e88770a1b8ba5ca23064b6a75eea72a0b32bcce52bb399b85ac95f755 diff --git a/dev-lang/rust/rust-1.71.1-r100.ebuild b/dev-lang/rust/rust-1.71.1-r100.ebuild deleted file mode 100644 index dedaab4fcbad..000000000000 --- a/dev-lang/rust/rust-1.71.1-r100.ebuild +++ /dev/null @@ -1,711 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 16 ) -PYTHON_COMPAT=( python3_{10..12} ) - -RUST_MAX_VER=${PV} -RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" - -inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing multilib multilib-build \ - optfeature python-any-r1 rust rust-toolchain toolchain-funcs verify-sig - -if [[ ${PV} = *beta* ]]; then - betaver=${PV//*beta} - BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" - MY_P="rustc-beta" - SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" -else - MY_P="rustc-${PV}" - SRC="${MY_P}-src.tar.xz" - KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv sparc x86" -fi - -DESCRIPTION="Language empowering everyone to build reliable and efficient software" -HOMEPAGE="https://www.rust-lang.org/" - -SRC_URI=" - https://static.rust-lang.org/dist/${SRC} - verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) -" -S="${WORKDIR}/${MY_P}-src" - -# keep in sync with llvm ebuild of the same version as bundled one. -ALL_LLVM_TARGETS=( AArch64 AMDGPU ARM AVR BPF Hexagon Lanai LoongArch Mips MSP430 - NVPTX PowerPC RISCV Sparc SystemZ VE WebAssembly X86 XCore ) -ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) -LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} - -ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4 UoI-NCSA" -SLOT="${PV}" - -IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind +lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" - -LLVM_DEPEND=() -# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation -for _x in "${ALL_LLVM_TARGETS[@]}"; do - LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) -done -LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) -LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) - -BDEPEND="${PYTHON_DEPS} - app-eselect/eselect-rust - || ( - >=sys-devel/gcc-4.7 - >=llvm-core/clang-3.5 - ) - !system-llvm? ( - >=dev-build/cmake-3.13.4 - app-alternatives/ninja - ) - test? ( dev-debug/gdb ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -DEPEND=" - >=app-arch/xz-utils-5.2 - net-misc/curl:=[http2,ssl] - sys-libs/zlib:= - dev-libs/openssl:0= - system-llvm? ( - ${LLVM_DEPEND[*]} - llvm-libunwind? ( llvm-runtimes/libunwind:= ) - ) - !system-llvm? ( - !llvm-libunwind? ( - elibc_musl? ( sys-libs/libunwind:= ) - ) - ) -" - -RDEPEND="${DEPEND} - app-eselect/eselect-rust - dev-lang/rust-common - sys-apps/lsb-release - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" - -REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) - miri? ( nightly ) - parallel-compiler? ( nightly ) - rust-analyzer? ( rust-src ) - test? ( ${ALL_LLVM_TARGETS[*]} ) - wasm? ( llvm_targets_WebAssembly ) - x86? ( cpu_flags_x86_sse2 ) -" - -# we don't use cmake.eclass, but can get a warning -CMAKE_WARN_UNUSED_CLI=no - -QA_FLAGS_IGNORED=" - usr/lib/${PN}/${PV}/bin/.* - usr/lib/${PN}/${PV}/libexec/.* - usr/lib/${PN}/${PV}/lib/lib.*.so - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_SONAME=" - usr/lib/${PN}/${PV}/lib/lib.*.so.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_PRESTRIPPED=" - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -# causes double bootstrap -RESTRICT="test" - -VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc - -PATCHES=( - "${FILESDIR}"/1.71.1-fix-bootstrap-version-comparison.patch - "${FILESDIR}"/1.70.0-ignore-broken-and-non-applicable-tests.patch - "${FILESDIR}"/1.62.1-musl-dynamic-linking.patch - "${FILESDIR}"/1.67.0-doc-wasm.patch -) - -toml_usex() { - usex "${1}" true false -} - -pre_build_checks() { - local M=9216 - # multiply requirements by 1.3 if we are doing x86-multilib - if use amd64; then - M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) - fi - M=$(( $(usex clippy 128 0) + ${M} )) - M=$(( $(usex miri 128 0) + ${M} )) - M=$(( $(usex rustfmt 256 0) + ${M} )) - # add 2G if we compile llvm and 256M per llvm_target - if ! use system-llvm; then - M=$(( 2048 + ${M} )) - local ltarget - for ltarget in ${ALL_LLVM_TARGETS[@]}; do - M=$(( $(usex ${ltarget} 256 0) + ${M} )) - done - fi - M=$(( $(usex wasm 256 0) + ${M} )) - M=$(( $(usex debug 2 1) * ${M} )) - eshopts_push -s extglob - if is-flagq '-g?(gdb)?([1-9])'; then - M=$(( 15 * ${M} / 10 )) - fi - eshopts_pop - M=$(( $(usex doc 256 0) + ${M} )) - CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} -} - -llvm_check_deps() { - has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" -} - -# Is LLVM being linked against libc++? -is_libcxx_linked() { - local code='#include -#if defined(_LIBCPP_VERSION) - HAVE_LIBCXX -#endif -' - local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 - [[ ${out} == *HAVE_LIBCXX* ]] -} - -pkg_pretend() { - pre_build_checks -} - -pkg_setup() { - pre_build_checks - python-any-r1_pkg_setup - - export LIBGIT2_NO_PKG_CONFIG=1 #749381 - - rust_pkg_setup - - if use system-llvm; then - llvm-r1_pkg_setup - - local llvm_config="$(get_llvm_prefix)/bin/llvm-config" - export LLVM_LINK_SHARED=1 - export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" - fi -} - -src_configure() { - filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 - - local rust_target="" rust_targets="" arch_cflags - - # Collect rust target names to compile standard libs for all ABIs. - for v in $(multilib_get_enabled_abi_pairs); do - rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" - done - if use wasm; then - rust_targets+=",\"wasm32-unknown-unknown\"" - if use system-llvm; then - # un-hardcode rust-lld linker for this target - # https://bugs.gentoo.org/715348 - sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/wasm_base.rs || die - fi - fi - rust_targets="${rust_targets#,}" - - # cargo and rustdoc are mandatory and should always be included - local tools='"cargo","rustdoc", "rust-demangler"' - use clippy && tools+=',"clippy"' - use miri && tools+=',"miri"' - use rustfmt && tools+=',"rustfmt"' - use rust-analyzer && tools+=',"rust-analyzer"' - use rust-src && tools+=',"src"' - - local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" - # in case of prefix it will be already prefixed, as --print sysroot returns full path - [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" - - rust_target="$(rust_abi)" - - LLVM_EXPERIMENTAL_TARGETS=() - for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do - if use llvm_targets_${_x} ; then - LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) - fi - done - LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} - - local cm_btype="$(usex debug DEBUG RELEASE)" - cat <<- _EOF_ > "${S}"/config.toml - changelog-seen = 2 - [llvm] - download-ci-llvm = false - optimize = $(toml_usex !debug) - release-debuginfo = $(toml_usex debug) - assertions = $(toml_usex debug) - ninja = true - targets = "${LLVM_TARGETS// /;}" - experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" - link-shared = $(toml_usex system-llvm) - $(if is_libcxx_linked; then - # https://bugs.gentoo.org/732632 - echo "use-libcxx = true" - echo "static-libstdcpp = false" - fi) - $(case "${rust_target}" in - i586-*-linux-*) - # https://github.com/rust-lang/rust/issues/93059 - echo 'cflags = "-fcf-protection=none"' - echo 'cxxflags = "-fcf-protection=none"' - echo 'ldflags = "-fcf-protection=none"' - ;; - *) - ;; - esac) - enable-warnings = false - [llvm.build-config] - CMAKE_VERBOSE_MAKEFILE = "ON" - CMAKE_C_FLAGS_${cm_btype} = "${CFLAGS}" - CMAKE_CXX_FLAGS_${cm_btype} = "${CXXFLAGS}" - CMAKE_EXE_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}" - CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}" - CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}" - CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = "${ARFLAGS}" - [build] - build-stage = 2 - test-stage = 2 - build = "${rust_target}" - host = ["${rust_target}"] - target = [${rust_targets}] - cargo = "${rust_stage0_root}/bin/cargo" - rustc = "${rust_stage0_root}/bin/rustc" - rustfmt = "${rust_stage0_root}/bin/rustfmt" - docs = $(toml_usex doc) - compiler-docs = false - submodules = false - python = "${EPYTHON}" - locked-deps = true - vendor = true - extended = true - tools = [${tools}] - verbose = 2 - sanitizers = false - profiler = true - cargo-native-static = false - [install] - prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" - sysconfdir = "etc" - docdir = "share/doc/rust" - bindir = "bin" - libdir = "lib" - mandir = "share/man" - [rust] - # https://github.com/rust-lang/rust/issues/54872 - codegen-units-std = 1 - optimize = true - debug = $(toml_usex debug) - debug-assertions = $(toml_usex debug) - debug-assertions-std = $(toml_usex debug) - debuginfo-level = $(usex debug 2 0) - debuginfo-level-rustc = $(usex debug 2 0) - debuginfo-level-std = $(usex debug 2 0) - debuginfo-level-tools = $(usex debug 2 0) - debuginfo-level-tests = 0 - backtrace = true - incremental = false - default-linker = "$(tc-getCC)" - parallel-compiler = $(toml_usex parallel-compiler) - channel = "$(usex nightly nightly stable)" - description = "gentoo" - rpath = false - verbose-tests = true - optimize-tests = $(toml_usex !debug) - codegen-tests = true - dist-src = false - remap-debuginfo = true - lld = $(usex system-llvm false $(toml_usex wasm)) - # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it - # https://github.com/rust-lang/rust/issues/74976 - # https://github.com/rust-lang/rust/issues/76526 - deny-warnings = $(usex wasm $(usex doc false true) true) - backtrace-on-ice = true - jemalloc = false - lto = "$(usex lto fat off)" - [dist] - src-tarball = false - compression-formats = ["xz"] - compression-profile = "balanced" - _EOF_ - - for v in $(multilib_get_enabled_abi_pairs); do - rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) - arch_cflags="$(get_abi_CFLAGS ${v##*.})" - - export CFLAGS_${rust_target//-/_}="${arch_cflags}" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${rust_target}] - ar = "$(tc-getAR)" - cc = "$(tc-getCC)" - cxx = "$(tc-getCXX)" - linker = "$(tc-getCC)" - ranlib = "$(tc-getRANLIB)" - llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; - # but we patch it and set to false here as well - if use elibc_musl; then - cat <<- _EOF_ >> "${S}"/config.toml - crt-static = false - _EOF_ - fi - done - if use wasm; then - cat <<- _EOF_ >> "${S}"/config.toml - [target.wasm32-unknown-unknown] - linker = "$(usex system-llvm lld rust-lld)" - # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 - profiler = false - _EOF_ - fi - - if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below - # experimental cross support - # discussion: https://bugs.gentoo.org/679878 - # TODO: c*flags, clang, system-llvm, cargo.eclass target support - # it would be much better if we could split out stdlib - # complilation to separate ebuild and abuse CATEGORY to - # just install to /usr/lib/rustlib/ - - # extra targets defined as a bash array - # spec format: :: - # best place would be /etc/portage/env/dev-lang/rust - # Example: - # RUST_CROSS_TARGETS=( - # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" - # ) - # no extra hand holding is done, no target transformations, all - # values are passed as-is with just basic checks, so it's up to user to supply correct values - # valid rust targets can be obtained with - # rustc --print target-list - # matching cross toolchain has to be installed - # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) - # only gcc toolchains installed with crossdev are checked for now. - - # BUG: we can't pass host flags to cross compiler, so just filter for now - # BUG: this should be more fine-grained. - filter-flags '-mcpu=*' '-march=*' '-mtune=*' - - local cross_target_spec - for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do - # extracts first element form :: - local cross_llvm_target="${cross_target_spec%%:*}" - # extracts toolchain triples, : - local cross_triples="${cross_target_spec#*:}" - # extracts first element after before : separator - local cross_rust_target="${cross_triples%%:*}" - # extracts last element after : separator - local cross_toolchain="${cross_triples##*:}" - use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" - command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${cross_rust_target}] - ar = "${cross_toolchain}-ar" - cc = "${cross_toolchain}-gcc" - cxx = "${cross_toolchain}-g++" - linker = "${cross_toolchain}-gcc" - ranlib = "${cross_toolchain}-ranlib" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - if [[ "${cross_toolchain}" == *-musl* ]]; then - cat <<- _EOF_ >> "${S}"/config.toml - musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" - _EOF_ - fi - - # append cross target to "normal" target list - # example 'target = ["powerpc64le-unknown-linux-gnu"]' - # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' - - rust_targets="${rust_targets},\"${cross_rust_target}\"" - sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die - - ewarn - ewarn "Enabled ${cross_rust_target} rust target" - ewarn "Using ${cross_toolchain} cross toolchain" - ewarn - if ! has_version -b 'sys-devel/binutils[multitarget]' ; then - ewarn "'sys-devel/binutils[multitarget]' is not installed" - ewarn "'strip' will be unable to strip cross libraries" - ewarn "cross targets will be installed with full debug information" - ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" - ewarn - ewarn "Alternatively llvm-strip can be used, it supports stripping any target" - ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" - ewarn - fi - done - fi # I_KNOW_WHAT_I_AM_DOING_CROSS - - einfo "Rust configured with the following flags:" - echo - echo RUSTFLAGS="\"${RUSTFLAGS}\"" - echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" - echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" - echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" - env | grep "CARGO_TARGET_.*_RUSTFLAGS=" - env | grep "CFLAGS_.*" - echo - einfo "config.toml contents:" - cat "${S}"/config.toml || die - echo -} - -src_compile() { - RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die -} - -src_test() { - # https://rustc-dev-guide.rust-lang.org/tests/intro.html - - # those are basic and codegen tests. - local tests=( - codegen - codegen-units - compile-fail - incremental - mir-opt - pretty - run-make - ) - - # fails if llvm is not built with ALL targets. - # and known to fail with system llvm sometimes. - use system-llvm || tests+=( assembly ) - - # fragile/expensive/less important tests - # or tests that require extra builds - # TODO: instead of skipping, just make some nonfatal. - if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then - tests+=( - rustdoc - rustdoc-js - rustdoc-js-std - rustdoc-ui - run-make-fulldeps - ui - ui-fulldeps - ) - fi - - local i failed=() - einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" - for i in "${tests[@]}"; do - local t="src/test/${i}" - einfo "rust_src_test: running ${t}" - if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ - -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" - then - failed+=( "${t}" ) - eerror "rust_src_test: ${t} failed" - fi - done - - if [[ ${#failed[@]} -ne 0 ]]; then - eerror "rust_src_test: failure summary: ${failed[@]}" - die "aborting due to test failures" - fi -} - -src_install() { - DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die - - # bug #689562, #689160 - rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die - rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - rust-demangler - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use miri && symlinks+=( miri cargo-miri ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- - # need to fix eselect-rust to remove this hack. - local ver_i="${i}-${PV}" - if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then - einfo "Installing ${i} symlink" - ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die - else - ewarn "${i} symlink requested, but source file not found" - ewarn "please report this" - fi - dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" - dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" - dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" - dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" - dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" - - newenvd - "50${P}" <<-_EOF_ - LDPATH="${EPREFIX}/usr/lib/rust/lib-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" - _EOF_ - - rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-demangler - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/libexec - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use miri; then - echo /usr/bin/miri >> "${T}/provider-${P}" - echo /usr/bin/cargo-miri >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - - if use dist; then - insinto "/usr/lib/${PN}/${PV}/dist" - doins -r "${S}/build/dist/." - fi -} - -pkg_preinst() { - # 943308 and friends; basically --keep-going can forget to unmerge old rust - # but the soft blocker allows us to install conflicting files. - # This results in duplicated .{rlib,so} files which confuses rustc and results in - # the need for manual intervention. - if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then - # we need to find all .{rlib,so} files in the old rust lib directory - # and store them in an array for later use - readarray -d '' old_rust_libs < <( - find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ - -type f \( -name '*.rlib' -o -name '*.so' \) -print0) - export old_rust_libs - if [[ ${#old_rust_libs[@]} -gt 0 ]]; then - einfo "Found old .rlib and .so files in the old rust lib directory" - else - die "Found no old .rlib and .so files but old rust version is installed. Bailing!" - fi - fi -} - -pkg_postinst() { - - local old_rust="dev-lang/rust:stable/$(ver_cut 1-2)" - if has_version -b ${old_rust}; then - # Be _extra_ careful here as we're removing files from the live filesystem - local f - local only_one_file=() - einfo "Tidying up libraries files from non-slotted \`${old_rust}\`." - for f in "${old_rust_libs[@]}"; do - [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" - local base_name="${f%-*}" - local ext="${f##*.}" - local matching_files=("${base_name}"-*.${ext}) - case ${#matching_files[@]} in - 2) - einfo "Removing old .${ext}: ${f}" - rm "${f}" || die - ;; - 1) - # Turns out fingerprints are not as unique as we'd thought, _sometimes_ they collide, - # so we may have already installed over the old file. - # We'll warn about this just in case, but it's probably fine. - only_one_file+=( "${matching_files[0]}" ) - ;; - *) - die "Expected one or two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" - ;; - esac - done - if [[ ${#only_one_file} -gt 0 ]]; then - einfo "While tidying up non-slotted rust libraries for \`${old_rust}\`," - einfo "the following file(s) did not have a duplicate where one was expected:" - for f in "${only_one_file[@]}"; do - einfo " * ${f}" - done - einfo "" - einfo "This is unlikely to cause problems; the fingerprint for the library ended up being the same." - einfo "However, if you encounter any issues please report them to the Gentoo Rust Team." - fi - fi - - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - optfeature "Emacs support" "app-emacs/rust-mode" - optfeature "Vim support" "app-vim/rust-vim" -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust/rust-1.71.1-r101.ebuild b/dev-lang/rust/rust-1.71.1-r101.ebuild new file mode 100644 index 000000000000..a454fcc7d08a --- /dev/null +++ b/dev-lang/rust/rust-1.71.1-r101.ebuild @@ -0,0 +1,710 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 16 ) +PYTHON_COMPAT=( python3_{10..12} ) + +RUST_MAX_VER=${PV} +RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" + +inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing multilib multilib-build \ + optfeature python-any-r1 rust rust-toolchain toolchain-funcs verify-sig + +if [[ ${PV} = *beta* ]]; then + betaver=${PV//*beta} + BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" + MY_P="rustc-beta" + SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" +else + MY_P="rustc-${PV}" + SRC="${MY_P}-src.tar.xz" + KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv sparc x86" +fi + +DESCRIPTION="Language empowering everyone to build reliable and efficient software" +HOMEPAGE="https://www.rust-lang.org/" + +SRC_URI=" + https://static.rust-lang.org/dist/${SRC} + verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) +" +S="${WORKDIR}/${MY_P}-src" + +# keep in sync with llvm ebuild of the same version as bundled one. +ALL_LLVM_TARGETS=( AArch64 AMDGPU ARM AVR BPF Hexagon Lanai LoongArch Mips MSP430 + NVPTX PowerPC RISCV Sparc SystemZ VE WebAssembly X86 XCore ) +ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) +LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} + +ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4 UoI-NCSA" +SLOT="${PV}" + +IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" + +LLVM_DEPEND=() +# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation +for _x in "${ALL_LLVM_TARGETS[@]}"; do + LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) +done +LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) +LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) + +BDEPEND="${PYTHON_DEPS} + app-eselect/eselect-rust + || ( + >=sys-devel/gcc-4.7 + >=llvm-core/clang-3.5 + ) + !system-llvm? ( + >=dev-build/cmake-3.13.4 + app-alternatives/ninja + ) + test? ( dev-debug/gdb ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +DEPEND=" + >=app-arch/xz-utils-5.2 + net-misc/curl:=[http2,ssl] + sys-libs/zlib:= + dev-libs/openssl:0= + system-llvm? ( + ${LLVM_DEPEND[*]} + llvm-libunwind? ( llvm-runtimes/libunwind:= ) + ) + !system-llvm? ( + !llvm-libunwind? ( + elibc_musl? ( sys-libs/libunwind:= ) + ) + ) +" + +RDEPEND="${DEPEND} + app-eselect/eselect-rust + dev-lang/rust-common + sys-apps/lsb-release + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" + +REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) + miri? ( nightly ) + parallel-compiler? ( nightly ) + rust-analyzer? ( rust-src ) + test? ( ${ALL_LLVM_TARGETS[*]} ) + wasm? ( llvm_targets_WebAssembly ) + x86? ( cpu_flags_x86_sse2 ) +" + +# we don't use cmake.eclass, but can get a warning +CMAKE_WARN_UNUSED_CLI=no + +QA_FLAGS_IGNORED=" + usr/lib/${PN}/${PV}/bin/.* + usr/lib/${PN}/${PV}/libexec/.* + usr/lib/${PN}/${PV}/lib/lib.*.so + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_SONAME=" + usr/lib/${PN}/${PV}/lib/lib.*.so.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_PRESTRIPPED=" + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +# causes double bootstrap +RESTRICT="test" + +VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc + +PATCHES=( + "${FILESDIR}"/1.71.1-fix-bootstrap-version-comparison.patch + "${FILESDIR}"/1.70.0-ignore-broken-and-non-applicable-tests.patch + "${FILESDIR}"/1.62.1-musl-dynamic-linking.patch + "${FILESDIR}"/1.67.0-doc-wasm.patch +) + +toml_usex() { + usex "${1}" true false +} + +pre_build_checks() { + local M=9216 + # multiply requirements by 1.3 if we are doing x86-multilib + if use amd64; then + M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) + fi + M=$(( $(usex clippy 128 0) + ${M} )) + M=$(( $(usex miri 128 0) + ${M} )) + M=$(( $(usex rustfmt 256 0) + ${M} )) + # add 2G if we compile llvm and 256M per llvm_target + if ! use system-llvm; then + M=$(( 2048 + ${M} )) + local ltarget + for ltarget in ${ALL_LLVM_TARGETS[@]}; do + M=$(( $(usex ${ltarget} 256 0) + ${M} )) + done + fi + M=$(( $(usex wasm 256 0) + ${M} )) + M=$(( $(usex debug 2 1) * ${M} )) + eshopts_push -s extglob + if is-flagq '-g?(gdb)?([1-9])'; then + M=$(( 15 * ${M} / 10 )) + fi + eshopts_pop + M=$(( $(usex doc 256 0) + ${M} )) + CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} +} + +llvm_check_deps() { + has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" +} + +# Is LLVM being linked against libc++? +is_libcxx_linked() { + local code='#include +#if defined(_LIBCPP_VERSION) + HAVE_LIBCXX +#endif +' + local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 + [[ ${out} == *HAVE_LIBCXX* ]] +} + +pkg_pretend() { + pre_build_checks +} + +pkg_setup() { + pre_build_checks + python-any-r1_pkg_setup + + export LIBGIT2_NO_PKG_CONFIG=1 #749381 + + rust_pkg_setup + + if use system-llvm; then + llvm-r1_pkg_setup + + local llvm_config="$(get_llvm_prefix)/bin/llvm-config" + export LLVM_LINK_SHARED=1 + export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" + fi +} + +src_configure() { + filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 + + local rust_target="" rust_targets="" arch_cflags + + # Collect rust target names to compile standard libs for all ABIs. + for v in $(multilib_get_enabled_abi_pairs); do + rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" + done + if use wasm; then + rust_targets+=",\"wasm32-unknown-unknown\"" + if use system-llvm; then + # un-hardcode rust-lld linker for this target + # https://bugs.gentoo.org/715348 + sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/wasm_base.rs || die + fi + fi + rust_targets="${rust_targets#,}" + + # cargo and rustdoc are mandatory and should always be included + local tools='"cargo","rustdoc", "rust-demangler"' + use clippy && tools+=',"clippy"' + use miri && tools+=',"miri"' + use rustfmt && tools+=',"rustfmt"' + use rust-analyzer && tools+=',"rust-analyzer"' + use rust-src && tools+=',"src"' + + local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" + # in case of prefix it will be already prefixed, as --print sysroot returns full path + [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" + + rust_target="$(rust_abi)" + + LLVM_EXPERIMENTAL_TARGETS=() + for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do + if use llvm_targets_${_x} ; then + LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) + fi + done + LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} + + local cm_btype="$(usex debug DEBUG RELEASE)" + cat <<- _EOF_ > "${S}"/config.toml + changelog-seen = 2 + [llvm] + download-ci-llvm = false + optimize = $(toml_usex !debug) + release-debuginfo = $(toml_usex debug) + assertions = $(toml_usex debug) + ninja = true + targets = "${LLVM_TARGETS// /;}" + experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" + link-shared = $(toml_usex system-llvm) + $(if is_libcxx_linked; then + # https://bugs.gentoo.org/732632 + echo "use-libcxx = true" + echo "static-libstdcpp = false" + fi) + $(case "${rust_target}" in + i586-*-linux-*) + # https://github.com/rust-lang/rust/issues/93059 + echo 'cflags = "-fcf-protection=none"' + echo 'cxxflags = "-fcf-protection=none"' + echo 'ldflags = "-fcf-protection=none"' + ;; + *) + ;; + esac) + enable-warnings = false + [llvm.build-config] + CMAKE_VERBOSE_MAKEFILE = "ON" + CMAKE_C_FLAGS_${cm_btype} = "${CFLAGS}" + CMAKE_CXX_FLAGS_${cm_btype} = "${CXXFLAGS}" + CMAKE_EXE_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}" + CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}" + CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = "${LDFLAGS}" + CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = "${ARFLAGS}" + [build] + build-stage = 2 + test-stage = 2 + build = "${rust_target}" + host = ["${rust_target}"] + target = [${rust_targets}] + cargo = "${rust_stage0_root}/bin/cargo" + rustc = "${rust_stage0_root}/bin/rustc" + rustfmt = "${rust_stage0_root}/bin/rustfmt" + docs = $(toml_usex doc) + compiler-docs = false + submodules = false + python = "${EPYTHON}" + locked-deps = true + vendor = true + extended = true + tools = [${tools}] + verbose = 2 + sanitizers = false + profiler = true + cargo-native-static = false + [install] + prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" + sysconfdir = "etc" + docdir = "share/doc/rust" + bindir = "bin" + libdir = "lib" + mandir = "share/man" + [rust] + # https://github.com/rust-lang/rust/issues/54872 + codegen-units-std = 1 + optimize = true + debug = $(toml_usex debug) + debug-assertions = $(toml_usex debug) + debug-assertions-std = $(toml_usex debug) + debuginfo-level = $(usex debug 2 0) + debuginfo-level-rustc = $(usex debug 2 0) + debuginfo-level-std = $(usex debug 2 0) + debuginfo-level-tools = $(usex debug 2 0) + debuginfo-level-tests = 0 + backtrace = true + incremental = false + default-linker = "$(tc-getCC)" + parallel-compiler = $(toml_usex parallel-compiler) + channel = "$(usex nightly nightly stable)" + description = "gentoo" + rpath = true + verbose-tests = true + optimize-tests = $(toml_usex !debug) + codegen-tests = true + dist-src = false + remap-debuginfo = true + lld = $(usex system-llvm false $(toml_usex wasm)) + # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it + # https://github.com/rust-lang/rust/issues/74976 + # https://github.com/rust-lang/rust/issues/76526 + deny-warnings = $(usex wasm $(usex doc false true) true) + backtrace-on-ice = true + jemalloc = false + lto = "$(usex lto fat off)" + [dist] + src-tarball = false + compression-formats = ["xz"] + compression-profile = "balanced" + _EOF_ + + for v in $(multilib_get_enabled_abi_pairs); do + rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) + arch_cflags="$(get_abi_CFLAGS ${v##*.})" + + export CFLAGS_${rust_target//-/_}="${arch_cflags}" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${rust_target}] + ar = "$(tc-getAR)" + cc = "$(tc-getCC)" + cxx = "$(tc-getCXX)" + linker = "$(tc-getCC)" + ranlib = "$(tc-getRANLIB)" + llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; + # but we patch it and set to false here as well + if use elibc_musl; then + cat <<- _EOF_ >> "${S}"/config.toml + crt-static = false + _EOF_ + fi + done + if use wasm; then + cat <<- _EOF_ >> "${S}"/config.toml + [target.wasm32-unknown-unknown] + linker = "$(usex system-llvm lld rust-lld)" + # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 + profiler = false + _EOF_ + fi + + if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below + # experimental cross support + # discussion: https://bugs.gentoo.org/679878 + # TODO: c*flags, clang, system-llvm, cargo.eclass target support + # it would be much better if we could split out stdlib + # complilation to separate ebuild and abuse CATEGORY to + # just install to /usr/lib/rustlib/ + + # extra targets defined as a bash array + # spec format: :: + # best place would be /etc/portage/env/dev-lang/rust + # Example: + # RUST_CROSS_TARGETS=( + # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" + # ) + # no extra hand holding is done, no target transformations, all + # values are passed as-is with just basic checks, so it's up to user to supply correct values + # valid rust targets can be obtained with + # rustc --print target-list + # matching cross toolchain has to be installed + # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) + # only gcc toolchains installed with crossdev are checked for now. + + # BUG: we can't pass host flags to cross compiler, so just filter for now + # BUG: this should be more fine-grained. + filter-flags '-mcpu=*' '-march=*' '-mtune=*' + + local cross_target_spec + for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do + # extracts first element form :: + local cross_llvm_target="${cross_target_spec%%:*}" + # extracts toolchain triples, : + local cross_triples="${cross_target_spec#*:}" + # extracts first element after before : separator + local cross_rust_target="${cross_triples%%:*}" + # extracts last element after : separator + local cross_toolchain="${cross_triples##*:}" + use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" + command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${cross_rust_target}] + ar = "${cross_toolchain}-ar" + cc = "${cross_toolchain}-gcc" + cxx = "${cross_toolchain}-g++" + linker = "${cross_toolchain}-gcc" + ranlib = "${cross_toolchain}-ranlib" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + if [[ "${cross_toolchain}" == *-musl* ]]; then + cat <<- _EOF_ >> "${S}"/config.toml + musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" + _EOF_ + fi + + # append cross target to "normal" target list + # example 'target = ["powerpc64le-unknown-linux-gnu"]' + # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' + + rust_targets="${rust_targets},\"${cross_rust_target}\"" + sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die + + ewarn + ewarn "Enabled ${cross_rust_target} rust target" + ewarn "Using ${cross_toolchain} cross toolchain" + ewarn + if ! has_version -b 'sys-devel/binutils[multitarget]' ; then + ewarn "'sys-devel/binutils[multitarget]' is not installed" + ewarn "'strip' will be unable to strip cross libraries" + ewarn "cross targets will be installed with full debug information" + ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" + ewarn + ewarn "Alternatively llvm-strip can be used, it supports stripping any target" + ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" + ewarn + fi + done + fi # I_KNOW_WHAT_I_AM_DOING_CROSS + + einfo "Rust configured with the following flags:" + echo + echo RUSTFLAGS="\"${RUSTFLAGS}\"" + echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" + echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" + echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" + env | grep "CARGO_TARGET_.*_RUSTFLAGS=" + env | grep "CFLAGS_.*" + echo + einfo "config.toml contents:" + cat "${S}"/config.toml || die + echo +} + +src_compile() { + RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die +} + +src_test() { + # https://rustc-dev-guide.rust-lang.org/tests/intro.html + + # those are basic and codegen tests. + local tests=( + codegen + codegen-units + compile-fail + incremental + mir-opt + pretty + run-make + ) + + # fails if llvm is not built with ALL targets. + # and known to fail with system llvm sometimes. + use system-llvm || tests+=( assembly ) + + # fragile/expensive/less important tests + # or tests that require extra builds + # TODO: instead of skipping, just make some nonfatal. + if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then + tests+=( + rustdoc + rustdoc-js + rustdoc-js-std + rustdoc-ui + run-make-fulldeps + ui + ui-fulldeps + ) + fi + + local i failed=() + einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" + for i in "${tests[@]}"; do + local t="src/test/${i}" + einfo "rust_src_test: running ${t}" + if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ + -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" + then + failed+=( "${t}" ) + eerror "rust_src_test: ${t} failed" + fi + done + + if [[ ${#failed[@]} -ne 0 ]]; then + eerror "rust_src_test: failure summary: ${failed[@]}" + die "aborting due to test failures" + fi +} + +src_install() { + DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die + + # bug #689562, #689160 + rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die + rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die + + local symlinks=( + cargo + rustc + rustdoc + rust-gdb + rust-gdbgui + rust-lldb + rust-demangler + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use miri && symlinks+=( miri cargo-miri ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- + # need to fix eselect-rust to remove this hack. + local ver_i="${i}-${PV}" + if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then + einfo "Installing ${i} symlink" + ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die + else + ewarn "${i} symlink requested, but source file not found" + ewarn "please report this" + fi + dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" + dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" + dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" + dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" + dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" + + newenvd - "50${P}" <<-_EOF_ + MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" + _EOF_ + + rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-demangler + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/libexec + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use miri; then + echo /usr/bin/miri >> "${T}/provider-${P}" + echo /usr/bin/cargo-miri >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + + if use dist; then + insinto "/usr/lib/${PN}/${PV}/dist" + doins -r "${S}/build/dist/." + fi +} + +pkg_preinst() { + # 943308 and friends; basically --keep-going can forget to unmerge old rust + # but the soft blocker allows us to install conflicting files. + # This results in duplicated .{rlib,so} files which confuses rustc and results in + # the need for manual intervention. + if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then + # we need to find all .{rlib,so} files in the old rust lib directory + # and store them in an array for later use + readarray -d '' old_rust_libs < <( + find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ + -type f \( -name '*.rlib' -o -name '*.so' \) -print0) + export old_rust_libs + if [[ ${#old_rust_libs[@]} -gt 0 ]]; then + einfo "Found old .rlib and .so files in the old rust lib directory" + else + die "Found no old .rlib and .so files but old rust version is installed. Bailing!" + fi + fi +} + +pkg_postinst() { + + local old_rust="dev-lang/rust:stable/$(ver_cut 1-2)" + if has_version -b ${old_rust}; then + # Be _extra_ careful here as we're removing files from the live filesystem + local f + local only_one_file=() + einfo "Tidying up libraries files from non-slotted \`${old_rust}\`." + for f in "${old_rust_libs[@]}"; do + [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" + local base_name="${f%-*}" + local ext="${f##*.}" + local matching_files=("${base_name}"-*.${ext}) + case ${#matching_files[@]} in + 2) + einfo "Removing old .${ext}: ${f}" + rm "${f}" || die + ;; + 1) + # Turns out fingerprints are not as unique as we'd thought, _sometimes_ they collide, + # so we may have already installed over the old file. + # We'll warn about this just in case, but it's probably fine. + only_one_file+=( "${matching_files[0]}" ) + ;; + *) + die "Expected one or two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" + ;; + esac + done + if [[ ${#only_one_file} -gt 0 ]]; then + einfo "While tidying up non-slotted rust libraries for \`${old_rust}\`," + einfo "the following file(s) did not have a duplicate where one was expected:" + for f in "${only_one_file[@]}"; do + einfo " * ${f}" + done + einfo "" + einfo "This is unlikely to cause problems; the fingerprint for the library ended up being the same." + einfo "However, if you encounter any issues please report them to the Gentoo Rust Team." + fi + fi + + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + optfeature "Emacs support" "app-emacs/rust-mode" + optfeature "Vim support" "app-vim/rust-vim" +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust/rust-1.74.1-r100.ebuild b/dev-lang/rust/rust-1.74.1-r100.ebuild deleted file mode 100644 index d131b800b874..000000000000 --- a/dev-lang/rust/rust-1.74.1-r100.ebuild +++ /dev/null @@ -1,1023 +0,0 @@ -# Copyright 1999-2025 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 17 ) -PYTHON_COMPAT=( python3_{10..12} ) - -RUST_MAX_VER=${PV} -RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" -RUST_OPTIONAL=1 - -MRUSTC_VERSION="0.11.2" -MRUSTC_RUST_VERSION="1.74.0" - -inherit check-reqs cmake edo estack flag-o-matic llvm-r1 multiprocessing multilib multilib-build \ - optfeature python-any-r1 rust rust-toolchain toolchain-funcs verify-sig - -if [[ ${PV} = *beta* ]]; then - betaver=${PV//*beta} - BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" - MY_P="rustc-beta" - SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" -else - MY_P="rustc-${PV}" - SRC="${MY_P}-src.tar.xz" - KEYWORDS="amd64 arm arm64 ~loong ppc ppc64 ~riscv sparc x86" -fi - -DESCRIPTION="Language empowering everyone to build reliable and efficient software" -HOMEPAGE="https://www.rust-lang.org/" - -SRC_URI=" - https://static.rust-lang.org/dist/${SRC} - verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) -" - -S="${WORKDIR}/${MY_P}-src" - -# keep in sync with llvm ebuild of the same version as bundled one. -ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai - LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE - WebAssembly X86 XCore Xtensa ) -ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) -LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} - -ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" - -IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind +lto miri mrustc-bootstrap nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" - -LLVM_DEPEND=() -# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation -for _x in "${ALL_LLVM_TARGETS[@]}"; do - LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) -done -LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) -LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) - -BDEPEND="${PYTHON_DEPS} - app-eselect/eselect-rust - || ( - >=sys-devel/gcc-4.7 - >=llvm-core/clang-3.5 - ) - !system-llvm? ( - >=dev-build/cmake-3.13.4 - app-alternatives/ninja - ) - test? ( dev-debug/gdb ) - verify-sig? ( sec-keys/openpgp-keys-rust ) - mrustc-bootstrap? ( - ~dev-lang/mrustc-${MRUSTC_VERSION} - dev-build/cmake - sys-devel/gcc:* - ) - !mrustc-bootstrap? ( ${RUST_DEPEND} ) -" - -DEPEND=" - >=app-arch/xz-utils-5.2 - net-misc/curl:=[http2,ssl] - sys-libs/zlib:= - dev-libs/openssl:0= - system-llvm? ( - ${LLVM_DEPEND[*]} - llvm-libunwind? ( llvm-runtimes/libunwind:= ) - ) - !system-llvm? ( - !llvm-libunwind? ( - elibc_musl? ( sys-libs/libunwind:= ) - ) - ) -" - -RDEPEND="${DEPEND} - app-eselect/eselect-rust - dev-lang/rust-common - sys-apps/lsb-release - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" - -REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) - miri? ( nightly ) - parallel-compiler? ( nightly ) - rust-analyzer? ( rust-src ) - test? ( ${ALL_LLVM_TARGETS[*]} ) - wasm? ( llvm_targets_WebAssembly ) - x86? ( cpu_flags_x86_sse2 ) -" - -# we don't use cmake.eclass, but can get a warning -CMAKE_WARN_UNUSED_CLI=no - -QA_FLAGS_IGNORED=" - usr/lib/${PN}/${PV}/bin/.* - usr/lib/${PN}/${PV}/libexec/.* - usr/lib/${PN}/${PV}/lib/lib.*.so - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_SONAME=" - usr/lib/${PN}/${PV}/lib/lib.*.so.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_PRESTRIPPED=" - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -# causes double bootstrap -RESTRICT="test" - -VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc - -PATCHES=( - "${FILESDIR}"/1.74.1-cross-compile-libz.patch - #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch # pending refresh - "${FILESDIR}"/1.70.0-ignore-broken-and-non-applicable-tests.patch - "${FILESDIR}"/1.62.1-musl-dynamic-linking.patch - "${FILESDIR}"/1.67.0-doc-wasm.patch -) - -clear_vendor_checksums() { - sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die -} - -toml_usex() { - usex "${1}" true false -} - -pre_build_checks() { - local M=9216 - # multiply requirements by 1.3 if we are doing x86-multilib - if use amd64; then - M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) - fi - M=$(( $(usex clippy 128 0) + ${M} )) - M=$(( $(usex miri 128 0) + ${M} )) - M=$(( $(usex rustfmt 256 0) + ${M} )) - # add 2G if we compile llvm and 256M per llvm_target - if ! use system-llvm; then - M=$(( 2048 + ${M} )) - local ltarget - for ltarget in ${ALL_LLVM_TARGETS[@]}; do - M=$(( $(usex ${ltarget} 256 0) + ${M} )) - done - fi - M=$(( $(usex wasm 256 0) + ${M} )) - M=$(( $(usex debug 2 1) * ${M} )) - eshopts_push -s extglob - if is-flagq '-g?(gdb)?([1-9])'; then - M=$(( 15 * ${M} / 10 )) - fi - eshopts_pop - M=$(( $(usex doc 256 0) + ${M} )) - if use mrustc-bootstrap; then - M=$(( 2 * ${M} )) - fi - CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} -} - -llvm_check_deps() { - has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" -} - -# Is LLVM being linked against libc++? -is_libcxx_linked() { - local code='#include -#if defined(_LIBCPP_VERSION) - HAVE_LIBCXX -#endif -' - local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 - [[ ${out} == *HAVE_LIBCXX* ]] -} - -pkg_pretend() { - pre_build_checks -} - -pkg_setup() { - if [[ ${MERGE_TYPE} != binary ]]; then - pre_build_checks - python-any-r1_pkg_setup - - export LIBGIT2_NO_PKG_CONFIG=1 #749381 - if tc-is-cross-compiler; then - use system-llvm && die "USE=system-llvm not allowed when cross-compiling" - local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" - use "llvm_targets_${cross_llvm_target}" || \ - die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" - fi - - if use mrustc-bootstrap; then - if ! tc-is-gcc; then - die "USE=mrustc-bootstrap reqires that the build environment use GCC" - fi - else - rust_pkg_setup - fi - - if use system-llvm; then - llvm-r1_pkg_setup - - local llvm_config="$(get_llvm_prefix)/bin/llvm-config" - export LLVM_LINK_SHARED=1 - export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" - fi - fi -} - -src_prepare() { - default - # We'll need to revert this after the bootstrap. - if use mrustc-bootstrap; then - pushd "${S}" 2>/dev/null || die - patch -p0 < "${BROOT}"/usr/share/mrustc-${MRUSTC_VERSION}/patches/rustc-${MRUSTC_RUST_VERSION}-src.patch || - die "Failed to patch sources to enable bootstrap with mrustc" - popd 2>/dev/null || die - fi -} - -src_configure() { - if tc-is-cross-compiler; then - export PKG_CONFIG_ALLOW_CROSS=1 - export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" - export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" - export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" - fi - - filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 - - local rust_target="" rust_targets="" arch_cflags - - # Collect rust target names to compile standard libs for all ABIs. - for v in $(multilib_get_enabled_abi_pairs); do - rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" - done - if use wasm; then - rust_targets+=",\"wasm32-unknown-unknown\"" - if use system-llvm; then - # un-hardcode rust-lld linker for this target - # https://bugs.gentoo.org/715348 - sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/wasm_base.rs || die - fi - fi - rust_targets="${rust_targets#,}" - - # cargo and rustdoc are mandatory and should always be included - local tools='"cargo","rustdoc", "rust-demangler"' - use clippy && tools+=',"clippy"' - use miri && tools+=',"miri"' - use rustfmt && tools+=',"rustfmt"' - use rust-analyzer && tools+=',"rust-analyzer"' - use rust-src && tools+=',"src"' - - if use mrustc-bootstrap; then - local rust_stage0_root="${WORKDIR}/bootstrap/rust-${PV}" - else - local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" - # in case of prefix it will be already prefixed, as --print sysroot returns full path - [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" - fi - - rust_target="$(rust_abi)" - rust_build="$(rust_abi "${CBUILD}")" - rust_host="$(rust_abi "${CHOST}")" - - LLVM_EXPERIMENTAL_TARGETS=() - for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do - if use llvm_targets_${_x} ; then - LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) - fi - done - LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} - - local cm_btype="$(usex debug DEBUG RELEASE)" - cat <<- _EOF_ > "${S}"/config.toml - changelog-seen = 2 - [llvm] - download-ci-llvm = false - optimize = $(toml_usex !debug) - release-debuginfo = $(toml_usex debug) - assertions = $(toml_usex debug) - ninja = true - targets = "${LLVM_TARGETS// /;}" - experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" - link-shared = $(toml_usex system-llvm) - $(if is_libcxx_linked; then - # https://bugs.gentoo.org/732632 - echo "use-libcxx = true" - echo "static-libstdcpp = false" - fi) - $(case "${rust_target}" in - i586-*-linux-*) - # https://github.com/rust-lang/rust/issues/93059 - echo 'cflags = "-fcf-protection=none"' - echo 'cxxflags = "-fcf-protection=none"' - echo 'ldflags = "-fcf-protection=none"' - ;; - *) - ;; - esac) - enable-warnings = false - [llvm.build-config] - CMAKE_VERBOSE_MAKEFILE = "ON" - $(if ! tc-is-cross-compiler; then - # When cross-compiling, LLVM is compiled twice, once for host and - # once for target. Unfortunately, this build configuration applies - # to both, which means any flags applicable to one target but not - # the other will break. Conditionally disable respecting user - # flags when cross-compiling. - echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" - echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" - echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" - fi) - [build] - build-stage = 2 - test-stage = 2 - build = "${rust_build}" - host = ["${rust_host}"] - target = [${rust_targets}] - cargo = "${rust_stage0_root}/bin/cargo" - rustc = "${rust_stage0_root}/bin/rustc" - rustfmt = "${rust_stage0_root}/bin/rustfmt" - docs = $(toml_usex doc) - compiler-docs = false - submodules = false - python = "${EPYTHON}" - locked-deps = true - vendor = true - extended = true - tools = [${tools}] - verbose = 2 - sanitizers = false - profiler = true - cargo-native-static = false - [install] - prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" - sysconfdir = "etc" - docdir = "share/doc/rust" - bindir = "bin" - libdir = "lib" - mandir = "share/man" - [rust] - # https://github.com/rust-lang/rust/issues/54872 - codegen-units-std = 1 - optimize = true - debug = $(toml_usex debug) - debug-assertions = $(toml_usex debug) - debug-assertions-std = $(toml_usex debug) - debuginfo-level = $(usex debug 2 0) - debuginfo-level-rustc = $(usex debug 2 0) - debuginfo-level-std = $(usex debug 2 0) - debuginfo-level-tools = $(usex debug 2 0) - debuginfo-level-tests = 0 - backtrace = true - incremental = false - $(if ! tc-is-cross-compiler; then - echo "default-linker = \"$(tc-getCC)\"" - fi) - parallel-compiler = $(toml_usex parallel-compiler) - channel = "$(usex nightly nightly stable)" - description = "gentoo" - rpath = false - verbose-tests = true - optimize-tests = $(toml_usex !debug) - codegen-tests = true - dist-src = false - remap-debuginfo = true - lld = $(usex system-llvm false $(toml_usex wasm)) - # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it - # https://github.com/rust-lang/rust/issues/74976 - # https://github.com/rust-lang/rust/issues/76526 - deny-warnings = $(usex wasm $(usex doc false true) true) - backtrace-on-ice = true - jemalloc = false - lto = "$(usex lto fat off)" - [dist] - src-tarball = false - compression-formats = ["xz"] - compression-profile = "balanced" - _EOF_ - - for v in $(multilib_get_enabled_abi_pairs); do - rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) - arch_cflags="$(get_abi_CFLAGS ${v##*.})" - - export CFLAGS_${rust_target//-/_}="${arch_cflags}" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${rust_target}] - ar = "$(tc-getAR)" - cc = "$(tc-getCC)" - cxx = "$(tc-getCXX)" - linker = "$(tc-getCC)" - ranlib = "$(tc-getRANLIB)" - llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; - # but we patch it and set to false here as well - if use elibc_musl; then - cat <<- _EOF_ >> "${S}"/config.toml - crt-static = false - _EOF_ - fi - done - if use wasm; then - cat <<- _EOF_ >> "${S}"/config.toml - [target.wasm32-unknown-unknown] - linker = "$(usex system-llvm lld rust-lld)" - # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 - profiler = false - _EOF_ - fi - - if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below - # experimental cross support - # discussion: https://bugs.gentoo.org/679878 - # TODO: c*flags, clang, system-llvm, cargo.eclass target support - # it would be much better if we could split out stdlib - # complilation to separate ebuild and abuse CATEGORY to - # just install to /usr/lib/rustlib/ - - # extra targets defined as a bash array - # spec format: :: - # best place would be /etc/portage/env/dev-lang/rust - # Example: - # RUST_CROSS_TARGETS=( - # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" - # ) - # no extra hand holding is done, no target transformations, all - # values are passed as-is with just basic checks, so it's up to user to supply correct values - # valid rust targets can be obtained with - # rustc --print target-list - # matching cross toolchain has to be installed - # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) - # only gcc toolchains installed with crossdev are checked for now. - - # BUG: we can't pass host flags to cross compiler, so just filter for now - # BUG: this should be more fine-grained. - filter-flags '-mcpu=*' '-march=*' '-mtune=*' - - local cross_target_spec - for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do - # extracts first element form :: - local cross_llvm_target="${cross_target_spec%%:*}" - # extracts toolchain triples, : - local cross_triples="${cross_target_spec#*:}" - # extracts first element after before : separator - local cross_rust_target="${cross_triples%%:*}" - # extracts last element after : separator - local cross_toolchain="${cross_triples##*:}" - use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" - command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${cross_rust_target}] - ar = "${cross_toolchain}-ar" - cc = "${cross_toolchain}-gcc" - cxx = "${cross_toolchain}-g++" - linker = "${cross_toolchain}-gcc" - ranlib = "${cross_toolchain}-ranlib" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - if [[ "${cross_toolchain}" == *-musl* ]]; then - cat <<- _EOF_ >> "${S}"/config.toml - musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" - _EOF_ - fi - - # append cross target to "normal" target list - # example 'target = ["powerpc64le-unknown-linux-gnu"]' - # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' - - rust_targets="${rust_targets},\"${cross_rust_target}\"" - sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die - - ewarn - ewarn "Enabled ${cross_rust_target} rust target" - ewarn "Using ${cross_toolchain} cross toolchain" - ewarn - if ! has_version -b 'sys-devel/binutils[multitarget]' ; then - ewarn "'sys-devel/binutils[multitarget]' is not installed" - ewarn "'strip' will be unable to strip cross libraries" - ewarn "cross targets will be installed with full debug information" - ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" - ewarn - ewarn "Alternatively llvm-strip can be used, it supports stripping any target" - ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" - ewarn - fi - done - fi # I_KNOW_WHAT_I_AM_DOING_CROSS - - einfo "Rust configured with the following flags:" - echo - echo RUSTFLAGS="\"${RUSTFLAGS}\"" - echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" - echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" - echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" - env | grep "CARGO_TARGET_.*_RUSTFLAGS=" - env | grep "CFLAGS_.*" - echo - einfo "config.toml contents:" - cat "${S}"/config.toml || die - echo -} - -# Build a very minimal llvm that we can use for bootstrap rustc codegen -llvm_bootstrap() { - # Reference ${P}/src/bootstrap/native.rs for these values - local llvm_cmake_opts=( - "-G Ninja" - "-DLLVM_TARGET_ARCH=${CFG_COMPILER_HOST_TRIPLE%%-*}" - "-DLLVM_DEFAULT_TARGET_TRIPLE=${CFG_COMPILER_HOST_TRIPLE}" - "-DLLVM_TARGETS_TO_BUILD=${BOOTSTRAP_LLVM_TARGETS:=X86;ARM;AArch64}" #;Mips;PowerPC;SystemZ;JSBackend;MSP430;Sparc;NVPTX - "-DLLVM_ENABLE_ASSERTIONS=OFF" - "-DLLVM_INCLUDE_EXAMPLES=OFF" - "-DLLVM_INCLUDE_TESTS=OFF" - "-DLLVM_INCLUDE_DOCS=OFF" - "-DLLVM_INCLUDE_BENCHMARKS=OFF" - "-DLLVM_ENABLE_ZLIB=OFF" - "-DLLVM_ENABLE_TERMINFO=OFF" - "-DLLVM_ENABLE_LIBEDIT=OFF" - "-DCMAKE_CXX_COMPILER=$(tc-getCXX)" - "-DCMAKE_C_COMPILER=$(tc-getCC)" - "-DCMAKE_BUILD_TYPE=Release" - ) - - if [[ -z "${LLVM_CMAKE_OPTS_EXTRA}" ]]; then - llvm_cmake_opts+=( "${LLVM_CMAKE_OPTS_EXTRA}") - fi - - elog "Building bootstrap llvm ..." - - mkdir -p "${WORKDIR}/bootstrap/llvm" || die - pushd "${WORKDIR}/bootstrap/llvm" 2>/dev/null || die - edo cmake ${llvm_cmake_opts[*]} "${S}/src/llvm-project/llvm" - eninja || die "Failed to build bootstrap llvm" - popd 2>/dev/null || die -} - -# High level steps: -# Our system mrustc package has built stdlib for our current platform. -# - Step 1: Use system-installed mrustc, (m)rust(c) stdlib, and minicargo to -# bootstrap a `cargo` and `rustc` (mrustc-stage0) -# - Step 2: Use minicargo and the built `rustc` to build a working `sysroot` -# (includes `std`, `panic_unwind``, `test`, etc.) (mrustc-stage0) -# - Step 3: Build build libs again (this time using `cargo` and `rustc`) (mrustc-stage1) -# - Step 4: Build a `rustc` using those libs (mrustc-stage1) -# - Done so there's an optimised rustc arollvm_cmake_optsund (mrustc is bad at codegen) -# - Step 5: Build `libstd` with this `rustc` (mrustc-stage2) -# - Needed to match ABIs -# Stages: -# - mrustc-stage0: mrustc-built cargo and rustc -# - mrustc-stage1: rustc and sysroot built with mrustc-stage0 -# - mrustc-stage2: rustc from stage1 with sysroot built with stage0 -# See: -# - https://github.com/thepowersgang/mrustc/blob/master/run_rustc/Makefile -# - https://github.com/thepowersgang/mrustc/blob/master/TestRustcBootstrap.sh -# - Upstream Windows .cmd files are also a good reference for early bootstrap -mrustc_bootstrap() { - export RUSTC_BOOTSTRAP=1 # Possibly the only intended use of this variable in ::gentoo - # export these variables now and unset them at the end of the function so they don't leak - # into the rest of the build. - export CFG_COMPILER_HOST_TRIPLE="$(rust_abi)" - export CFG_RELEASE="${MRUSTC_RUST_VERSION}" # Let's pretend we're 1.74.0 - export CFG_RELEASE_CHANNEL="stable" - export CFG_VERSION="${MRUSTC_RUST_VERSION}-stable-mrustc" - export CFG_PREFIX="mrustc" - export CFG_LIBDIR_RELATIVE="lib" - export RUSTC_INSTALL_BINDIR="bin" - export REAL_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" - - # These flags are used in every invocation of our bootstrap `cargo`. - local cargo_flags="--target ${CFG_COMPILER_HOST_TRIPLE} -j $(makeopts_jobs) --release --verbose" - - if use system-llvm; then - export LLVM_CONFIG="$(get_llvm_prefix)/bin/llvm-config" - else - llvm_bootstrap - export LLVM_CONFIG="${WORKDIR}/bootstrap/llvm/bin/llvm-config" - fi - - # define the mrustc sysroot and common minicargo arguments. - local mrustc_sysroot="${BROOT}/usr/lib/rust/mrustc-${MRUSTC_VERSION}/lib/rustlib/${CFG_COMPILER_HOST_TRIPLE}/lib" - local minicargo_common_args=( - "-L" "${mrustc_sysroot}" - "-j" "$(makeopts_jobs)" - "--vendor-dir" "${S}/vendor" - "--manifest-overrides" - "${BROOT}/usr/share/mrustc-${MRUSTC_VERSION}/patches/rustc-${MRUSTC_RUST_VERSION}-overrides.toml" - ) - # There's a very good chance that minicargo and mrustc are not in the PATH. - if ! command -v minicargo &> /dev/null; then - export PATH="${BROOT}/usr/lib/rust/mrustc-${MRUSTC_VERSION}/bin:${PATH}" - fi - # Sanity check our bootstrap compiler & stdlib. - elog "Sanity checking mrustc and stdlib ..." - edo mrustc "${S}/tests/ui/hello_world/main.rs" -L "${mrustc_sysroot}" -o "${T}"/hello -g - "${T}"/hello || die "Failed to run hello_world" - # Seems fine, let's build some tools! - - # Step 1: Build a `cargo` and `rustc` using system-installed mrustc - # Anything we produce is going to be terribly unoptimised; mrustc does not do fantastic codegen. - # It's good enough to bootstrap the "real" rustc though. - elog "Building bootstrap cargo and rustc using mrustc and minicargo (mrustc-stage0) ..." - local stage0="${WORKDIR}/bootstrap/mrustc-stage0" - mkdir -p "${stage0}" || die - edo minicargo "${S}"/src/tools/cargo --output-dir "${stage0}"/cargo-build ${minicargo_common_args[*]} - "${stage0}"/cargo-build/cargo --version || die "Bootstrap cargo failed basic sanity check" - edo minicargo "${S}"/compiler/rustc --output-dir "${stage0}"/rustc-build ${minicargo_common_args[*]} \ - --features llvm - "${stage0}"/rustc-build/rustc_main --version || die "Bootstrap rustc failed basic sanity check" - # minicargo has special-casing for `rustc` so we need to rename it. - mv "${stage0}"/rustc-build/rustc_main "${stage0}"/rustc-build/rustc || die "Failed to rename rustc_main to rustc" - # rustc wants these here - mkdir -p "${stage0}"/codegen-backends || die - mv "${stage0}"/rustc-build/librustc_codegen_llvm.* "${stage0}"/codegen-backends || die - - # Step 2: use the bootstrapped rustc to build sysroot; we need to use `minicargo` for this - - # mrustc does not accept all of the arguments that rustc does, even with the rustc_proxy wrapper. - # `--script-overrides`: If the overrides are available, build scripts (and build-deps) are not built - # which is good since we don't have a working compiler yet, and can't build them. - - local stage0_sysroot_lib="${stage0}/lib/rustlib/${CFG_COMPILER_HOST_TRIPLE}/lib" - # minicargo <= 0.11.2 doesn't create this directory and silently fails, besides it's better to be explicit, right? - mkdir -p "${stage0_sysroot_lib}" || die "Failed to create stage0 directory" - - elog "Building 'sysroot' using bootstrap rustc (mrustc-stage0) ..." - edo env MRUSTC_PATH="${stage0}/rustc-build/rustc" minicargo -j $(makeopts_jobs) --vendor-dir "${S}"/vendor \ - --script-overrides "${BROOT}/usr/share/mrustc-0.11.2/script-overrides/stable-${MRUSTC_RUST_VERSION}-linux/" \ - --output-dir "${stage0_sysroot_lib}" "${S}"/library/sysroot || - die "Failed to build sysroot with bootstrap rust (mrustc-stage0)" - - elog "Sanity checking sysroot and rustc ..." - mkdir -p "${T}"/stage0-hello || die - edo "${stage0}"/rustc-build/rustc -L "${stage0_sysroot_lib}" -g "${S}/tests/ui/hello_world/main.rs" \ - -o "${T}"/stage0-hello/hello - "${T}"/stage0-hello/hello || die "Failed to run hello_world built with bootstrap rust stage0" - - elog "mrustc bootstrap stage0 complete!" - - # Step 3: Build a "proper" libstd, including dynamic libs using our bootstrap cargo and rustc. - elog "Building 'sysroot' with the stage0 rustc (mrustc-stage1) ..." - local stage1="${WORKDIR}/bootstrap/mrustc-stage1" - local stage1_sysroot_lib="${stage1}/lib/rustlib/${CFG_COMPILER_HOST_TRIPLE}/lib" - mkdir -p "${stage1_sysroot_lib}" || die "Failed to create stage1 directory" - mkdir -p "${stage1}/bin" || die - - # Simplified to avoid calling rustc_proxy; We don't need stage1 rustc until after this is built... - edo env RUSTFLAGS="-Z force-unstable-if-unmarked" CARGO_TARGET_DIR="${stage1}/sysroot-build" \ - RUSTC="${stage0}/rustc-build/rustc" "${stage0}"/cargo-build/cargo build ${cargo_flags} \ - --manifest-path "${S}/library/sysroot/Cargo.toml" --features panic-unwind - - # Move the built libs into the sysroot libdir. - mv "${stage1}/sysroot-build/${CFG_COMPILER_HOST_TRIPLE}/release/deps"/*.{rlib,rmeta,so} \ - "${stage1_sysroot_lib}" || die "Failed to move stage1 libs to stage1 sysroot" - - # We need to copy the stage0 rustc to the stage1 sysroot; this "updates" the sysroot location and enables - # resolution of stage1 libs. (run `rustc --print sysroot` on stage0 and stage1 rustc to verify) - cp "${stage0}/rustc-build/rustc" "${stage1}/bin/rustc" || die "Failed to copy rustc to stage1 sysroot" - - # Step 4: Build `rustc` with itself, so we have a rustc with the right ABI. - # This will be our final `rustc` for the bootstrap process. - elog "Building rustc with stage1 libs (mrustc-stage1) ..." - mkdir -p "${stage1}/rustc-build" || die - edo env RUSTFLAGS="-Z force-unstable-if-unmarked -C link_args=-Wl,-rpath,\$ORIGIN/../lib" \ - LD_LIBRARY_PATH="${stage2_sysroot_lib}" CARGO_TARGET_DIR="${stage1}/rustc-build" \ - RUSTC="${stage1}/bin/rustc" TMPDIR="${T}" "${stage0}"/cargo-build/cargo build ${cargo_flags} \ - --manifest-path "${S}/compiler/rustc/Cargo.toml" --features llvm - - # Step 5: Build `sysroot` with this `rustc` - Needed to match ABI - # We need to use the previous sysroot; we could reuse that dir but it's easier to just copy it. - elog "Building final 'sysroot' with the final rustc (mrustc-stage2) ..." - local stage2="${WORKDIR}/bootstrap/mrustc-stage2" - local stage2_sysroot_lib="${stage2}/lib/rustlib/${CFG_COMPILER_HOST_TRIPLE}/lib" - mkdir -p "${stage2_sysroot_lib}" || die "Failed to create stage2 directory" - mkdir -p "${stage2}/bin" || die - - # Copy required files from stage1 to stage2 sysroot - cp "${stage1}/rustc-build/${CFG_COMPILER_HOST_TRIPLE}"/release/rustc-main "${stage2}/bin/rustc_binary" || - die "Failed to copy final rustc to stage2 sysroot" - cp "${stage1}/rustc-build/${CFG_COMPILER_HOST_TRIPLE}"/release/librustc_driver.so "${stage2}/lib" || - die "Failed to copy librustc_driver to sysroot" - cp "${stage1}/rustc-build/${CFG_COMPILER_HOST_TRIPLE}"/release/deps/*.{rlib,so} "${stage2_sysroot_lib}" || - die "Failed to copy final rustc libs to stage2 sysroot" - cp "${stage1_sysroot_lib}"/* "${stage2_sysroot_lib}" || die "Failed to copy stage1 so files to stage2 sysroot" - - # There's a magic script used in place of rustc so that libs can be found - cat <<- EOF > "${stage2}/bin/rustc" || die "Failed to create rustc wrapper" - #!/bin/sh - LD_LIBRARY_PATH="${stage2}/lib:${stage2_sysroot_lib}" ${stage2}/bin/rustc_binary "\$@" - EOF - chmod +x "${stage2}/bin/rustc" || die "Failed to make rustc wrapper executable" - - # Use rustc to build 'sysroot'; this is the final step in the bootstrap process. - # rpath probably isn't needed here, but it doesn't hurt. - edo env RUSTFLAGS="-Z force-unstable-if-unmarked -C link_args=-Wl,-rpath,\$ORIGIN/../lib" \ - CARGO_TARGET_DIR="${stage2}/stdlib-build" RUSTC="${stage2}/bin/rustc" \ - "${stage0}"/cargo-build/cargo build ${cargo_flags} --manifest-path "${S}/library/sysroot/Cargo.toml" \ - --features panic-unwind - - # Build our final output sysroot - local output="${WORKDIR}/bootstrap/rust-${PV}" - local output_sysroot_lib="${output}/lib/rustlib/${CFG_COMPILER_HOST_TRIPLE}/lib" - mkdir -p "${output_sysroot_lib}" || die "Failed to create output directory" - mkdir -p "${output}/bin" || die "Failed to create output directory" - - # Copy our various output files into the output sysroot - # rustc - cp "${stage1}/rustc-build/${CFG_COMPILER_HOST_TRIPLE}"/release/rustc-main "${output}/bin/rustc_binary" || - die "Failed to copy final rustc to output" - cp "${stage1}/rustc-build/${CFG_COMPILER_HOST_TRIPLE}"/release/librustc_driver.so "${output}/lib" || - die "Failed to copy librustc_driver to output" - cp "${stage1}/rustc-build/${CFG_COMPILER_HOST_TRIPLE}"/release/deps/*.{rlib,so} "${output_sysroot_lib}" || - die "Failed to copy final rustc libs to output" - # cargo; no need to build an optimised cargo if we're using this to build a complelety new Rust. - cp "${stage0}/cargo-build/cargo" "${output}/bin/cargo" || die "Failed to copy cargo to output" - # libs - mv "${stage2}/stdlib-build/${CFG_COMPILER_HOST_TRIPLE}/release/deps"/*.{rlib,rmeta,so} "${output_sysroot_lib}" || - die "Failed to copy stage2 libs to output" - # Our trusty rustc wrapper - cat <<- EOF > "${output}/bin/rustc" || die "Failed to create rustc wrapper" - #!/bin/sh - LD_LIBRARY_PATH="${output}/lib:${output_sysroot_lib}" ${output}/bin/rustc_binary "\$@" - EOF - chmod +x "${output}/bin/rustc" || die "Failed to make rustc wrapper executable" - - # Perform a sanity check on the final Rust. - mkdir -p "${T}"/output-hello || die - edo "${output}/bin/rustc" -L "${output_sysroot_lib}" -g "${S}/tests/ui/hello_world/main.rs" \ - -o "${T}"/output-hello/hello - "${T}"/output-hello/hello || die "Failed to run hello_world built with bootstrapped Rust" - - elog "Successfully bootstrapped Rust using mrustc!" - - # Note: The Rust sysroot that we've produced is pretty close to what we'd expect from a normal Rust build. - # If someone was so inclined they could build an optimised cargo using the stage2 rustc and sysroot, - # and install the output directly. This is untested, as I'm sure there's more to it than that. - # I'm satisfied with being able to build Rust normally at this point. - - # Tidy up the Rust sources; revert mrustc changes so Rust can be built normally. - pushd "${S}" 2>/dev/null || die - patch -R -p0 < "${BROOT}"/usr/share/mrustc-${MRUSTC_VERSION}/patches/rustc-${MRUSTC_RUST_VERSION}-src.patch || - die "Failed to revert mrustc patches" - popd 2>/dev/null || die - - # Tidy up any environment variables we've set in the bootstrap process. - unset CFG_COMPILER_HOST_TRIPLE CFG_RELEASE CFG_RELEASE_CHANNEL CFG_PREFIX CFG_VERSION - unset CFG_LIBDIR_RELATIVE LLVM_CONFIG REAL_LIBRARY_PATH_VAR RUSTFLAGS RUSTC_BOOTSTRAP RUSTC_INSTALL_BINDIR -} - -src_compile() { - use mrustc-bootstrap && mrustc_bootstrap - RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die -} - -src_test() { - # https://rustc-dev-guide.rust-lang.org/tests/intro.html - - # those are basic and codegen tests. - local tests=( - codegen - codegen-units - compile-fail - incremental - mir-opt - pretty - run-make - ) - - # fails if llvm is not built with ALL targets. - # and known to fail with system llvm sometimes. - use system-llvm || tests+=( assembly ) - - # fragile/expensive/less important tests - # or tests that require extra builds - # TODO: instead of skipping, just make some nonfatal. - if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then - tests+=( - rustdoc - rustdoc-js - rustdoc-js-std - rustdoc-ui - run-make-fulldeps - ui - ui-fulldeps - ) - fi - - local i failed=() - einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" - for i in "${tests[@]}"; do - local t="src/test/${i}" - einfo "rust_src_test: running ${t}" - if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ - -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" - then - failed+=( "${t}" ) - eerror "rust_src_test: ${t} failed" - fi - done - - if [[ ${#failed[@]} -ne 0 ]]; then - eerror "rust_src_test: failure summary: ${failed[@]}" - die "aborting due to test failures" - fi -} - -src_install() { - DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die - - # bug #689562, #689160 - rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die - rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - rust-demangler - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use miri && symlinks+=( miri cargo-miri ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- - # need to fix eselect-rust to remove this hack. - local ver_i="${i}-${PV}" - if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then - einfo "Installing ${i} symlink" - ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die - else - ewarn "${i} symlink requested, but source file not found" - ewarn "please report this" - fi - dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" - use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" - dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" - dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" - dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" - - newenvd - "50${P}" <<-_EOF_ - LDPATH="${EPREFIX}/usr/lib/rust/lib-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" - _EOF_ - - rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-demangler - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use miri; then - echo /usr/bin/miri >> "${T}/provider-${P}" - echo /usr/bin/cargo-miri >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/lib/rust/libexec >> "${T}/provider-${P}" - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - - if use dist; then - insinto "/usr/lib/${PN}/${PV}/dist" - doins -r "${S}/build/dist/." - fi -} - -pkg_preinst() { - # 943308 and friends; basically --keep-going can forget to unmerge old rust - # but the soft blocker allows us to install conflicting files. - # This results in duplicated .{rlib,so} files which confuses rustc and results in - # the need for manual intervention. - if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then - # we need to find all .{rlib,so} files in the old rust lib directory - # and store them in an array for later use - readarray -d '' old_rust_libs < <( - find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ - -type f \( -name '*.rlib' -o -name '*.so' \) -print0) - export old_rust_libs - if [[ ${#old_rust_libs[@]} -gt 0 ]]; then - einfo "Found old .rlib and .so files in the old rust lib directory" - else - die "Found no old .rlib and .so files but old rust version is installed. Bailing!" - fi - fi -} - -pkg_postinst() { - - local old_rust="dev-lang/rust:stable/$(ver_cut 1-2)" - if has_version -b ${old_rust}; then - # Be _extra_ careful here as we're removing files from the live filesystem - local f - local only_one_file=() - einfo "Tidying up libraries files from non-slotted \`${old_rust}\`." - for f in "${old_rust_libs[@]}"; do - [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" - local base_name="${f%-*}" - local ext="${f##*.}" - local matching_files=("${base_name}"-*.${ext}) - case ${#matching_files[@]} in - 2) - einfo "Removing old .${ext}: ${f}" - rm "${f}" || die - ;; - 1) - # Turns out fingerprints are not as unique as we'd thought, _sometimes_ they collide, - # so we may have already installed over the old file. - # We'll warn about this just in case, but it's probably fine. - only_one_file+=( "${matching_files[0]}" ) - ;; - *) - die "Expected one or two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" - ;; - esac - done - if [[ ${#only_one_file} -gt 0 ]]; then - einfo "While tidying up non-slotted rust libraries for \`${old_rust}\`," - einfo "the following file(s) did not have a duplicate where one was expected:" - for f in "${only_one_file[@]}"; do - einfo " * ${f}" - done - einfo "" - einfo "This is unlikely to cause problems; the fingerprint for the library ended up being the same." - einfo "However, if you encounter any issues please report them to the Gentoo Rust Team." - fi - fi - - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - optfeature "Emacs support" "app-emacs/rust-mode" - optfeature "Vim support" "app-vim/rust-vim" -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust/rust-1.74.1-r101.ebuild b/dev-lang/rust/rust-1.74.1-r101.ebuild new file mode 100644 index 000000000000..cabb75e7e37c --- /dev/null +++ b/dev-lang/rust/rust-1.74.1-r101.ebuild @@ -0,0 +1,1022 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 17 ) +PYTHON_COMPAT=( python3_{10..12} ) + +RUST_MAX_VER=${PV} +RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" +RUST_OPTIONAL=1 + +MRUSTC_VERSION="0.11.2" +MRUSTC_RUST_VERSION="1.74.0" + +inherit check-reqs cmake edo estack flag-o-matic llvm-r1 multiprocessing multilib multilib-build \ + optfeature python-any-r1 rust rust-toolchain toolchain-funcs verify-sig + +if [[ ${PV} = *beta* ]]; then + betaver=${PV//*beta} + BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" + MY_P="rustc-beta" + SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" +else + MY_P="rustc-${PV}" + SRC="${MY_P}-src.tar.xz" + KEYWORDS="amd64 arm arm64 ~loong ppc ppc64 ~riscv sparc x86" +fi + +DESCRIPTION="Language empowering everyone to build reliable and efficient software" +HOMEPAGE="https://www.rust-lang.org/" + +SRC_URI=" + https://static.rust-lang.org/dist/${SRC} + verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) +" + +S="${WORKDIR}/${MY_P}-src" + +# keep in sync with llvm ebuild of the same version as bundled one. +ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai + LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE + WebAssembly X86 XCore Xtensa ) +ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) +LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} + +ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" +SLOT="${PV}" + +IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind lto miri mrustc-bootstrap nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" + +LLVM_DEPEND=() +# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation +for _x in "${ALL_LLVM_TARGETS[@]}"; do + LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) +done +LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) +LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) + +BDEPEND="${PYTHON_DEPS} + app-eselect/eselect-rust + || ( + >=sys-devel/gcc-4.7 + >=llvm-core/clang-3.5 + ) + !system-llvm? ( + >=dev-build/cmake-3.13.4 + app-alternatives/ninja + ) + test? ( dev-debug/gdb ) + verify-sig? ( sec-keys/openpgp-keys-rust ) + mrustc-bootstrap? ( + ~dev-lang/mrustc-${MRUSTC_VERSION} + dev-build/cmake + sys-devel/gcc:* + ) + !mrustc-bootstrap? ( ${RUST_DEPEND} ) +" + +DEPEND=" + >=app-arch/xz-utils-5.2 + net-misc/curl:=[http2,ssl] + sys-libs/zlib:= + dev-libs/openssl:0= + system-llvm? ( + ${LLVM_DEPEND[*]} + llvm-libunwind? ( llvm-runtimes/libunwind:= ) + ) + !system-llvm? ( + !llvm-libunwind? ( + elibc_musl? ( sys-libs/libunwind:= ) + ) + ) +" + +RDEPEND="${DEPEND} + app-eselect/eselect-rust + dev-lang/rust-common + sys-apps/lsb-release + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" + +REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) + miri? ( nightly ) + parallel-compiler? ( nightly ) + rust-analyzer? ( rust-src ) + test? ( ${ALL_LLVM_TARGETS[*]} ) + wasm? ( llvm_targets_WebAssembly ) + x86? ( cpu_flags_x86_sse2 ) +" + +# we don't use cmake.eclass, but can get a warning +CMAKE_WARN_UNUSED_CLI=no + +QA_FLAGS_IGNORED=" + usr/lib/${PN}/${PV}/bin/.* + usr/lib/${PN}/${PV}/libexec/.* + usr/lib/${PN}/${PV}/lib/lib.*.so + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_SONAME=" + usr/lib/${PN}/${PV}/lib/lib.*.so.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_PRESTRIPPED=" + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +# causes double bootstrap +RESTRICT="test" + +VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc + +PATCHES=( + "${FILESDIR}"/1.74.1-cross-compile-libz.patch + #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch # pending refresh + "${FILESDIR}"/1.70.0-ignore-broken-and-non-applicable-tests.patch + "${FILESDIR}"/1.62.1-musl-dynamic-linking.patch + "${FILESDIR}"/1.67.0-doc-wasm.patch +) + +clear_vendor_checksums() { + sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die +} + +toml_usex() { + usex "${1}" true false +} + +pre_build_checks() { + local M=9216 + # multiply requirements by 1.3 if we are doing x86-multilib + if use amd64; then + M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) + fi + M=$(( $(usex clippy 128 0) + ${M} )) + M=$(( $(usex miri 128 0) + ${M} )) + M=$(( $(usex rustfmt 256 0) + ${M} )) + # add 2G if we compile llvm and 256M per llvm_target + if ! use system-llvm; then + M=$(( 2048 + ${M} )) + local ltarget + for ltarget in ${ALL_LLVM_TARGETS[@]}; do + M=$(( $(usex ${ltarget} 256 0) + ${M} )) + done + fi + M=$(( $(usex wasm 256 0) + ${M} )) + M=$(( $(usex debug 2 1) * ${M} )) + eshopts_push -s extglob + if is-flagq '-g?(gdb)?([1-9])'; then + M=$(( 15 * ${M} / 10 )) + fi + eshopts_pop + M=$(( $(usex doc 256 0) + ${M} )) + if use mrustc-bootstrap; then + M=$(( 2 * ${M} )) + fi + CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} +} + +llvm_check_deps() { + has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" +} + +# Is LLVM being linked against libc++? +is_libcxx_linked() { + local code='#include +#if defined(_LIBCPP_VERSION) + HAVE_LIBCXX +#endif +' + local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 + [[ ${out} == *HAVE_LIBCXX* ]] +} + +pkg_pretend() { + pre_build_checks +} + +pkg_setup() { + if [[ ${MERGE_TYPE} != binary ]]; then + pre_build_checks + python-any-r1_pkg_setup + + export LIBGIT2_NO_PKG_CONFIG=1 #749381 + if tc-is-cross-compiler; then + use system-llvm && die "USE=system-llvm not allowed when cross-compiling" + local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" + use "llvm_targets_${cross_llvm_target}" || \ + die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" + fi + + if use mrustc-bootstrap; then + if ! tc-is-gcc; then + die "USE=mrustc-bootstrap reqires that the build environment use GCC" + fi + else + rust_pkg_setup + fi + + if use system-llvm; then + llvm-r1_pkg_setup + + local llvm_config="$(get_llvm_prefix)/bin/llvm-config" + export LLVM_LINK_SHARED=1 + export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" + fi + fi +} + +src_prepare() { + default + # We'll need to revert this after the bootstrap. + if use mrustc-bootstrap; then + pushd "${S}" 2>/dev/null || die + patch -p0 < "${BROOT}"/usr/share/mrustc-${MRUSTC_VERSION}/patches/rustc-${MRUSTC_RUST_VERSION}-src.patch || + die "Failed to patch sources to enable bootstrap with mrustc" + popd 2>/dev/null || die + fi +} + +src_configure() { + if tc-is-cross-compiler; then + export PKG_CONFIG_ALLOW_CROSS=1 + export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" + export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" + export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" + fi + + filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 + + local rust_target="" rust_targets="" arch_cflags + + # Collect rust target names to compile standard libs for all ABIs. + for v in $(multilib_get_enabled_abi_pairs); do + rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" + done + if use wasm; then + rust_targets+=",\"wasm32-unknown-unknown\"" + if use system-llvm; then + # un-hardcode rust-lld linker for this target + # https://bugs.gentoo.org/715348 + sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/wasm_base.rs || die + fi + fi + rust_targets="${rust_targets#,}" + + # cargo and rustdoc are mandatory and should always be included + local tools='"cargo","rustdoc", "rust-demangler"' + use clippy && tools+=',"clippy"' + use miri && tools+=',"miri"' + use rustfmt && tools+=',"rustfmt"' + use rust-analyzer && tools+=',"rust-analyzer"' + use rust-src && tools+=',"src"' + + if use mrustc-bootstrap; then + local rust_stage0_root="${WORKDIR}/bootstrap/rust-${PV}" + else + local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" + # in case of prefix it will be already prefixed, as --print sysroot returns full path + [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" + fi + + rust_target="$(rust_abi)" + rust_build="$(rust_abi "${CBUILD}")" + rust_host="$(rust_abi "${CHOST}")" + + LLVM_EXPERIMENTAL_TARGETS=() + for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do + if use llvm_targets_${_x} ; then + LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) + fi + done + LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} + + local cm_btype="$(usex debug DEBUG RELEASE)" + cat <<- _EOF_ > "${S}"/config.toml + changelog-seen = 2 + [llvm] + download-ci-llvm = false + optimize = $(toml_usex !debug) + release-debuginfo = $(toml_usex debug) + assertions = $(toml_usex debug) + ninja = true + targets = "${LLVM_TARGETS// /;}" + experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" + link-shared = $(toml_usex system-llvm) + $(if is_libcxx_linked; then + # https://bugs.gentoo.org/732632 + echo "use-libcxx = true" + echo "static-libstdcpp = false" + fi) + $(case "${rust_target}" in + i586-*-linux-*) + # https://github.com/rust-lang/rust/issues/93059 + echo 'cflags = "-fcf-protection=none"' + echo 'cxxflags = "-fcf-protection=none"' + echo 'ldflags = "-fcf-protection=none"' + ;; + *) + ;; + esac) + enable-warnings = false + [llvm.build-config] + CMAKE_VERBOSE_MAKEFILE = "ON" + $(if ! tc-is-cross-compiler; then + # When cross-compiling, LLVM is compiled twice, once for host and + # once for target. Unfortunately, this build configuration applies + # to both, which means any flags applicable to one target but not + # the other will break. Conditionally disable respecting user + # flags when cross-compiling. + echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" + echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" + echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" + fi) + [build] + build-stage = 2 + test-stage = 2 + build = "${rust_build}" + host = ["${rust_host}"] + target = [${rust_targets}] + cargo = "${rust_stage0_root}/bin/cargo" + rustc = "${rust_stage0_root}/bin/rustc" + rustfmt = "${rust_stage0_root}/bin/rustfmt" + docs = $(toml_usex doc) + compiler-docs = false + submodules = false + python = "${EPYTHON}" + locked-deps = true + vendor = true + extended = true + tools = [${tools}] + verbose = 2 + sanitizers = false + profiler = true + cargo-native-static = false + [install] + prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" + sysconfdir = "etc" + docdir = "share/doc/rust" + bindir = "bin" + libdir = "lib" + mandir = "share/man" + [rust] + # https://github.com/rust-lang/rust/issues/54872 + codegen-units-std = 1 + optimize = true + debug = $(toml_usex debug) + debug-assertions = $(toml_usex debug) + debug-assertions-std = $(toml_usex debug) + debuginfo-level = $(usex debug 2 0) + debuginfo-level-rustc = $(usex debug 2 0) + debuginfo-level-std = $(usex debug 2 0) + debuginfo-level-tools = $(usex debug 2 0) + debuginfo-level-tests = 0 + backtrace = true + incremental = false + $(if ! tc-is-cross-compiler; then + echo "default-linker = \"$(tc-getCC)\"" + fi) + parallel-compiler = $(toml_usex parallel-compiler) + channel = "$(usex nightly nightly stable)" + description = "gentoo" + rpath = true + verbose-tests = true + optimize-tests = $(toml_usex !debug) + codegen-tests = true + dist-src = false + remap-debuginfo = true + lld = $(usex system-llvm false $(toml_usex wasm)) + # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it + # https://github.com/rust-lang/rust/issues/74976 + # https://github.com/rust-lang/rust/issues/76526 + deny-warnings = $(usex wasm $(usex doc false true) true) + backtrace-on-ice = true + jemalloc = false + lto = "$(usex lto fat off)" + [dist] + src-tarball = false + compression-formats = ["xz"] + compression-profile = "balanced" + _EOF_ + + for v in $(multilib_get_enabled_abi_pairs); do + rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) + arch_cflags="$(get_abi_CFLAGS ${v##*.})" + + export CFLAGS_${rust_target//-/_}="${arch_cflags}" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${rust_target}] + ar = "$(tc-getAR)" + cc = "$(tc-getCC)" + cxx = "$(tc-getCXX)" + linker = "$(tc-getCC)" + ranlib = "$(tc-getRANLIB)" + llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; + # but we patch it and set to false here as well + if use elibc_musl; then + cat <<- _EOF_ >> "${S}"/config.toml + crt-static = false + _EOF_ + fi + done + if use wasm; then + cat <<- _EOF_ >> "${S}"/config.toml + [target.wasm32-unknown-unknown] + linker = "$(usex system-llvm lld rust-lld)" + # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 + profiler = false + _EOF_ + fi + + if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below + # experimental cross support + # discussion: https://bugs.gentoo.org/679878 + # TODO: c*flags, clang, system-llvm, cargo.eclass target support + # it would be much better if we could split out stdlib + # complilation to separate ebuild and abuse CATEGORY to + # just install to /usr/lib/rustlib/ + + # extra targets defined as a bash array + # spec format: :: + # best place would be /etc/portage/env/dev-lang/rust + # Example: + # RUST_CROSS_TARGETS=( + # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" + # ) + # no extra hand holding is done, no target transformations, all + # values are passed as-is with just basic checks, so it's up to user to supply correct values + # valid rust targets can be obtained with + # rustc --print target-list + # matching cross toolchain has to be installed + # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) + # only gcc toolchains installed with crossdev are checked for now. + + # BUG: we can't pass host flags to cross compiler, so just filter for now + # BUG: this should be more fine-grained. + filter-flags '-mcpu=*' '-march=*' '-mtune=*' + + local cross_target_spec + for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do + # extracts first element form :: + local cross_llvm_target="${cross_target_spec%%:*}" + # extracts toolchain triples, : + local cross_triples="${cross_target_spec#*:}" + # extracts first element after before : separator + local cross_rust_target="${cross_triples%%:*}" + # extracts last element after : separator + local cross_toolchain="${cross_triples##*:}" + use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" + command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${cross_rust_target}] + ar = "${cross_toolchain}-ar" + cc = "${cross_toolchain}-gcc" + cxx = "${cross_toolchain}-g++" + linker = "${cross_toolchain}-gcc" + ranlib = "${cross_toolchain}-ranlib" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + if [[ "${cross_toolchain}" == *-musl* ]]; then + cat <<- _EOF_ >> "${S}"/config.toml + musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" + _EOF_ + fi + + # append cross target to "normal" target list + # example 'target = ["powerpc64le-unknown-linux-gnu"]' + # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' + + rust_targets="${rust_targets},\"${cross_rust_target}\"" + sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die + + ewarn + ewarn "Enabled ${cross_rust_target} rust target" + ewarn "Using ${cross_toolchain} cross toolchain" + ewarn + if ! has_version -b 'sys-devel/binutils[multitarget]' ; then + ewarn "'sys-devel/binutils[multitarget]' is not installed" + ewarn "'strip' will be unable to strip cross libraries" + ewarn "cross targets will be installed with full debug information" + ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" + ewarn + ewarn "Alternatively llvm-strip can be used, it supports stripping any target" + ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" + ewarn + fi + done + fi # I_KNOW_WHAT_I_AM_DOING_CROSS + + einfo "Rust configured with the following flags:" + echo + echo RUSTFLAGS="\"${RUSTFLAGS}\"" + echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" + echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" + echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" + env | grep "CARGO_TARGET_.*_RUSTFLAGS=" + env | grep "CFLAGS_.*" + echo + einfo "config.toml contents:" + cat "${S}"/config.toml || die + echo +} + +# Build a very minimal llvm that we can use for bootstrap rustc codegen +llvm_bootstrap() { + # Reference ${P}/src/bootstrap/native.rs for these values + local llvm_cmake_opts=( + "-G Ninja" + "-DLLVM_TARGET_ARCH=${CFG_COMPILER_HOST_TRIPLE%%-*}" + "-DLLVM_DEFAULT_TARGET_TRIPLE=${CFG_COMPILER_HOST_TRIPLE}" + "-DLLVM_TARGETS_TO_BUILD=${BOOTSTRAP_LLVM_TARGETS:=X86;ARM;AArch64}" #;Mips;PowerPC;SystemZ;JSBackend;MSP430;Sparc;NVPTX + "-DLLVM_ENABLE_ASSERTIONS=OFF" + "-DLLVM_INCLUDE_EXAMPLES=OFF" + "-DLLVM_INCLUDE_TESTS=OFF" + "-DLLVM_INCLUDE_DOCS=OFF" + "-DLLVM_INCLUDE_BENCHMARKS=OFF" + "-DLLVM_ENABLE_ZLIB=OFF" + "-DLLVM_ENABLE_TERMINFO=OFF" + "-DLLVM_ENABLE_LIBEDIT=OFF" + "-DCMAKE_CXX_COMPILER=$(tc-getCXX)" + "-DCMAKE_C_COMPILER=$(tc-getCC)" + "-DCMAKE_BUILD_TYPE=Release" + ) + + if [[ -z "${LLVM_CMAKE_OPTS_EXTRA}" ]]; then + llvm_cmake_opts+=( "${LLVM_CMAKE_OPTS_EXTRA}") + fi + + elog "Building bootstrap llvm ..." + + mkdir -p "${WORKDIR}/bootstrap/llvm" || die + pushd "${WORKDIR}/bootstrap/llvm" 2>/dev/null || die + edo cmake ${llvm_cmake_opts[*]} "${S}/src/llvm-project/llvm" + eninja || die "Failed to build bootstrap llvm" + popd 2>/dev/null || die +} + +# High level steps: +# Our system mrustc package has built stdlib for our current platform. +# - Step 1: Use system-installed mrustc, (m)rust(c) stdlib, and minicargo to +# bootstrap a `cargo` and `rustc` (mrustc-stage0) +# - Step 2: Use minicargo and the built `rustc` to build a working `sysroot` +# (includes `std`, `panic_unwind``, `test`, etc.) (mrustc-stage0) +# - Step 3: Build build libs again (this time using `cargo` and `rustc`) (mrustc-stage1) +# - Step 4: Build a `rustc` using those libs (mrustc-stage1) +# - Done so there's an optimised rustc arollvm_cmake_optsund (mrustc is bad at codegen) +# - Step 5: Build `libstd` with this `rustc` (mrustc-stage2) +# - Needed to match ABIs +# Stages: +# - mrustc-stage0: mrustc-built cargo and rustc +# - mrustc-stage1: rustc and sysroot built with mrustc-stage0 +# - mrustc-stage2: rustc from stage1 with sysroot built with stage0 +# See: +# - https://github.com/thepowersgang/mrustc/blob/master/run_rustc/Makefile +# - https://github.com/thepowersgang/mrustc/blob/master/TestRustcBootstrap.sh +# - Upstream Windows .cmd files are also a good reference for early bootstrap +mrustc_bootstrap() { + export RUSTC_BOOTSTRAP=1 # Possibly the only intended use of this variable in ::gentoo + # export these variables now and unset them at the end of the function so they don't leak + # into the rest of the build. + export CFG_COMPILER_HOST_TRIPLE="$(rust_abi)" + export CFG_RELEASE="${MRUSTC_RUST_VERSION}" # Let's pretend we're 1.74.0 + export CFG_RELEASE_CHANNEL="stable" + export CFG_VERSION="${MRUSTC_RUST_VERSION}-stable-mrustc" + export CFG_PREFIX="mrustc" + export CFG_LIBDIR_RELATIVE="lib" + export RUSTC_INSTALL_BINDIR="bin" + export REAL_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" + + # These flags are used in every invocation of our bootstrap `cargo`. + local cargo_flags="--target ${CFG_COMPILER_HOST_TRIPLE} -j $(makeopts_jobs) --release --verbose" + + if use system-llvm; then + export LLVM_CONFIG="$(get_llvm_prefix)/bin/llvm-config" + else + llvm_bootstrap + export LLVM_CONFIG="${WORKDIR}/bootstrap/llvm/bin/llvm-config" + fi + + # define the mrustc sysroot and common minicargo arguments. + local mrustc_sysroot="${BROOT}/usr/lib/rust/mrustc-${MRUSTC_VERSION}/lib/rustlib/${CFG_COMPILER_HOST_TRIPLE}/lib" + local minicargo_common_args=( + "-L" "${mrustc_sysroot}" + "-j" "$(makeopts_jobs)" + "--vendor-dir" "${S}/vendor" + "--manifest-overrides" + "${BROOT}/usr/share/mrustc-${MRUSTC_VERSION}/patches/rustc-${MRUSTC_RUST_VERSION}-overrides.toml" + ) + # There's a very good chance that minicargo and mrustc are not in the PATH. + if ! command -v minicargo &> /dev/null; then + export PATH="${BROOT}/usr/lib/rust/mrustc-${MRUSTC_VERSION}/bin:${PATH}" + fi + # Sanity check our bootstrap compiler & stdlib. + elog "Sanity checking mrustc and stdlib ..." + edo mrustc "${S}/tests/ui/hello_world/main.rs" -L "${mrustc_sysroot}" -o "${T}"/hello -g + "${T}"/hello || die "Failed to run hello_world" + # Seems fine, let's build some tools! + + # Step 1: Build a `cargo` and `rustc` using system-installed mrustc + # Anything we produce is going to be terribly unoptimised; mrustc does not do fantastic codegen. + # It's good enough to bootstrap the "real" rustc though. + elog "Building bootstrap cargo and rustc using mrustc and minicargo (mrustc-stage0) ..." + local stage0="${WORKDIR}/bootstrap/mrustc-stage0" + mkdir -p "${stage0}" || die + edo minicargo "${S}"/src/tools/cargo --output-dir "${stage0}"/cargo-build ${minicargo_common_args[*]} + "${stage0}"/cargo-build/cargo --version || die "Bootstrap cargo failed basic sanity check" + edo minicargo "${S}"/compiler/rustc --output-dir "${stage0}"/rustc-build ${minicargo_common_args[*]} \ + --features llvm + "${stage0}"/rustc-build/rustc_main --version || die "Bootstrap rustc failed basic sanity check" + # minicargo has special-casing for `rustc` so we need to rename it. + mv "${stage0}"/rustc-build/rustc_main "${stage0}"/rustc-build/rustc || die "Failed to rename rustc_main to rustc" + # rustc wants these here + mkdir -p "${stage0}"/codegen-backends || die + mv "${stage0}"/rustc-build/librustc_codegen_llvm.* "${stage0}"/codegen-backends || die + + # Step 2: use the bootstrapped rustc to build sysroot; we need to use `minicargo` for this - + # mrustc does not accept all of the arguments that rustc does, even with the rustc_proxy wrapper. + # `--script-overrides`: If the overrides are available, build scripts (and build-deps) are not built + # which is good since we don't have a working compiler yet, and can't build them. + + local stage0_sysroot_lib="${stage0}/lib/rustlib/${CFG_COMPILER_HOST_TRIPLE}/lib" + # minicargo <= 0.11.2 doesn't create this directory and silently fails, besides it's better to be explicit, right? + mkdir -p "${stage0_sysroot_lib}" || die "Failed to create stage0 directory" + + elog "Building 'sysroot' using bootstrap rustc (mrustc-stage0) ..." + edo env MRUSTC_PATH="${stage0}/rustc-build/rustc" minicargo -j $(makeopts_jobs) --vendor-dir "${S}"/vendor \ + --script-overrides "${BROOT}/usr/share/mrustc-0.11.2/script-overrides/stable-${MRUSTC_RUST_VERSION}-linux/" \ + --output-dir "${stage0_sysroot_lib}" "${S}"/library/sysroot || + die "Failed to build sysroot with bootstrap rust (mrustc-stage0)" + + elog "Sanity checking sysroot and rustc ..." + mkdir -p "${T}"/stage0-hello || die + edo "${stage0}"/rustc-build/rustc -L "${stage0_sysroot_lib}" -g "${S}/tests/ui/hello_world/main.rs" \ + -o "${T}"/stage0-hello/hello + "${T}"/stage0-hello/hello || die "Failed to run hello_world built with bootstrap rust stage0" + + elog "mrustc bootstrap stage0 complete!" + + # Step 3: Build a "proper" libstd, including dynamic libs using our bootstrap cargo and rustc. + elog "Building 'sysroot' with the stage0 rustc (mrustc-stage1) ..." + local stage1="${WORKDIR}/bootstrap/mrustc-stage1" + local stage1_sysroot_lib="${stage1}/lib/rustlib/${CFG_COMPILER_HOST_TRIPLE}/lib" + mkdir -p "${stage1_sysroot_lib}" || die "Failed to create stage1 directory" + mkdir -p "${stage1}/bin" || die + + # Simplified to avoid calling rustc_proxy; We don't need stage1 rustc until after this is built... + edo env RUSTFLAGS="-Z force-unstable-if-unmarked" CARGO_TARGET_DIR="${stage1}/sysroot-build" \ + RUSTC="${stage0}/rustc-build/rustc" "${stage0}"/cargo-build/cargo build ${cargo_flags} \ + --manifest-path "${S}/library/sysroot/Cargo.toml" --features panic-unwind + + # Move the built libs into the sysroot libdir. + mv "${stage1}/sysroot-build/${CFG_COMPILER_HOST_TRIPLE}/release/deps"/*.{rlib,rmeta,so} \ + "${stage1_sysroot_lib}" || die "Failed to move stage1 libs to stage1 sysroot" + + # We need to copy the stage0 rustc to the stage1 sysroot; this "updates" the sysroot location and enables + # resolution of stage1 libs. (run `rustc --print sysroot` on stage0 and stage1 rustc to verify) + cp "${stage0}/rustc-build/rustc" "${stage1}/bin/rustc" || die "Failed to copy rustc to stage1 sysroot" + + # Step 4: Build `rustc` with itself, so we have a rustc with the right ABI. + # This will be our final `rustc` for the bootstrap process. + elog "Building rustc with stage1 libs (mrustc-stage1) ..." + mkdir -p "${stage1}/rustc-build" || die + edo env RUSTFLAGS="-Z force-unstable-if-unmarked -C link_args=-Wl,-rpath,\$ORIGIN/../lib" \ + LD_LIBRARY_PATH="${stage2_sysroot_lib}" CARGO_TARGET_DIR="${stage1}/rustc-build" \ + RUSTC="${stage1}/bin/rustc" TMPDIR="${T}" "${stage0}"/cargo-build/cargo build ${cargo_flags} \ + --manifest-path "${S}/compiler/rustc/Cargo.toml" --features llvm + + # Step 5: Build `sysroot` with this `rustc` - Needed to match ABI + # We need to use the previous sysroot; we could reuse that dir but it's easier to just copy it. + elog "Building final 'sysroot' with the final rustc (mrustc-stage2) ..." + local stage2="${WORKDIR}/bootstrap/mrustc-stage2" + local stage2_sysroot_lib="${stage2}/lib/rustlib/${CFG_COMPILER_HOST_TRIPLE}/lib" + mkdir -p "${stage2_sysroot_lib}" || die "Failed to create stage2 directory" + mkdir -p "${stage2}/bin" || die + + # Copy required files from stage1 to stage2 sysroot + cp "${stage1}/rustc-build/${CFG_COMPILER_HOST_TRIPLE}"/release/rustc-main "${stage2}/bin/rustc_binary" || + die "Failed to copy final rustc to stage2 sysroot" + cp "${stage1}/rustc-build/${CFG_COMPILER_HOST_TRIPLE}"/release/librustc_driver.so "${stage2}/lib" || + die "Failed to copy librustc_driver to sysroot" + cp "${stage1}/rustc-build/${CFG_COMPILER_HOST_TRIPLE}"/release/deps/*.{rlib,so} "${stage2_sysroot_lib}" || + die "Failed to copy final rustc libs to stage2 sysroot" + cp "${stage1_sysroot_lib}"/* "${stage2_sysroot_lib}" || die "Failed to copy stage1 so files to stage2 sysroot" + + # There's a magic script used in place of rustc so that libs can be found + cat <<- EOF > "${stage2}/bin/rustc" || die "Failed to create rustc wrapper" + #!/bin/sh + LD_LIBRARY_PATH="${stage2}/lib:${stage2_sysroot_lib}" ${stage2}/bin/rustc_binary "\$@" + EOF + chmod +x "${stage2}/bin/rustc" || die "Failed to make rustc wrapper executable" + + # Use rustc to build 'sysroot'; this is the final step in the bootstrap process. + # rpath probably isn't needed here, but it doesn't hurt. + edo env RUSTFLAGS="-Z force-unstable-if-unmarked -C link_args=-Wl,-rpath,\$ORIGIN/../lib" \ + CARGO_TARGET_DIR="${stage2}/stdlib-build" RUSTC="${stage2}/bin/rustc" \ + "${stage0}"/cargo-build/cargo build ${cargo_flags} --manifest-path "${S}/library/sysroot/Cargo.toml" \ + --features panic-unwind + + # Build our final output sysroot + local output="${WORKDIR}/bootstrap/rust-${PV}" + local output_sysroot_lib="${output}/lib/rustlib/${CFG_COMPILER_HOST_TRIPLE}/lib" + mkdir -p "${output_sysroot_lib}" || die "Failed to create output directory" + mkdir -p "${output}/bin" || die "Failed to create output directory" + + # Copy our various output files into the output sysroot + # rustc + cp "${stage1}/rustc-build/${CFG_COMPILER_HOST_TRIPLE}"/release/rustc-main "${output}/bin/rustc_binary" || + die "Failed to copy final rustc to output" + cp "${stage1}/rustc-build/${CFG_COMPILER_HOST_TRIPLE}"/release/librustc_driver.so "${output}/lib" || + die "Failed to copy librustc_driver to output" + cp "${stage1}/rustc-build/${CFG_COMPILER_HOST_TRIPLE}"/release/deps/*.{rlib,so} "${output_sysroot_lib}" || + die "Failed to copy final rustc libs to output" + # cargo; no need to build an optimised cargo if we're using this to build a complelety new Rust. + cp "${stage0}/cargo-build/cargo" "${output}/bin/cargo" || die "Failed to copy cargo to output" + # libs + mv "${stage2}/stdlib-build/${CFG_COMPILER_HOST_TRIPLE}/release/deps"/*.{rlib,rmeta,so} "${output_sysroot_lib}" || + die "Failed to copy stage2 libs to output" + # Our trusty rustc wrapper + cat <<- EOF > "${output}/bin/rustc" || die "Failed to create rustc wrapper" + #!/bin/sh + LD_LIBRARY_PATH="${output}/lib:${output_sysroot_lib}" ${output}/bin/rustc_binary "\$@" + EOF + chmod +x "${output}/bin/rustc" || die "Failed to make rustc wrapper executable" + + # Perform a sanity check on the final Rust. + mkdir -p "${T}"/output-hello || die + edo "${output}/bin/rustc" -L "${output_sysroot_lib}" -g "${S}/tests/ui/hello_world/main.rs" \ + -o "${T}"/output-hello/hello + "${T}"/output-hello/hello || die "Failed to run hello_world built with bootstrapped Rust" + + elog "Successfully bootstrapped Rust using mrustc!" + + # Note: The Rust sysroot that we've produced is pretty close to what we'd expect from a normal Rust build. + # If someone was so inclined they could build an optimised cargo using the stage2 rustc and sysroot, + # and install the output directly. This is untested, as I'm sure there's more to it than that. + # I'm satisfied with being able to build Rust normally at this point. + + # Tidy up the Rust sources; revert mrustc changes so Rust can be built normally. + pushd "${S}" 2>/dev/null || die + patch -R -p0 < "${BROOT}"/usr/share/mrustc-${MRUSTC_VERSION}/patches/rustc-${MRUSTC_RUST_VERSION}-src.patch || + die "Failed to revert mrustc patches" + popd 2>/dev/null || die + + # Tidy up any environment variables we've set in the bootstrap process. + unset CFG_COMPILER_HOST_TRIPLE CFG_RELEASE CFG_RELEASE_CHANNEL CFG_PREFIX CFG_VERSION + unset CFG_LIBDIR_RELATIVE LLVM_CONFIG REAL_LIBRARY_PATH_VAR RUSTFLAGS RUSTC_BOOTSTRAP RUSTC_INSTALL_BINDIR +} + +src_compile() { + use mrustc-bootstrap && mrustc_bootstrap + RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die +} + +src_test() { + # https://rustc-dev-guide.rust-lang.org/tests/intro.html + + # those are basic and codegen tests. + local tests=( + codegen + codegen-units + compile-fail + incremental + mir-opt + pretty + run-make + ) + + # fails if llvm is not built with ALL targets. + # and known to fail with system llvm sometimes. + use system-llvm || tests+=( assembly ) + + # fragile/expensive/less important tests + # or tests that require extra builds + # TODO: instead of skipping, just make some nonfatal. + if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then + tests+=( + rustdoc + rustdoc-js + rustdoc-js-std + rustdoc-ui + run-make-fulldeps + ui + ui-fulldeps + ) + fi + + local i failed=() + einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" + for i in "${tests[@]}"; do + local t="src/test/${i}" + einfo "rust_src_test: running ${t}" + if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ + -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" + then + failed+=( "${t}" ) + eerror "rust_src_test: ${t} failed" + fi + done + + if [[ ${#failed[@]} -ne 0 ]]; then + eerror "rust_src_test: failure summary: ${failed[@]}" + die "aborting due to test failures" + fi +} + +src_install() { + DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die + + # bug #689562, #689160 + rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die + rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die + + local symlinks=( + cargo + rustc + rustdoc + rust-gdb + rust-gdbgui + rust-lldb + rust-demangler + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use miri && symlinks+=( miri cargo-miri ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- + # need to fix eselect-rust to remove this hack. + local ver_i="${i}-${PV}" + if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then + einfo "Installing ${i} symlink" + ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die + else + ewarn "${i} symlink requested, but source file not found" + ewarn "please report this" + fi + dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" + use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" + dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" + dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" + dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" + + newenvd - "50${P}" <<-_EOF_ + MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" + _EOF_ + + rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-demangler + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use miri; then + echo /usr/bin/miri >> "${T}/provider-${P}" + echo /usr/bin/cargo-miri >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/lib/rust/libexec >> "${T}/provider-${P}" + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + + if use dist; then + insinto "/usr/lib/${PN}/${PV}/dist" + doins -r "${S}/build/dist/." + fi +} + +pkg_preinst() { + # 943308 and friends; basically --keep-going can forget to unmerge old rust + # but the soft blocker allows us to install conflicting files. + # This results in duplicated .{rlib,so} files which confuses rustc and results in + # the need for manual intervention. + if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then + # we need to find all .{rlib,so} files in the old rust lib directory + # and store them in an array for later use + readarray -d '' old_rust_libs < <( + find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ + -type f \( -name '*.rlib' -o -name '*.so' \) -print0) + export old_rust_libs + if [[ ${#old_rust_libs[@]} -gt 0 ]]; then + einfo "Found old .rlib and .so files in the old rust lib directory" + else + die "Found no old .rlib and .so files but old rust version is installed. Bailing!" + fi + fi +} + +pkg_postinst() { + + local old_rust="dev-lang/rust:stable/$(ver_cut 1-2)" + if has_version -b ${old_rust}; then + # Be _extra_ careful here as we're removing files from the live filesystem + local f + local only_one_file=() + einfo "Tidying up libraries files from non-slotted \`${old_rust}\`." + for f in "${old_rust_libs[@]}"; do + [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" + local base_name="${f%-*}" + local ext="${f##*.}" + local matching_files=("${base_name}"-*.${ext}) + case ${#matching_files[@]} in + 2) + einfo "Removing old .${ext}: ${f}" + rm "${f}" || die + ;; + 1) + # Turns out fingerprints are not as unique as we'd thought, _sometimes_ they collide, + # so we may have already installed over the old file. + # We'll warn about this just in case, but it's probably fine. + only_one_file+=( "${matching_files[0]}" ) + ;; + *) + die "Expected one or two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" + ;; + esac + done + if [[ ${#only_one_file} -gt 0 ]]; then + einfo "While tidying up non-slotted rust libraries for \`${old_rust}\`," + einfo "the following file(s) did not have a duplicate where one was expected:" + for f in "${only_one_file[@]}"; do + einfo " * ${f}" + done + einfo "" + einfo "This is unlikely to cause problems; the fingerprint for the library ended up being the same." + einfo "However, if you encounter any issues please report them to the Gentoo Rust Team." + fi + fi + + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + optfeature "Emacs support" "app-emacs/rust-mode" + optfeature "Vim support" "app-vim/rust-vim" +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust/rust-1.75.0-r100.ebuild b/dev-lang/rust/rust-1.75.0-r100.ebuild deleted file mode 100644 index 478f58c567f0..000000000000 --- a/dev-lang/rust/rust-1.75.0-r100.ebuild +++ /dev/null @@ -1,743 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 17 ) -PYTHON_COMPAT=( python3_{10..12} ) - -RUST_MAX_VER=${PV} -RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" - -inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing multilib multilib-build \ - optfeature python-any-r1 rust rust-toolchain toolchain-funcs verify-sig - -if [[ ${PV} = *beta* ]]; then - betaver=${PV//*beta} - BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" - MY_P="rustc-beta" - SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" -else - MY_P="rustc-${PV}" - SRC="${MY_P}-src.tar.xz" - KEYWORDS="amd64 arm arm64 ~loong ppc ppc64 ~riscv sparc x86" -fi - -DESCRIPTION="Language empowering everyone to build reliable and efficient software" -HOMEPAGE="https://www.rust-lang.org/" - -SRC_URI=" - https://static.rust-lang.org/dist/${SRC} - verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) -" -S="${WORKDIR}/${MY_P}-src" - -# keep in sync with llvm ebuild of the same version as bundled one. -ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai - LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE - WebAssembly X86 XCore Xtensa ) -ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) -LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} - -ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" - -IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind +lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" - -LLVM_DEPEND=() -# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation -for _x in "${ALL_LLVM_TARGETS[@]}"; do - LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) -done -LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) -LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) - -BDEPEND="${PYTHON_DEPS} - app-eselect/eselect-rust - || ( - >=sys-devel/gcc-4.7 - >=llvm-core/clang-3.5 - ) - !system-llvm? ( - >=dev-build/cmake-3.13.4 - app-alternatives/ninja - ) - test? ( dev-debug/gdb ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -DEPEND=" - >=app-arch/xz-utils-5.2 - net-misc/curl:=[http2,ssl] - sys-libs/zlib:= - dev-libs/openssl:0= - system-llvm? ( - ${LLVM_DEPEND[*]} - llvm-libunwind? ( llvm-runtimes/libunwind:= ) - ) - !system-llvm? ( - !llvm-libunwind? ( - elibc_musl? ( sys-libs/libunwind:= ) - ) - ) -" - -RDEPEND="${DEPEND} - app-eselect/eselect-rust - dev-lang/rust-common - sys-apps/lsb-release - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" - -REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) - miri? ( nightly ) - parallel-compiler? ( nightly ) - rust-analyzer? ( rust-src ) - test? ( ${ALL_LLVM_TARGETS[*]} ) - wasm? ( llvm_targets_WebAssembly ) - x86? ( cpu_flags_x86_sse2 ) -" - -# we don't use cmake.eclass, but can get a warning -CMAKE_WARN_UNUSED_CLI=no - -QA_FLAGS_IGNORED=" - usr/lib/${PN}/${PV}/bin/.* - usr/lib/${PN}/${PV}/libexec/.* - usr/lib/${PN}/${PV}/lib/lib.*.so - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_SONAME=" - usr/lib/${PN}/${PV}/lib/lib.*.so.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_PRESTRIPPED=" - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -# causes double bootstrap -RESTRICT="test" - -VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc - -PATCHES=( - "${FILESDIR}"/1.75.0-musl-dynamic-linking.patch - "${FILESDIR}"/1.74.1-cross-compile-libz.patch - #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch # pending refresh - "${FILESDIR}"/1.70.0-ignore-broken-and-non-applicable-tests.patch - "${FILESDIR}"/1.67.0-doc-wasm.patch - # This patch shouldn't be necessary for later versions of Rust because its - # code was backported from master. - "${FILESDIR}"/1.75.0-handle-vendored-sources.patch -) - -clear_vendor_checksums() { - sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die -} - -toml_usex() { - usex "${1}" true false -} - -pre_build_checks() { - local M=9216 - # multiply requirements by 1.3 if we are doing x86-multilib - if use amd64; then - M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) - fi - M=$(( $(usex clippy 128 0) + ${M} )) - M=$(( $(usex miri 128 0) + ${M} )) - M=$(( $(usex rustfmt 256 0) + ${M} )) - # add 2G if we compile llvm and 256M per llvm_target - if ! use system-llvm; then - M=$(( 2048 + ${M} )) - local ltarget - for ltarget in ${ALL_LLVM_TARGETS[@]}; do - M=$(( $(usex ${ltarget} 256 0) + ${M} )) - done - fi - M=$(( $(usex wasm 256 0) + ${M} )) - M=$(( $(usex debug 2 1) * ${M} )) - eshopts_push -s extglob - if is-flagq '-g?(gdb)?([1-9])'; then - M=$(( 15 * ${M} / 10 )) - fi - eshopts_pop - M=$(( $(usex doc 256 0) + ${M} )) - CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} -} - -llvm_check_deps() { - has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" -} - -# Is LLVM being linked against libc++? -is_libcxx_linked() { - local code='#include -#if defined(_LIBCPP_VERSION) - HAVE_LIBCXX -#endif -' - local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 - [[ ${out} == *HAVE_LIBCXX* ]] -} - -pkg_pretend() { - pre_build_checks -} - -pkg_setup() { - pre_build_checks - python-any-r1_pkg_setup - - export LIBGIT2_NO_PKG_CONFIG=1 #749381 - if tc-is-cross-compiler; then - use system-llvm && die "USE=system-llvm not allowed when cross-compiling" - local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" - use "llvm_targets_${cross_llvm_target}" || \ - die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" - fi - - rust_pkg_setup - - if use system-llvm; then - llvm-r1_pkg_setup - - local llvm_config="$(get_llvm_prefix)/bin/llvm-config" - export LLVM_LINK_SHARED=1 - export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" - fi -} - -src_configure() { - if tc-is-cross-compiler; then - export PKG_CONFIG_ALLOW_CROSS=1 - export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" - export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" - export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" - fi - - filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 - - local rust_target="" rust_targets="" arch_cflags - - # Collect rust target names to compile standard libs for all ABIs. - for v in $(multilib_get_enabled_abi_pairs); do - rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" - done - if use wasm; then - rust_targets+=",\"wasm32-unknown-unknown\"" - if use system-llvm; then - # un-hardcode rust-lld linker for this target - # https://bugs.gentoo.org/715348 - sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/base/wasm.rs || die - fi - fi - rust_targets="${rust_targets#,}" - - # cargo and rustdoc are mandatory and should always be included - local tools='"cargo","rustdoc", "rust-demangler"' - use clippy && tools+=',"clippy"' - use miri && tools+=',"miri"' - use rustfmt && tools+=',"rustfmt"' - use rust-analyzer && tools+=',"rust-analyzer"' - use rust-src && tools+=',"src"' - - local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" - # in case of prefix it will be already prefixed, as --print sysroot returns full path - [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" - - rust_target="$(rust_abi)" - rust_build="$(rust_abi "${CBUILD}")" - rust_host="$(rust_abi "${CHOST}")" - - LLVM_EXPERIMENTAL_TARGETS=() - for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do - if use llvm_targets_${_x} ; then - LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) - fi - done - LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} - - local cm_btype="$(usex debug DEBUG RELEASE)" - cat <<- _EOF_ > "${S}"/config.toml - changelog-seen = 2 - [llvm] - download-ci-llvm = false - optimize = $(toml_usex !debug) - release-debuginfo = $(toml_usex debug) - assertions = $(toml_usex debug) - ninja = true - targets = "${LLVM_TARGETS// /;}" - experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" - link-shared = $(toml_usex system-llvm) - $(if is_libcxx_linked; then - # https://bugs.gentoo.org/732632 - echo "use-libcxx = true" - echo "static-libstdcpp = false" - fi) - $(case "${rust_target}" in - i586-*-linux-*) - # https://github.com/rust-lang/rust/issues/93059 - echo 'cflags = "-fcf-protection=none"' - echo 'cxxflags = "-fcf-protection=none"' - echo 'ldflags = "-fcf-protection=none"' - ;; - *) - ;; - esac) - enable-warnings = false - [llvm.build-config] - CMAKE_VERBOSE_MAKEFILE = "ON" - $(if ! tc-is-cross-compiler; then - # When cross-compiling, LLVM is compiled twice, once for host and - # once for target. Unfortunately, this build configuration applies - # to both, which means any flags applicable to one target but not - # the other will break. Conditionally disable respecting user - # flags when cross-compiling. - echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" - echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" - echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" - fi) - [build] - build-stage = 2 - test-stage = 2 - build = "${rust_build}" - host = ["${rust_host}"] - target = [${rust_targets}] - cargo = "${rust_stage0_root}/bin/cargo" - rustc = "${rust_stage0_root}/bin/rustc" - rustfmt = "${rust_stage0_root}/bin/rustfmt" - docs = $(toml_usex doc) - compiler-docs = false - submodules = false - python = "${EPYTHON}" - locked-deps = true - vendor = true - extended = true - tools = [${tools}] - verbose = 2 - sanitizers = false - profiler = true - cargo-native-static = false - [install] - prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" - sysconfdir = "etc" - docdir = "share/doc/rust" - bindir = "bin" - libdir = "lib" - mandir = "share/man" - [rust] - # https://github.com/rust-lang/rust/issues/54872 - codegen-units-std = 1 - optimize = true - debug = $(toml_usex debug) - debug-assertions = $(toml_usex debug) - debug-assertions-std = $(toml_usex debug) - debuginfo-level = $(usex debug 2 0) - debuginfo-level-rustc = $(usex debug 2 0) - debuginfo-level-std = $(usex debug 2 0) - debuginfo-level-tools = $(usex debug 2 0) - debuginfo-level-tests = 0 - backtrace = true - incremental = false - $(if ! tc-is-cross-compiler; then - echo "default-linker = \"$(tc-getCC)\"" - fi) - parallel-compiler = $(toml_usex parallel-compiler) - channel = "$(usex nightly nightly stable)" - description = "gentoo" - rpath = false - verbose-tests = true - optimize-tests = $(toml_usex !debug) - codegen-tests = true - dist-src = false - remap-debuginfo = true - lld = $(usex system-llvm false $(toml_usex wasm)) - # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it - # https://github.com/rust-lang/rust/issues/74976 - # https://github.com/rust-lang/rust/issues/76526 - deny-warnings = $(usex wasm $(usex doc false true) true) - backtrace-on-ice = true - jemalloc = false - lto = "$(usex lto fat off)" - [dist] - src-tarball = false - compression-formats = ["xz"] - compression-profile = "balanced" - _EOF_ - - for v in $(multilib_get_enabled_abi_pairs); do - rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) - arch_cflags="$(get_abi_CFLAGS ${v##*.})" - - export CFLAGS_${rust_target//-/_}="${arch_cflags}" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${rust_target}] - ar = "$(tc-getAR)" - cc = "$(tc-getCC)" - cxx = "$(tc-getCXX)" - linker = "$(tc-getCC)" - ranlib = "$(tc-getRANLIB)" - llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; - # but we patch it and set to false here as well - if use elibc_musl; then - cat <<- _EOF_ >> "${S}"/config.toml - crt-static = false - _EOF_ - fi - done - if use wasm; then - cat <<- _EOF_ >> "${S}"/config.toml - [target.wasm32-unknown-unknown] - linker = "$(usex system-llvm lld rust-lld)" - # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 - profiler = false - _EOF_ - fi - - if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below - # experimental cross support - # discussion: https://bugs.gentoo.org/679878 - # TODO: c*flags, clang, system-llvm, cargo.eclass target support - # it would be much better if we could split out stdlib - # complilation to separate ebuild and abuse CATEGORY to - # just install to /usr/lib/rustlib/ - - # extra targets defined as a bash array - # spec format: :: - # best place would be /etc/portage/env/dev-lang/rust - # Example: - # RUST_CROSS_TARGETS=( - # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" - # ) - # no extra hand holding is done, no target transformations, all - # values are passed as-is with just basic checks, so it's up to user to supply correct values - # valid rust targets can be obtained with - # rustc --print target-list - # matching cross toolchain has to be installed - # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) - # only gcc toolchains installed with crossdev are checked for now. - - # BUG: we can't pass host flags to cross compiler, so just filter for now - # BUG: this should be more fine-grained. - filter-flags '-mcpu=*' '-march=*' '-mtune=*' - - local cross_target_spec - for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do - # extracts first element form :: - local cross_llvm_target="${cross_target_spec%%:*}" - # extracts toolchain triples, : - local cross_triples="${cross_target_spec#*:}" - # extracts first element after before : separator - local cross_rust_target="${cross_triples%%:*}" - # extracts last element after : separator - local cross_toolchain="${cross_triples##*:}" - use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" - command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${cross_rust_target}] - ar = "${cross_toolchain}-ar" - cc = "${cross_toolchain}-gcc" - cxx = "${cross_toolchain}-g++" - linker = "${cross_toolchain}-gcc" - ranlib = "${cross_toolchain}-ranlib" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - if [[ "${cross_toolchain}" == *-musl* ]]; then - cat <<- _EOF_ >> "${S}"/config.toml - musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" - _EOF_ - fi - - # append cross target to "normal" target list - # example 'target = ["powerpc64le-unknown-linux-gnu"]' - # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' - - rust_targets="${rust_targets},\"${cross_rust_target}\"" - sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die - - ewarn - ewarn "Enabled ${cross_rust_target} rust target" - ewarn "Using ${cross_toolchain} cross toolchain" - ewarn - if ! has_version -b 'sys-devel/binutils[multitarget]' ; then - ewarn "'sys-devel/binutils[multitarget]' is not installed" - ewarn "'strip' will be unable to strip cross libraries" - ewarn "cross targets will be installed with full debug information" - ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" - ewarn - ewarn "Alternatively llvm-strip can be used, it supports stripping any target" - ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" - ewarn - fi - done - fi # I_KNOW_WHAT_I_AM_DOING_CROSS - - einfo "Rust configured with the following flags:" - echo - echo RUSTFLAGS="\"${RUSTFLAGS}\"" - echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" - echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" - echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" - env | grep "CARGO_TARGET_.*_RUSTFLAGS=" - env | grep "CFLAGS_.*" - echo - einfo "config.toml contents:" - cat "${S}"/config.toml || die - echo -} - -src_compile() { - RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die -} - -src_test() { - # https://rustc-dev-guide.rust-lang.org/tests/intro.html - - # those are basic and codegen tests. - local tests=( - codegen - codegen-units - compile-fail - incremental - mir-opt - pretty - run-make - ) - - # fails if llvm is not built with ALL targets. - # and known to fail with system llvm sometimes. - use system-llvm || tests+=( assembly ) - - # fragile/expensive/less important tests - # or tests that require extra builds - # TODO: instead of skipping, just make some nonfatal. - if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then - tests+=( - rustdoc - rustdoc-js - rustdoc-js-std - rustdoc-ui - run-make-fulldeps - ui - ui-fulldeps - ) - fi - - local i failed=() - einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" - for i in "${tests[@]}"; do - local t="src/test/${i}" - einfo "rust_src_test: running ${t}" - if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ - -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" - then - failed+=( "${t}" ) - eerror "rust_src_test: ${t} failed" - fi - done - - if [[ ${#failed[@]} -ne 0 ]]; then - eerror "rust_src_test: failure summary: ${failed[@]}" - die "aborting due to test failures" - fi -} - -src_install() { - DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die - - # bug #689562, #689160 - rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die - rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - rust-demangler - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use miri && symlinks+=( miri cargo-miri ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- - # need to fix eselect-rust to remove this hack. - local ver_i="${i}-${PV}" - if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then - einfo "Installing ${i} symlink" - ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die - else - ewarn "${i} symlink requested, but source file not found" - ewarn "please report this" - fi - dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" - use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" - dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" - dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" - dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" - - newenvd - "50${P}" <<-_EOF_ - LDPATH="${EPREFIX}/usr/lib/rust/lib-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" - _EOF_ - - rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-demangler - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use miri; then - echo /usr/bin/miri >> "${T}/provider-${P}" - echo /usr/bin/cargo-miri >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/lib/rust/libexec >> "${T}/provider-${P}" - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - - if use dist; then - insinto "/usr/lib/${PN}/${PV}/dist" - doins -r "${S}/build/dist/." - fi -} - -pkg_preinst() { - # 943308 and friends; basically --keep-going can forget to unmerge old rust - # but the soft blocker allows us to install conflicting files. - # This results in duplicated .{rlib,so} files which confuses rustc and results in - # the need for manual intervention. - if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then - # we need to find all .{rlib,so} files in the old rust lib directory - # and store them in an array for later use - readarray -d '' old_rust_libs < <( - find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ - -type f \( -name '*.rlib' -o -name '*.so' \) -print0) - export old_rust_libs - if [[ ${#old_rust_libs[@]} -gt 0 ]]; then - einfo "Found old .rlib and .so files in the old rust lib directory" - else - die "Found no old .rlib and .so files but old rust version is installed. Bailing!" - fi - fi -} - -pkg_postinst() { - - local old_rust="dev-lang/rust:stable/$(ver_cut 1-2)" - if has_version -b ${old_rust}; then - # Be _extra_ careful here as we're removing files from the live filesystem - local f - local only_one_file=() - einfo "Tidying up libraries files from non-slotted \`${old_rust}\`." - for f in "${old_rust_libs[@]}"; do - [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" - local base_name="${f%-*}" - local ext="${f##*.}" - local matching_files=("${base_name}"-*.${ext}) - case ${#matching_files[@]} in - 2) - einfo "Removing old .${ext}: ${f}" - rm "${f}" || die - ;; - 1) - # Turns out fingerprints are not as unique as we'd thought, _sometimes_ they collide, - # so we may have already installed over the old file. - # We'll warn about this just in case, but it's probably fine. - only_one_file+=( "${matching_files[0]}" ) - ;; - *) - die "Expected one or two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" - ;; - esac - done - if [[ ${#only_one_file} -gt 0 ]]; then - einfo "While tidying up non-slotted rust libraries for \`${old_rust}\`," - einfo "the following file(s) did not have a duplicate where one was expected:" - for f in "${only_one_file[@]}"; do - einfo " * ${f}" - done - einfo "" - einfo "This is unlikely to cause problems; the fingerprint for the library ended up being the same." - einfo "However, if you encounter any issues please report them to the Gentoo Rust Team." - fi - fi - - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - optfeature "Emacs support" "app-emacs/rust-mode" - optfeature "Vim support" "app-vim/rust-vim" -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust/rust-1.75.0-r101.ebuild b/dev-lang/rust/rust-1.75.0-r101.ebuild new file mode 100644 index 000000000000..5bec96815fdf --- /dev/null +++ b/dev-lang/rust/rust-1.75.0-r101.ebuild @@ -0,0 +1,742 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 17 ) +PYTHON_COMPAT=( python3_{10..12} ) + +RUST_MAX_VER=${PV} +RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" + +inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing multilib multilib-build \ + optfeature python-any-r1 rust rust-toolchain toolchain-funcs verify-sig + +if [[ ${PV} = *beta* ]]; then + betaver=${PV//*beta} + BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" + MY_P="rustc-beta" + SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" +else + MY_P="rustc-${PV}" + SRC="${MY_P}-src.tar.xz" + KEYWORDS="amd64 arm arm64 ~loong ppc ppc64 ~riscv sparc x86" +fi + +DESCRIPTION="Language empowering everyone to build reliable and efficient software" +HOMEPAGE="https://www.rust-lang.org/" + +SRC_URI=" + https://static.rust-lang.org/dist/${SRC} + verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) +" +S="${WORKDIR}/${MY_P}-src" + +# keep in sync with llvm ebuild of the same version as bundled one. +ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai + LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE + WebAssembly X86 XCore Xtensa ) +ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) +LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} + +ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" +SLOT="${PV}" + +IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" + +LLVM_DEPEND=() +# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation +for _x in "${ALL_LLVM_TARGETS[@]}"; do + LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) +done +LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) +LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) + +BDEPEND="${PYTHON_DEPS} + app-eselect/eselect-rust + || ( + >=sys-devel/gcc-4.7 + >=llvm-core/clang-3.5 + ) + !system-llvm? ( + >=dev-build/cmake-3.13.4 + app-alternatives/ninja + ) + test? ( dev-debug/gdb ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +DEPEND=" + >=app-arch/xz-utils-5.2 + net-misc/curl:=[http2,ssl] + sys-libs/zlib:= + dev-libs/openssl:0= + system-llvm? ( + ${LLVM_DEPEND[*]} + llvm-libunwind? ( llvm-runtimes/libunwind:= ) + ) + !system-llvm? ( + !llvm-libunwind? ( + elibc_musl? ( sys-libs/libunwind:= ) + ) + ) +" + +RDEPEND="${DEPEND} + app-eselect/eselect-rust + dev-lang/rust-common + sys-apps/lsb-release + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" + +REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) + miri? ( nightly ) + parallel-compiler? ( nightly ) + rust-analyzer? ( rust-src ) + test? ( ${ALL_LLVM_TARGETS[*]} ) + wasm? ( llvm_targets_WebAssembly ) + x86? ( cpu_flags_x86_sse2 ) +" + +# we don't use cmake.eclass, but can get a warning +CMAKE_WARN_UNUSED_CLI=no + +QA_FLAGS_IGNORED=" + usr/lib/${PN}/${PV}/bin/.* + usr/lib/${PN}/${PV}/libexec/.* + usr/lib/${PN}/${PV}/lib/lib.*.so + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_SONAME=" + usr/lib/${PN}/${PV}/lib/lib.*.so.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_PRESTRIPPED=" + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +# causes double bootstrap +RESTRICT="test" + +VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc + +PATCHES=( + "${FILESDIR}"/1.75.0-musl-dynamic-linking.patch + "${FILESDIR}"/1.74.1-cross-compile-libz.patch + #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch # pending refresh + "${FILESDIR}"/1.70.0-ignore-broken-and-non-applicable-tests.patch + "${FILESDIR}"/1.67.0-doc-wasm.patch + # This patch shouldn't be necessary for later versions of Rust because its + # code was backported from master. + "${FILESDIR}"/1.75.0-handle-vendored-sources.patch +) + +clear_vendor_checksums() { + sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die +} + +toml_usex() { + usex "${1}" true false +} + +pre_build_checks() { + local M=9216 + # multiply requirements by 1.3 if we are doing x86-multilib + if use amd64; then + M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) + fi + M=$(( $(usex clippy 128 0) + ${M} )) + M=$(( $(usex miri 128 0) + ${M} )) + M=$(( $(usex rustfmt 256 0) + ${M} )) + # add 2G if we compile llvm and 256M per llvm_target + if ! use system-llvm; then + M=$(( 2048 + ${M} )) + local ltarget + for ltarget in ${ALL_LLVM_TARGETS[@]}; do + M=$(( $(usex ${ltarget} 256 0) + ${M} )) + done + fi + M=$(( $(usex wasm 256 0) + ${M} )) + M=$(( $(usex debug 2 1) * ${M} )) + eshopts_push -s extglob + if is-flagq '-g?(gdb)?([1-9])'; then + M=$(( 15 * ${M} / 10 )) + fi + eshopts_pop + M=$(( $(usex doc 256 0) + ${M} )) + CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} +} + +llvm_check_deps() { + has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" +} + +# Is LLVM being linked against libc++? +is_libcxx_linked() { + local code='#include +#if defined(_LIBCPP_VERSION) + HAVE_LIBCXX +#endif +' + local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 + [[ ${out} == *HAVE_LIBCXX* ]] +} + +pkg_pretend() { + pre_build_checks +} + +pkg_setup() { + pre_build_checks + python-any-r1_pkg_setup + + export LIBGIT2_NO_PKG_CONFIG=1 #749381 + if tc-is-cross-compiler; then + use system-llvm && die "USE=system-llvm not allowed when cross-compiling" + local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" + use "llvm_targets_${cross_llvm_target}" || \ + die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" + fi + + rust_pkg_setup + + if use system-llvm; then + llvm-r1_pkg_setup + + local llvm_config="$(get_llvm_prefix)/bin/llvm-config" + export LLVM_LINK_SHARED=1 + export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" + fi +} + +src_configure() { + if tc-is-cross-compiler; then + export PKG_CONFIG_ALLOW_CROSS=1 + export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" + export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" + export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" + fi + + filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 + + local rust_target="" rust_targets="" arch_cflags + + # Collect rust target names to compile standard libs for all ABIs. + for v in $(multilib_get_enabled_abi_pairs); do + rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" + done + if use wasm; then + rust_targets+=",\"wasm32-unknown-unknown\"" + if use system-llvm; then + # un-hardcode rust-lld linker for this target + # https://bugs.gentoo.org/715348 + sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/base/wasm.rs || die + fi + fi + rust_targets="${rust_targets#,}" + + # cargo and rustdoc are mandatory and should always be included + local tools='"cargo","rustdoc", "rust-demangler"' + use clippy && tools+=',"clippy"' + use miri && tools+=',"miri"' + use rustfmt && tools+=',"rustfmt"' + use rust-analyzer && tools+=',"rust-analyzer"' + use rust-src && tools+=',"src"' + + local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" + # in case of prefix it will be already prefixed, as --print sysroot returns full path + [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" + + rust_target="$(rust_abi)" + rust_build="$(rust_abi "${CBUILD}")" + rust_host="$(rust_abi "${CHOST}")" + + LLVM_EXPERIMENTAL_TARGETS=() + for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do + if use llvm_targets_${_x} ; then + LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) + fi + done + LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} + + local cm_btype="$(usex debug DEBUG RELEASE)" + cat <<- _EOF_ > "${S}"/config.toml + changelog-seen = 2 + [llvm] + download-ci-llvm = false + optimize = $(toml_usex !debug) + release-debuginfo = $(toml_usex debug) + assertions = $(toml_usex debug) + ninja = true + targets = "${LLVM_TARGETS// /;}" + experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" + link-shared = $(toml_usex system-llvm) + $(if is_libcxx_linked; then + # https://bugs.gentoo.org/732632 + echo "use-libcxx = true" + echo "static-libstdcpp = false" + fi) + $(case "${rust_target}" in + i586-*-linux-*) + # https://github.com/rust-lang/rust/issues/93059 + echo 'cflags = "-fcf-protection=none"' + echo 'cxxflags = "-fcf-protection=none"' + echo 'ldflags = "-fcf-protection=none"' + ;; + *) + ;; + esac) + enable-warnings = false + [llvm.build-config] + CMAKE_VERBOSE_MAKEFILE = "ON" + $(if ! tc-is-cross-compiler; then + # When cross-compiling, LLVM is compiled twice, once for host and + # once for target. Unfortunately, this build configuration applies + # to both, which means any flags applicable to one target but not + # the other will break. Conditionally disable respecting user + # flags when cross-compiling. + echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" + echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" + echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" + fi) + [build] + build-stage = 2 + test-stage = 2 + build = "${rust_build}" + host = ["${rust_host}"] + target = [${rust_targets}] + cargo = "${rust_stage0_root}/bin/cargo" + rustc = "${rust_stage0_root}/bin/rustc" + rustfmt = "${rust_stage0_root}/bin/rustfmt" + docs = $(toml_usex doc) + compiler-docs = false + submodules = false + python = "${EPYTHON}" + locked-deps = true + vendor = true + extended = true + tools = [${tools}] + verbose = 2 + sanitizers = false + profiler = true + cargo-native-static = false + [install] + prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" + sysconfdir = "etc" + docdir = "share/doc/rust" + bindir = "bin" + libdir = "lib" + mandir = "share/man" + [rust] + # https://github.com/rust-lang/rust/issues/54872 + codegen-units-std = 1 + optimize = true + debug = $(toml_usex debug) + debug-assertions = $(toml_usex debug) + debug-assertions-std = $(toml_usex debug) + debuginfo-level = $(usex debug 2 0) + debuginfo-level-rustc = $(usex debug 2 0) + debuginfo-level-std = $(usex debug 2 0) + debuginfo-level-tools = $(usex debug 2 0) + debuginfo-level-tests = 0 + backtrace = true + incremental = false + $(if ! tc-is-cross-compiler; then + echo "default-linker = \"$(tc-getCC)\"" + fi) + parallel-compiler = $(toml_usex parallel-compiler) + channel = "$(usex nightly nightly stable)" + description = "gentoo" + rpath = true + verbose-tests = true + optimize-tests = $(toml_usex !debug) + codegen-tests = true + dist-src = false + remap-debuginfo = true + lld = $(usex system-llvm false $(toml_usex wasm)) + # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it + # https://github.com/rust-lang/rust/issues/74976 + # https://github.com/rust-lang/rust/issues/76526 + deny-warnings = $(usex wasm $(usex doc false true) true) + backtrace-on-ice = true + jemalloc = false + lto = "$(usex lto fat off)" + [dist] + src-tarball = false + compression-formats = ["xz"] + compression-profile = "balanced" + _EOF_ + + for v in $(multilib_get_enabled_abi_pairs); do + rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) + arch_cflags="$(get_abi_CFLAGS ${v##*.})" + + export CFLAGS_${rust_target//-/_}="${arch_cflags}" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${rust_target}] + ar = "$(tc-getAR)" + cc = "$(tc-getCC)" + cxx = "$(tc-getCXX)" + linker = "$(tc-getCC)" + ranlib = "$(tc-getRANLIB)" + llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; + # but we patch it and set to false here as well + if use elibc_musl; then + cat <<- _EOF_ >> "${S}"/config.toml + crt-static = false + _EOF_ + fi + done + if use wasm; then + cat <<- _EOF_ >> "${S}"/config.toml + [target.wasm32-unknown-unknown] + linker = "$(usex system-llvm lld rust-lld)" + # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 + profiler = false + _EOF_ + fi + + if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below + # experimental cross support + # discussion: https://bugs.gentoo.org/679878 + # TODO: c*flags, clang, system-llvm, cargo.eclass target support + # it would be much better if we could split out stdlib + # complilation to separate ebuild and abuse CATEGORY to + # just install to /usr/lib/rustlib/ + + # extra targets defined as a bash array + # spec format: :: + # best place would be /etc/portage/env/dev-lang/rust + # Example: + # RUST_CROSS_TARGETS=( + # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" + # ) + # no extra hand holding is done, no target transformations, all + # values are passed as-is with just basic checks, so it's up to user to supply correct values + # valid rust targets can be obtained with + # rustc --print target-list + # matching cross toolchain has to be installed + # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) + # only gcc toolchains installed with crossdev are checked for now. + + # BUG: we can't pass host flags to cross compiler, so just filter for now + # BUG: this should be more fine-grained. + filter-flags '-mcpu=*' '-march=*' '-mtune=*' + + local cross_target_spec + for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do + # extracts first element form :: + local cross_llvm_target="${cross_target_spec%%:*}" + # extracts toolchain triples, : + local cross_triples="${cross_target_spec#*:}" + # extracts first element after before : separator + local cross_rust_target="${cross_triples%%:*}" + # extracts last element after : separator + local cross_toolchain="${cross_triples##*:}" + use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" + command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${cross_rust_target}] + ar = "${cross_toolchain}-ar" + cc = "${cross_toolchain}-gcc" + cxx = "${cross_toolchain}-g++" + linker = "${cross_toolchain}-gcc" + ranlib = "${cross_toolchain}-ranlib" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + if [[ "${cross_toolchain}" == *-musl* ]]; then + cat <<- _EOF_ >> "${S}"/config.toml + musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" + _EOF_ + fi + + # append cross target to "normal" target list + # example 'target = ["powerpc64le-unknown-linux-gnu"]' + # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' + + rust_targets="${rust_targets},\"${cross_rust_target}\"" + sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die + + ewarn + ewarn "Enabled ${cross_rust_target} rust target" + ewarn "Using ${cross_toolchain} cross toolchain" + ewarn + if ! has_version -b 'sys-devel/binutils[multitarget]' ; then + ewarn "'sys-devel/binutils[multitarget]' is not installed" + ewarn "'strip' will be unable to strip cross libraries" + ewarn "cross targets will be installed with full debug information" + ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" + ewarn + ewarn "Alternatively llvm-strip can be used, it supports stripping any target" + ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" + ewarn + fi + done + fi # I_KNOW_WHAT_I_AM_DOING_CROSS + + einfo "Rust configured with the following flags:" + echo + echo RUSTFLAGS="\"${RUSTFLAGS}\"" + echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" + echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" + echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" + env | grep "CARGO_TARGET_.*_RUSTFLAGS=" + env | grep "CFLAGS_.*" + echo + einfo "config.toml contents:" + cat "${S}"/config.toml || die + echo +} + +src_compile() { + RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die +} + +src_test() { + # https://rustc-dev-guide.rust-lang.org/tests/intro.html + + # those are basic and codegen tests. + local tests=( + codegen + codegen-units + compile-fail + incremental + mir-opt + pretty + run-make + ) + + # fails if llvm is not built with ALL targets. + # and known to fail with system llvm sometimes. + use system-llvm || tests+=( assembly ) + + # fragile/expensive/less important tests + # or tests that require extra builds + # TODO: instead of skipping, just make some nonfatal. + if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then + tests+=( + rustdoc + rustdoc-js + rustdoc-js-std + rustdoc-ui + run-make-fulldeps + ui + ui-fulldeps + ) + fi + + local i failed=() + einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" + for i in "${tests[@]}"; do + local t="src/test/${i}" + einfo "rust_src_test: running ${t}" + if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ + -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" + then + failed+=( "${t}" ) + eerror "rust_src_test: ${t} failed" + fi + done + + if [[ ${#failed[@]} -ne 0 ]]; then + eerror "rust_src_test: failure summary: ${failed[@]}" + die "aborting due to test failures" + fi +} + +src_install() { + DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die + + # bug #689562, #689160 + rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die + rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die + + local symlinks=( + cargo + rustc + rustdoc + rust-gdb + rust-gdbgui + rust-lldb + rust-demangler + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use miri && symlinks+=( miri cargo-miri ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- + # need to fix eselect-rust to remove this hack. + local ver_i="${i}-${PV}" + if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then + einfo "Installing ${i} symlink" + ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die + else + ewarn "${i} symlink requested, but source file not found" + ewarn "please report this" + fi + dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" + use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" + dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" + dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" + dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" + + newenvd - "50${P}" <<-_EOF_ + MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" + _EOF_ + + rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-demangler + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use miri; then + echo /usr/bin/miri >> "${T}/provider-${P}" + echo /usr/bin/cargo-miri >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/lib/rust/libexec >> "${T}/provider-${P}" + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + + if use dist; then + insinto "/usr/lib/${PN}/${PV}/dist" + doins -r "${S}/build/dist/." + fi +} + +pkg_preinst() { + # 943308 and friends; basically --keep-going can forget to unmerge old rust + # but the soft blocker allows us to install conflicting files. + # This results in duplicated .{rlib,so} files which confuses rustc and results in + # the need for manual intervention. + if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then + # we need to find all .{rlib,so} files in the old rust lib directory + # and store them in an array for later use + readarray -d '' old_rust_libs < <( + find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ + -type f \( -name '*.rlib' -o -name '*.so' \) -print0) + export old_rust_libs + if [[ ${#old_rust_libs[@]} -gt 0 ]]; then + einfo "Found old .rlib and .so files in the old rust lib directory" + else + die "Found no old .rlib and .so files but old rust version is installed. Bailing!" + fi + fi +} + +pkg_postinst() { + + local old_rust="dev-lang/rust:stable/$(ver_cut 1-2)" + if has_version -b ${old_rust}; then + # Be _extra_ careful here as we're removing files from the live filesystem + local f + local only_one_file=() + einfo "Tidying up libraries files from non-slotted \`${old_rust}\`." + for f in "${old_rust_libs[@]}"; do + [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" + local base_name="${f%-*}" + local ext="${f##*.}" + local matching_files=("${base_name}"-*.${ext}) + case ${#matching_files[@]} in + 2) + einfo "Removing old .${ext}: ${f}" + rm "${f}" || die + ;; + 1) + # Turns out fingerprints are not as unique as we'd thought, _sometimes_ they collide, + # so we may have already installed over the old file. + # We'll warn about this just in case, but it's probably fine. + only_one_file+=( "${matching_files[0]}" ) + ;; + *) + die "Expected one or two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" + ;; + esac + done + if [[ ${#only_one_file} -gt 0 ]]; then + einfo "While tidying up non-slotted rust libraries for \`${old_rust}\`," + einfo "the following file(s) did not have a duplicate where one was expected:" + for f in "${only_one_file[@]}"; do + einfo " * ${f}" + done + einfo "" + einfo "This is unlikely to cause problems; the fingerprint for the library ended up being the same." + einfo "However, if you encounter any issues please report them to the Gentoo Rust Team." + fi + fi + + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + optfeature "Emacs support" "app-emacs/rust-mode" + optfeature "Vim support" "app-vim/rust-vim" +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust/rust-1.76.0-r100.ebuild b/dev-lang/rust/rust-1.76.0-r100.ebuild deleted file mode 100644 index 364d59bed5b6..000000000000 --- a/dev-lang/rust/rust-1.76.0-r100.ebuild +++ /dev/null @@ -1,660 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 17 ) -PYTHON_COMPAT=( python3_{10..12} ) - -RUST_MAX_VER=${PV} -RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" - -inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing multilib multilib-build \ - optfeature python-any-r1 rust rust-toolchain toolchain-funcs verify-sig - -if [[ ${PV} = *beta* ]]; then - betaver=${PV//*beta} - BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" - MY_P="rustc-beta" - SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" -else - MY_P="rustc-${PV}" - SRC="${MY_P}-src.tar.xz" - KEYWORDS="amd64 arm arm64 ~loong ppc ppc64 ~riscv sparc x86" -fi - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" - -SRC_URI=" - https://static.rust-lang.org/dist/${SRC} - verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) -" -S="${WORKDIR}/${MY_P}-src" - -# keep in sync with llvm ebuild of the same version as bundled one. -ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai - LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE - WebAssembly X86 XCore Xtensa ) -ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) -LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} - -ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" - -IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" - -LLVM_DEPEND=() -# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation -for _x in "${ALL_LLVM_TARGETS[@]}"; do - LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) -done -LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) -LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) - -BDEPEND="${PYTHON_DEPS} - app-eselect/eselect-rust - || ( - >=sys-devel/gcc-4.7 - >=llvm-core/clang-3.5 - ) - !system-llvm? ( - >=dev-build/cmake-3.13.4 - app-alternatives/ninja - ) - test? ( dev-debug/gdb ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -DEPEND=" - >=app-arch/xz-utils-5.2 - net-misc/curl:=[http2,ssl] - sys-libs/zlib:= - dev-libs/openssl:0= - system-llvm? ( - ${LLVM_DEPEND[*]} - llvm-libunwind? ( llvm-runtimes/libunwind:= ) - ) - !system-llvm? ( - !llvm-libunwind? ( - elibc_musl? ( sys-libs/libunwind:= ) - ) - ) -" - -RDEPEND="${DEPEND} - app-eselect/eselect-rust - dev-lang/rust-common - sys-apps/lsb-release - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" - -REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) - miri? ( nightly ) - parallel-compiler? ( nightly ) - rust-analyzer? ( rust-src ) - test? ( ${ALL_LLVM_TARGETS[*]} ) - wasm? ( llvm_targets_WebAssembly ) - x86? ( cpu_flags_x86_sse2 ) -" - -# we don't use cmake.eclass, but can get a warning -CMAKE_WARN_UNUSED_CLI=no - -QA_FLAGS_IGNORED=" - usr/lib/${PN}/${PV}/bin/.* - usr/lib/${PN}/${PV}/libexec/.* - usr/lib/${PN}/${PV}/lib/lib.*.so - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_SONAME=" - usr/lib/${PN}/${PV}/lib/lib.*.so.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_PRESTRIPPED=" - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -# causes double bootstrap -RESTRICT="test" - -VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc - -PATCHES=( - "${FILESDIR}"/1.75.0-musl-dynamic-linking.patch - "${FILESDIR}"/1.74.1-cross-compile-libz.patch - #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch # pending refresh - "${FILESDIR}"/1.70.0-ignore-broken-and-non-applicable-tests.patch - "${FILESDIR}"/1.67.0-doc-wasm.patch - "${FILESDIR}"/1.75.0-handle-vendored-sources.patch - "${FILESDIR}"/1.76.0-loong-code-model.patch # remove for >=1.78.0 -) - -clear_vendor_checksums() { - sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die -} - -toml_usex() { - usex "${1}" true false -} - -pre_build_checks() { - local M=9216 - # multiply requirements by 1.3 if we are doing x86-multilib - if use amd64; then - M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) - fi - M=$(( $(usex clippy 128 0) + ${M} )) - M=$(( $(usex miri 128 0) + ${M} )) - M=$(( $(usex rustfmt 256 0) + ${M} )) - # add 2G if we compile llvm and 256M per llvm_target - if ! use system-llvm; then - M=$(( 2048 + ${M} )) - local ltarget - for ltarget in ${ALL_LLVM_TARGETS[@]}; do - M=$(( $(usex ${ltarget} 256 0) + ${M} )) - done - fi - M=$(( $(usex wasm 256 0) + ${M} )) - M=$(( $(usex debug 2 1) * ${M} )) - eshopts_push -s extglob - if is-flagq '-g?(gdb)?([1-9])'; then - M=$(( 15 * ${M} / 10 )) - fi - eshopts_pop - M=$(( $(usex doc 256 0) + ${M} )) - CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} -} - -llvm_check_deps() { - has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" -} - -# Is LLVM being linked against libc++? -is_libcxx_linked() { - local code='#include -#if defined(_LIBCPP_VERSION) - HAVE_LIBCXX -#endif -' - local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 - [[ ${out} == *HAVE_LIBCXX* ]] -} - -pkg_pretend() { - pre_build_checks -} - -pkg_setup() { - pre_build_checks - python-any-r1_pkg_setup - - export LIBGIT2_NO_PKG_CONFIG=1 #749381 - if tc-is-cross-compiler; then - use system-llvm && die "USE=system-llvm not allowed when cross-compiling" - local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" - use "llvm_targets_${cross_llvm_target}" || \ - die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" - fi - - rust_pkg_setup - - if use system-llvm; then - llvm-r1_pkg_setup - - local llvm_config="$(get_llvm_prefix)/bin/llvm-config" - export LLVM_LINK_SHARED=1 - export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" - fi -} - -src_configure() { - if tc-is-cross-compiler; then - export PKG_CONFIG_ALLOW_CROSS=1 - export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" - export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" - export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" - fi - - filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 - - local rust_target="" rust_targets="" arch_cflags - - # Collect rust target names to compile standard libs for all ABIs. - for v in $(multilib_get_enabled_abi_pairs); do - rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" - done - if use wasm; then - rust_targets+=",\"wasm32-unknown-unknown\"" - if use system-llvm; then - # un-hardcode rust-lld linker for this target - # https://bugs.gentoo.org/715348 - sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/base/wasm.rs || die - fi - fi - rust_targets="${rust_targets#,}" - - # cargo and rustdoc are mandatory and should always be included - local tools='"cargo","rustdoc", "rust-demangler"' - use clippy && tools+=',"clippy"' - use miri && tools+=',"miri"' - use rustfmt && tools+=',"rustfmt"' - use rust-analyzer && tools+=',"rust-analyzer","rust-analyzer-proc-macro-srv"' - use rust-src && tools+=',"src"' - - local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" - # in case of prefix it will be already prefixed, as --print sysroot returns full path - [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" - - rust_target="$(rust_abi)" - rust_build="$(rust_abi "${CBUILD}")" - rust_host="$(rust_abi "${CHOST}")" - - LLVM_EXPERIMENTAL_TARGETS=() - for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do - if use llvm_targets_${_x} ; then - LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) - fi - done - LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} - - local cm_btype="$(usex debug DEBUG RELEASE)" - cat <<- _EOF_ > "${S}"/config.toml - changelog-seen = 2 - [llvm] - download-ci-llvm = false - optimize = $(toml_usex !debug) - release-debuginfo = $(toml_usex debug) - assertions = $(toml_usex debug) - ninja = true - targets = "${LLVM_TARGETS// /;}" - experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" - link-shared = $(toml_usex system-llvm) - $(if is_libcxx_linked; then - # https://bugs.gentoo.org/732632 - echo "use-libcxx = true" - echo "static-libstdcpp = false" - fi) - $(case "${rust_target}" in - i586-*-linux-*) - # https://github.com/rust-lang/rust/issues/93059 - echo 'cflags = "-fcf-protection=none"' - echo 'cxxflags = "-fcf-protection=none"' - echo 'ldflags = "-fcf-protection=none"' - ;; - *) - ;; - esac) - enable-warnings = false - [llvm.build-config] - CMAKE_VERBOSE_MAKEFILE = "ON" - $(if ! tc-is-cross-compiler; then - # When cross-compiling, LLVM is compiled twice, once for host and - # once for target. Unfortunately, this build configuration applies - # to both, which means any flags applicable to one target but not - # the other will break. Conditionally disable respecting user - # flags when cross-compiling. - echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" - echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" - echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" - fi) - [build] - build-stage = 2 - test-stage = 2 - build = "${rust_build}" - host = ["${rust_host}"] - target = [${rust_targets}] - cargo = "${rust_stage0_root}/bin/cargo" - rustc = "${rust_stage0_root}/bin/rustc" - rustfmt = "${rust_stage0_root}/bin/rustfmt" - docs = $(toml_usex doc) - compiler-docs = false - submodules = false - python = "${EPYTHON}" - locked-deps = true - vendor = true - extended = true - tools = [${tools}] - verbose = 2 - sanitizers = false - profiler = true - cargo-native-static = false - [install] - prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" - sysconfdir = "etc" - docdir = "share/doc/rust" - bindir = "bin" - libdir = "lib" - mandir = "share/man" - [rust] - # https://github.com/rust-lang/rust/issues/54872 - codegen-units-std = 1 - optimize = true - debug = $(toml_usex debug) - debug-assertions = $(toml_usex debug) - debug-assertions-std = $(toml_usex debug) - debuginfo-level = $(usex debug 2 0) - debuginfo-level-rustc = $(usex debug 2 0) - debuginfo-level-std = $(usex debug 2 0) - debuginfo-level-tools = $(usex debug 2 0) - debuginfo-level-tests = 0 - backtrace = true - incremental = false - $(if ! tc-is-cross-compiler; then - echo "default-linker = \"$(tc-getCC)\"" - fi) - parallel-compiler = $(toml_usex parallel-compiler) - channel = "$(usex nightly nightly stable)" - description = "gentoo" - rpath = false - verbose-tests = true - optimize-tests = $(toml_usex !debug) - codegen-tests = true - dist-src = false - remap-debuginfo = true - lld = $(usex system-llvm false $(toml_usex wasm)) - # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it - # https://github.com/rust-lang/rust/issues/74976 - # https://github.com/rust-lang/rust/issues/76526 - deny-warnings = $(usex wasm $(usex doc false true) true) - backtrace-on-ice = true - jemalloc = false - # See https://github.com/rust-lang/rust/issues/121124 - lto = "$(usex lto thin off)" - [dist] - src-tarball = false - compression-formats = ["xz"] - compression-profile = "balanced" - _EOF_ - - for v in $(multilib_get_enabled_abi_pairs); do - rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) - arch_cflags="$(get_abi_CFLAGS ${v##*.})" - - export CFLAGS_${rust_target//-/_}="${arch_cflags}" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${rust_target}] - ar = "$(tc-getAR)" - cc = "$(tc-getCC)" - cxx = "$(tc-getCXX)" - linker = "$(tc-getCC)" - ranlib = "$(tc-getRANLIB)" - llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; - # but we patch it and set to false here as well - if use elibc_musl; then - cat <<- _EOF_ >> "${S}"/config.toml - crt-static = false - _EOF_ - fi - done - if use wasm; then - cat <<- _EOF_ >> "${S}"/config.toml - [target.wasm32-unknown-unknown] - linker = "$(usex system-llvm lld rust-lld)" - # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 - profiler = false - _EOF_ - fi - - einfo "Rust configured with the following flags:" - echo - echo RUSTFLAGS="\"${RUSTFLAGS}\"" - echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" - echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" - echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" - env | grep "CARGO_TARGET_.*_RUSTFLAGS=" - env | grep "CFLAGS_.*" - echo - einfo "config.toml contents:" - cat "${S}"/config.toml || die - echo -} - -src_compile() { - RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die -} - -src_test() { - # https://rustc-dev-guide.rust-lang.org/tests/intro.html - - # those are basic and codegen tests. - local tests=( - codegen - codegen-units - compile-fail - incremental - mir-opt - pretty - run-make - ) - - # fails if llvm is not built with ALL targets. - # and known to fail with system llvm sometimes. - use system-llvm || tests+=( assembly ) - - # fragile/expensive/less important tests - # or tests that require extra builds - # TODO: instead of skipping, just make some nonfatal. - if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then - tests+=( - rustdoc - rustdoc-js - rustdoc-js-std - rustdoc-ui - run-make-fulldeps - ui - ui-fulldeps - ) - fi - - local i failed=() - einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" - for i in "${tests[@]}"; do - local t="src/test/${i}" - einfo "rust_src_test: running ${t}" - if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ - -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" - then - failed+=( "${t}" ) - eerror "rust_src_test: ${t} failed" - fi - done - - if [[ ${#failed[@]} -ne 0 ]]; then - eerror "rust_src_test: failure summary: ${failed[@]}" - die "aborting due to test failures" - fi -} - -src_install() { - DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die - - # bug #689562, #689160 - rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die - rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - rust-demangler - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use miri && symlinks+=( miri cargo-miri ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- - # need to fix eselect-rust to remove this hack. - local ver_i="${i}-${PV}" - if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then - einfo "Installing ${i} symlink" - ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die - else - ewarn "${i} symlink requested, but source file not found" - ewarn "please report this" - fi - dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" - use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" - dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" - dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" - dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" - - newenvd - "50${P}" <<-_EOF_ - LDPATH="${EPREFIX}/usr/lib/rust/lib-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" - _EOF_ - - rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-demangler - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use miri; then - echo /usr/bin/miri >> "${T}/provider-${P}" - echo /usr/bin/cargo-miri >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/lib/rust/libexec >> "${T}/provider-${P}" - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - - if use dist; then - insinto "/usr/lib/${PN}/${PV}/dist" - doins -r "${S}/build/dist/." - fi -} - -pkg_preinst() { - # 943308 and friends; basically --keep-going can forget to unmerge old rust - # but the soft blocker allows us to install conflicting files. - # This results in duplicated .{rlib,so} files which confuses rustc and results in - # the need for manual intervention. - if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then - # we need to find all .{rlib,so} files in the old rust lib directory - # and store them in an array for later use - readarray -d '' old_rust_libs < <( - find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ - -type f \( -name '*.rlib' -o -name '*.so' \) -print0) - export old_rust_libs - if [[ ${#old_rust_libs[@]} -gt 0 ]]; then - einfo "Found old .rlib and .so files in the old rust lib directory" - else - die "Found no old .rlib and .so files but old rust version is installed. Bailing!" - fi - fi -} - -pkg_postinst() { - - local old_rust="dev-lang/rust:stable/$(ver_cut 1-2)" - if has_version -b ${old_rust}; then - # Be _extra_ careful here as we're removing files from the live filesystem - local f - local only_one_file=() - einfo "Tidying up libraries files from non-slotted \`${old_rust}\`." - for f in "${old_rust_libs[@]}"; do - [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" - local base_name="${f%-*}" - local ext="${f##*.}" - local matching_files=("${base_name}"-*.${ext}) - case ${#matching_files[@]} in - 2) - einfo "Removing old .${ext}: ${f}" - rm "${f}" || die - ;; - 1) - # Turns out fingerprints are not as unique as we'd thought, _sometimes_ they collide, - # so we may have already installed over the old file. - # We'll warn about this just in case, but it's probably fine. - only_one_file+=( "${matching_files[0]}" ) - ;; - *) - die "Expected one or two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" - ;; - esac - done - if [[ ${#only_one_file} -gt 0 ]]; then - einfo "While tidying up non-slotted rust libraries for \`${old_rust}\`," - einfo "the following file(s) did not have a duplicate where one was expected:" - for f in "${only_one_file[@]}"; do - einfo " * ${f}" - done - einfo "" - einfo "This is unlikely to cause problems; the fingerprint for the library ended up being the same." - einfo "However, if you encounter any issues please report them to the Gentoo Rust Team." - fi - fi - - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - optfeature "Emacs support" "app-emacs/rust-mode" - optfeature "Vim support" "app-vim/rust-vim" -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust/rust-1.76.0-r101.ebuild b/dev-lang/rust/rust-1.76.0-r101.ebuild new file mode 100644 index 000000000000..f26d3673bb4f --- /dev/null +++ b/dev-lang/rust/rust-1.76.0-r101.ebuild @@ -0,0 +1,659 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 17 ) +PYTHON_COMPAT=( python3_{10..12} ) + +RUST_MAX_VER=${PV} +RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" + +inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing multilib multilib-build \ + optfeature python-any-r1 rust rust-toolchain toolchain-funcs verify-sig + +if [[ ${PV} = *beta* ]]; then + betaver=${PV//*beta} + BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" + MY_P="rustc-beta" + SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" +else + MY_P="rustc-${PV}" + SRC="${MY_P}-src.tar.xz" + KEYWORDS="amd64 arm arm64 ~loong ppc ppc64 ~riscv sparc x86" +fi + +DESCRIPTION="Systems programming language from Mozilla" +HOMEPAGE="https://www.rust-lang.org/" + +SRC_URI=" + https://static.rust-lang.org/dist/${SRC} + verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) +" +S="${WORKDIR}/${MY_P}-src" + +# keep in sync with llvm ebuild of the same version as bundled one. +ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai + LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE + WebAssembly X86 XCore Xtensa ) +ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) +LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} + +ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" +SLOT="${PV}" + +IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" + +LLVM_DEPEND=() +# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation +for _x in "${ALL_LLVM_TARGETS[@]}"; do + LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) +done +LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) +LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) + +BDEPEND="${PYTHON_DEPS} + app-eselect/eselect-rust + || ( + >=sys-devel/gcc-4.7 + >=llvm-core/clang-3.5 + ) + !system-llvm? ( + >=dev-build/cmake-3.13.4 + app-alternatives/ninja + ) + test? ( dev-debug/gdb ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +DEPEND=" + >=app-arch/xz-utils-5.2 + net-misc/curl:=[http2,ssl] + sys-libs/zlib:= + dev-libs/openssl:0= + system-llvm? ( + ${LLVM_DEPEND[*]} + llvm-libunwind? ( llvm-runtimes/libunwind:= ) + ) + !system-llvm? ( + !llvm-libunwind? ( + elibc_musl? ( sys-libs/libunwind:= ) + ) + ) +" + +RDEPEND="${DEPEND} + app-eselect/eselect-rust + dev-lang/rust-common + sys-apps/lsb-release + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" + +REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) + miri? ( nightly ) + parallel-compiler? ( nightly ) + rust-analyzer? ( rust-src ) + test? ( ${ALL_LLVM_TARGETS[*]} ) + wasm? ( llvm_targets_WebAssembly ) + x86? ( cpu_flags_x86_sse2 ) +" + +# we don't use cmake.eclass, but can get a warning +CMAKE_WARN_UNUSED_CLI=no + +QA_FLAGS_IGNORED=" + usr/lib/${PN}/${PV}/bin/.* + usr/lib/${PN}/${PV}/libexec/.* + usr/lib/${PN}/${PV}/lib/lib.*.so + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_SONAME=" + usr/lib/${PN}/${PV}/lib/lib.*.so.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_PRESTRIPPED=" + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +# causes double bootstrap +RESTRICT="test" + +VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc + +PATCHES=( + "${FILESDIR}"/1.75.0-musl-dynamic-linking.patch + "${FILESDIR}"/1.74.1-cross-compile-libz.patch + #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch # pending refresh + "${FILESDIR}"/1.70.0-ignore-broken-and-non-applicable-tests.patch + "${FILESDIR}"/1.67.0-doc-wasm.patch + "${FILESDIR}"/1.75.0-handle-vendored-sources.patch + "${FILESDIR}"/1.76.0-loong-code-model.patch # remove for >=1.78.0 +) + +clear_vendor_checksums() { + sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die +} + +toml_usex() { + usex "${1}" true false +} + +pre_build_checks() { + local M=9216 + # multiply requirements by 1.3 if we are doing x86-multilib + if use amd64; then + M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) + fi + M=$(( $(usex clippy 128 0) + ${M} )) + M=$(( $(usex miri 128 0) + ${M} )) + M=$(( $(usex rustfmt 256 0) + ${M} )) + # add 2G if we compile llvm and 256M per llvm_target + if ! use system-llvm; then + M=$(( 2048 + ${M} )) + local ltarget + for ltarget in ${ALL_LLVM_TARGETS[@]}; do + M=$(( $(usex ${ltarget} 256 0) + ${M} )) + done + fi + M=$(( $(usex wasm 256 0) + ${M} )) + M=$(( $(usex debug 2 1) * ${M} )) + eshopts_push -s extglob + if is-flagq '-g?(gdb)?([1-9])'; then + M=$(( 15 * ${M} / 10 )) + fi + eshopts_pop + M=$(( $(usex doc 256 0) + ${M} )) + CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} +} + +llvm_check_deps() { + has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" +} + +# Is LLVM being linked against libc++? +is_libcxx_linked() { + local code='#include +#if defined(_LIBCPP_VERSION) + HAVE_LIBCXX +#endif +' + local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 + [[ ${out} == *HAVE_LIBCXX* ]] +} + +pkg_pretend() { + pre_build_checks +} + +pkg_setup() { + pre_build_checks + python-any-r1_pkg_setup + + export LIBGIT2_NO_PKG_CONFIG=1 #749381 + if tc-is-cross-compiler; then + use system-llvm && die "USE=system-llvm not allowed when cross-compiling" + local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" + use "llvm_targets_${cross_llvm_target}" || \ + die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" + fi + + rust_pkg_setup + + if use system-llvm; then + llvm-r1_pkg_setup + + local llvm_config="$(get_llvm_prefix)/bin/llvm-config" + export LLVM_LINK_SHARED=1 + export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" + fi +} + +src_configure() { + if tc-is-cross-compiler; then + export PKG_CONFIG_ALLOW_CROSS=1 + export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" + export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" + export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" + fi + + filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 + + local rust_target="" rust_targets="" arch_cflags + + # Collect rust target names to compile standard libs for all ABIs. + for v in $(multilib_get_enabled_abi_pairs); do + rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" + done + if use wasm; then + rust_targets+=",\"wasm32-unknown-unknown\"" + if use system-llvm; then + # un-hardcode rust-lld linker for this target + # https://bugs.gentoo.org/715348 + sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/base/wasm.rs || die + fi + fi + rust_targets="${rust_targets#,}" + + # cargo and rustdoc are mandatory and should always be included + local tools='"cargo","rustdoc", "rust-demangler"' + use clippy && tools+=',"clippy"' + use miri && tools+=',"miri"' + use rustfmt && tools+=',"rustfmt"' + use rust-analyzer && tools+=',"rust-analyzer","rust-analyzer-proc-macro-srv"' + use rust-src && tools+=',"src"' + + local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" + # in case of prefix it will be already prefixed, as --print sysroot returns full path + [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" + + rust_target="$(rust_abi)" + rust_build="$(rust_abi "${CBUILD}")" + rust_host="$(rust_abi "${CHOST}")" + + LLVM_EXPERIMENTAL_TARGETS=() + for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do + if use llvm_targets_${_x} ; then + LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) + fi + done + LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} + + local cm_btype="$(usex debug DEBUG RELEASE)" + cat <<- _EOF_ > "${S}"/config.toml + changelog-seen = 2 + [llvm] + download-ci-llvm = false + optimize = $(toml_usex !debug) + release-debuginfo = $(toml_usex debug) + assertions = $(toml_usex debug) + ninja = true + targets = "${LLVM_TARGETS// /;}" + experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" + link-shared = $(toml_usex system-llvm) + $(if is_libcxx_linked; then + # https://bugs.gentoo.org/732632 + echo "use-libcxx = true" + echo "static-libstdcpp = false" + fi) + $(case "${rust_target}" in + i586-*-linux-*) + # https://github.com/rust-lang/rust/issues/93059 + echo 'cflags = "-fcf-protection=none"' + echo 'cxxflags = "-fcf-protection=none"' + echo 'ldflags = "-fcf-protection=none"' + ;; + *) + ;; + esac) + enable-warnings = false + [llvm.build-config] + CMAKE_VERBOSE_MAKEFILE = "ON" + $(if ! tc-is-cross-compiler; then + # When cross-compiling, LLVM is compiled twice, once for host and + # once for target. Unfortunately, this build configuration applies + # to both, which means any flags applicable to one target but not + # the other will break. Conditionally disable respecting user + # flags when cross-compiling. + echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" + echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" + echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" + fi) + [build] + build-stage = 2 + test-stage = 2 + build = "${rust_build}" + host = ["${rust_host}"] + target = [${rust_targets}] + cargo = "${rust_stage0_root}/bin/cargo" + rustc = "${rust_stage0_root}/bin/rustc" + rustfmt = "${rust_stage0_root}/bin/rustfmt" + docs = $(toml_usex doc) + compiler-docs = false + submodules = false + python = "${EPYTHON}" + locked-deps = true + vendor = true + extended = true + tools = [${tools}] + verbose = 2 + sanitizers = false + profiler = true + cargo-native-static = false + [install] + prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" + sysconfdir = "etc" + docdir = "share/doc/rust" + bindir = "bin" + libdir = "lib" + mandir = "share/man" + [rust] + # https://github.com/rust-lang/rust/issues/54872 + codegen-units-std = 1 + optimize = true + debug = $(toml_usex debug) + debug-assertions = $(toml_usex debug) + debug-assertions-std = $(toml_usex debug) + debuginfo-level = $(usex debug 2 0) + debuginfo-level-rustc = $(usex debug 2 0) + debuginfo-level-std = $(usex debug 2 0) + debuginfo-level-tools = $(usex debug 2 0) + debuginfo-level-tests = 0 + backtrace = true + incremental = false + $(if ! tc-is-cross-compiler; then + echo "default-linker = \"$(tc-getCC)\"" + fi) + parallel-compiler = $(toml_usex parallel-compiler) + channel = "$(usex nightly nightly stable)" + description = "gentoo" + rpath = true + verbose-tests = true + optimize-tests = $(toml_usex !debug) + codegen-tests = true + dist-src = false + remap-debuginfo = true + lld = $(usex system-llvm false $(toml_usex wasm)) + # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it + # https://github.com/rust-lang/rust/issues/74976 + # https://github.com/rust-lang/rust/issues/76526 + deny-warnings = $(usex wasm $(usex doc false true) true) + backtrace-on-ice = true + jemalloc = false + # See https://github.com/rust-lang/rust/issues/121124 + lto = "$(usex lto thin off)" + [dist] + src-tarball = false + compression-formats = ["xz"] + compression-profile = "balanced" + _EOF_ + + for v in $(multilib_get_enabled_abi_pairs); do + rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) + arch_cflags="$(get_abi_CFLAGS ${v##*.})" + + export CFLAGS_${rust_target//-/_}="${arch_cflags}" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${rust_target}] + ar = "$(tc-getAR)" + cc = "$(tc-getCC)" + cxx = "$(tc-getCXX)" + linker = "$(tc-getCC)" + ranlib = "$(tc-getRANLIB)" + llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; + # but we patch it and set to false here as well + if use elibc_musl; then + cat <<- _EOF_ >> "${S}"/config.toml + crt-static = false + _EOF_ + fi + done + if use wasm; then + cat <<- _EOF_ >> "${S}"/config.toml + [target.wasm32-unknown-unknown] + linker = "$(usex system-llvm lld rust-lld)" + # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 + profiler = false + _EOF_ + fi + + einfo "Rust configured with the following flags:" + echo + echo RUSTFLAGS="\"${RUSTFLAGS}\"" + echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" + echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" + echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" + env | grep "CARGO_TARGET_.*_RUSTFLAGS=" + env | grep "CFLAGS_.*" + echo + einfo "config.toml contents:" + cat "${S}"/config.toml || die + echo +} + +src_compile() { + RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die +} + +src_test() { + # https://rustc-dev-guide.rust-lang.org/tests/intro.html + + # those are basic and codegen tests. + local tests=( + codegen + codegen-units + compile-fail + incremental + mir-opt + pretty + run-make + ) + + # fails if llvm is not built with ALL targets. + # and known to fail with system llvm sometimes. + use system-llvm || tests+=( assembly ) + + # fragile/expensive/less important tests + # or tests that require extra builds + # TODO: instead of skipping, just make some nonfatal. + if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then + tests+=( + rustdoc + rustdoc-js + rustdoc-js-std + rustdoc-ui + run-make-fulldeps + ui + ui-fulldeps + ) + fi + + local i failed=() + einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" + for i in "${tests[@]}"; do + local t="src/test/${i}" + einfo "rust_src_test: running ${t}" + if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ + -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" + then + failed+=( "${t}" ) + eerror "rust_src_test: ${t} failed" + fi + done + + if [[ ${#failed[@]} -ne 0 ]]; then + eerror "rust_src_test: failure summary: ${failed[@]}" + die "aborting due to test failures" + fi +} + +src_install() { + DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die + + # bug #689562, #689160 + rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die + rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die + + local symlinks=( + cargo + rustc + rustdoc + rust-gdb + rust-gdbgui + rust-lldb + rust-demangler + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use miri && symlinks+=( miri cargo-miri ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- + # need to fix eselect-rust to remove this hack. + local ver_i="${i}-${PV}" + if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then + einfo "Installing ${i} symlink" + ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die + else + ewarn "${i} symlink requested, but source file not found" + ewarn "please report this" + fi + dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" + use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" + dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" + dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" + dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" + + newenvd - "50${P}" <<-_EOF_ + MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" + _EOF_ + + rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-demangler + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use miri; then + echo /usr/bin/miri >> "${T}/provider-${P}" + echo /usr/bin/cargo-miri >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/lib/rust/libexec >> "${T}/provider-${P}" + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + + if use dist; then + insinto "/usr/lib/${PN}/${PV}/dist" + doins -r "${S}/build/dist/." + fi +} + +pkg_preinst() { + # 943308 and friends; basically --keep-going can forget to unmerge old rust + # but the soft blocker allows us to install conflicting files. + # This results in duplicated .{rlib,so} files which confuses rustc and results in + # the need for manual intervention. + if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then + # we need to find all .{rlib,so} files in the old rust lib directory + # and store them in an array for later use + readarray -d '' old_rust_libs < <( + find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ + -type f \( -name '*.rlib' -o -name '*.so' \) -print0) + export old_rust_libs + if [[ ${#old_rust_libs[@]} -gt 0 ]]; then + einfo "Found old .rlib and .so files in the old rust lib directory" + else + die "Found no old .rlib and .so files but old rust version is installed. Bailing!" + fi + fi +} + +pkg_postinst() { + + local old_rust="dev-lang/rust:stable/$(ver_cut 1-2)" + if has_version -b ${old_rust}; then + # Be _extra_ careful here as we're removing files from the live filesystem + local f + local only_one_file=() + einfo "Tidying up libraries files from non-slotted \`${old_rust}\`." + for f in "${old_rust_libs[@]}"; do + [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" + local base_name="${f%-*}" + local ext="${f##*.}" + local matching_files=("${base_name}"-*.${ext}) + case ${#matching_files[@]} in + 2) + einfo "Removing old .${ext}: ${f}" + rm "${f}" || die + ;; + 1) + # Turns out fingerprints are not as unique as we'd thought, _sometimes_ they collide, + # so we may have already installed over the old file. + # We'll warn about this just in case, but it's probably fine. + only_one_file+=( "${matching_files[0]}" ) + ;; + *) + die "Expected one or two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" + ;; + esac + done + if [[ ${#only_one_file} -gt 0 ]]; then + einfo "While tidying up non-slotted rust libraries for \`${old_rust}\`," + einfo "the following file(s) did not have a duplicate where one was expected:" + for f in "${only_one_file[@]}"; do + einfo " * ${f}" + done + einfo "" + einfo "This is unlikely to cause problems; the fingerprint for the library ended up being the same." + einfo "However, if you encounter any issues please report them to the Gentoo Rust Team." + fi + fi + + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + optfeature "Emacs support" "app-emacs/rust-mode" + optfeature "Vim support" "app-vim/rust-vim" +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust/rust-1.77.1-r100.ebuild b/dev-lang/rust/rust-1.77.1-r100.ebuild deleted file mode 100644 index 5461a2a6b93e..000000000000 --- a/dev-lang/rust/rust-1.77.1-r100.ebuild +++ /dev/null @@ -1,742 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 17 ) -PYTHON_COMPAT=( python3_{10..12} ) - -RUST_MAX_VER=${PV} -RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" - -inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing multilib multilib-build \ - optfeature python-any-r1 rust rust-toolchain toolchain-funcs verify-sig - -if [[ ${PV} = *beta* ]]; then - betaver=${PV//*beta} - BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" - MY_P="rustc-beta" - SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" -else - MY_P="rustc-${PV}" - SRC="${MY_P}-src.tar.xz" - KEYWORDS="amd64 arm arm64 ~loong ppc ppc64 ~riscv sparc x86" -fi - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" - -SRC_URI=" - https://static.rust-lang.org/dist/${SRC} - verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) -" -S="${WORKDIR}/${MY_P}-src" - -# keep in sync with llvm ebuild of the same version as bundled one. -ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai - LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE - WebAssembly X86 XCore Xtensa ) -ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) -LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} - -ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" - -IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" - -LLVM_DEPEND=() -# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation -for _x in "${ALL_LLVM_TARGETS[@]}"; do - LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) -done -LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) -LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) - -BDEPEND="${PYTHON_DEPS} - app-eselect/eselect-rust - || ( - >=sys-devel/gcc-4.7 - >=llvm-core/clang-3.5 - ) - !system-llvm? ( - >=dev-build/cmake-3.13.4 - app-alternatives/ninja - ) - test? ( dev-debug/gdb ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -DEPEND=" - >=app-arch/xz-utils-5.2 - net-misc/curl:=[http2,ssl] - sys-libs/zlib:= - dev-libs/openssl:0= - system-llvm? ( - ${LLVM_DEPEND[*]} - llvm-libunwind? ( llvm-runtimes/libunwind:= ) - ) - !system-llvm? ( - !llvm-libunwind? ( - elibc_musl? ( sys-libs/libunwind:= ) - ) - ) -" - -RDEPEND="${DEPEND} - app-eselect/eselect-rust - dev-lang/rust-common - sys-apps/lsb-release - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" - -REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) - miri? ( nightly ) - parallel-compiler? ( nightly ) - rust-analyzer? ( rust-src ) - test? ( ${ALL_LLVM_TARGETS[*]} ) - wasm? ( llvm_targets_WebAssembly ) - x86? ( cpu_flags_x86_sse2 ) -" - -# we don't use cmake.eclass, but can get a warning -CMAKE_WARN_UNUSED_CLI=no - -QA_FLAGS_IGNORED=" - usr/lib/${PN}/${PV}/bin/.* - usr/lib/${PN}/${PV}/libexec/.* - usr/lib/${PN}/${PV}/lib/lib.*.so - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_SONAME=" - usr/lib/${PN}/${PV}/lib/lib.*.so.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_PRESTRIPPED=" - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -# causes double bootstrap -RESTRICT="test" - -VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc - -PATCHES=( - "${FILESDIR}"/1.75.0-musl-dynamic-linking.patch - "${FILESDIR}"/1.74.1-cross-compile-libz.patch - #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch # pending refresh - "${FILESDIR}"/1.70.0-ignore-broken-and-non-applicable-tests.patch - "${FILESDIR}"/1.67.0-doc-wasm.patch - "${FILESDIR}"/1.76.0-loong-code-model.patch # remove for >=1.78.0 -) - -clear_vendor_checksums() { - sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die -} - -toml_usex() { - usex "${1}" true false -} - -pre_build_checks() { - local M=9216 - # multiply requirements by 1.3 if we are doing x86-multilib - if use amd64; then - M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) - fi - M=$(( $(usex clippy 128 0) + ${M} )) - M=$(( $(usex miri 128 0) + ${M} )) - M=$(( $(usex rustfmt 256 0) + ${M} )) - # add 2G if we compile llvm and 256M per llvm_target - if ! use system-llvm; then - M=$(( 2048 + ${M} )) - local ltarget - for ltarget in ${ALL_LLVM_TARGETS[@]}; do - M=$(( $(usex ${ltarget} 256 0) + ${M} )) - done - fi - M=$(( $(usex wasm 256 0) + ${M} )) - M=$(( $(usex debug 2 1) * ${M} )) - eshopts_push -s extglob - if is-flagq '-g?(gdb)?([1-9])'; then - M=$(( 15 * ${M} / 10 )) - fi - eshopts_pop - M=$(( $(usex doc 256 0) + ${M} )) - CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} -} - -llvm_check_deps() { - has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" -} - -# Is LLVM being linked against libc++? -is_libcxx_linked() { - local code='#include -#if defined(_LIBCPP_VERSION) - HAVE_LIBCXX -#endif -' - local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 - [[ ${out} == *HAVE_LIBCXX* ]] -} - -pkg_pretend() { - pre_build_checks -} - -pkg_setup() { - pre_build_checks - python-any-r1_pkg_setup - - export LIBGIT2_NO_PKG_CONFIG=1 #749381 - if tc-is-cross-compiler; then - use system-llvm && die "USE=system-llvm not allowed when cross-compiling" - local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" - use "llvm_targets_${cross_llvm_target}" || \ - die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" - fi - - rust_pkg_setup - - if use system-llvm; then - llvm-r1_pkg_setup - - local llvm_config="$(get_llvm_prefix)/bin/llvm-config" - export LLVM_LINK_SHARED=1 - export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" - fi -} - -src_configure() { - if tc-is-cross-compiler; then - export PKG_CONFIG_ALLOW_CROSS=1 - export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" - export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" - export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" - fi - - filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 - - local rust_target="" rust_targets="" arch_cflags - - # Collect rust target names to compile standard libs for all ABIs. - for v in $(multilib_get_enabled_abi_pairs); do - rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" - done - if use wasm; then - rust_targets+=",\"wasm32-unknown-unknown\"" - if use system-llvm; then - # un-hardcode rust-lld linker for this target - # https://bugs.gentoo.org/715348 - sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/base/wasm.rs || die - fi - fi - rust_targets="${rust_targets#,}" - - # cargo and rustdoc are mandatory and should always be included - local tools='"cargo","rustdoc", "rust-demangler"' - use clippy && tools+=',"clippy"' - use miri && tools+=',"miri"' - use rustfmt && tools+=',"rustfmt"' - use rust-analyzer && tools+=',"rust-analyzer","rust-analyzer-proc-macro-srv"' - use rust-src && tools+=',"src"' - - local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" - # in case of prefix it will be already prefixed, as --print sysroot returns full path - [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" - - rust_target="$(rust_abi)" - rust_build="$(rust_abi "${CBUILD}")" - rust_host="$(rust_abi "${CHOST}")" - - LLVM_EXPERIMENTAL_TARGETS=() - for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do - if use llvm_targets_${_x} ; then - LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) - fi - done - LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} - - local cm_btype="$(usex debug DEBUG RELEASE)" - cat <<- _EOF_ > "${S}"/config.toml - changelog-seen = 2 - [llvm] - download-ci-llvm = false - optimize = $(toml_usex !debug) - release-debuginfo = $(toml_usex debug) - assertions = $(toml_usex debug) - ninja = true - targets = "${LLVM_TARGETS// /;}" - experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" - link-shared = $(toml_usex system-llvm) - $(if is_libcxx_linked; then - # https://bugs.gentoo.org/732632 - echo "use-libcxx = true" - echo "static-libstdcpp = false" - fi) - $(case "${rust_target}" in - i586-*-linux-*) - # https://github.com/rust-lang/rust/issues/93059 - echo 'cflags = "-fcf-protection=none"' - echo 'cxxflags = "-fcf-protection=none"' - echo 'ldflags = "-fcf-protection=none"' - ;; - *) - ;; - esac) - enable-warnings = false - [llvm.build-config] - CMAKE_VERBOSE_MAKEFILE = "ON" - $(if ! tc-is-cross-compiler; then - # When cross-compiling, LLVM is compiled twice, once for host and - # once for target. Unfortunately, this build configuration applies - # to both, which means any flags applicable to one target but not - # the other will break. Conditionally disable respecting user - # flags when cross-compiling. - echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" - echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" - echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" - fi) - [build] - build-stage = 2 - test-stage = 2 - build = "${rust_build}" - host = ["${rust_host}"] - target = [${rust_targets}] - cargo = "${rust_stage0_root}/bin/cargo" - rustc = "${rust_stage0_root}/bin/rustc" - rustfmt = "${rust_stage0_root}/bin/rustfmt" - docs = $(toml_usex doc) - compiler-docs = false - submodules = false - python = "${EPYTHON}" - locked-deps = true - vendor = true - extended = true - tools = [${tools}] - verbose = 2 - sanitizers = false - profiler = true - cargo-native-static = false - [install] - prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" - sysconfdir = "etc" - docdir = "share/doc/rust" - bindir = "bin" - libdir = "lib" - mandir = "share/man" - [rust] - # https://github.com/rust-lang/rust/issues/54872 - codegen-units-std = 1 - optimize = true - debug = $(toml_usex debug) - debug-assertions = $(toml_usex debug) - debug-assertions-std = $(toml_usex debug) - debuginfo-level = $(usex debug 2 0) - debuginfo-level-rustc = $(usex debug 2 0) - debuginfo-level-std = $(usex debug 2 0) - debuginfo-level-tools = $(usex debug 2 0) - debuginfo-level-tests = 0 - backtrace = true - incremental = false - $(if ! tc-is-cross-compiler; then - echo "default-linker = \"$(tc-getCC)\"" - fi) - parallel-compiler = $(toml_usex parallel-compiler) - channel = "$(usex nightly nightly stable)" - description = "gentoo" - rpath = false - verbose-tests = true - optimize-tests = $(toml_usex !debug) - codegen-tests = true - dist-src = false - remap-debuginfo = true - lld = $(usex system-llvm false $(toml_usex wasm)) - # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it - # https://github.com/rust-lang/rust/issues/74976 - # https://github.com/rust-lang/rust/issues/76526 - deny-warnings = $(usex wasm $(usex doc false true) true) - backtrace-on-ice = true - jemalloc = false - # See https://github.com/rust-lang/rust/issues/121124 - lto = "$(usex lto thin off)" - [dist] - src-tarball = false - compression-formats = ["xz"] - compression-profile = "balanced" - _EOF_ - - for v in $(multilib_get_enabled_abi_pairs); do - rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) - arch_cflags="$(get_abi_CFLAGS ${v##*.})" - - export CFLAGS_${rust_target//-/_}="${arch_cflags}" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${rust_target}] - ar = "$(tc-getAR)" - cc = "$(tc-getCC)" - cxx = "$(tc-getCXX)" - linker = "$(tc-getCC)" - ranlib = "$(tc-getRANLIB)" - llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; - # but we patch it and set to false here as well - if use elibc_musl; then - cat <<- _EOF_ >> "${S}"/config.toml - crt-static = false - _EOF_ - fi - done - if use wasm; then - cat <<- _EOF_ >> "${S}"/config.toml - [target.wasm32-unknown-unknown] - linker = "$(usex system-llvm lld rust-lld)" - # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 - profiler = false - _EOF_ - fi - - if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below - # experimental cross support - # discussion: https://bugs.gentoo.org/679878 - # TODO: c*flags, clang, system-llvm, cargo.eclass target support - # it would be much better if we could split out stdlib - # complilation to separate ebuild and abuse CATEGORY to - # just install to /usr/lib/rustlib/ - - # extra targets defined as a bash array - # spec format: :: - # best place would be /etc/portage/env/dev-lang/rust - # Example: - # RUST_CROSS_TARGETS=( - # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" - # ) - # no extra hand holding is done, no target transformations, all - # values are passed as-is with just basic checks, so it's up to user to supply correct values - # valid rust targets can be obtained with - # rustc --print target-list - # matching cross toolchain has to be installed - # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) - # only gcc toolchains installed with crossdev are checked for now. - - # BUG: we can't pass host flags to cross compiler, so just filter for now - # BUG: this should be more fine-grained. - filter-flags '-mcpu=*' '-march=*' '-mtune=*' - - local cross_target_spec - for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do - # extracts first element form :: - local cross_llvm_target="${cross_target_spec%%:*}" - # extracts toolchain triples, : - local cross_triples="${cross_target_spec#*:}" - # extracts first element after before : separator - local cross_rust_target="${cross_triples%%:*}" - # extracts last element after : separator - local cross_toolchain="${cross_triples##*:}" - use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" - command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${cross_rust_target}] - ar = "${cross_toolchain}-ar" - cc = "${cross_toolchain}-gcc" - cxx = "${cross_toolchain}-g++" - linker = "${cross_toolchain}-gcc" - ranlib = "${cross_toolchain}-ranlib" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - if [[ "${cross_toolchain}" == *-musl* ]]; then - cat <<- _EOF_ >> "${S}"/config.toml - musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" - _EOF_ - fi - - # append cross target to "normal" target list - # example 'target = ["powerpc64le-unknown-linux-gnu"]' - # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' - - rust_targets="${rust_targets},\"${cross_rust_target}\"" - sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die - - ewarn - ewarn "Enabled ${cross_rust_target} rust target" - ewarn "Using ${cross_toolchain} cross toolchain" - ewarn - if ! has_version -b 'sys-devel/binutils[multitarget]' ; then - ewarn "'sys-devel/binutils[multitarget]' is not installed" - ewarn "'strip' will be unable to strip cross libraries" - ewarn "cross targets will be installed with full debug information" - ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" - ewarn - ewarn "Alternatively llvm-strip can be used, it supports stripping any target" - ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" - ewarn - fi - done - fi # I_KNOW_WHAT_I_AM_DOING_CROSS - - einfo "Rust configured with the following flags:" - echo - echo RUSTFLAGS="\"${RUSTFLAGS}\"" - echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" - echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" - echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" - env | grep "CARGO_TARGET_.*_RUSTFLAGS=" - env | grep "CFLAGS_.*" - echo - einfo "config.toml contents:" - cat "${S}"/config.toml || die - echo -} - -src_compile() { - RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die -} - -src_test() { - # https://rustc-dev-guide.rust-lang.org/tests/intro.html - - # those are basic and codegen tests. - local tests=( - codegen - codegen-units - compile-fail - incremental - mir-opt - pretty - run-make - ) - - # fails if llvm is not built with ALL targets. - # and known to fail with system llvm sometimes. - use system-llvm || tests+=( assembly ) - - # fragile/expensive/less important tests - # or tests that require extra builds - # TODO: instead of skipping, just make some nonfatal. - if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then - tests+=( - rustdoc - rustdoc-js - rustdoc-js-std - rustdoc-ui - run-make-fulldeps - ui - ui-fulldeps - ) - fi - - local i failed=() - einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" - for i in "${tests[@]}"; do - local t="src/test/${i}" - einfo "rust_src_test: running ${t}" - if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ - -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" - then - failed+=( "${t}" ) - eerror "rust_src_test: ${t} failed" - fi - done - - if [[ ${#failed[@]} -ne 0 ]]; then - eerror "rust_src_test: failure summary: ${failed[@]}" - die "aborting due to test failures" - fi -} - -src_install() { - DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die - - # bug #689562, #689160 - rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die - rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - rust-demangler - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use miri && symlinks+=( miri cargo-miri ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- - # need to fix eselect-rust to remove this hack. - local ver_i="${i}-${PV}" - if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then - einfo "Installing ${i} symlink" - ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die - else - ewarn "${i} symlink requested, but source file not found" - ewarn "please report this" - fi - dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" - use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" - dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" - dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" - dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" - - newenvd - "50${P}" <<-_EOF_ - LDPATH="${EPREFIX}/usr/lib/rust/lib-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" - _EOF_ - - rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-demangler - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use miri; then - echo /usr/bin/miri >> "${T}/provider-${P}" - echo /usr/bin/cargo-miri >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/lib/rust/libexec >> "${T}/provider-${P}" - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - - if use dist; then - insinto "/usr/lib/${PN}/${PV}/dist" - doins -r "${S}/build/dist/." - fi -} - -pkg_preinst() { - # 943308 and friends; basically --keep-going can forget to unmerge old rust - # but the soft blocker allows us to install conflicting files. - # This results in duplicated .{rlib,so} files which confuses rustc and results in - # the need for manual intervention. - if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then - # we need to find all .{rlib,so} files in the old rust lib directory - # and store them in an array for later use - readarray -d '' old_rust_libs < <( - find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ - -type f \( -name '*.rlib' -o -name '*.so' \) -print0) - export old_rust_libs - if [[ ${#old_rust_libs[@]} -gt 0 ]]; then - einfo "Found old .rlib and .so files in the old rust lib directory" - else - die "Found no old .rlib and .so files but old rust version is installed. Bailing!" - fi - fi -} - -pkg_postinst() { - - local old_rust="dev-lang/rust:stable/$(ver_cut 1-2)" - if has_version -b ${old_rust}; then - # Be _extra_ careful here as we're removing files from the live filesystem - local f - local only_one_file=() - einfo "Tidying up libraries files from non-slotted \`${old_rust}\`." - for f in "${old_rust_libs[@]}"; do - [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" - local base_name="${f%-*}" - local ext="${f##*.}" - local matching_files=("${base_name}"-*.${ext}) - case ${#matching_files[@]} in - 2) - einfo "Removing old .${ext}: ${f}" - rm "${f}" || die - ;; - 1) - # Turns out fingerprints are not as unique as we'd thought, _sometimes_ they collide, - # so we may have already installed over the old file. - # We'll warn about this just in case, but it's probably fine. - only_one_file+=( "${matching_files[0]}" ) - ;; - *) - die "Expected one or two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" - ;; - esac - done - if [[ ${#only_one_file} -gt 0 ]]; then - einfo "While tidying up non-slotted rust libraries for \`${old_rust}\`," - einfo "the following file(s) did not have a duplicate where one was expected:" - for f in "${only_one_file[@]}"; do - einfo " * ${f}" - done - einfo "" - einfo "This is unlikely to cause problems; the fingerprint for the library ended up being the same." - einfo "However, if you encounter any issues please report them to the Gentoo Rust Team." - fi - fi - - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - optfeature "Emacs support" "app-emacs/rust-mode" - optfeature "Vim support" "app-vim/rust-vim" -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust/rust-1.77.1-r101.ebuild b/dev-lang/rust/rust-1.77.1-r101.ebuild new file mode 100644 index 000000000000..a84253b3343f --- /dev/null +++ b/dev-lang/rust/rust-1.77.1-r101.ebuild @@ -0,0 +1,741 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 17 ) +PYTHON_COMPAT=( python3_{10..12} ) + +RUST_MAX_VER=${PV} +RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" + +inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing multilib multilib-build \ + optfeature python-any-r1 rust rust-toolchain toolchain-funcs verify-sig + +if [[ ${PV} = *beta* ]]; then + betaver=${PV//*beta} + BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" + MY_P="rustc-beta" + SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" +else + MY_P="rustc-${PV}" + SRC="${MY_P}-src.tar.xz" + KEYWORDS="amd64 arm arm64 ~loong ppc ppc64 ~riscv sparc x86" +fi + +DESCRIPTION="Systems programming language from Mozilla" +HOMEPAGE="https://www.rust-lang.org/" + +SRC_URI=" + https://static.rust-lang.org/dist/${SRC} + verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) +" +S="${WORKDIR}/${MY_P}-src" + +# keep in sync with llvm ebuild of the same version as bundled one. +ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai + LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE + WebAssembly X86 XCore Xtensa ) +ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) +LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} + +ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" +SLOT="${PV}" + +IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" + +LLVM_DEPEND=() +# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation +for _x in "${ALL_LLVM_TARGETS[@]}"; do + LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) +done +LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) +LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) + +BDEPEND="${PYTHON_DEPS} + app-eselect/eselect-rust + || ( + >=sys-devel/gcc-4.7 + >=llvm-core/clang-3.5 + ) + !system-llvm? ( + >=dev-build/cmake-3.13.4 + app-alternatives/ninja + ) + test? ( dev-debug/gdb ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +DEPEND=" + >=app-arch/xz-utils-5.2 + net-misc/curl:=[http2,ssl] + sys-libs/zlib:= + dev-libs/openssl:0= + system-llvm? ( + ${LLVM_DEPEND[*]} + llvm-libunwind? ( llvm-runtimes/libunwind:= ) + ) + !system-llvm? ( + !llvm-libunwind? ( + elibc_musl? ( sys-libs/libunwind:= ) + ) + ) +" + +RDEPEND="${DEPEND} + app-eselect/eselect-rust + dev-lang/rust-common + sys-apps/lsb-release + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" + +REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) + miri? ( nightly ) + parallel-compiler? ( nightly ) + rust-analyzer? ( rust-src ) + test? ( ${ALL_LLVM_TARGETS[*]} ) + wasm? ( llvm_targets_WebAssembly ) + x86? ( cpu_flags_x86_sse2 ) +" + +# we don't use cmake.eclass, but can get a warning +CMAKE_WARN_UNUSED_CLI=no + +QA_FLAGS_IGNORED=" + usr/lib/${PN}/${PV}/bin/.* + usr/lib/${PN}/${PV}/libexec/.* + usr/lib/${PN}/${PV}/lib/lib.*.so + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_SONAME=" + usr/lib/${PN}/${PV}/lib/lib.*.so.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_PRESTRIPPED=" + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +# causes double bootstrap +RESTRICT="test" + +VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc + +PATCHES=( + "${FILESDIR}"/1.75.0-musl-dynamic-linking.patch + "${FILESDIR}"/1.74.1-cross-compile-libz.patch + #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch # pending refresh + "${FILESDIR}"/1.70.0-ignore-broken-and-non-applicable-tests.patch + "${FILESDIR}"/1.67.0-doc-wasm.patch + "${FILESDIR}"/1.76.0-loong-code-model.patch # remove for >=1.78.0 +) + +clear_vendor_checksums() { + sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die +} + +toml_usex() { + usex "${1}" true false +} + +pre_build_checks() { + local M=9216 + # multiply requirements by 1.3 if we are doing x86-multilib + if use amd64; then + M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) + fi + M=$(( $(usex clippy 128 0) + ${M} )) + M=$(( $(usex miri 128 0) + ${M} )) + M=$(( $(usex rustfmt 256 0) + ${M} )) + # add 2G if we compile llvm and 256M per llvm_target + if ! use system-llvm; then + M=$(( 2048 + ${M} )) + local ltarget + for ltarget in ${ALL_LLVM_TARGETS[@]}; do + M=$(( $(usex ${ltarget} 256 0) + ${M} )) + done + fi + M=$(( $(usex wasm 256 0) + ${M} )) + M=$(( $(usex debug 2 1) * ${M} )) + eshopts_push -s extglob + if is-flagq '-g?(gdb)?([1-9])'; then + M=$(( 15 * ${M} / 10 )) + fi + eshopts_pop + M=$(( $(usex doc 256 0) + ${M} )) + CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} +} + +llvm_check_deps() { + has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" +} + +# Is LLVM being linked against libc++? +is_libcxx_linked() { + local code='#include +#if defined(_LIBCPP_VERSION) + HAVE_LIBCXX +#endif +' + local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 + [[ ${out} == *HAVE_LIBCXX* ]] +} + +pkg_pretend() { + pre_build_checks +} + +pkg_setup() { + pre_build_checks + python-any-r1_pkg_setup + + export LIBGIT2_NO_PKG_CONFIG=1 #749381 + if tc-is-cross-compiler; then + use system-llvm && die "USE=system-llvm not allowed when cross-compiling" + local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" + use "llvm_targets_${cross_llvm_target}" || \ + die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" + fi + + rust_pkg_setup + + if use system-llvm; then + llvm-r1_pkg_setup + + local llvm_config="$(get_llvm_prefix)/bin/llvm-config" + export LLVM_LINK_SHARED=1 + export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" + fi +} + +src_configure() { + if tc-is-cross-compiler; then + export PKG_CONFIG_ALLOW_CROSS=1 + export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" + export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" + export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" + fi + + filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 + + local rust_target="" rust_targets="" arch_cflags + + # Collect rust target names to compile standard libs for all ABIs. + for v in $(multilib_get_enabled_abi_pairs); do + rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" + done + if use wasm; then + rust_targets+=",\"wasm32-unknown-unknown\"" + if use system-llvm; then + # un-hardcode rust-lld linker for this target + # https://bugs.gentoo.org/715348 + sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/base/wasm.rs || die + fi + fi + rust_targets="${rust_targets#,}" + + # cargo and rustdoc are mandatory and should always be included + local tools='"cargo","rustdoc", "rust-demangler"' + use clippy && tools+=',"clippy"' + use miri && tools+=',"miri"' + use rustfmt && tools+=',"rustfmt"' + use rust-analyzer && tools+=',"rust-analyzer","rust-analyzer-proc-macro-srv"' + use rust-src && tools+=',"src"' + + local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" + # in case of prefix it will be already prefixed, as --print sysroot returns full path + [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" + + rust_target="$(rust_abi)" + rust_build="$(rust_abi "${CBUILD}")" + rust_host="$(rust_abi "${CHOST}")" + + LLVM_EXPERIMENTAL_TARGETS=() + for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do + if use llvm_targets_${_x} ; then + LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) + fi + done + LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} + + local cm_btype="$(usex debug DEBUG RELEASE)" + cat <<- _EOF_ > "${S}"/config.toml + changelog-seen = 2 + [llvm] + download-ci-llvm = false + optimize = $(toml_usex !debug) + release-debuginfo = $(toml_usex debug) + assertions = $(toml_usex debug) + ninja = true + targets = "${LLVM_TARGETS// /;}" + experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" + link-shared = $(toml_usex system-llvm) + $(if is_libcxx_linked; then + # https://bugs.gentoo.org/732632 + echo "use-libcxx = true" + echo "static-libstdcpp = false" + fi) + $(case "${rust_target}" in + i586-*-linux-*) + # https://github.com/rust-lang/rust/issues/93059 + echo 'cflags = "-fcf-protection=none"' + echo 'cxxflags = "-fcf-protection=none"' + echo 'ldflags = "-fcf-protection=none"' + ;; + *) + ;; + esac) + enable-warnings = false + [llvm.build-config] + CMAKE_VERBOSE_MAKEFILE = "ON" + $(if ! tc-is-cross-compiler; then + # When cross-compiling, LLVM is compiled twice, once for host and + # once for target. Unfortunately, this build configuration applies + # to both, which means any flags applicable to one target but not + # the other will break. Conditionally disable respecting user + # flags when cross-compiling. + echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" + echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" + echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" + fi) + [build] + build-stage = 2 + test-stage = 2 + build = "${rust_build}" + host = ["${rust_host}"] + target = [${rust_targets}] + cargo = "${rust_stage0_root}/bin/cargo" + rustc = "${rust_stage0_root}/bin/rustc" + rustfmt = "${rust_stage0_root}/bin/rustfmt" + docs = $(toml_usex doc) + compiler-docs = false + submodules = false + python = "${EPYTHON}" + locked-deps = true + vendor = true + extended = true + tools = [${tools}] + verbose = 2 + sanitizers = false + profiler = true + cargo-native-static = false + [install] + prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" + sysconfdir = "etc" + docdir = "share/doc/rust" + bindir = "bin" + libdir = "lib" + mandir = "share/man" + [rust] + # https://github.com/rust-lang/rust/issues/54872 + codegen-units-std = 1 + optimize = true + debug = $(toml_usex debug) + debug-assertions = $(toml_usex debug) + debug-assertions-std = $(toml_usex debug) + debuginfo-level = $(usex debug 2 0) + debuginfo-level-rustc = $(usex debug 2 0) + debuginfo-level-std = $(usex debug 2 0) + debuginfo-level-tools = $(usex debug 2 0) + debuginfo-level-tests = 0 + backtrace = true + incremental = false + $(if ! tc-is-cross-compiler; then + echo "default-linker = \"$(tc-getCC)\"" + fi) + parallel-compiler = $(toml_usex parallel-compiler) + channel = "$(usex nightly nightly stable)" + description = "gentoo" + rpath = true + verbose-tests = true + optimize-tests = $(toml_usex !debug) + codegen-tests = true + dist-src = false + remap-debuginfo = true + lld = $(usex system-llvm false $(toml_usex wasm)) + # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it + # https://github.com/rust-lang/rust/issues/74976 + # https://github.com/rust-lang/rust/issues/76526 + deny-warnings = $(usex wasm $(usex doc false true) true) + backtrace-on-ice = true + jemalloc = false + # See https://github.com/rust-lang/rust/issues/121124 + lto = "$(usex lto thin off)" + [dist] + src-tarball = false + compression-formats = ["xz"] + compression-profile = "balanced" + _EOF_ + + for v in $(multilib_get_enabled_abi_pairs); do + rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) + arch_cflags="$(get_abi_CFLAGS ${v##*.})" + + export CFLAGS_${rust_target//-/_}="${arch_cflags}" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${rust_target}] + ar = "$(tc-getAR)" + cc = "$(tc-getCC)" + cxx = "$(tc-getCXX)" + linker = "$(tc-getCC)" + ranlib = "$(tc-getRANLIB)" + llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; + # but we patch it and set to false here as well + if use elibc_musl; then + cat <<- _EOF_ >> "${S}"/config.toml + crt-static = false + _EOF_ + fi + done + if use wasm; then + cat <<- _EOF_ >> "${S}"/config.toml + [target.wasm32-unknown-unknown] + linker = "$(usex system-llvm lld rust-lld)" + # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 + profiler = false + _EOF_ + fi + + if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below + # experimental cross support + # discussion: https://bugs.gentoo.org/679878 + # TODO: c*flags, clang, system-llvm, cargo.eclass target support + # it would be much better if we could split out stdlib + # complilation to separate ebuild and abuse CATEGORY to + # just install to /usr/lib/rustlib/ + + # extra targets defined as a bash array + # spec format: :: + # best place would be /etc/portage/env/dev-lang/rust + # Example: + # RUST_CROSS_TARGETS=( + # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" + # ) + # no extra hand holding is done, no target transformations, all + # values are passed as-is with just basic checks, so it's up to user to supply correct values + # valid rust targets can be obtained with + # rustc --print target-list + # matching cross toolchain has to be installed + # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) + # only gcc toolchains installed with crossdev are checked for now. + + # BUG: we can't pass host flags to cross compiler, so just filter for now + # BUG: this should be more fine-grained. + filter-flags '-mcpu=*' '-march=*' '-mtune=*' + + local cross_target_spec + for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do + # extracts first element form :: + local cross_llvm_target="${cross_target_spec%%:*}" + # extracts toolchain triples, : + local cross_triples="${cross_target_spec#*:}" + # extracts first element after before : separator + local cross_rust_target="${cross_triples%%:*}" + # extracts last element after : separator + local cross_toolchain="${cross_triples##*:}" + use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" + command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${cross_rust_target}] + ar = "${cross_toolchain}-ar" + cc = "${cross_toolchain}-gcc" + cxx = "${cross_toolchain}-g++" + linker = "${cross_toolchain}-gcc" + ranlib = "${cross_toolchain}-ranlib" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + if [[ "${cross_toolchain}" == *-musl* ]]; then + cat <<- _EOF_ >> "${S}"/config.toml + musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" + _EOF_ + fi + + # append cross target to "normal" target list + # example 'target = ["powerpc64le-unknown-linux-gnu"]' + # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' + + rust_targets="${rust_targets},\"${cross_rust_target}\"" + sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die + + ewarn + ewarn "Enabled ${cross_rust_target} rust target" + ewarn "Using ${cross_toolchain} cross toolchain" + ewarn + if ! has_version -b 'sys-devel/binutils[multitarget]' ; then + ewarn "'sys-devel/binutils[multitarget]' is not installed" + ewarn "'strip' will be unable to strip cross libraries" + ewarn "cross targets will be installed with full debug information" + ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" + ewarn + ewarn "Alternatively llvm-strip can be used, it supports stripping any target" + ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" + ewarn + fi + done + fi # I_KNOW_WHAT_I_AM_DOING_CROSS + + einfo "Rust configured with the following flags:" + echo + echo RUSTFLAGS="\"${RUSTFLAGS}\"" + echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" + echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" + echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" + env | grep "CARGO_TARGET_.*_RUSTFLAGS=" + env | grep "CFLAGS_.*" + echo + einfo "config.toml contents:" + cat "${S}"/config.toml || die + echo +} + +src_compile() { + RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die +} + +src_test() { + # https://rustc-dev-guide.rust-lang.org/tests/intro.html + + # those are basic and codegen tests. + local tests=( + codegen + codegen-units + compile-fail + incremental + mir-opt + pretty + run-make + ) + + # fails if llvm is not built with ALL targets. + # and known to fail with system llvm sometimes. + use system-llvm || tests+=( assembly ) + + # fragile/expensive/less important tests + # or tests that require extra builds + # TODO: instead of skipping, just make some nonfatal. + if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then + tests+=( + rustdoc + rustdoc-js + rustdoc-js-std + rustdoc-ui + run-make-fulldeps + ui + ui-fulldeps + ) + fi + + local i failed=() + einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" + for i in "${tests[@]}"; do + local t="src/test/${i}" + einfo "rust_src_test: running ${t}" + if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ + -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" + then + failed+=( "${t}" ) + eerror "rust_src_test: ${t} failed" + fi + done + + if [[ ${#failed[@]} -ne 0 ]]; then + eerror "rust_src_test: failure summary: ${failed[@]}" + die "aborting due to test failures" + fi +} + +src_install() { + DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die + + # bug #689562, #689160 + rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die + rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die + + local symlinks=( + cargo + rustc + rustdoc + rust-gdb + rust-gdbgui + rust-lldb + rust-demangler + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use miri && symlinks+=( miri cargo-miri ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- + # need to fix eselect-rust to remove this hack. + local ver_i="${i}-${PV}" + if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then + einfo "Installing ${i} symlink" + ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die + else + ewarn "${i} symlink requested, but source file not found" + ewarn "please report this" + fi + dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" + use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" + dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" + dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" + dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" + + newenvd - "50${P}" <<-_EOF_ + MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" + _EOF_ + + rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-demangler + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use miri; then + echo /usr/bin/miri >> "${T}/provider-${P}" + echo /usr/bin/cargo-miri >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/lib/rust/libexec >> "${T}/provider-${P}" + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + + if use dist; then + insinto "/usr/lib/${PN}/${PV}/dist" + doins -r "${S}/build/dist/." + fi +} + +pkg_preinst() { + # 943308 and friends; basically --keep-going can forget to unmerge old rust + # but the soft blocker allows us to install conflicting files. + # This results in duplicated .{rlib,so} files which confuses rustc and results in + # the need for manual intervention. + if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then + # we need to find all .{rlib,so} files in the old rust lib directory + # and store them in an array for later use + readarray -d '' old_rust_libs < <( + find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ + -type f \( -name '*.rlib' -o -name '*.so' \) -print0) + export old_rust_libs + if [[ ${#old_rust_libs[@]} -gt 0 ]]; then + einfo "Found old .rlib and .so files in the old rust lib directory" + else + die "Found no old .rlib and .so files but old rust version is installed. Bailing!" + fi + fi +} + +pkg_postinst() { + + local old_rust="dev-lang/rust:stable/$(ver_cut 1-2)" + if has_version -b ${old_rust}; then + # Be _extra_ careful here as we're removing files from the live filesystem + local f + local only_one_file=() + einfo "Tidying up libraries files from non-slotted \`${old_rust}\`." + for f in "${old_rust_libs[@]}"; do + [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" + local base_name="${f%-*}" + local ext="${f##*.}" + local matching_files=("${base_name}"-*.${ext}) + case ${#matching_files[@]} in + 2) + einfo "Removing old .${ext}: ${f}" + rm "${f}" || die + ;; + 1) + # Turns out fingerprints are not as unique as we'd thought, _sometimes_ they collide, + # so we may have already installed over the old file. + # We'll warn about this just in case, but it's probably fine. + only_one_file+=( "${matching_files[0]}" ) + ;; + *) + die "Expected one or two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" + ;; + esac + done + if [[ ${#only_one_file} -gt 0 ]]; then + einfo "While tidying up non-slotted rust libraries for \`${old_rust}\`," + einfo "the following file(s) did not have a duplicate where one was expected:" + for f in "${only_one_file[@]}"; do + einfo " * ${f}" + done + einfo "" + einfo "This is unlikely to cause problems; the fingerprint for the library ended up being the same." + einfo "However, if you encounter any issues please report them to the Gentoo Rust Team." + fi + fi + + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + optfeature "Emacs support" "app-emacs/rust-mode" + optfeature "Vim support" "app-vim/rust-vim" +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust/rust-1.78.0-r100.ebuild b/dev-lang/rust/rust-1.78.0-r100.ebuild deleted file mode 100644 index 19a64890ab0b..000000000000 --- a/dev-lang/rust/rust-1.78.0-r100.ebuild +++ /dev/null @@ -1,745 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 18 ) -PYTHON_COMPAT=( python3_{10..13} ) - -RUST_MAX_VER=${PV} -RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" - -inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing multilib multilib-build \ - optfeature python-any-r1 rust rust-toolchain toolchain-funcs verify-sig - -if [[ ${PV} = *beta* ]]; then - betaver=${PV//*beta} - BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" - MY_P="rustc-beta" - SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" -else - MY_P="rustc-${PV}" - SRC="${MY_P}-src.tar.xz" - KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv sparc x86" -fi - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" - -SRC_URI=" - https://static.rust-lang.org/dist/${SRC} - verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) -" -S="${WORKDIR}/${MY_P}-src" - -# keep in sync with llvm ebuild of the same version as bundled one. -ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai - LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE - WebAssembly X86 XCore Xtensa ) -ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) -LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} - -ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" - -IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" - -LLVM_DEPEND=() -# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation -for _x in "${ALL_LLVM_TARGETS[@]}"; do - LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) -done -LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) -LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) - -BDEPEND="${PYTHON_DEPS} - app-eselect/eselect-rust - || ( - >=sys-devel/gcc-4.7 - >=llvm-core/clang-3.5 - ) - !system-llvm? ( - >=dev-build/cmake-3.13.4 - app-alternatives/ninja - ) - test? ( dev-debug/gdb ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -DEPEND=" - >=app-arch/xz-utils-5.2 - net-misc/curl:=[http2,ssl] - sys-libs/zlib:= - dev-libs/openssl:0= - system-llvm? ( - ${LLVM_DEPEND[*]} - llvm-libunwind? ( llvm-runtimes/libunwind:= ) - ) - !system-llvm? ( - !llvm-libunwind? ( - elibc_musl? ( sys-libs/libunwind:= ) - ) - ) -" - -RDEPEND="${DEPEND} - app-eselect/eselect-rust - dev-lang/rust-common - sys-apps/lsb-release - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" - -REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) - miri? ( nightly ) - parallel-compiler? ( nightly ) - rust-analyzer? ( rust-src ) - test? ( ${ALL_LLVM_TARGETS[*]} ) - wasm? ( llvm_targets_WebAssembly ) - x86? ( cpu_flags_x86_sse2 ) -" - -# we don't use cmake.eclass, but can get a warning -CMAKE_WARN_UNUSED_CLI=no - -QA_FLAGS_IGNORED=" - usr/lib/${PN}/${PV}/bin/.* - usr/lib/${PN}/${PV}/libexec/.* - usr/lib/${PN}/${PV}/lib/lib.*.so - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_SONAME=" - usr/lib/${PN}/${PV}/lib/lib.*.so.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_PRESTRIPPED=" - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -# causes double bootstrap -RESTRICT="test" - -VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc - -PATCHES=( - "${FILESDIR}"/1.78.0-musl-dynamic-linking.patch - "${FILESDIR}"/1.74.1-cross-compile-libz.patch - #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch # pending refresh - "${FILESDIR}"/1.78.0-ignore-broken-and-non-applicable-tests.patch - "${FILESDIR}"/1.67.0-doc-wasm.patch - "${FILESDIR}"/1.79.0-revert-8c40426.patch -) - -clear_vendor_checksums() { - sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die -} - -toml_usex() { - usex "${1}" true false -} - -pre_build_checks() { - local M=9216 - # multiply requirements by 1.3 if we are doing x86-multilib - if use amd64; then - M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) - fi - M=$(( $(usex clippy 128 0) + ${M} )) - M=$(( $(usex miri 128 0) + ${M} )) - M=$(( $(usex rustfmt 256 0) + ${M} )) - # add 2G if we compile llvm and 256M per llvm_target - if ! use system-llvm; then - M=$(( 2048 + ${M} )) - local ltarget - for ltarget in ${ALL_LLVM_TARGETS[@]}; do - M=$(( $(usex ${ltarget} 256 0) + ${M} )) - done - fi - M=$(( $(usex wasm 256 0) + ${M} )) - M=$(( $(usex debug 2 1) * ${M} )) - eshopts_push -s extglob - if is-flagq '-g?(gdb)?([1-9])'; then - M=$(( 15 * ${M} / 10 )) - fi - eshopts_pop - M=$(( $(usex doc 256 0) + ${M} )) - CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} -} - -llvm_check_deps() { - has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" -} - -# Is LLVM being linked against libc++? -is_libcxx_linked() { - local code='#include -#if defined(_LIBCPP_VERSION) - HAVE_LIBCXX -#endif -' - local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 - [[ ${out} == *HAVE_LIBCXX* ]] -} - -pkg_pretend() { - pre_build_checks -} - -pkg_setup() { - pre_build_checks - python-any-r1_pkg_setup - - export LIBGIT2_NO_PKG_CONFIG=1 #749381 - if tc-is-cross-compiler; then - use system-llvm && die "USE=system-llvm not allowed when cross-compiling" - local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" - use "llvm_targets_${cross_llvm_target}" || \ - die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" - fi - - rust_pkg_setup - - if use system-llvm; then - llvm-r1_pkg_setup - - local llvm_config="$(get_llvm_prefix)/bin/llvm-config" - export LLVM_LINK_SHARED=1 - export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" - fi -} - -src_configure() { - if tc-is-cross-compiler; then - export PKG_CONFIG_ALLOW_CROSS=1 - export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" - export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" - export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" - fi - - filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 - - local rust_target="" rust_targets="" arch_cflags - - # Collect rust target names to compile standard libs for all ABIs. - for v in $(multilib_get_enabled_abi_pairs); do - rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" - done - if use wasm; then - rust_targets+=",\"wasm32-unknown-unknown\"" - if use system-llvm; then - # un-hardcode rust-lld linker for this target - # https://bugs.gentoo.org/715348 - sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/base/wasm.rs || die - fi - fi - rust_targets="${rust_targets#,}" - - # cargo and rustdoc are mandatory and should always be included - local tools='"cargo","rustdoc", "rust-demangler"' - use clippy && tools+=',"clippy"' - use miri && tools+=',"miri"' - use rustfmt && tools+=',"rustfmt"' - use rust-analyzer && tools+=',"rust-analyzer","rust-analyzer-proc-macro-srv"' - use rust-src && tools+=',"src"' - - local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" - # in case of prefix it will be already prefixed, as --print sysroot returns full path - [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" - - rust_target="$(rust_abi)" - rust_build="$(rust_abi "${CBUILD}")" - rust_host="$(rust_abi "${CHOST}")" - - LLVM_EXPERIMENTAL_TARGETS=() - for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do - if use llvm_targets_${_x} ; then - LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) - fi - done - LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} - - local cm_btype="$(usex debug DEBUG RELEASE)" - cat <<- _EOF_ > "${S}"/config.toml - [llvm] - download-ci-llvm = false - optimize = $(toml_usex !debug) - release-debuginfo = $(toml_usex debug) - assertions = $(toml_usex debug) - ninja = true - targets = "${LLVM_TARGETS// /;}" - experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" - link-shared = $(toml_usex system-llvm) - $(if is_libcxx_linked; then - # https://bugs.gentoo.org/732632 - echo "use-libcxx = true" - echo "static-libstdcpp = false" - fi) - $(case "${rust_target}" in - i586-*-linux-*) - # https://github.com/rust-lang/rust/issues/93059 - echo 'cflags = "-fcf-protection=none"' - echo 'cxxflags = "-fcf-protection=none"' - echo 'ldflags = "-fcf-protection=none"' - ;; - *) - ;; - esac) - enable-warnings = false - [llvm.build-config] - CMAKE_VERBOSE_MAKEFILE = "ON" - $(if ! tc-is-cross-compiler; then - # When cross-compiling, LLVM is compiled twice, once for host and - # once for target. Unfortunately, this build configuration applies - # to both, which means any flags applicable to one target but not - # the other will break. Conditionally disable respecting user - # flags when cross-compiling. - echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" - echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" - echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" - fi) - [build] - build-stage = 2 - test-stage = 2 - build = "${rust_build}" - host = ["${rust_host}"] - target = [${rust_targets}] - cargo = "${rust_stage0_root}/bin/cargo" - rustc = "${rust_stage0_root}/bin/rustc" - rustfmt = "${rust_stage0_root}/bin/rustfmt" - docs = $(toml_usex doc) - compiler-docs = false - submodules = false - python = "${EPYTHON}" - locked-deps = true - vendor = true - extended = true - tools = [${tools}] - verbose = 2 - sanitizers = false - profiler = true - cargo-native-static = false - [install] - prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" - sysconfdir = "etc" - docdir = "share/doc/rust" - bindir = "bin" - libdir = "lib" - mandir = "share/man" - [rust] - # https://github.com/rust-lang/rust/issues/54872 - codegen-units-std = 1 - optimize = true - debug = $(toml_usex debug) - debug-assertions = $(toml_usex debug) - debug-assertions-std = $(toml_usex debug) - debuginfo-level = $(usex debug 2 0) - debuginfo-level-rustc = $(usex debug 2 0) - debuginfo-level-std = $(usex debug 2 0) - debuginfo-level-tools = $(usex debug 2 0) - debuginfo-level-tests = 0 - backtrace = true - incremental = false - $(if ! tc-is-cross-compiler; then - echo "default-linker = \"$(tc-getCC)\"" - fi) - parallel-compiler = $(toml_usex parallel-compiler) - channel = "$(usex nightly nightly stable)" - description = "gentoo" - rpath = false - verbose-tests = true - optimize-tests = $(toml_usex !debug) - codegen-tests = true - dist-src = false - remap-debuginfo = true - lld = $(usex system-llvm false $(toml_usex wasm)) - # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it - # https://github.com/rust-lang/rust/issues/74976 - # https://github.com/rust-lang/rust/issues/76526 - deny-warnings = $(usex wasm $(usex doc false true) true) - backtrace-on-ice = true - jemalloc = false - # See https://github.com/rust-lang/rust/issues/121124 - lto = "$(usex lto thin off)" - [dist] - src-tarball = false - compression-formats = ["xz"] - compression-profile = "balanced" - _EOF_ - - for v in $(multilib_get_enabled_abi_pairs); do - rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) - arch_cflags="$(get_abi_CFLAGS ${v##*.})" - - export CFLAGS_${rust_target//-/_}="${arch_cflags}" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${rust_target}] - ar = "$(tc-getAR)" - cc = "$(tc-getCC)" - cxx = "$(tc-getCXX)" - linker = "$(tc-getCC)" - ranlib = "$(tc-getRANLIB)" - llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; - # but we patch it and set to false here as well - if use elibc_musl; then - cat <<- _EOF_ >> "${S}"/config.toml - crt-static = false - musl-root = "$($(tc-getCC) -print-sysroot)/usr" - _EOF_ - fi - done - if use wasm; then - wasm_target="wasm32-unknown-unknown" - export CFLAGS_${wasm_target//-/_}="$(filter-flags '-mcpu*' '-march*' '-mtune*'; echo "$CFLAGS")" - cat <<- _EOF_ >> "${S}"/config.toml - [target.wasm32-unknown-unknown] - linker = "$(usex system-llvm lld rust-lld)" - # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 - profiler = false - _EOF_ - fi - - if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below - # experimental cross support - # discussion: https://bugs.gentoo.org/679878 - # TODO: c*flags, clang, system-llvm, cargo.eclass target support - # it would be much better if we could split out stdlib - # complilation to separate ebuild and abuse CATEGORY to - # just install to /usr/lib/rustlib/ - - # extra targets defined as a bash array - # spec format: :: - # best place would be /etc/portage/env/dev-lang/rust - # Example: - # RUST_CROSS_TARGETS=( - # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" - # ) - # no extra hand holding is done, no target transformations, all - # values are passed as-is with just basic checks, so it's up to user to supply correct values - # valid rust targets can be obtained with - # rustc --print target-list - # matching cross toolchain has to be installed - # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) - # only gcc toolchains installed with crossdev are checked for now. - - # BUG: we can't pass host flags to cross compiler, so just filter for now - # BUG: this should be more fine-grained. - filter-flags '-mcpu=*' '-march=*' '-mtune=*' - - local cross_target_spec - for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do - # extracts first element form :: - local cross_llvm_target="${cross_target_spec%%:*}" - # extracts toolchain triples, : - local cross_triples="${cross_target_spec#*:}" - # extracts first element after before : separator - local cross_rust_target="${cross_triples%%:*}" - # extracts last element after : separator - local cross_toolchain="${cross_triples##*:}" - use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" - command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${cross_rust_target}] - ar = "${cross_toolchain}-ar" - cc = "${cross_toolchain}-gcc" - cxx = "${cross_toolchain}-g++" - linker = "${cross_toolchain}-gcc" - ranlib = "${cross_toolchain}-ranlib" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - if [[ "${cross_toolchain}" == *-musl* ]]; then - cat <<- _EOF_ >> "${S}"/config.toml - musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" - _EOF_ - fi - - # append cross target to "normal" target list - # example 'target = ["powerpc64le-unknown-linux-gnu"]' - # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' - - rust_targets="${rust_targets},\"${cross_rust_target}\"" - sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die - - ewarn - ewarn "Enabled ${cross_rust_target} rust target" - ewarn "Using ${cross_toolchain} cross toolchain" - ewarn - if ! has_version -b 'sys-devel/binutils[multitarget]' ; then - ewarn "'sys-devel/binutils[multitarget]' is not installed" - ewarn "'strip' will be unable to strip cross libraries" - ewarn "cross targets will be installed with full debug information" - ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" - ewarn - ewarn "Alternatively llvm-strip can be used, it supports stripping any target" - ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" - ewarn - fi - done - fi # I_KNOW_WHAT_I_AM_DOING_CROSS - - einfo "Rust configured with the following flags:" - echo - echo RUSTFLAGS="\"${RUSTFLAGS}\"" - echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" - echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" - echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" - env | grep "CARGO_TARGET_.*_RUSTFLAGS=" - env | grep "CFLAGS_.*" - echo - einfo "config.toml contents:" - cat "${S}"/config.toml || die - echo -} - -src_compile() { - RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die -} - -src_test() { - # https://rustc-dev-guide.rust-lang.org/tests/intro.html - - # those are basic and codegen tests. - local tests=( - codegen - codegen-units - compile-fail - incremental - mir-opt - pretty - run-make - ) - - # fails if llvm is not built with ALL targets. - # and known to fail with system llvm sometimes. - use system-llvm || tests+=( assembly ) - - # fragile/expensive/less important tests - # or tests that require extra builds - # TODO: instead of skipping, just make some nonfatal. - if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then - tests+=( - rustdoc - rustdoc-js - rustdoc-js-std - rustdoc-ui - run-make-fulldeps - ui - ui-fulldeps - ) - fi - - local i failed=() - einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" - for i in "${tests[@]}"; do - local t="src/test/${i}" - einfo "rust_src_test: running ${t}" - if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ - -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" - then - failed+=( "${t}" ) - eerror "rust_src_test: ${t} failed" - fi - done - - if [[ ${#failed[@]} -ne 0 ]]; then - eerror "rust_src_test: failure summary: ${failed[@]}" - die "aborting due to test failures" - fi -} - -src_install() { - DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die - - # bug #689562, #689160 - rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die - rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - rust-demangler - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use miri && symlinks+=( miri cargo-miri ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- - # need to fix eselect-rust to remove this hack. - local ver_i="${i}-${PV}" - if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then - einfo "Installing ${i} symlink" - ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die - else - ewarn "${i} symlink requested, but source file not found" - ewarn "please report this" - fi - dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" - use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" - dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" - dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" - dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" - - newenvd - "50${P}" <<-_EOF_ - LDPATH="${EPREFIX}/usr/lib/rust/lib-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" - _EOF_ - - rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-demangler - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use miri; then - echo /usr/bin/miri >> "${T}/provider-${P}" - echo /usr/bin/cargo-miri >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/lib/rust/libexec >> "${T}/provider-${P}" - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - - if use dist; then - "${EPYTHON}" ./x.py dist -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die - insinto "/usr/lib/${PN}/${PV}/dist" - doins -r "${S}/build/dist/." - fi -} - -pkg_preinst() { - # 943308 and friends; basically --keep-going can forget to unmerge old rust - # but the soft blocker allows us to install conflicting files. - # This results in duplicated .{rlib,so} files which confuses rustc and results in - # the need for manual intervention. - if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then - # we need to find all .{rlib,so} files in the old rust lib directory - # and store them in an array for later use - readarray -d '' old_rust_libs < <( - find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ - -type f \( -name '*.rlib' -o -name '*.so' \) -print0) - export old_rust_libs - if [[ ${#old_rust_libs[@]} -gt 0 ]]; then - einfo "Found old .rlib and .so files in the old rust lib directory" - else - die "Found no old .rlib and .so files but old rust version is installed. Bailing!" - fi - fi -} - -pkg_postinst() { - - local old_rust="dev-lang/rust:stable/$(ver_cut 1-2)" - if has_version -b ${old_rust}; then - # Be _extra_ careful here as we're removing files from the live filesystem - local f - local only_one_file=() - einfo "Tidying up libraries files from non-slotted \`${old_rust}\`." - for f in "${old_rust_libs[@]}"; do - [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" - local base_name="${f%-*}" - local ext="${f##*.}" - local matching_files=("${base_name}"-*.${ext}) - case ${#matching_files[@]} in - 2) - einfo "Removing old .${ext}: ${f}" - rm "${f}" || die - ;; - 1) - # Turns out fingerprints are not as unique as we'd thought, _sometimes_ they collide, - # so we may have already installed over the old file. - # We'll warn about this just in case, but it's probably fine. - only_one_file+=( "${matching_files[0]}" ) - ;; - *) - die "Expected one or two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" - ;; - esac - done - if [[ ${#only_one_file} -gt 0 ]]; then - einfo "While tidying up non-slotted rust libraries for \`${old_rust}\`," - einfo "the following file(s) did not have a duplicate where one was expected:" - for f in "${only_one_file[@]}"; do - einfo " * ${f}" - done - einfo "" - einfo "This is unlikely to cause problems; the fingerprint for the library ended up being the same." - einfo "However, if you encounter any issues please report them to the Gentoo Rust Team." - fi - fi - - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - optfeature "Emacs support" "app-emacs/rust-mode" - optfeature "Vim support" "app-vim/rust-vim" -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust/rust-1.78.0-r101.ebuild b/dev-lang/rust/rust-1.78.0-r101.ebuild new file mode 100644 index 000000000000..a2ab0b579d5f --- /dev/null +++ b/dev-lang/rust/rust-1.78.0-r101.ebuild @@ -0,0 +1,744 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 18 ) +PYTHON_COMPAT=( python3_{10..13} ) + +RUST_MAX_VER=${PV} +RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" + +inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing multilib multilib-build \ + optfeature python-any-r1 rust rust-toolchain toolchain-funcs verify-sig + +if [[ ${PV} = *beta* ]]; then + betaver=${PV//*beta} + BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" + MY_P="rustc-beta" + SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" +else + MY_P="rustc-${PV}" + SRC="${MY_P}-src.tar.xz" + KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv sparc x86" +fi + +DESCRIPTION="Systems programming language from Mozilla" +HOMEPAGE="https://www.rust-lang.org/" + +SRC_URI=" + https://static.rust-lang.org/dist/${SRC} + verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) +" +S="${WORKDIR}/${MY_P}-src" + +# keep in sync with llvm ebuild of the same version as bundled one. +ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai + LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE + WebAssembly X86 XCore Xtensa ) +ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) +LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} + +ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" +SLOT="${PV}" + +IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" + +LLVM_DEPEND=() +# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation +for _x in "${ALL_LLVM_TARGETS[@]}"; do + LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) +done +LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) +LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) + +BDEPEND="${PYTHON_DEPS} + app-eselect/eselect-rust + || ( + >=sys-devel/gcc-4.7 + >=llvm-core/clang-3.5 + ) + !system-llvm? ( + >=dev-build/cmake-3.13.4 + app-alternatives/ninja + ) + test? ( dev-debug/gdb ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +DEPEND=" + >=app-arch/xz-utils-5.2 + net-misc/curl:=[http2,ssl] + sys-libs/zlib:= + dev-libs/openssl:0= + system-llvm? ( + ${LLVM_DEPEND[*]} + llvm-libunwind? ( llvm-runtimes/libunwind:= ) + ) + !system-llvm? ( + !llvm-libunwind? ( + elibc_musl? ( sys-libs/libunwind:= ) + ) + ) +" + +RDEPEND="${DEPEND} + app-eselect/eselect-rust + dev-lang/rust-common + sys-apps/lsb-release + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" + +REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) + miri? ( nightly ) + parallel-compiler? ( nightly ) + rust-analyzer? ( rust-src ) + test? ( ${ALL_LLVM_TARGETS[*]} ) + wasm? ( llvm_targets_WebAssembly ) + x86? ( cpu_flags_x86_sse2 ) +" + +# we don't use cmake.eclass, but can get a warning +CMAKE_WARN_UNUSED_CLI=no + +QA_FLAGS_IGNORED=" + usr/lib/${PN}/${PV}/bin/.* + usr/lib/${PN}/${PV}/libexec/.* + usr/lib/${PN}/${PV}/lib/lib.*.so + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_SONAME=" + usr/lib/${PN}/${PV}/lib/lib.*.so.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_PRESTRIPPED=" + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +# causes double bootstrap +RESTRICT="test" + +VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc + +PATCHES=( + "${FILESDIR}"/1.78.0-musl-dynamic-linking.patch + "${FILESDIR}"/1.74.1-cross-compile-libz.patch + #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch # pending refresh + "${FILESDIR}"/1.78.0-ignore-broken-and-non-applicable-tests.patch + "${FILESDIR}"/1.67.0-doc-wasm.patch + "${FILESDIR}"/1.79.0-revert-8c40426.patch +) + +clear_vendor_checksums() { + sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die +} + +toml_usex() { + usex "${1}" true false +} + +pre_build_checks() { + local M=9216 + # multiply requirements by 1.3 if we are doing x86-multilib + if use amd64; then + M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) + fi + M=$(( $(usex clippy 128 0) + ${M} )) + M=$(( $(usex miri 128 0) + ${M} )) + M=$(( $(usex rustfmt 256 0) + ${M} )) + # add 2G if we compile llvm and 256M per llvm_target + if ! use system-llvm; then + M=$(( 2048 + ${M} )) + local ltarget + for ltarget in ${ALL_LLVM_TARGETS[@]}; do + M=$(( $(usex ${ltarget} 256 0) + ${M} )) + done + fi + M=$(( $(usex wasm 256 0) + ${M} )) + M=$(( $(usex debug 2 1) * ${M} )) + eshopts_push -s extglob + if is-flagq '-g?(gdb)?([1-9])'; then + M=$(( 15 * ${M} / 10 )) + fi + eshopts_pop + M=$(( $(usex doc 256 0) + ${M} )) + CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} +} + +llvm_check_deps() { + has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" +} + +# Is LLVM being linked against libc++? +is_libcxx_linked() { + local code='#include +#if defined(_LIBCPP_VERSION) + HAVE_LIBCXX +#endif +' + local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 + [[ ${out} == *HAVE_LIBCXX* ]] +} + +pkg_pretend() { + pre_build_checks +} + +pkg_setup() { + pre_build_checks + python-any-r1_pkg_setup + + export LIBGIT2_NO_PKG_CONFIG=1 #749381 + if tc-is-cross-compiler; then + use system-llvm && die "USE=system-llvm not allowed when cross-compiling" + local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" + use "llvm_targets_${cross_llvm_target}" || \ + die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" + fi + + rust_pkg_setup + + if use system-llvm; then + llvm-r1_pkg_setup + + local llvm_config="$(get_llvm_prefix)/bin/llvm-config" + export LLVM_LINK_SHARED=1 + export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" + fi +} + +src_configure() { + if tc-is-cross-compiler; then + export PKG_CONFIG_ALLOW_CROSS=1 + export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" + export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" + export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" + fi + + filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 + + local rust_target="" rust_targets="" arch_cflags + + # Collect rust target names to compile standard libs for all ABIs. + for v in $(multilib_get_enabled_abi_pairs); do + rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" + done + if use wasm; then + rust_targets+=",\"wasm32-unknown-unknown\"" + if use system-llvm; then + # un-hardcode rust-lld linker for this target + # https://bugs.gentoo.org/715348 + sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/base/wasm.rs || die + fi + fi + rust_targets="${rust_targets#,}" + + # cargo and rustdoc are mandatory and should always be included + local tools='"cargo","rustdoc", "rust-demangler"' + use clippy && tools+=',"clippy"' + use miri && tools+=',"miri"' + use rustfmt && tools+=',"rustfmt"' + use rust-analyzer && tools+=',"rust-analyzer","rust-analyzer-proc-macro-srv"' + use rust-src && tools+=',"src"' + + local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" + # in case of prefix it will be already prefixed, as --print sysroot returns full path + [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" + + rust_target="$(rust_abi)" + rust_build="$(rust_abi "${CBUILD}")" + rust_host="$(rust_abi "${CHOST}")" + + LLVM_EXPERIMENTAL_TARGETS=() + for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do + if use llvm_targets_${_x} ; then + LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) + fi + done + LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} + + local cm_btype="$(usex debug DEBUG RELEASE)" + cat <<- _EOF_ > "${S}"/config.toml + [llvm] + download-ci-llvm = false + optimize = $(toml_usex !debug) + release-debuginfo = $(toml_usex debug) + assertions = $(toml_usex debug) + ninja = true + targets = "${LLVM_TARGETS// /;}" + experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" + link-shared = $(toml_usex system-llvm) + $(if is_libcxx_linked; then + # https://bugs.gentoo.org/732632 + echo "use-libcxx = true" + echo "static-libstdcpp = false" + fi) + $(case "${rust_target}" in + i586-*-linux-*) + # https://github.com/rust-lang/rust/issues/93059 + echo 'cflags = "-fcf-protection=none"' + echo 'cxxflags = "-fcf-protection=none"' + echo 'ldflags = "-fcf-protection=none"' + ;; + *) + ;; + esac) + enable-warnings = false + [llvm.build-config] + CMAKE_VERBOSE_MAKEFILE = "ON" + $(if ! tc-is-cross-compiler; then + # When cross-compiling, LLVM is compiled twice, once for host and + # once for target. Unfortunately, this build configuration applies + # to both, which means any flags applicable to one target but not + # the other will break. Conditionally disable respecting user + # flags when cross-compiling. + echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" + echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" + echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" + fi) + [build] + build-stage = 2 + test-stage = 2 + build = "${rust_build}" + host = ["${rust_host}"] + target = [${rust_targets}] + cargo = "${rust_stage0_root}/bin/cargo" + rustc = "${rust_stage0_root}/bin/rustc" + rustfmt = "${rust_stage0_root}/bin/rustfmt" + docs = $(toml_usex doc) + compiler-docs = false + submodules = false + python = "${EPYTHON}" + locked-deps = true + vendor = true + extended = true + tools = [${tools}] + verbose = 2 + sanitizers = false + profiler = true + cargo-native-static = false + [install] + prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" + sysconfdir = "etc" + docdir = "share/doc/rust" + bindir = "bin" + libdir = "lib" + mandir = "share/man" + [rust] + # https://github.com/rust-lang/rust/issues/54872 + codegen-units-std = 1 + optimize = true + debug = $(toml_usex debug) + debug-assertions = $(toml_usex debug) + debug-assertions-std = $(toml_usex debug) + debuginfo-level = $(usex debug 2 0) + debuginfo-level-rustc = $(usex debug 2 0) + debuginfo-level-std = $(usex debug 2 0) + debuginfo-level-tools = $(usex debug 2 0) + debuginfo-level-tests = 0 + backtrace = true + incremental = false + $(if ! tc-is-cross-compiler; then + echo "default-linker = \"$(tc-getCC)\"" + fi) + parallel-compiler = $(toml_usex parallel-compiler) + channel = "$(usex nightly nightly stable)" + description = "gentoo" + rpath = true + verbose-tests = true + optimize-tests = $(toml_usex !debug) + codegen-tests = true + dist-src = false + remap-debuginfo = true + lld = $(usex system-llvm false $(toml_usex wasm)) + # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it + # https://github.com/rust-lang/rust/issues/74976 + # https://github.com/rust-lang/rust/issues/76526 + deny-warnings = $(usex wasm $(usex doc false true) true) + backtrace-on-ice = true + jemalloc = false + # See https://github.com/rust-lang/rust/issues/121124 + lto = "$(usex lto thin off)" + [dist] + src-tarball = false + compression-formats = ["xz"] + compression-profile = "balanced" + _EOF_ + + for v in $(multilib_get_enabled_abi_pairs); do + rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) + arch_cflags="$(get_abi_CFLAGS ${v##*.})" + + export CFLAGS_${rust_target//-/_}="${arch_cflags}" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${rust_target}] + ar = "$(tc-getAR)" + cc = "$(tc-getCC)" + cxx = "$(tc-getCXX)" + linker = "$(tc-getCC)" + ranlib = "$(tc-getRANLIB)" + llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; + # but we patch it and set to false here as well + if use elibc_musl; then + cat <<- _EOF_ >> "${S}"/config.toml + crt-static = false + musl-root = "$($(tc-getCC) -print-sysroot)/usr" + _EOF_ + fi + done + if use wasm; then + wasm_target="wasm32-unknown-unknown" + export CFLAGS_${wasm_target//-/_}="$(filter-flags '-mcpu*' '-march*' '-mtune*'; echo "$CFLAGS")" + cat <<- _EOF_ >> "${S}"/config.toml + [target.wasm32-unknown-unknown] + linker = "$(usex system-llvm lld rust-lld)" + # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 + profiler = false + _EOF_ + fi + + if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below + # experimental cross support + # discussion: https://bugs.gentoo.org/679878 + # TODO: c*flags, clang, system-llvm, cargo.eclass target support + # it would be much better if we could split out stdlib + # complilation to separate ebuild and abuse CATEGORY to + # just install to /usr/lib/rustlib/ + + # extra targets defined as a bash array + # spec format: :: + # best place would be /etc/portage/env/dev-lang/rust + # Example: + # RUST_CROSS_TARGETS=( + # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" + # ) + # no extra hand holding is done, no target transformations, all + # values are passed as-is with just basic checks, so it's up to user to supply correct values + # valid rust targets can be obtained with + # rustc --print target-list + # matching cross toolchain has to be installed + # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) + # only gcc toolchains installed with crossdev are checked for now. + + # BUG: we can't pass host flags to cross compiler, so just filter for now + # BUG: this should be more fine-grained. + filter-flags '-mcpu=*' '-march=*' '-mtune=*' + + local cross_target_spec + for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do + # extracts first element form :: + local cross_llvm_target="${cross_target_spec%%:*}" + # extracts toolchain triples, : + local cross_triples="${cross_target_spec#*:}" + # extracts first element after before : separator + local cross_rust_target="${cross_triples%%:*}" + # extracts last element after : separator + local cross_toolchain="${cross_triples##*:}" + use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" + command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${cross_rust_target}] + ar = "${cross_toolchain}-ar" + cc = "${cross_toolchain}-gcc" + cxx = "${cross_toolchain}-g++" + linker = "${cross_toolchain}-gcc" + ranlib = "${cross_toolchain}-ranlib" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + if [[ "${cross_toolchain}" == *-musl* ]]; then + cat <<- _EOF_ >> "${S}"/config.toml + musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" + _EOF_ + fi + + # append cross target to "normal" target list + # example 'target = ["powerpc64le-unknown-linux-gnu"]' + # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' + + rust_targets="${rust_targets},\"${cross_rust_target}\"" + sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die + + ewarn + ewarn "Enabled ${cross_rust_target} rust target" + ewarn "Using ${cross_toolchain} cross toolchain" + ewarn + if ! has_version -b 'sys-devel/binutils[multitarget]' ; then + ewarn "'sys-devel/binutils[multitarget]' is not installed" + ewarn "'strip' will be unable to strip cross libraries" + ewarn "cross targets will be installed with full debug information" + ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" + ewarn + ewarn "Alternatively llvm-strip can be used, it supports stripping any target" + ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" + ewarn + fi + done + fi # I_KNOW_WHAT_I_AM_DOING_CROSS + + einfo "Rust configured with the following flags:" + echo + echo RUSTFLAGS="\"${RUSTFLAGS}\"" + echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" + echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" + echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" + env | grep "CARGO_TARGET_.*_RUSTFLAGS=" + env | grep "CFLAGS_.*" + echo + einfo "config.toml contents:" + cat "${S}"/config.toml || die + echo +} + +src_compile() { + RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die +} + +src_test() { + # https://rustc-dev-guide.rust-lang.org/tests/intro.html + + # those are basic and codegen tests. + local tests=( + codegen + codegen-units + compile-fail + incremental + mir-opt + pretty + run-make + ) + + # fails if llvm is not built with ALL targets. + # and known to fail with system llvm sometimes. + use system-llvm || tests+=( assembly ) + + # fragile/expensive/less important tests + # or tests that require extra builds + # TODO: instead of skipping, just make some nonfatal. + if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then + tests+=( + rustdoc + rustdoc-js + rustdoc-js-std + rustdoc-ui + run-make-fulldeps + ui + ui-fulldeps + ) + fi + + local i failed=() + einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" + for i in "${tests[@]}"; do + local t="src/test/${i}" + einfo "rust_src_test: running ${t}" + if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ + -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" + then + failed+=( "${t}" ) + eerror "rust_src_test: ${t} failed" + fi + done + + if [[ ${#failed[@]} -ne 0 ]]; then + eerror "rust_src_test: failure summary: ${failed[@]}" + die "aborting due to test failures" + fi +} + +src_install() { + DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die + + # bug #689562, #689160 + rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die + rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die + + local symlinks=( + cargo + rustc + rustdoc + rust-gdb + rust-gdbgui + rust-lldb + rust-demangler + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use miri && symlinks+=( miri cargo-miri ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- + # need to fix eselect-rust to remove this hack. + local ver_i="${i}-${PV}" + if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then + einfo "Installing ${i} symlink" + ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die + else + ewarn "${i} symlink requested, but source file not found" + ewarn "please report this" + fi + dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" + use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" + dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" + dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" + dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" + + newenvd - "50${P}" <<-_EOF_ + MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" + _EOF_ + + rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-demangler + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use miri; then + echo /usr/bin/miri >> "${T}/provider-${P}" + echo /usr/bin/cargo-miri >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/lib/rust/libexec >> "${T}/provider-${P}" + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + + if use dist; then + "${EPYTHON}" ./x.py dist -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die + insinto "/usr/lib/${PN}/${PV}/dist" + doins -r "${S}/build/dist/." + fi +} + +pkg_preinst() { + # 943308 and friends; basically --keep-going can forget to unmerge old rust + # but the soft blocker allows us to install conflicting files. + # This results in duplicated .{rlib,so} files which confuses rustc and results in + # the need for manual intervention. + if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then + # we need to find all .{rlib,so} files in the old rust lib directory + # and store them in an array for later use + readarray -d '' old_rust_libs < <( + find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ + -type f \( -name '*.rlib' -o -name '*.so' \) -print0) + export old_rust_libs + if [[ ${#old_rust_libs[@]} -gt 0 ]]; then + einfo "Found old .rlib and .so files in the old rust lib directory" + else + die "Found no old .rlib and .so files but old rust version is installed. Bailing!" + fi + fi +} + +pkg_postinst() { + + local old_rust="dev-lang/rust:stable/$(ver_cut 1-2)" + if has_version -b ${old_rust}; then + # Be _extra_ careful here as we're removing files from the live filesystem + local f + local only_one_file=() + einfo "Tidying up libraries files from non-slotted \`${old_rust}\`." + for f in "${old_rust_libs[@]}"; do + [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" + local base_name="${f%-*}" + local ext="${f##*.}" + local matching_files=("${base_name}"-*.${ext}) + case ${#matching_files[@]} in + 2) + einfo "Removing old .${ext}: ${f}" + rm "${f}" || die + ;; + 1) + # Turns out fingerprints are not as unique as we'd thought, _sometimes_ they collide, + # so we may have already installed over the old file. + # We'll warn about this just in case, but it's probably fine. + only_one_file+=( "${matching_files[0]}" ) + ;; + *) + die "Expected one or two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" + ;; + esac + done + if [[ ${#only_one_file} -gt 0 ]]; then + einfo "While tidying up non-slotted rust libraries for \`${old_rust}\`," + einfo "the following file(s) did not have a duplicate where one was expected:" + for f in "${only_one_file[@]}"; do + einfo " * ${f}" + done + einfo "" + einfo "This is unlikely to cause problems; the fingerprint for the library ended up being the same." + einfo "However, if you encounter any issues please report them to the Gentoo Rust Team." + fi + fi + + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + optfeature "Emacs support" "app-emacs/rust-mode" + optfeature "Vim support" "app-vim/rust-vim" +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust/rust-1.79.0-r100.ebuild b/dev-lang/rust/rust-1.79.0-r100.ebuild deleted file mode 100644 index 19a64890ab0b..000000000000 --- a/dev-lang/rust/rust-1.79.0-r100.ebuild +++ /dev/null @@ -1,745 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 18 ) -PYTHON_COMPAT=( python3_{10..13} ) - -RUST_MAX_VER=${PV} -RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" - -inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing multilib multilib-build \ - optfeature python-any-r1 rust rust-toolchain toolchain-funcs verify-sig - -if [[ ${PV} = *beta* ]]; then - betaver=${PV//*beta} - BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" - MY_P="rustc-beta" - SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" -else - MY_P="rustc-${PV}" - SRC="${MY_P}-src.tar.xz" - KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv sparc x86" -fi - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" - -SRC_URI=" - https://static.rust-lang.org/dist/${SRC} - verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) -" -S="${WORKDIR}/${MY_P}-src" - -# keep in sync with llvm ebuild of the same version as bundled one. -ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai - LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE - WebAssembly X86 XCore Xtensa ) -ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) -LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} - -ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" - -IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" - -LLVM_DEPEND=() -# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation -for _x in "${ALL_LLVM_TARGETS[@]}"; do - LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) -done -LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) -LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) - -BDEPEND="${PYTHON_DEPS} - app-eselect/eselect-rust - || ( - >=sys-devel/gcc-4.7 - >=llvm-core/clang-3.5 - ) - !system-llvm? ( - >=dev-build/cmake-3.13.4 - app-alternatives/ninja - ) - test? ( dev-debug/gdb ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -DEPEND=" - >=app-arch/xz-utils-5.2 - net-misc/curl:=[http2,ssl] - sys-libs/zlib:= - dev-libs/openssl:0= - system-llvm? ( - ${LLVM_DEPEND[*]} - llvm-libunwind? ( llvm-runtimes/libunwind:= ) - ) - !system-llvm? ( - !llvm-libunwind? ( - elibc_musl? ( sys-libs/libunwind:= ) - ) - ) -" - -RDEPEND="${DEPEND} - app-eselect/eselect-rust - dev-lang/rust-common - sys-apps/lsb-release - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" - -REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) - miri? ( nightly ) - parallel-compiler? ( nightly ) - rust-analyzer? ( rust-src ) - test? ( ${ALL_LLVM_TARGETS[*]} ) - wasm? ( llvm_targets_WebAssembly ) - x86? ( cpu_flags_x86_sse2 ) -" - -# we don't use cmake.eclass, but can get a warning -CMAKE_WARN_UNUSED_CLI=no - -QA_FLAGS_IGNORED=" - usr/lib/${PN}/${PV}/bin/.* - usr/lib/${PN}/${PV}/libexec/.* - usr/lib/${PN}/${PV}/lib/lib.*.so - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_SONAME=" - usr/lib/${PN}/${PV}/lib/lib.*.so.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_PRESTRIPPED=" - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -# causes double bootstrap -RESTRICT="test" - -VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc - -PATCHES=( - "${FILESDIR}"/1.78.0-musl-dynamic-linking.patch - "${FILESDIR}"/1.74.1-cross-compile-libz.patch - #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch # pending refresh - "${FILESDIR}"/1.78.0-ignore-broken-and-non-applicable-tests.patch - "${FILESDIR}"/1.67.0-doc-wasm.patch - "${FILESDIR}"/1.79.0-revert-8c40426.patch -) - -clear_vendor_checksums() { - sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die -} - -toml_usex() { - usex "${1}" true false -} - -pre_build_checks() { - local M=9216 - # multiply requirements by 1.3 if we are doing x86-multilib - if use amd64; then - M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) - fi - M=$(( $(usex clippy 128 0) + ${M} )) - M=$(( $(usex miri 128 0) + ${M} )) - M=$(( $(usex rustfmt 256 0) + ${M} )) - # add 2G if we compile llvm and 256M per llvm_target - if ! use system-llvm; then - M=$(( 2048 + ${M} )) - local ltarget - for ltarget in ${ALL_LLVM_TARGETS[@]}; do - M=$(( $(usex ${ltarget} 256 0) + ${M} )) - done - fi - M=$(( $(usex wasm 256 0) + ${M} )) - M=$(( $(usex debug 2 1) * ${M} )) - eshopts_push -s extglob - if is-flagq '-g?(gdb)?([1-9])'; then - M=$(( 15 * ${M} / 10 )) - fi - eshopts_pop - M=$(( $(usex doc 256 0) + ${M} )) - CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} -} - -llvm_check_deps() { - has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" -} - -# Is LLVM being linked against libc++? -is_libcxx_linked() { - local code='#include -#if defined(_LIBCPP_VERSION) - HAVE_LIBCXX -#endif -' - local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 - [[ ${out} == *HAVE_LIBCXX* ]] -} - -pkg_pretend() { - pre_build_checks -} - -pkg_setup() { - pre_build_checks - python-any-r1_pkg_setup - - export LIBGIT2_NO_PKG_CONFIG=1 #749381 - if tc-is-cross-compiler; then - use system-llvm && die "USE=system-llvm not allowed when cross-compiling" - local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" - use "llvm_targets_${cross_llvm_target}" || \ - die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" - fi - - rust_pkg_setup - - if use system-llvm; then - llvm-r1_pkg_setup - - local llvm_config="$(get_llvm_prefix)/bin/llvm-config" - export LLVM_LINK_SHARED=1 - export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" - fi -} - -src_configure() { - if tc-is-cross-compiler; then - export PKG_CONFIG_ALLOW_CROSS=1 - export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" - export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" - export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" - fi - - filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 - - local rust_target="" rust_targets="" arch_cflags - - # Collect rust target names to compile standard libs for all ABIs. - for v in $(multilib_get_enabled_abi_pairs); do - rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" - done - if use wasm; then - rust_targets+=",\"wasm32-unknown-unknown\"" - if use system-llvm; then - # un-hardcode rust-lld linker for this target - # https://bugs.gentoo.org/715348 - sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/base/wasm.rs || die - fi - fi - rust_targets="${rust_targets#,}" - - # cargo and rustdoc are mandatory and should always be included - local tools='"cargo","rustdoc", "rust-demangler"' - use clippy && tools+=',"clippy"' - use miri && tools+=',"miri"' - use rustfmt && tools+=',"rustfmt"' - use rust-analyzer && tools+=',"rust-analyzer","rust-analyzer-proc-macro-srv"' - use rust-src && tools+=',"src"' - - local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" - # in case of prefix it will be already prefixed, as --print sysroot returns full path - [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" - - rust_target="$(rust_abi)" - rust_build="$(rust_abi "${CBUILD}")" - rust_host="$(rust_abi "${CHOST}")" - - LLVM_EXPERIMENTAL_TARGETS=() - for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do - if use llvm_targets_${_x} ; then - LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) - fi - done - LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} - - local cm_btype="$(usex debug DEBUG RELEASE)" - cat <<- _EOF_ > "${S}"/config.toml - [llvm] - download-ci-llvm = false - optimize = $(toml_usex !debug) - release-debuginfo = $(toml_usex debug) - assertions = $(toml_usex debug) - ninja = true - targets = "${LLVM_TARGETS// /;}" - experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" - link-shared = $(toml_usex system-llvm) - $(if is_libcxx_linked; then - # https://bugs.gentoo.org/732632 - echo "use-libcxx = true" - echo "static-libstdcpp = false" - fi) - $(case "${rust_target}" in - i586-*-linux-*) - # https://github.com/rust-lang/rust/issues/93059 - echo 'cflags = "-fcf-protection=none"' - echo 'cxxflags = "-fcf-protection=none"' - echo 'ldflags = "-fcf-protection=none"' - ;; - *) - ;; - esac) - enable-warnings = false - [llvm.build-config] - CMAKE_VERBOSE_MAKEFILE = "ON" - $(if ! tc-is-cross-compiler; then - # When cross-compiling, LLVM is compiled twice, once for host and - # once for target. Unfortunately, this build configuration applies - # to both, which means any flags applicable to one target but not - # the other will break. Conditionally disable respecting user - # flags when cross-compiling. - echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" - echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" - echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" - fi) - [build] - build-stage = 2 - test-stage = 2 - build = "${rust_build}" - host = ["${rust_host}"] - target = [${rust_targets}] - cargo = "${rust_stage0_root}/bin/cargo" - rustc = "${rust_stage0_root}/bin/rustc" - rustfmt = "${rust_stage0_root}/bin/rustfmt" - docs = $(toml_usex doc) - compiler-docs = false - submodules = false - python = "${EPYTHON}" - locked-deps = true - vendor = true - extended = true - tools = [${tools}] - verbose = 2 - sanitizers = false - profiler = true - cargo-native-static = false - [install] - prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" - sysconfdir = "etc" - docdir = "share/doc/rust" - bindir = "bin" - libdir = "lib" - mandir = "share/man" - [rust] - # https://github.com/rust-lang/rust/issues/54872 - codegen-units-std = 1 - optimize = true - debug = $(toml_usex debug) - debug-assertions = $(toml_usex debug) - debug-assertions-std = $(toml_usex debug) - debuginfo-level = $(usex debug 2 0) - debuginfo-level-rustc = $(usex debug 2 0) - debuginfo-level-std = $(usex debug 2 0) - debuginfo-level-tools = $(usex debug 2 0) - debuginfo-level-tests = 0 - backtrace = true - incremental = false - $(if ! tc-is-cross-compiler; then - echo "default-linker = \"$(tc-getCC)\"" - fi) - parallel-compiler = $(toml_usex parallel-compiler) - channel = "$(usex nightly nightly stable)" - description = "gentoo" - rpath = false - verbose-tests = true - optimize-tests = $(toml_usex !debug) - codegen-tests = true - dist-src = false - remap-debuginfo = true - lld = $(usex system-llvm false $(toml_usex wasm)) - # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it - # https://github.com/rust-lang/rust/issues/74976 - # https://github.com/rust-lang/rust/issues/76526 - deny-warnings = $(usex wasm $(usex doc false true) true) - backtrace-on-ice = true - jemalloc = false - # See https://github.com/rust-lang/rust/issues/121124 - lto = "$(usex lto thin off)" - [dist] - src-tarball = false - compression-formats = ["xz"] - compression-profile = "balanced" - _EOF_ - - for v in $(multilib_get_enabled_abi_pairs); do - rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) - arch_cflags="$(get_abi_CFLAGS ${v##*.})" - - export CFLAGS_${rust_target//-/_}="${arch_cflags}" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${rust_target}] - ar = "$(tc-getAR)" - cc = "$(tc-getCC)" - cxx = "$(tc-getCXX)" - linker = "$(tc-getCC)" - ranlib = "$(tc-getRANLIB)" - llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; - # but we patch it and set to false here as well - if use elibc_musl; then - cat <<- _EOF_ >> "${S}"/config.toml - crt-static = false - musl-root = "$($(tc-getCC) -print-sysroot)/usr" - _EOF_ - fi - done - if use wasm; then - wasm_target="wasm32-unknown-unknown" - export CFLAGS_${wasm_target//-/_}="$(filter-flags '-mcpu*' '-march*' '-mtune*'; echo "$CFLAGS")" - cat <<- _EOF_ >> "${S}"/config.toml - [target.wasm32-unknown-unknown] - linker = "$(usex system-llvm lld rust-lld)" - # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 - profiler = false - _EOF_ - fi - - if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below - # experimental cross support - # discussion: https://bugs.gentoo.org/679878 - # TODO: c*flags, clang, system-llvm, cargo.eclass target support - # it would be much better if we could split out stdlib - # complilation to separate ebuild and abuse CATEGORY to - # just install to /usr/lib/rustlib/ - - # extra targets defined as a bash array - # spec format: :: - # best place would be /etc/portage/env/dev-lang/rust - # Example: - # RUST_CROSS_TARGETS=( - # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" - # ) - # no extra hand holding is done, no target transformations, all - # values are passed as-is with just basic checks, so it's up to user to supply correct values - # valid rust targets can be obtained with - # rustc --print target-list - # matching cross toolchain has to be installed - # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) - # only gcc toolchains installed with crossdev are checked for now. - - # BUG: we can't pass host flags to cross compiler, so just filter for now - # BUG: this should be more fine-grained. - filter-flags '-mcpu=*' '-march=*' '-mtune=*' - - local cross_target_spec - for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do - # extracts first element form :: - local cross_llvm_target="${cross_target_spec%%:*}" - # extracts toolchain triples, : - local cross_triples="${cross_target_spec#*:}" - # extracts first element after before : separator - local cross_rust_target="${cross_triples%%:*}" - # extracts last element after : separator - local cross_toolchain="${cross_triples##*:}" - use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" - command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${cross_rust_target}] - ar = "${cross_toolchain}-ar" - cc = "${cross_toolchain}-gcc" - cxx = "${cross_toolchain}-g++" - linker = "${cross_toolchain}-gcc" - ranlib = "${cross_toolchain}-ranlib" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - if [[ "${cross_toolchain}" == *-musl* ]]; then - cat <<- _EOF_ >> "${S}"/config.toml - musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" - _EOF_ - fi - - # append cross target to "normal" target list - # example 'target = ["powerpc64le-unknown-linux-gnu"]' - # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' - - rust_targets="${rust_targets},\"${cross_rust_target}\"" - sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die - - ewarn - ewarn "Enabled ${cross_rust_target} rust target" - ewarn "Using ${cross_toolchain} cross toolchain" - ewarn - if ! has_version -b 'sys-devel/binutils[multitarget]' ; then - ewarn "'sys-devel/binutils[multitarget]' is not installed" - ewarn "'strip' will be unable to strip cross libraries" - ewarn "cross targets will be installed with full debug information" - ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" - ewarn - ewarn "Alternatively llvm-strip can be used, it supports stripping any target" - ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" - ewarn - fi - done - fi # I_KNOW_WHAT_I_AM_DOING_CROSS - - einfo "Rust configured with the following flags:" - echo - echo RUSTFLAGS="\"${RUSTFLAGS}\"" - echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" - echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" - echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" - env | grep "CARGO_TARGET_.*_RUSTFLAGS=" - env | grep "CFLAGS_.*" - echo - einfo "config.toml contents:" - cat "${S}"/config.toml || die - echo -} - -src_compile() { - RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die -} - -src_test() { - # https://rustc-dev-guide.rust-lang.org/tests/intro.html - - # those are basic and codegen tests. - local tests=( - codegen - codegen-units - compile-fail - incremental - mir-opt - pretty - run-make - ) - - # fails if llvm is not built with ALL targets. - # and known to fail with system llvm sometimes. - use system-llvm || tests+=( assembly ) - - # fragile/expensive/less important tests - # or tests that require extra builds - # TODO: instead of skipping, just make some nonfatal. - if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then - tests+=( - rustdoc - rustdoc-js - rustdoc-js-std - rustdoc-ui - run-make-fulldeps - ui - ui-fulldeps - ) - fi - - local i failed=() - einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" - for i in "${tests[@]}"; do - local t="src/test/${i}" - einfo "rust_src_test: running ${t}" - if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ - -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" - then - failed+=( "${t}" ) - eerror "rust_src_test: ${t} failed" - fi - done - - if [[ ${#failed[@]} -ne 0 ]]; then - eerror "rust_src_test: failure summary: ${failed[@]}" - die "aborting due to test failures" - fi -} - -src_install() { - DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die - - # bug #689562, #689160 - rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die - rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - rust-demangler - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use miri && symlinks+=( miri cargo-miri ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- - # need to fix eselect-rust to remove this hack. - local ver_i="${i}-${PV}" - if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then - einfo "Installing ${i} symlink" - ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die - else - ewarn "${i} symlink requested, but source file not found" - ewarn "please report this" - fi - dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" - use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" - dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" - dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" - dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" - - newenvd - "50${P}" <<-_EOF_ - LDPATH="${EPREFIX}/usr/lib/rust/lib-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" - _EOF_ - - rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-demangler - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use miri; then - echo /usr/bin/miri >> "${T}/provider-${P}" - echo /usr/bin/cargo-miri >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/lib/rust/libexec >> "${T}/provider-${P}" - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - - if use dist; then - "${EPYTHON}" ./x.py dist -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die - insinto "/usr/lib/${PN}/${PV}/dist" - doins -r "${S}/build/dist/." - fi -} - -pkg_preinst() { - # 943308 and friends; basically --keep-going can forget to unmerge old rust - # but the soft blocker allows us to install conflicting files. - # This results in duplicated .{rlib,so} files which confuses rustc and results in - # the need for manual intervention. - if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then - # we need to find all .{rlib,so} files in the old rust lib directory - # and store them in an array for later use - readarray -d '' old_rust_libs < <( - find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ - -type f \( -name '*.rlib' -o -name '*.so' \) -print0) - export old_rust_libs - if [[ ${#old_rust_libs[@]} -gt 0 ]]; then - einfo "Found old .rlib and .so files in the old rust lib directory" - else - die "Found no old .rlib and .so files but old rust version is installed. Bailing!" - fi - fi -} - -pkg_postinst() { - - local old_rust="dev-lang/rust:stable/$(ver_cut 1-2)" - if has_version -b ${old_rust}; then - # Be _extra_ careful here as we're removing files from the live filesystem - local f - local only_one_file=() - einfo "Tidying up libraries files from non-slotted \`${old_rust}\`." - for f in "${old_rust_libs[@]}"; do - [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" - local base_name="${f%-*}" - local ext="${f##*.}" - local matching_files=("${base_name}"-*.${ext}) - case ${#matching_files[@]} in - 2) - einfo "Removing old .${ext}: ${f}" - rm "${f}" || die - ;; - 1) - # Turns out fingerprints are not as unique as we'd thought, _sometimes_ they collide, - # so we may have already installed over the old file. - # We'll warn about this just in case, but it's probably fine. - only_one_file+=( "${matching_files[0]}" ) - ;; - *) - die "Expected one or two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" - ;; - esac - done - if [[ ${#only_one_file} -gt 0 ]]; then - einfo "While tidying up non-slotted rust libraries for \`${old_rust}\`," - einfo "the following file(s) did not have a duplicate where one was expected:" - for f in "${only_one_file[@]}"; do - einfo " * ${f}" - done - einfo "" - einfo "This is unlikely to cause problems; the fingerprint for the library ended up being the same." - einfo "However, if you encounter any issues please report them to the Gentoo Rust Team." - fi - fi - - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - optfeature "Emacs support" "app-emacs/rust-mode" - optfeature "Vim support" "app-vim/rust-vim" -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust/rust-1.79.0-r101.ebuild b/dev-lang/rust/rust-1.79.0-r101.ebuild new file mode 100644 index 000000000000..a2ab0b579d5f --- /dev/null +++ b/dev-lang/rust/rust-1.79.0-r101.ebuild @@ -0,0 +1,744 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 18 ) +PYTHON_COMPAT=( python3_{10..13} ) + +RUST_MAX_VER=${PV} +RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" + +inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing multilib multilib-build \ + optfeature python-any-r1 rust rust-toolchain toolchain-funcs verify-sig + +if [[ ${PV} = *beta* ]]; then + betaver=${PV//*beta} + BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" + MY_P="rustc-beta" + SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" +else + MY_P="rustc-${PV}" + SRC="${MY_P}-src.tar.xz" + KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv sparc x86" +fi + +DESCRIPTION="Systems programming language from Mozilla" +HOMEPAGE="https://www.rust-lang.org/" + +SRC_URI=" + https://static.rust-lang.org/dist/${SRC} + verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) +" +S="${WORKDIR}/${MY_P}-src" + +# keep in sync with llvm ebuild of the same version as bundled one. +ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai + LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE + WebAssembly X86 XCore Xtensa ) +ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) +LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} + +ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" +SLOT="${PV}" + +IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" + +LLVM_DEPEND=() +# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation +for _x in "${ALL_LLVM_TARGETS[@]}"; do + LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) +done +LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) +LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) + +BDEPEND="${PYTHON_DEPS} + app-eselect/eselect-rust + || ( + >=sys-devel/gcc-4.7 + >=llvm-core/clang-3.5 + ) + !system-llvm? ( + >=dev-build/cmake-3.13.4 + app-alternatives/ninja + ) + test? ( dev-debug/gdb ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +DEPEND=" + >=app-arch/xz-utils-5.2 + net-misc/curl:=[http2,ssl] + sys-libs/zlib:= + dev-libs/openssl:0= + system-llvm? ( + ${LLVM_DEPEND[*]} + llvm-libunwind? ( llvm-runtimes/libunwind:= ) + ) + !system-llvm? ( + !llvm-libunwind? ( + elibc_musl? ( sys-libs/libunwind:= ) + ) + ) +" + +RDEPEND="${DEPEND} + app-eselect/eselect-rust + dev-lang/rust-common + sys-apps/lsb-release + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" + +REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) + miri? ( nightly ) + parallel-compiler? ( nightly ) + rust-analyzer? ( rust-src ) + test? ( ${ALL_LLVM_TARGETS[*]} ) + wasm? ( llvm_targets_WebAssembly ) + x86? ( cpu_flags_x86_sse2 ) +" + +# we don't use cmake.eclass, but can get a warning +CMAKE_WARN_UNUSED_CLI=no + +QA_FLAGS_IGNORED=" + usr/lib/${PN}/${PV}/bin/.* + usr/lib/${PN}/${PV}/libexec/.* + usr/lib/${PN}/${PV}/lib/lib.*.so + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_SONAME=" + usr/lib/${PN}/${PV}/lib/lib.*.so.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_PRESTRIPPED=" + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +# causes double bootstrap +RESTRICT="test" + +VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc + +PATCHES=( + "${FILESDIR}"/1.78.0-musl-dynamic-linking.patch + "${FILESDIR}"/1.74.1-cross-compile-libz.patch + #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch # pending refresh + "${FILESDIR}"/1.78.0-ignore-broken-and-non-applicable-tests.patch + "${FILESDIR}"/1.67.0-doc-wasm.patch + "${FILESDIR}"/1.79.0-revert-8c40426.patch +) + +clear_vendor_checksums() { + sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die +} + +toml_usex() { + usex "${1}" true false +} + +pre_build_checks() { + local M=9216 + # multiply requirements by 1.3 if we are doing x86-multilib + if use amd64; then + M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) + fi + M=$(( $(usex clippy 128 0) + ${M} )) + M=$(( $(usex miri 128 0) + ${M} )) + M=$(( $(usex rustfmt 256 0) + ${M} )) + # add 2G if we compile llvm and 256M per llvm_target + if ! use system-llvm; then + M=$(( 2048 + ${M} )) + local ltarget + for ltarget in ${ALL_LLVM_TARGETS[@]}; do + M=$(( $(usex ${ltarget} 256 0) + ${M} )) + done + fi + M=$(( $(usex wasm 256 0) + ${M} )) + M=$(( $(usex debug 2 1) * ${M} )) + eshopts_push -s extglob + if is-flagq '-g?(gdb)?([1-9])'; then + M=$(( 15 * ${M} / 10 )) + fi + eshopts_pop + M=$(( $(usex doc 256 0) + ${M} )) + CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} +} + +llvm_check_deps() { + has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" +} + +# Is LLVM being linked against libc++? +is_libcxx_linked() { + local code='#include +#if defined(_LIBCPP_VERSION) + HAVE_LIBCXX +#endif +' + local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 + [[ ${out} == *HAVE_LIBCXX* ]] +} + +pkg_pretend() { + pre_build_checks +} + +pkg_setup() { + pre_build_checks + python-any-r1_pkg_setup + + export LIBGIT2_NO_PKG_CONFIG=1 #749381 + if tc-is-cross-compiler; then + use system-llvm && die "USE=system-llvm not allowed when cross-compiling" + local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" + use "llvm_targets_${cross_llvm_target}" || \ + die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" + fi + + rust_pkg_setup + + if use system-llvm; then + llvm-r1_pkg_setup + + local llvm_config="$(get_llvm_prefix)/bin/llvm-config" + export LLVM_LINK_SHARED=1 + export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" + fi +} + +src_configure() { + if tc-is-cross-compiler; then + export PKG_CONFIG_ALLOW_CROSS=1 + export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" + export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" + export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" + fi + + filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 + + local rust_target="" rust_targets="" arch_cflags + + # Collect rust target names to compile standard libs for all ABIs. + for v in $(multilib_get_enabled_abi_pairs); do + rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" + done + if use wasm; then + rust_targets+=",\"wasm32-unknown-unknown\"" + if use system-llvm; then + # un-hardcode rust-lld linker for this target + # https://bugs.gentoo.org/715348 + sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/base/wasm.rs || die + fi + fi + rust_targets="${rust_targets#,}" + + # cargo and rustdoc are mandatory and should always be included + local tools='"cargo","rustdoc", "rust-demangler"' + use clippy && tools+=',"clippy"' + use miri && tools+=',"miri"' + use rustfmt && tools+=',"rustfmt"' + use rust-analyzer && tools+=',"rust-analyzer","rust-analyzer-proc-macro-srv"' + use rust-src && tools+=',"src"' + + local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" + # in case of prefix it will be already prefixed, as --print sysroot returns full path + [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" + + rust_target="$(rust_abi)" + rust_build="$(rust_abi "${CBUILD}")" + rust_host="$(rust_abi "${CHOST}")" + + LLVM_EXPERIMENTAL_TARGETS=() + for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do + if use llvm_targets_${_x} ; then + LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) + fi + done + LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} + + local cm_btype="$(usex debug DEBUG RELEASE)" + cat <<- _EOF_ > "${S}"/config.toml + [llvm] + download-ci-llvm = false + optimize = $(toml_usex !debug) + release-debuginfo = $(toml_usex debug) + assertions = $(toml_usex debug) + ninja = true + targets = "${LLVM_TARGETS// /;}" + experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" + link-shared = $(toml_usex system-llvm) + $(if is_libcxx_linked; then + # https://bugs.gentoo.org/732632 + echo "use-libcxx = true" + echo "static-libstdcpp = false" + fi) + $(case "${rust_target}" in + i586-*-linux-*) + # https://github.com/rust-lang/rust/issues/93059 + echo 'cflags = "-fcf-protection=none"' + echo 'cxxflags = "-fcf-protection=none"' + echo 'ldflags = "-fcf-protection=none"' + ;; + *) + ;; + esac) + enable-warnings = false + [llvm.build-config] + CMAKE_VERBOSE_MAKEFILE = "ON" + $(if ! tc-is-cross-compiler; then + # When cross-compiling, LLVM is compiled twice, once for host and + # once for target. Unfortunately, this build configuration applies + # to both, which means any flags applicable to one target but not + # the other will break. Conditionally disable respecting user + # flags when cross-compiling. + echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" + echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" + echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" + fi) + [build] + build-stage = 2 + test-stage = 2 + build = "${rust_build}" + host = ["${rust_host}"] + target = [${rust_targets}] + cargo = "${rust_stage0_root}/bin/cargo" + rustc = "${rust_stage0_root}/bin/rustc" + rustfmt = "${rust_stage0_root}/bin/rustfmt" + docs = $(toml_usex doc) + compiler-docs = false + submodules = false + python = "${EPYTHON}" + locked-deps = true + vendor = true + extended = true + tools = [${tools}] + verbose = 2 + sanitizers = false + profiler = true + cargo-native-static = false + [install] + prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" + sysconfdir = "etc" + docdir = "share/doc/rust" + bindir = "bin" + libdir = "lib" + mandir = "share/man" + [rust] + # https://github.com/rust-lang/rust/issues/54872 + codegen-units-std = 1 + optimize = true + debug = $(toml_usex debug) + debug-assertions = $(toml_usex debug) + debug-assertions-std = $(toml_usex debug) + debuginfo-level = $(usex debug 2 0) + debuginfo-level-rustc = $(usex debug 2 0) + debuginfo-level-std = $(usex debug 2 0) + debuginfo-level-tools = $(usex debug 2 0) + debuginfo-level-tests = 0 + backtrace = true + incremental = false + $(if ! tc-is-cross-compiler; then + echo "default-linker = \"$(tc-getCC)\"" + fi) + parallel-compiler = $(toml_usex parallel-compiler) + channel = "$(usex nightly nightly stable)" + description = "gentoo" + rpath = true + verbose-tests = true + optimize-tests = $(toml_usex !debug) + codegen-tests = true + dist-src = false + remap-debuginfo = true + lld = $(usex system-llvm false $(toml_usex wasm)) + # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it + # https://github.com/rust-lang/rust/issues/74976 + # https://github.com/rust-lang/rust/issues/76526 + deny-warnings = $(usex wasm $(usex doc false true) true) + backtrace-on-ice = true + jemalloc = false + # See https://github.com/rust-lang/rust/issues/121124 + lto = "$(usex lto thin off)" + [dist] + src-tarball = false + compression-formats = ["xz"] + compression-profile = "balanced" + _EOF_ + + for v in $(multilib_get_enabled_abi_pairs); do + rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) + arch_cflags="$(get_abi_CFLAGS ${v##*.})" + + export CFLAGS_${rust_target//-/_}="${arch_cflags}" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${rust_target}] + ar = "$(tc-getAR)" + cc = "$(tc-getCC)" + cxx = "$(tc-getCXX)" + linker = "$(tc-getCC)" + ranlib = "$(tc-getRANLIB)" + llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; + # but we patch it and set to false here as well + if use elibc_musl; then + cat <<- _EOF_ >> "${S}"/config.toml + crt-static = false + musl-root = "$($(tc-getCC) -print-sysroot)/usr" + _EOF_ + fi + done + if use wasm; then + wasm_target="wasm32-unknown-unknown" + export CFLAGS_${wasm_target//-/_}="$(filter-flags '-mcpu*' '-march*' '-mtune*'; echo "$CFLAGS")" + cat <<- _EOF_ >> "${S}"/config.toml + [target.wasm32-unknown-unknown] + linker = "$(usex system-llvm lld rust-lld)" + # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 + profiler = false + _EOF_ + fi + + if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below + # experimental cross support + # discussion: https://bugs.gentoo.org/679878 + # TODO: c*flags, clang, system-llvm, cargo.eclass target support + # it would be much better if we could split out stdlib + # complilation to separate ebuild and abuse CATEGORY to + # just install to /usr/lib/rustlib/ + + # extra targets defined as a bash array + # spec format: :: + # best place would be /etc/portage/env/dev-lang/rust + # Example: + # RUST_CROSS_TARGETS=( + # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" + # ) + # no extra hand holding is done, no target transformations, all + # values are passed as-is with just basic checks, so it's up to user to supply correct values + # valid rust targets can be obtained with + # rustc --print target-list + # matching cross toolchain has to be installed + # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) + # only gcc toolchains installed with crossdev are checked for now. + + # BUG: we can't pass host flags to cross compiler, so just filter for now + # BUG: this should be more fine-grained. + filter-flags '-mcpu=*' '-march=*' '-mtune=*' + + local cross_target_spec + for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do + # extracts first element form :: + local cross_llvm_target="${cross_target_spec%%:*}" + # extracts toolchain triples, : + local cross_triples="${cross_target_spec#*:}" + # extracts first element after before : separator + local cross_rust_target="${cross_triples%%:*}" + # extracts last element after : separator + local cross_toolchain="${cross_triples##*:}" + use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" + command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${cross_rust_target}] + ar = "${cross_toolchain}-ar" + cc = "${cross_toolchain}-gcc" + cxx = "${cross_toolchain}-g++" + linker = "${cross_toolchain}-gcc" + ranlib = "${cross_toolchain}-ranlib" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + if [[ "${cross_toolchain}" == *-musl* ]]; then + cat <<- _EOF_ >> "${S}"/config.toml + musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" + _EOF_ + fi + + # append cross target to "normal" target list + # example 'target = ["powerpc64le-unknown-linux-gnu"]' + # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' + + rust_targets="${rust_targets},\"${cross_rust_target}\"" + sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die + + ewarn + ewarn "Enabled ${cross_rust_target} rust target" + ewarn "Using ${cross_toolchain} cross toolchain" + ewarn + if ! has_version -b 'sys-devel/binutils[multitarget]' ; then + ewarn "'sys-devel/binutils[multitarget]' is not installed" + ewarn "'strip' will be unable to strip cross libraries" + ewarn "cross targets will be installed with full debug information" + ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" + ewarn + ewarn "Alternatively llvm-strip can be used, it supports stripping any target" + ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" + ewarn + fi + done + fi # I_KNOW_WHAT_I_AM_DOING_CROSS + + einfo "Rust configured with the following flags:" + echo + echo RUSTFLAGS="\"${RUSTFLAGS}\"" + echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" + echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" + echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" + env | grep "CARGO_TARGET_.*_RUSTFLAGS=" + env | grep "CFLAGS_.*" + echo + einfo "config.toml contents:" + cat "${S}"/config.toml || die + echo +} + +src_compile() { + RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die +} + +src_test() { + # https://rustc-dev-guide.rust-lang.org/tests/intro.html + + # those are basic and codegen tests. + local tests=( + codegen + codegen-units + compile-fail + incremental + mir-opt + pretty + run-make + ) + + # fails if llvm is not built with ALL targets. + # and known to fail with system llvm sometimes. + use system-llvm || tests+=( assembly ) + + # fragile/expensive/less important tests + # or tests that require extra builds + # TODO: instead of skipping, just make some nonfatal. + if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then + tests+=( + rustdoc + rustdoc-js + rustdoc-js-std + rustdoc-ui + run-make-fulldeps + ui + ui-fulldeps + ) + fi + + local i failed=() + einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" + for i in "${tests[@]}"; do + local t="src/test/${i}" + einfo "rust_src_test: running ${t}" + if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ + -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" + then + failed+=( "${t}" ) + eerror "rust_src_test: ${t} failed" + fi + done + + if [[ ${#failed[@]} -ne 0 ]]; then + eerror "rust_src_test: failure summary: ${failed[@]}" + die "aborting due to test failures" + fi +} + +src_install() { + DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die + + # bug #689562, #689160 + rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die + rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die + + local symlinks=( + cargo + rustc + rustdoc + rust-gdb + rust-gdbgui + rust-lldb + rust-demangler + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use miri && symlinks+=( miri cargo-miri ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- + # need to fix eselect-rust to remove this hack. + local ver_i="${i}-${PV}" + if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then + einfo "Installing ${i} symlink" + ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die + else + ewarn "${i} symlink requested, but source file not found" + ewarn "please report this" + fi + dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" + use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" + dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" + dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" + dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" + + newenvd - "50${P}" <<-_EOF_ + MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" + _EOF_ + + rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-demangler + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use miri; then + echo /usr/bin/miri >> "${T}/provider-${P}" + echo /usr/bin/cargo-miri >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/lib/rust/libexec >> "${T}/provider-${P}" + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + + if use dist; then + "${EPYTHON}" ./x.py dist -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die + insinto "/usr/lib/${PN}/${PV}/dist" + doins -r "${S}/build/dist/." + fi +} + +pkg_preinst() { + # 943308 and friends; basically --keep-going can forget to unmerge old rust + # but the soft blocker allows us to install conflicting files. + # This results in duplicated .{rlib,so} files which confuses rustc and results in + # the need for manual intervention. + if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then + # we need to find all .{rlib,so} files in the old rust lib directory + # and store them in an array for later use + readarray -d '' old_rust_libs < <( + find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ + -type f \( -name '*.rlib' -o -name '*.so' \) -print0) + export old_rust_libs + if [[ ${#old_rust_libs[@]} -gt 0 ]]; then + einfo "Found old .rlib and .so files in the old rust lib directory" + else + die "Found no old .rlib and .so files but old rust version is installed. Bailing!" + fi + fi +} + +pkg_postinst() { + + local old_rust="dev-lang/rust:stable/$(ver_cut 1-2)" + if has_version -b ${old_rust}; then + # Be _extra_ careful here as we're removing files from the live filesystem + local f + local only_one_file=() + einfo "Tidying up libraries files from non-slotted \`${old_rust}\`." + for f in "${old_rust_libs[@]}"; do + [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" + local base_name="${f%-*}" + local ext="${f##*.}" + local matching_files=("${base_name}"-*.${ext}) + case ${#matching_files[@]} in + 2) + einfo "Removing old .${ext}: ${f}" + rm "${f}" || die + ;; + 1) + # Turns out fingerprints are not as unique as we'd thought, _sometimes_ they collide, + # so we may have already installed over the old file. + # We'll warn about this just in case, but it's probably fine. + only_one_file+=( "${matching_files[0]}" ) + ;; + *) + die "Expected one or two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" + ;; + esac + done + if [[ ${#only_one_file} -gt 0 ]]; then + einfo "While tidying up non-slotted rust libraries for \`${old_rust}\`," + einfo "the following file(s) did not have a duplicate where one was expected:" + for f in "${only_one_file[@]}"; do + einfo " * ${f}" + done + einfo "" + einfo "This is unlikely to cause problems; the fingerprint for the library ended up being the same." + einfo "However, if you encounter any issues please report them to the Gentoo Rust Team." + fi + fi + + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + optfeature "Emacs support" "app-emacs/rust-mode" + optfeature "Vim support" "app-vim/rust-vim" +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust/rust-1.80.1-r100.ebuild b/dev-lang/rust/rust-1.80.1-r100.ebuild deleted file mode 100644 index fb5eef4568b5..000000000000 --- a/dev-lang/rust/rust-1.80.1-r100.ebuild +++ /dev/null @@ -1,742 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 18 ) -PYTHON_COMPAT=( python3_{10..13} ) - -RUST_MAX_VER=${PV} -RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" - -inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing multilib multilib-build \ - optfeature python-any-r1 rust rust-toolchain toolchain-funcs verify-sig - -if [[ ${PV} = *beta* ]]; then - betaver=${PV//*beta} - BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" - MY_P="rustc-beta" - SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" -else - MY_P="rustc-${PV}" - SRC="${MY_P}-src.tar.xz" - KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv sparc x86" -fi - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" - -SRC_URI=" - https://static.rust-lang.org/dist/${SRC} - verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) -" -S="${WORKDIR}/${MY_P}-src" - -# keep in sync with llvm ebuild of the same version as bundled one. -ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai - LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE - WebAssembly X86 XCore Xtensa ) -ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) -LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} - -ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" - -IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" - -LLVM_DEPEND=() -# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation -for _x in "${ALL_LLVM_TARGETS[@]}"; do - LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) -done -LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) -LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) - -BDEPEND="${PYTHON_DEPS} - app-eselect/eselect-rust - || ( - >=sys-devel/gcc-4.7 - >=llvm-core/clang-3.5 - ) - !system-llvm? ( - >=dev-build/cmake-3.13.4 - app-alternatives/ninja - ) - test? ( dev-debug/gdb ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -DEPEND=" - >=app-arch/xz-utils-5.2 - net-misc/curl:=[http2,ssl] - sys-libs/zlib:= - dev-libs/openssl:0= - system-llvm? ( - ${LLVM_DEPEND[*]} - llvm-libunwind? ( llvm-runtimes/libunwind:= ) - ) - !system-llvm? ( - !llvm-libunwind? ( - elibc_musl? ( sys-libs/libunwind:= ) - ) - ) -" - -RDEPEND="${DEPEND} - app-eselect/eselect-rust - dev-lang/rust-common - sys-apps/lsb-release - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" - -REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) - miri? ( nightly ) - parallel-compiler? ( nightly ) - rust-analyzer? ( rust-src ) - test? ( ${ALL_LLVM_TARGETS[*]} ) - wasm? ( llvm_targets_WebAssembly ) - x86? ( cpu_flags_x86_sse2 ) -" - -# we don't use cmake.eclass, but can get a warning -CMAKE_WARN_UNUSED_CLI=no - -QA_FLAGS_IGNORED=" - usr/lib/${PN}/${PV}/bin/.* - usr/lib/${PN}/${PV}/libexec/.* - usr/lib/${PN}/${PV}/lib/lib.*.so - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_SONAME=" - usr/lib/${PN}/${PV}/lib/lib.*.so.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_PRESTRIPPED=" - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -# causes double bootstrap -RESTRICT="test" - -VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc - -PATCHES=( - "${FILESDIR}"/1.78.0-musl-dynamic-linking.patch - "${FILESDIR}"/1.74.1-cross-compile-libz.patch - #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch # pending refresh - "${FILESDIR}"/1.67.0-doc-wasm.patch - "${FILESDIR}"/1.79.0-revert-8c40426.patch -) - -clear_vendor_checksums() { - sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die -} - -toml_usex() { - usex "${1}" true false -} - -pre_build_checks() { - local M=9216 - # multiply requirements by 1.3 if we are doing x86-multilib - if use amd64; then - M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) - fi - M=$(( $(usex clippy 128 0) + ${M} )) - M=$(( $(usex miri 128 0) + ${M} )) - M=$(( $(usex rustfmt 256 0) + ${M} )) - # add 2G if we compile llvm and 256M per llvm_target - if ! use system-llvm; then - M=$(( 2048 + ${M} )) - local ltarget - for ltarget in ${ALL_LLVM_TARGETS[@]}; do - M=$(( $(usex ${ltarget} 256 0) + ${M} )) - done - fi - M=$(( $(usex wasm 256 0) + ${M} )) - M=$(( $(usex debug 2 1) * ${M} )) - eshopts_push -s extglob - if is-flagq '-g?(gdb)?([1-9])'; then - M=$(( 15 * ${M} / 10 )) - fi - eshopts_pop - M=$(( $(usex doc 256 0) + ${M} )) - CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} -} - -llvm_check_deps() { - has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" -} - -# Is LLVM being linked against libc++? -is_libcxx_linked() { - local code='#include -#if defined(_LIBCPP_VERSION) - HAVE_LIBCXX -#endif -' - local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 - [[ ${out} == *HAVE_LIBCXX* ]] -} - -pkg_pretend() { - pre_build_checks -} - -pkg_setup() { - pre_build_checks - python-any-r1_pkg_setup - - export LIBGIT2_NO_PKG_CONFIG=1 #749381 - if tc-is-cross-compiler; then - use system-llvm && die "USE=system-llvm not allowed when cross-compiling" - local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" - use "llvm_targets_${cross_llvm_target}" || \ - die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" - fi - - rust_pkg_setup - - if use system-llvm; then - llvm-r1_pkg_setup - - local llvm_config="$(get_llvm_prefix)/bin/llvm-config" - export LLVM_LINK_SHARED=1 - export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" - fi -} - -src_configure() { - if tc-is-cross-compiler; then - export PKG_CONFIG_ALLOW_CROSS=1 - export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" - export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" - export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" - fi - - filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 - - local rust_target="" rust_targets="" arch_cflags - - # Collect rust target names to compile standard libs for all ABIs. - for v in $(multilib_get_enabled_abi_pairs); do - rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" - done - if use wasm; then - rust_targets+=",\"wasm32-unknown-unknown\"" - if use system-llvm; then - # un-hardcode rust-lld linker for this target - # https://bugs.gentoo.org/715348 - sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/base/wasm.rs || die - fi - fi - rust_targets="${rust_targets#,}" - - # cargo and rustdoc are mandatory and should always be included - local tools='"cargo","rustdoc"' - use clippy && tools+=',"clippy"' - use miri && tools+=',"miri"' - use rustfmt && tools+=',"rustfmt"' - use rust-analyzer && tools+=',"rust-analyzer","rust-analyzer-proc-macro-srv"' - use rust-src && tools+=',"src"' - - local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" - # in case of prefix it will be already prefixed, as --print sysroot returns full path - [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" - - rust_target="$(rust_abi)" - rust_build="$(rust_abi "${CBUILD}")" - rust_host="$(rust_abi "${CHOST}")" - - LLVM_EXPERIMENTAL_TARGETS=() - for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do - if use llvm_targets_${_x} ; then - LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) - fi - done - LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} - - local cm_btype="$(usex debug DEBUG RELEASE)" - cat <<- _EOF_ > "${S}"/config.toml - [llvm] - download-ci-llvm = false - optimize = $(toml_usex !debug) - release-debuginfo = $(toml_usex debug) - assertions = $(toml_usex debug) - ninja = true - targets = "${LLVM_TARGETS// /;}" - experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" - link-shared = $(toml_usex system-llvm) - $(if is_libcxx_linked; then - # https://bugs.gentoo.org/732632 - echo "use-libcxx = true" - echo "static-libstdcpp = false" - fi) - $(case "${rust_target}" in - i586-*-linux-*) - # https://github.com/rust-lang/rust/issues/93059 - echo 'cflags = "-fcf-protection=none"' - echo 'cxxflags = "-fcf-protection=none"' - echo 'ldflags = "-fcf-protection=none"' - ;; - *) - ;; - esac) - enable-warnings = false - [llvm.build-config] - CMAKE_VERBOSE_MAKEFILE = "ON" - $(if ! tc-is-cross-compiler; then - # When cross-compiling, LLVM is compiled twice, once for host and - # once for target. Unfortunately, this build configuration applies - # to both, which means any flags applicable to one target but not - # the other will break. Conditionally disable respecting user - # flags when cross-compiling. - echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" - echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" - echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" - fi) - [build] - build-stage = 2 - test-stage = 2 - build = "${rust_build}" - host = ["${rust_host}"] - target = [${rust_targets}] - cargo = "${rust_stage0_root}/bin/cargo" - rustc = "${rust_stage0_root}/bin/rustc" - rustfmt = "${rust_stage0_root}/bin/rustfmt" - docs = $(toml_usex doc) - compiler-docs = false - submodules = false - python = "${EPYTHON}" - locked-deps = true - vendor = true - extended = true - tools = [${tools}] - verbose = 2 - sanitizers = false - profiler = true - cargo-native-static = false - [install] - prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" - sysconfdir = "etc" - docdir = "share/doc/rust" - bindir = "bin" - libdir = "lib" - mandir = "share/man" - [rust] - # https://github.com/rust-lang/rust/issues/54872 - codegen-units-std = 1 - optimize = true - debug = $(toml_usex debug) - debug-assertions = $(toml_usex debug) - debug-assertions-std = $(toml_usex debug) - debuginfo-level = $(usex debug 2 0) - debuginfo-level-rustc = $(usex debug 2 0) - debuginfo-level-std = $(usex debug 2 0) - debuginfo-level-tools = $(usex debug 2 0) - debuginfo-level-tests = 0 - backtrace = true - incremental = false - $(if ! tc-is-cross-compiler; then - echo "default-linker = \"$(tc-getCC)\"" - fi) - parallel-compiler = $(toml_usex parallel-compiler) - channel = "$(usex nightly nightly stable)" - description = "gentoo" - rpath = false - verbose-tests = true - optimize-tests = $(toml_usex !debug) - codegen-tests = true - dist-src = false - remap-debuginfo = true - lld = $(usex system-llvm false $(toml_usex wasm)) - # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it - # https://github.com/rust-lang/rust/issues/74976 - # https://github.com/rust-lang/rust/issues/76526 - deny-warnings = $(usex wasm $(usex doc false true) true) - backtrace-on-ice = true - jemalloc = false - # See https://github.com/rust-lang/rust/issues/121124 - lto = "$(usex lto thin off)" - [dist] - src-tarball = false - compression-formats = ["xz"] - compression-profile = "balanced" - _EOF_ - - for v in $(multilib_get_enabled_abi_pairs); do - rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) - arch_cflags="$(get_abi_CFLAGS ${v##*.})" - - export CFLAGS_${rust_target//-/_}="${arch_cflags}" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${rust_target}] - ar = "$(tc-getAR)" - cc = "$(tc-getCC)" - cxx = "$(tc-getCXX)" - linker = "$(tc-getCC)" - ranlib = "$(tc-getRANLIB)" - llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; - # but we patch it and set to false here as well - if use elibc_musl; then - cat <<- _EOF_ >> "${S}"/config.toml - crt-static = false - musl-root = "$($(tc-getCC) -print-sysroot)/usr" - _EOF_ - fi - done - if use wasm; then - wasm_target="wasm32-unknown-unknown" - export CFLAGS_${wasm_target//-/_}="$(filter-flags '-mcpu*' '-march*' '-mtune*'; echo "$CFLAGS")" - cat <<- _EOF_ >> "${S}"/config.toml - [target.wasm32-unknown-unknown] - linker = "$(usex system-llvm lld rust-lld)" - # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 - profiler = false - _EOF_ - fi - - if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below - # experimental cross support - # discussion: https://bugs.gentoo.org/679878 - # TODO: c*flags, clang, system-llvm, cargo.eclass target support - # it would be much better if we could split out stdlib - # complilation to separate ebuild and abuse CATEGORY to - # just install to /usr/lib/rustlib/ - - # extra targets defined as a bash array - # spec format: :: - # best place would be /etc/portage/env/dev-lang/rust - # Example: - # RUST_CROSS_TARGETS=( - # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" - # ) - # no extra hand holding is done, no target transformations, all - # values are passed as-is with just basic checks, so it's up to user to supply correct values - # valid rust targets can be obtained with - # rustc --print target-list - # matching cross toolchain has to be installed - # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) - # only gcc toolchains installed with crossdev are checked for now. - - # BUG: we can't pass host flags to cross compiler, so just filter for now - # BUG: this should be more fine-grained. - filter-flags '-mcpu=*' '-march=*' '-mtune=*' - - local cross_target_spec - for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do - # extracts first element form :: - local cross_llvm_target="${cross_target_spec%%:*}" - # extracts toolchain triples, : - local cross_triples="${cross_target_spec#*:}" - # extracts first element after before : separator - local cross_rust_target="${cross_triples%%:*}" - # extracts last element after : separator - local cross_toolchain="${cross_triples##*:}" - use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" - command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${cross_rust_target}] - ar = "${cross_toolchain}-ar" - cc = "${cross_toolchain}-gcc" - cxx = "${cross_toolchain}-g++" - linker = "${cross_toolchain}-gcc" - ranlib = "${cross_toolchain}-ranlib" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - if [[ "${cross_toolchain}" == *-musl* ]]; then - cat <<- _EOF_ >> "${S}"/config.toml - musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" - _EOF_ - fi - - # append cross target to "normal" target list - # example 'target = ["powerpc64le-unknown-linux-gnu"]' - # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' - - rust_targets="${rust_targets},\"${cross_rust_target}\"" - sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die - - ewarn - ewarn "Enabled ${cross_rust_target} rust target" - ewarn "Using ${cross_toolchain} cross toolchain" - ewarn - if ! has_version -b 'sys-devel/binutils[multitarget]' ; then - ewarn "'sys-devel/binutils[multitarget]' is not installed" - ewarn "'strip' will be unable to strip cross libraries" - ewarn "cross targets will be installed with full debug information" - ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" - ewarn - ewarn "Alternatively llvm-strip can be used, it supports stripping any target" - ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" - ewarn - fi - done - fi # I_KNOW_WHAT_I_AM_DOING_CROSS - - einfo "Rust configured with the following flags:" - echo - echo RUSTFLAGS="\"${RUSTFLAGS}\"" - echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" - echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" - echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" - env | grep "CARGO_TARGET_.*_RUSTFLAGS=" - env | grep "CFLAGS_.*" - echo - einfo "config.toml contents:" - cat "${S}"/config.toml || die - echo -} - -src_compile() { - RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die -} - -src_test() { - # https://rustc-dev-guide.rust-lang.org/tests/intro.html - - # those are basic and codegen tests. - local tests=( - codegen - codegen-units - compile-fail - incremental - mir-opt - pretty - run-make - ) - - # fails if llvm is not built with ALL targets. - # and known to fail with system llvm sometimes. - use system-llvm || tests+=( assembly ) - - # fragile/expensive/less important tests - # or tests that require extra builds - # TODO: instead of skipping, just make some nonfatal. - if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then - tests+=( - rustdoc - rustdoc-js - rustdoc-js-std - rustdoc-ui - run-make-fulldeps - ui - ui-fulldeps - ) - fi - - local i failed=() - einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" - for i in "${tests[@]}"; do - local t="src/test/${i}" - einfo "rust_src_test: running ${t}" - if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ - -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" - then - failed+=( "${t}" ) - eerror "rust_src_test: ${t} failed" - fi - done - - if [[ ${#failed[@]} -ne 0 ]]; then - eerror "rust_src_test: failure summary: ${failed[@]}" - die "aborting due to test failures" - fi -} - -src_install() { - DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die - - # bug #689562, #689160 - rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die - rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use miri && symlinks+=( miri cargo-miri ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- - # need to fix eselect-rust to remove this hack. - local ver_i="${i}-${PV}" - if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then - einfo "Installing ${i} symlink" - ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die - else - ewarn "${i} symlink requested, but source file not found" - ewarn "please report this" - fi - dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" - use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" - dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" - dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" - dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" - - newenvd - "50${P}" <<-_EOF_ - LDPATH="${EPREFIX}/usr/lib/rust/lib-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" - _EOF_ - - rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use miri; then - echo /usr/bin/miri >> "${T}/provider-${P}" - echo /usr/bin/cargo-miri >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/lib/rust/libexec >> "${T}/provider-${P}" - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - - if use dist; then - "${EPYTHON}" ./x.py dist -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die - insinto "/usr/lib/${PN}/${PV}/dist" - doins -r "${S}/build/dist/." - fi -} - -pkg_preinst() { - # 943308 and friends; basically --keep-going can forget to unmerge old rust - # but the soft blocker allows us to install conflicting files. - # This results in duplicated .{rlib,so} files which confuses rustc and results in - # the need for manual intervention. - if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then - # we need to find all .{rlib,so} files in the old rust lib directory - # and store them in an array for later use - readarray -d '' old_rust_libs < <( - find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ - -type f \( -name '*.rlib' -o -name '*.so' \) -print0) - export old_rust_libs - if [[ ${#old_rust_libs[@]} -gt 0 ]]; then - einfo "Found old .rlib and .so files in the old rust lib directory" - else - die "Found no old .rlib and .so files but old rust version is installed. Bailing!" - fi - fi -} - -pkg_postinst() { - - local old_rust="dev-lang/rust:stable/$(ver_cut 1-2)" - if has_version -b ${old_rust}; then - # Be _extra_ careful here as we're removing files from the live filesystem - local f - local only_one_file=() - einfo "Tidying up libraries files from non-slotted \`${old_rust}\`." - for f in "${old_rust_libs[@]}"; do - [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" - local base_name="${f%-*}" - local ext="${f##*.}" - local matching_files=("${base_name}"-*.${ext}) - case ${#matching_files[@]} in - 2) - einfo "Removing old .${ext}: ${f}" - rm "${f}" || die - ;; - 1) - # Turns out fingerprints are not as unique as we'd thought, _sometimes_ they collide, - # so we may have already installed over the old file. - # We'll warn about this just in case, but it's probably fine. - only_one_file+=( "${matching_files[0]}" ) - ;; - *) - die "Expected one or two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" - ;; - esac - done - if [[ ${#only_one_file} -gt 0 ]]; then - einfo "While tidying up non-slotted rust libraries for \`${old_rust}\`," - einfo "the following file(s) did not have a duplicate where one was expected:" - for f in "${only_one_file[@]}"; do - einfo " * ${f}" - done - einfo "" - einfo "This is unlikely to cause problems; the fingerprint for the library ended up being the same." - einfo "However, if you encounter any issues please report them to the Gentoo Rust Team." - fi - fi - - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - optfeature "Emacs support" "app-emacs/rust-mode" - optfeature "Vim support" "app-vim/rust-vim" -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust/rust-1.80.1-r101.ebuild b/dev-lang/rust/rust-1.80.1-r101.ebuild new file mode 100644 index 000000000000..c569cb53351c --- /dev/null +++ b/dev-lang/rust/rust-1.80.1-r101.ebuild @@ -0,0 +1,741 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 18 ) +PYTHON_COMPAT=( python3_{10..13} ) + +RUST_MAX_VER=${PV} +RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" + +inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing multilib multilib-build \ + optfeature python-any-r1 rust rust-toolchain toolchain-funcs verify-sig + +if [[ ${PV} = *beta* ]]; then + betaver=${PV//*beta} + BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" + MY_P="rustc-beta" + SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" +else + MY_P="rustc-${PV}" + SRC="${MY_P}-src.tar.xz" + KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv sparc x86" +fi + +DESCRIPTION="Systems programming language from Mozilla" +HOMEPAGE="https://www.rust-lang.org/" + +SRC_URI=" + https://static.rust-lang.org/dist/${SRC} + verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) +" +S="${WORKDIR}/${MY_P}-src" + +# keep in sync with llvm ebuild of the same version as bundled one. +ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai + LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE + WebAssembly X86 XCore Xtensa ) +ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) +LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} + +ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" +SLOT="${PV}" + +IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" + +LLVM_DEPEND=() +# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation +for _x in "${ALL_LLVM_TARGETS[@]}"; do + LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) +done +LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) +LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) + +BDEPEND="${PYTHON_DEPS} + app-eselect/eselect-rust + || ( + >=sys-devel/gcc-4.7 + >=llvm-core/clang-3.5 + ) + !system-llvm? ( + >=dev-build/cmake-3.13.4 + app-alternatives/ninja + ) + test? ( dev-debug/gdb ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +DEPEND=" + >=app-arch/xz-utils-5.2 + net-misc/curl:=[http2,ssl] + sys-libs/zlib:= + dev-libs/openssl:0= + system-llvm? ( + ${LLVM_DEPEND[*]} + llvm-libunwind? ( llvm-runtimes/libunwind:= ) + ) + !system-llvm? ( + !llvm-libunwind? ( + elibc_musl? ( sys-libs/libunwind:= ) + ) + ) +" + +RDEPEND="${DEPEND} + app-eselect/eselect-rust + dev-lang/rust-common + sys-apps/lsb-release + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" + +REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) + miri? ( nightly ) + parallel-compiler? ( nightly ) + rust-analyzer? ( rust-src ) + test? ( ${ALL_LLVM_TARGETS[*]} ) + wasm? ( llvm_targets_WebAssembly ) + x86? ( cpu_flags_x86_sse2 ) +" + +# we don't use cmake.eclass, but can get a warning +CMAKE_WARN_UNUSED_CLI=no + +QA_FLAGS_IGNORED=" + usr/lib/${PN}/${PV}/bin/.* + usr/lib/${PN}/${PV}/libexec/.* + usr/lib/${PN}/${PV}/lib/lib.*.so + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_SONAME=" + usr/lib/${PN}/${PV}/lib/lib.*.so.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_PRESTRIPPED=" + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +# causes double bootstrap +RESTRICT="test" + +VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc + +PATCHES=( + "${FILESDIR}"/1.78.0-musl-dynamic-linking.patch + "${FILESDIR}"/1.74.1-cross-compile-libz.patch + #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch # pending refresh + "${FILESDIR}"/1.67.0-doc-wasm.patch + "${FILESDIR}"/1.79.0-revert-8c40426.patch +) + +clear_vendor_checksums() { + sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die +} + +toml_usex() { + usex "${1}" true false +} + +pre_build_checks() { + local M=9216 + # multiply requirements by 1.3 if we are doing x86-multilib + if use amd64; then + M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) + fi + M=$(( $(usex clippy 128 0) + ${M} )) + M=$(( $(usex miri 128 0) + ${M} )) + M=$(( $(usex rustfmt 256 0) + ${M} )) + # add 2G if we compile llvm and 256M per llvm_target + if ! use system-llvm; then + M=$(( 2048 + ${M} )) + local ltarget + for ltarget in ${ALL_LLVM_TARGETS[@]}; do + M=$(( $(usex ${ltarget} 256 0) + ${M} )) + done + fi + M=$(( $(usex wasm 256 0) + ${M} )) + M=$(( $(usex debug 2 1) * ${M} )) + eshopts_push -s extglob + if is-flagq '-g?(gdb)?([1-9])'; then + M=$(( 15 * ${M} / 10 )) + fi + eshopts_pop + M=$(( $(usex doc 256 0) + ${M} )) + CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} +} + +llvm_check_deps() { + has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" +} + +# Is LLVM being linked against libc++? +is_libcxx_linked() { + local code='#include +#if defined(_LIBCPP_VERSION) + HAVE_LIBCXX +#endif +' + local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 + [[ ${out} == *HAVE_LIBCXX* ]] +} + +pkg_pretend() { + pre_build_checks +} + +pkg_setup() { + pre_build_checks + python-any-r1_pkg_setup + + export LIBGIT2_NO_PKG_CONFIG=1 #749381 + if tc-is-cross-compiler; then + use system-llvm && die "USE=system-llvm not allowed when cross-compiling" + local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" + use "llvm_targets_${cross_llvm_target}" || \ + die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" + fi + + rust_pkg_setup + + if use system-llvm; then + llvm-r1_pkg_setup + + local llvm_config="$(get_llvm_prefix)/bin/llvm-config" + export LLVM_LINK_SHARED=1 + export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" + fi +} + +src_configure() { + if tc-is-cross-compiler; then + export PKG_CONFIG_ALLOW_CROSS=1 + export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" + export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" + export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" + fi + + filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 + + local rust_target="" rust_targets="" arch_cflags + + # Collect rust target names to compile standard libs for all ABIs. + for v in $(multilib_get_enabled_abi_pairs); do + rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" + done + if use wasm; then + rust_targets+=",\"wasm32-unknown-unknown\"" + if use system-llvm; then + # un-hardcode rust-lld linker for this target + # https://bugs.gentoo.org/715348 + sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/base/wasm.rs || die + fi + fi + rust_targets="${rust_targets#,}" + + # cargo and rustdoc are mandatory and should always be included + local tools='"cargo","rustdoc"' + use clippy && tools+=',"clippy"' + use miri && tools+=',"miri"' + use rustfmt && tools+=',"rustfmt"' + use rust-analyzer && tools+=',"rust-analyzer","rust-analyzer-proc-macro-srv"' + use rust-src && tools+=',"src"' + + local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" + # in case of prefix it will be already prefixed, as --print sysroot returns full path + [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" + + rust_target="$(rust_abi)" + rust_build="$(rust_abi "${CBUILD}")" + rust_host="$(rust_abi "${CHOST}")" + + LLVM_EXPERIMENTAL_TARGETS=() + for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do + if use llvm_targets_${_x} ; then + LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) + fi + done + LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} + + local cm_btype="$(usex debug DEBUG RELEASE)" + cat <<- _EOF_ > "${S}"/config.toml + [llvm] + download-ci-llvm = false + optimize = $(toml_usex !debug) + release-debuginfo = $(toml_usex debug) + assertions = $(toml_usex debug) + ninja = true + targets = "${LLVM_TARGETS// /;}" + experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" + link-shared = $(toml_usex system-llvm) + $(if is_libcxx_linked; then + # https://bugs.gentoo.org/732632 + echo "use-libcxx = true" + echo "static-libstdcpp = false" + fi) + $(case "${rust_target}" in + i586-*-linux-*) + # https://github.com/rust-lang/rust/issues/93059 + echo 'cflags = "-fcf-protection=none"' + echo 'cxxflags = "-fcf-protection=none"' + echo 'ldflags = "-fcf-protection=none"' + ;; + *) + ;; + esac) + enable-warnings = false + [llvm.build-config] + CMAKE_VERBOSE_MAKEFILE = "ON" + $(if ! tc-is-cross-compiler; then + # When cross-compiling, LLVM is compiled twice, once for host and + # once for target. Unfortunately, this build configuration applies + # to both, which means any flags applicable to one target but not + # the other will break. Conditionally disable respecting user + # flags when cross-compiling. + echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" + echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" + echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" + fi) + [build] + build-stage = 2 + test-stage = 2 + build = "${rust_build}" + host = ["${rust_host}"] + target = [${rust_targets}] + cargo = "${rust_stage0_root}/bin/cargo" + rustc = "${rust_stage0_root}/bin/rustc" + rustfmt = "${rust_stage0_root}/bin/rustfmt" + docs = $(toml_usex doc) + compiler-docs = false + submodules = false + python = "${EPYTHON}" + locked-deps = true + vendor = true + extended = true + tools = [${tools}] + verbose = 2 + sanitizers = false + profiler = true + cargo-native-static = false + [install] + prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" + sysconfdir = "etc" + docdir = "share/doc/rust" + bindir = "bin" + libdir = "lib" + mandir = "share/man" + [rust] + # https://github.com/rust-lang/rust/issues/54872 + codegen-units-std = 1 + optimize = true + debug = $(toml_usex debug) + debug-assertions = $(toml_usex debug) + debug-assertions-std = $(toml_usex debug) + debuginfo-level = $(usex debug 2 0) + debuginfo-level-rustc = $(usex debug 2 0) + debuginfo-level-std = $(usex debug 2 0) + debuginfo-level-tools = $(usex debug 2 0) + debuginfo-level-tests = 0 + backtrace = true + incremental = false + $(if ! tc-is-cross-compiler; then + echo "default-linker = \"$(tc-getCC)\"" + fi) + parallel-compiler = $(toml_usex parallel-compiler) + channel = "$(usex nightly nightly stable)" + description = "gentoo" + rpath = true + verbose-tests = true + optimize-tests = $(toml_usex !debug) + codegen-tests = true + dist-src = false + remap-debuginfo = true + lld = $(usex system-llvm false $(toml_usex wasm)) + # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it + # https://github.com/rust-lang/rust/issues/74976 + # https://github.com/rust-lang/rust/issues/76526 + deny-warnings = $(usex wasm $(usex doc false true) true) + backtrace-on-ice = true + jemalloc = false + # See https://github.com/rust-lang/rust/issues/121124 + lto = "$(usex lto thin off)" + [dist] + src-tarball = false + compression-formats = ["xz"] + compression-profile = "balanced" + _EOF_ + + for v in $(multilib_get_enabled_abi_pairs); do + rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) + arch_cflags="$(get_abi_CFLAGS ${v##*.})" + + export CFLAGS_${rust_target//-/_}="${arch_cflags}" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${rust_target}] + ar = "$(tc-getAR)" + cc = "$(tc-getCC)" + cxx = "$(tc-getCXX)" + linker = "$(tc-getCC)" + ranlib = "$(tc-getRANLIB)" + llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; + # but we patch it and set to false here as well + if use elibc_musl; then + cat <<- _EOF_ >> "${S}"/config.toml + crt-static = false + musl-root = "$($(tc-getCC) -print-sysroot)/usr" + _EOF_ + fi + done + if use wasm; then + wasm_target="wasm32-unknown-unknown" + export CFLAGS_${wasm_target//-/_}="$(filter-flags '-mcpu*' '-march*' '-mtune*'; echo "$CFLAGS")" + cat <<- _EOF_ >> "${S}"/config.toml + [target.wasm32-unknown-unknown] + linker = "$(usex system-llvm lld rust-lld)" + # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 + profiler = false + _EOF_ + fi + + if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below + # experimental cross support + # discussion: https://bugs.gentoo.org/679878 + # TODO: c*flags, clang, system-llvm, cargo.eclass target support + # it would be much better if we could split out stdlib + # complilation to separate ebuild and abuse CATEGORY to + # just install to /usr/lib/rustlib/ + + # extra targets defined as a bash array + # spec format: :: + # best place would be /etc/portage/env/dev-lang/rust + # Example: + # RUST_CROSS_TARGETS=( + # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" + # ) + # no extra hand holding is done, no target transformations, all + # values are passed as-is with just basic checks, so it's up to user to supply correct values + # valid rust targets can be obtained with + # rustc --print target-list + # matching cross toolchain has to be installed + # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) + # only gcc toolchains installed with crossdev are checked for now. + + # BUG: we can't pass host flags to cross compiler, so just filter for now + # BUG: this should be more fine-grained. + filter-flags '-mcpu=*' '-march=*' '-mtune=*' + + local cross_target_spec + for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do + # extracts first element form :: + local cross_llvm_target="${cross_target_spec%%:*}" + # extracts toolchain triples, : + local cross_triples="${cross_target_spec#*:}" + # extracts first element after before : separator + local cross_rust_target="${cross_triples%%:*}" + # extracts last element after : separator + local cross_toolchain="${cross_triples##*:}" + use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" + command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${cross_rust_target}] + ar = "${cross_toolchain}-ar" + cc = "${cross_toolchain}-gcc" + cxx = "${cross_toolchain}-g++" + linker = "${cross_toolchain}-gcc" + ranlib = "${cross_toolchain}-ranlib" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + if [[ "${cross_toolchain}" == *-musl* ]]; then + cat <<- _EOF_ >> "${S}"/config.toml + musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" + _EOF_ + fi + + # append cross target to "normal" target list + # example 'target = ["powerpc64le-unknown-linux-gnu"]' + # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' + + rust_targets="${rust_targets},\"${cross_rust_target}\"" + sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die + + ewarn + ewarn "Enabled ${cross_rust_target} rust target" + ewarn "Using ${cross_toolchain} cross toolchain" + ewarn + if ! has_version -b 'sys-devel/binutils[multitarget]' ; then + ewarn "'sys-devel/binutils[multitarget]' is not installed" + ewarn "'strip' will be unable to strip cross libraries" + ewarn "cross targets will be installed with full debug information" + ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" + ewarn + ewarn "Alternatively llvm-strip can be used, it supports stripping any target" + ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" + ewarn + fi + done + fi # I_KNOW_WHAT_I_AM_DOING_CROSS + + einfo "Rust configured with the following flags:" + echo + echo RUSTFLAGS="\"${RUSTFLAGS}\"" + echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" + echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" + echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" + env | grep "CARGO_TARGET_.*_RUSTFLAGS=" + env | grep "CFLAGS_.*" + echo + einfo "config.toml contents:" + cat "${S}"/config.toml || die + echo +} + +src_compile() { + RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die +} + +src_test() { + # https://rustc-dev-guide.rust-lang.org/tests/intro.html + + # those are basic and codegen tests. + local tests=( + codegen + codegen-units + compile-fail + incremental + mir-opt + pretty + run-make + ) + + # fails if llvm is not built with ALL targets. + # and known to fail with system llvm sometimes. + use system-llvm || tests+=( assembly ) + + # fragile/expensive/less important tests + # or tests that require extra builds + # TODO: instead of skipping, just make some nonfatal. + if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then + tests+=( + rustdoc + rustdoc-js + rustdoc-js-std + rustdoc-ui + run-make-fulldeps + ui + ui-fulldeps + ) + fi + + local i failed=() + einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" + for i in "${tests[@]}"; do + local t="src/test/${i}" + einfo "rust_src_test: running ${t}" + if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ + -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" + then + failed+=( "${t}" ) + eerror "rust_src_test: ${t} failed" + fi + done + + if [[ ${#failed[@]} -ne 0 ]]; then + eerror "rust_src_test: failure summary: ${failed[@]}" + die "aborting due to test failures" + fi +} + +src_install() { + DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die + + # bug #689562, #689160 + rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die + rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die + + local symlinks=( + cargo + rustc + rustdoc + rust-gdb + rust-gdbgui + rust-lldb + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use miri && symlinks+=( miri cargo-miri ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- + # need to fix eselect-rust to remove this hack. + local ver_i="${i}-${PV}" + if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then + einfo "Installing ${i} symlink" + ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die + else + ewarn "${i} symlink requested, but source file not found" + ewarn "please report this" + fi + dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" + use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" + dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" + dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" + dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" + + newenvd - "50${P}" <<-_EOF_ + MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" + _EOF_ + + rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use miri; then + echo /usr/bin/miri >> "${T}/provider-${P}" + echo /usr/bin/cargo-miri >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/lib/rust/libexec >> "${T}/provider-${P}" + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + + if use dist; then + "${EPYTHON}" ./x.py dist -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die + insinto "/usr/lib/${PN}/${PV}/dist" + doins -r "${S}/build/dist/." + fi +} + +pkg_preinst() { + # 943308 and friends; basically --keep-going can forget to unmerge old rust + # but the soft blocker allows us to install conflicting files. + # This results in duplicated .{rlib,so} files which confuses rustc and results in + # the need for manual intervention. + if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then + # we need to find all .{rlib,so} files in the old rust lib directory + # and store them in an array for later use + readarray -d '' old_rust_libs < <( + find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ + -type f \( -name '*.rlib' -o -name '*.so' \) -print0) + export old_rust_libs + if [[ ${#old_rust_libs[@]} -gt 0 ]]; then + einfo "Found old .rlib and .so files in the old rust lib directory" + else + die "Found no old .rlib and .so files but old rust version is installed. Bailing!" + fi + fi +} + +pkg_postinst() { + + local old_rust="dev-lang/rust:stable/$(ver_cut 1-2)" + if has_version -b ${old_rust}; then + # Be _extra_ careful here as we're removing files from the live filesystem + local f + local only_one_file=() + einfo "Tidying up libraries files from non-slotted \`${old_rust}\`." + for f in "${old_rust_libs[@]}"; do + [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" + local base_name="${f%-*}" + local ext="${f##*.}" + local matching_files=("${base_name}"-*.${ext}) + case ${#matching_files[@]} in + 2) + einfo "Removing old .${ext}: ${f}" + rm "${f}" || die + ;; + 1) + # Turns out fingerprints are not as unique as we'd thought, _sometimes_ they collide, + # so we may have already installed over the old file. + # We'll warn about this just in case, but it's probably fine. + only_one_file+=( "${matching_files[0]}" ) + ;; + *) + die "Expected one or two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" + ;; + esac + done + if [[ ${#only_one_file} -gt 0 ]]; then + einfo "While tidying up non-slotted rust libraries for \`${old_rust}\`," + einfo "the following file(s) did not have a duplicate where one was expected:" + for f in "${only_one_file[@]}"; do + einfo " * ${f}" + done + einfo "" + einfo "This is unlikely to cause problems; the fingerprint for the library ended up being the same." + einfo "However, if you encounter any issues please report them to the Gentoo Rust Team." + fi + fi + + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + optfeature "Emacs support" "app-emacs/rust-mode" + optfeature "Vim support" "app-vim/rust-vim" +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust/rust-1.81.0-r100.ebuild b/dev-lang/rust/rust-1.81.0-r100.ebuild deleted file mode 100644 index 93dfa988757c..000000000000 --- a/dev-lang/rust/rust-1.81.0-r100.ebuild +++ /dev/null @@ -1,746 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 18 ) -PYTHON_COMPAT=( python3_{10..13} ) - -RUST_MAX_VER=${PV} -RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" - -inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing optfeature \ - multilib multilib-build python-any-r1 rust rust-toolchain toolchain-funcs verify-sig - -if [[ ${PV} = *beta* ]]; then - betaver=${PV//*beta} - BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" - MY_P="rustc-beta" - SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" -else - MY_P="rustc-${PV}" - SRC="${MY_P}-src.tar.xz" - KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv sparc x86" -fi - -RUST_STAGE0_VERSION="1.$(($(ver_cut 2) - 1)).1" -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" - -SRC_URI=" - https://static.rust-lang.org/dist/${SRC} - verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) -" -S="${WORKDIR}/${MY_P}-src" - -# keep in sync with llvm ebuild of the same version as bundled one. -ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai - LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE - WebAssembly X86 XCore Xtensa ) -ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) -LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} - -ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" - -IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" - -LLVM_DEPEND=() -# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation -for _x in "${ALL_LLVM_TARGETS[@]}"; do - LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) -done -LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) -LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) - -BDEPEND="${PYTHON_DEPS} - app-eselect/eselect-rust - || ( - >=sys-devel/gcc-4.7 - >=llvm-core/clang-3.5 - ) - !system-llvm? ( - >=dev-build/cmake-3.13.4 - app-alternatives/ninja - ) - test? ( dev-debug/gdb ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -DEPEND=" - >=app-arch/xz-utils-5.2 - net-misc/curl:=[http2,ssl] - sys-libs/zlib:= - dev-libs/openssl:0= - system-llvm? ( - ${LLVM_DEPEND[*]} - llvm-libunwind? ( llvm-runtimes/libunwind:= ) - ) - !system-llvm? ( - !llvm-libunwind? ( - elibc_musl? ( sys-libs/libunwind:= ) - ) - ) -" - -RDEPEND="${DEPEND} - app-eselect/eselect-rust - dev-lang/rust-common - sys-apps/lsb-release - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" - -REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) - miri? ( nightly ) - parallel-compiler? ( nightly ) - rust-analyzer? ( rust-src ) - test? ( ${ALL_LLVM_TARGETS[*]} ) - wasm? ( llvm_targets_WebAssembly ) - x86? ( cpu_flags_x86_sse2 ) -" - -# we don't use cmake.eclass, but can get a warning -CMAKE_WARN_UNUSED_CLI=no - -QA_FLAGS_IGNORED=" - usr/lib/${PN}/${PV}/bin/.* - usr/lib/${PN}/${PV}/libexec/.* - usr/lib/${PN}/${PV}/lib/lib.*.so - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_SONAME=" - usr/lib/${PN}/${PV}/lib/lib.*.so.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_PRESTRIPPED=" - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -# causes double bootstrap -RESTRICT="test" - -VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc - -PATCHES=( - "${FILESDIR}"/1.78.0-musl-dynamic-linking.patch - "${FILESDIR}"/1.74.1-cross-compile-libz.patch - #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch # pending refresh - "${FILESDIR}"/1.67.0-doc-wasm.patch - "${FILESDIR}"/1.79.0-revert-8c40426.patch - "${FILESDIR}/1.81.0-backport-bug937164.patch" - "${FILESDIR}/1.81.0-backport-llvm-pr101761.patch" - "${FILESDIR}/1.81.0-backport-llvm-pr101766.patch" -) - -clear_vendor_checksums() { - sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die -} - -toml_usex() { - usex "${1}" true false -} - -pre_build_checks() { - local M=9216 - # multiply requirements by 1.3 if we are doing x86-multilib - if use amd64; then - M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) - fi - M=$(( $(usex clippy 128 0) + ${M} )) - M=$(( $(usex miri 128 0) + ${M} )) - M=$(( $(usex rustfmt 256 0) + ${M} )) - # add 2G if we compile llvm and 256M per llvm_target - if ! use system-llvm; then - M=$(( 2048 + ${M} )) - local ltarget - for ltarget in ${ALL_LLVM_TARGETS[@]}; do - M=$(( $(usex ${ltarget} 256 0) + ${M} )) - done - fi - M=$(( $(usex wasm 256 0) + ${M} )) - M=$(( $(usex debug 2 1) * ${M} )) - eshopts_push -s extglob - if is-flagq '-g?(gdb)?([1-9])'; then - M=$(( 15 * ${M} / 10 )) - fi - eshopts_pop - M=$(( $(usex doc 256 0) + ${M} )) - CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} -} - -llvm_check_deps() { - has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" -} - -# Is LLVM being linked against libc++? -is_libcxx_linked() { - local code='#include -#if defined(_LIBCPP_VERSION) - HAVE_LIBCXX -#endif -' - local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 - [[ ${out} == *HAVE_LIBCXX* ]] -} - -pkg_pretend() { - pre_build_checks -} - -pkg_setup() { - pre_build_checks - python-any-r1_pkg_setup - - export LIBGIT2_NO_PKG_CONFIG=1 #749381 - if tc-is-cross-compiler; then - use system-llvm && die "USE=system-llvm not allowed when cross-compiling" - local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" - use "llvm_targets_${cross_llvm_target}" || \ - die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" - fi - - rust_pkg_setup - - if use system-llvm; then - llvm-r1_pkg_setup - - local llvm_config="$(get_llvm_prefix)/bin/llvm-config" - export LLVM_LINK_SHARED=1 - export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" - fi -} - -src_configure() { - if tc-is-cross-compiler; then - export PKG_CONFIG_ALLOW_CROSS=1 - export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" - export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" - export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" - fi - - filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 - - local rust_target="" rust_targets="" arch_cflags - - # Collect rust target names to compile standard libs for all ABIs. - for v in $(multilib_get_enabled_abi_pairs); do - rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" - done - if use wasm; then - rust_targets+=",\"wasm32-unknown-unknown\"" - if use system-llvm; then - # un-hardcode rust-lld linker for this target - # https://bugs.gentoo.org/715348 - sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/base/wasm.rs || die - fi - fi - rust_targets="${rust_targets#,}" - - # cargo and rustdoc are mandatory and should always be included - local tools='"cargo","rustdoc"' - use clippy && tools+=',"clippy"' - use miri && tools+=',"miri"' - use rustfmt && tools+=',"rustfmt"' - use rust-analyzer && tools+=',"rust-analyzer","rust-analyzer-proc-macro-srv"' - use rust-src && tools+=',"src"' - - local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" - # in case of prefix it will be already prefixed, as --print sysroot returns full path - [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" - - rust_target="$(rust_abi)" - rust_build="$(rust_abi "${CBUILD}")" - rust_host="$(rust_abi "${CHOST}")" - - LLVM_EXPERIMENTAL_TARGETS=() - for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do - if use llvm_targets_${_x} ; then - LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) - fi - done - LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} - - local cm_btype="$(usex debug DEBUG RELEASE)" - cat <<- _EOF_ > "${S}"/config.toml - [llvm] - download-ci-llvm = false - optimize = $(toml_usex !debug) - release-debuginfo = $(toml_usex debug) - assertions = $(toml_usex debug) - ninja = true - targets = "${LLVM_TARGETS// /;}" - experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" - link-shared = $(toml_usex system-llvm) - $(if is_libcxx_linked; then - # https://bugs.gentoo.org/732632 - echo "use-libcxx = true" - echo "static-libstdcpp = false" - fi) - $(case "${rust_target}" in - i586-*-linux-*) - # https://github.com/rust-lang/rust/issues/93059 - echo 'cflags = "-fcf-protection=none"' - echo 'cxxflags = "-fcf-protection=none"' - echo 'ldflags = "-fcf-protection=none"' - ;; - *) - ;; - esac) - enable-warnings = false - [llvm.build-config] - CMAKE_VERBOSE_MAKEFILE = "ON" - $(if ! tc-is-cross-compiler; then - # When cross-compiling, LLVM is compiled twice, once for host and - # once for target. Unfortunately, this build configuration applies - # to both, which means any flags applicable to one target but not - # the other will break. Conditionally disable respecting user - # flags when cross-compiling. - echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" - echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" - echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" - fi) - [build] - build-stage = 2 - test-stage = 2 - build = "${rust_build}" - host = ["${rust_host}"] - target = [${rust_targets}] - cargo = "${rust_stage0_root}/bin/cargo" - rustc = "${rust_stage0_root}/bin/rustc" - rustfmt = "${rust_stage0_root}/bin/rustfmt" - docs = $(toml_usex doc) - compiler-docs = false - submodules = false - python = "${EPYTHON}" - locked-deps = true - vendor = true - extended = true - tools = [${tools}] - verbose = 2 - sanitizers = false - profiler = true - cargo-native-static = false - [install] - prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" - sysconfdir = "etc" - docdir = "share/doc/rust" - bindir = "bin" - libdir = "lib" - mandir = "share/man" - [rust] - # https://github.com/rust-lang/rust/issues/54872 - codegen-units-std = 1 - optimize = true - debug = $(toml_usex debug) - debug-assertions = $(toml_usex debug) - debug-assertions-std = $(toml_usex debug) - debuginfo-level = $(usex debug 2 0) - debuginfo-level-rustc = $(usex debug 2 0) - debuginfo-level-std = $(usex debug 2 0) - debuginfo-level-tools = $(usex debug 2 0) - debuginfo-level-tests = 0 - backtrace = true - incremental = false - $(if ! tc-is-cross-compiler; then - echo "default-linker = \"$(tc-getCC)\"" - fi) - parallel-compiler = $(toml_usex parallel-compiler) - channel = "$(usex nightly nightly stable)" - description = "gentoo" - rpath = false - verbose-tests = true - optimize-tests = $(toml_usex !debug) - codegen-tests = true - dist-src = false - remap-debuginfo = true - lld = $(usex system-llvm false $(toml_usex wasm)) - # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it - # https://github.com/rust-lang/rust/issues/74976 - # https://github.com/rust-lang/rust/issues/76526 - deny-warnings = $(usex wasm $(usex doc false true) true) - backtrace-on-ice = true - jemalloc = false - # See https://github.com/rust-lang/rust/issues/121124 - lto = "$(usex lto thin off)" - [dist] - src-tarball = false - compression-formats = ["xz"] - compression-profile = "balanced" - _EOF_ - - for v in $(multilib_get_enabled_abi_pairs); do - rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) - arch_cflags="$(get_abi_CFLAGS ${v##*.})" - - export CFLAGS_${rust_target//-/_}="${arch_cflags}" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${rust_target}] - ar = "$(tc-getAR)" - cc = "$(tc-getCC)" - cxx = "$(tc-getCXX)" - linker = "$(tc-getCC)" - ranlib = "$(tc-getRANLIB)" - llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; - # but we patch it and set to false here as well - if use elibc_musl; then - cat <<- _EOF_ >> "${S}"/config.toml - crt-static = false - musl-root = "$($(tc-getCC) -print-sysroot)/usr" - _EOF_ - fi - done - if use wasm; then - wasm_target="wasm32-unknown-unknown" - export CFLAGS_${wasm_target//-/_}="$(filter-flags '-mcpu*' '-march*' '-mtune*'; echo "$CFLAGS")" - cat <<- _EOF_ >> "${S}"/config.toml - [target.wasm32-unknown-unknown] - linker = "$(usex system-llvm lld rust-lld)" - # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 - profiler = false - _EOF_ - fi - - if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below - # experimental cross support - # discussion: https://bugs.gentoo.org/679878 - # TODO: c*flags, clang, system-llvm, cargo.eclass target support - # it would be much better if we could split out stdlib - # complilation to separate ebuild and abuse CATEGORY to - # just install to /usr/lib/rustlib/ - - # extra targets defined as a bash array - # spec format: :: - # best place would be /etc/portage/env/dev-lang/rust - # Example: - # RUST_CROSS_TARGETS=( - # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" - # ) - # no extra hand holding is done, no target transformations, all - # values are passed as-is with just basic checks, so it's up to user to supply correct values - # valid rust targets can be obtained with - # rustc --print target-list - # matching cross toolchain has to be installed - # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) - # only gcc toolchains installed with crossdev are checked for now. - - # BUG: we can't pass host flags to cross compiler, so just filter for now - # BUG: this should be more fine-grained. - filter-flags '-mcpu=*' '-march=*' '-mtune=*' - - local cross_target_spec - for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do - # extracts first element form :: - local cross_llvm_target="${cross_target_spec%%:*}" - # extracts toolchain triples, : - local cross_triples="${cross_target_spec#*:}" - # extracts first element after before : separator - local cross_rust_target="${cross_triples%%:*}" - # extracts last element after : separator - local cross_toolchain="${cross_triples##*:}" - use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" - command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${cross_rust_target}] - ar = "${cross_toolchain}-ar" - cc = "${cross_toolchain}-gcc" - cxx = "${cross_toolchain}-g++" - linker = "${cross_toolchain}-gcc" - ranlib = "${cross_toolchain}-ranlib" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - if [[ "${cross_toolchain}" == *-musl* ]]; then - cat <<- _EOF_ >> "${S}"/config.toml - musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" - _EOF_ - fi - - # append cross target to "normal" target list - # example 'target = ["powerpc64le-unknown-linux-gnu"]' - # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' - - rust_targets="${rust_targets},\"${cross_rust_target}\"" - sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die - - ewarn - ewarn "Enabled ${cross_rust_target} rust target" - ewarn "Using ${cross_toolchain} cross toolchain" - ewarn - if ! has_version -b 'sys-devel/binutils[multitarget]' ; then - ewarn "'sys-devel/binutils[multitarget]' is not installed" - ewarn "'strip' will be unable to strip cross libraries" - ewarn "cross targets will be installed with full debug information" - ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" - ewarn - ewarn "Alternatively llvm-strip can be used, it supports stripping any target" - ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" - ewarn - fi - done - fi # I_KNOW_WHAT_I_AM_DOING_CROSS - - einfo "Rust configured with the following flags:" - echo - echo RUSTFLAGS="\"${RUSTFLAGS}\"" - echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" - echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" - echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" - env | grep "CARGO_TARGET_.*_RUSTFLAGS=" - env | grep "CFLAGS_.*" - echo - einfo "config.toml contents:" - cat "${S}"/config.toml || die - echo -} - -src_compile() { - RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die -} - -src_test() { - # https://rustc-dev-guide.rust-lang.org/tests/intro.html - - # those are basic and codegen tests. - local tests=( - codegen - codegen-units - compile-fail - incremental - mir-opt - pretty - run-make - ) - - # fails if llvm is not built with ALL targets. - # and known to fail with system llvm sometimes. - use system-llvm || tests+=( assembly ) - - # fragile/expensive/less important tests - # or tests that require extra builds - # TODO: instead of skipping, just make some nonfatal. - if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then - tests+=( - rustdoc - rustdoc-js - rustdoc-js-std - rustdoc-ui - run-make-fulldeps - ui - ui-fulldeps - ) - fi - - local i failed=() - einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" - for i in "${tests[@]}"; do - local t="src/test/${i}" - einfo "rust_src_test: running ${t}" - if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ - -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" - then - failed+=( "${t}" ) - eerror "rust_src_test: ${t} failed" - fi - done - - if [[ ${#failed[@]} -ne 0 ]]; then - eerror "rust_src_test: failure summary: ${failed[@]}" - die "aborting due to test failures" - fi -} - -src_install() { - DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die - - # bug #689562, #689160 - rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die - rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use miri && symlinks+=( miri cargo-miri ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- - # need to fix eselect-rust to remove this hack. - local ver_i="${i}-${PV}" - if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then - einfo "Installing ${i} symlink" - ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die - else - ewarn "${i} symlink requested, but source file not found" - ewarn "please report this" - fi - dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" - use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" - dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" - dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" - dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" - - newenvd - "50${P}" <<-_EOF_ - LDPATH="${EPREFIX}/usr/lib/rust/lib-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" - _EOF_ - - rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use miri; then - echo /usr/bin/miri >> "${T}/provider-${P}" - echo /usr/bin/cargo-miri >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/lib/rust/libexec >> "${T}/provider-${P}" - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - - if use dist; then - "${EPYTHON}" ./x.py dist -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die - insinto "/usr/lib/${PN}/${PV}/dist" - doins -r "${S}/build/dist/." - fi -} - -pkg_preinst() { - # 943308 and friends; basically --keep-going can forget to unmerge old rust - # but the soft blocker allows us to install conflicting files. - # This results in duplicated .{rlib,so} files which confuses rustc and results in - # the need for manual intervention. - if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then - # we need to find all .{rlib,so} files in the old rust lib directory - # and store them in an array for later use - readarray -d '' old_rust_libs < <( - find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ - -type f \( -name '*.rlib' -o -name '*.so' \) -print0) - export old_rust_libs - if [[ ${#old_rust_libs[@]} -gt 0 ]]; then - einfo "Found old .rlib and .so files in the old rust lib directory" - else - die "Found no old .rlib and .so files but old rust version is installed. Bailing!" - fi - fi -} - -pkg_postinst() { - - local old_rust="dev-lang/rust:stable/$(ver_cut 1-2)" - if has_version -b ${old_rust}; then - # Be _extra_ careful here as we're removing files from the live filesystem - local f - local only_one_file=() - einfo "Tidying up libraries files from non-slotted \`${old_rust}\`." - for f in "${old_rust_libs[@]}"; do - [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" - local base_name="${f%-*}" - local ext="${f##*.}" - local matching_files=("${base_name}"-*.${ext}) - case ${#matching_files[@]} in - 2) - einfo "Removing old .${ext}: ${f}" - rm "${f}" || die - ;; - 1) - # Turns out fingerprints are not as unique as we'd thought, _sometimes_ they collide, - # so we may have already installed over the old file. - # We'll warn about this just in case, but it's probably fine. - only_one_file+=( "${matching_files[0]}" ) - ;; - *) - die "Expected one or two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" - ;; - esac - done - if [[ ${#only_one_file} -gt 0 ]]; then - einfo "While tidying up non-slotted rust libraries for \`${old_rust}\`," - einfo "the following file(s) did not have a duplicate where one was expected:" - for f in "${only_one_file[@]}"; do - einfo " * ${f}" - done - einfo "" - einfo "This is unlikely to cause problems; the fingerprint for the library ended up being the same." - einfo "However, if you encounter any issues please report them to the Gentoo Rust Team." - fi - fi - - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - optfeature "Emacs support" "app-emacs/rust-mode" - optfeature "Vim support" "app-vim/rust-vim" -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust/rust-1.81.0-r101.ebuild b/dev-lang/rust/rust-1.81.0-r101.ebuild new file mode 100644 index 000000000000..01d49bc018e9 --- /dev/null +++ b/dev-lang/rust/rust-1.81.0-r101.ebuild @@ -0,0 +1,745 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 18 ) +PYTHON_COMPAT=( python3_{10..13} ) + +RUST_MAX_VER=${PV} +RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" + +inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing optfeature \ + multilib multilib-build python-any-r1 rust rust-toolchain toolchain-funcs verify-sig + +if [[ ${PV} = *beta* ]]; then + betaver=${PV//*beta} + BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" + MY_P="rustc-beta" + SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" +else + MY_P="rustc-${PV}" + SRC="${MY_P}-src.tar.xz" + KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv sparc x86" +fi + +RUST_STAGE0_VERSION="1.$(($(ver_cut 2) - 1)).1" +DESCRIPTION="Systems programming language from Mozilla" +HOMEPAGE="https://www.rust-lang.org/" + +SRC_URI=" + https://static.rust-lang.org/dist/${SRC} + verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) +" +S="${WORKDIR}/${MY_P}-src" + +# keep in sync with llvm ebuild of the same version as bundled one. +ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai + LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE + WebAssembly X86 XCore Xtensa ) +ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) +LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} + +ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" +SLOT="${PV}" + +IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" + +LLVM_DEPEND=() +# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation +for _x in "${ALL_LLVM_TARGETS[@]}"; do + LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) +done +LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) +LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) + +BDEPEND="${PYTHON_DEPS} + app-eselect/eselect-rust + || ( + >=sys-devel/gcc-4.7 + >=llvm-core/clang-3.5 + ) + !system-llvm? ( + >=dev-build/cmake-3.13.4 + app-alternatives/ninja + ) + test? ( dev-debug/gdb ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +DEPEND=" + >=app-arch/xz-utils-5.2 + net-misc/curl:=[http2,ssl] + sys-libs/zlib:= + dev-libs/openssl:0= + system-llvm? ( + ${LLVM_DEPEND[*]} + llvm-libunwind? ( llvm-runtimes/libunwind:= ) + ) + !system-llvm? ( + !llvm-libunwind? ( + elibc_musl? ( sys-libs/libunwind:= ) + ) + ) +" + +RDEPEND="${DEPEND} + app-eselect/eselect-rust + dev-lang/rust-common + sys-apps/lsb-release + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" + +REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) + miri? ( nightly ) + parallel-compiler? ( nightly ) + rust-analyzer? ( rust-src ) + test? ( ${ALL_LLVM_TARGETS[*]} ) + wasm? ( llvm_targets_WebAssembly ) + x86? ( cpu_flags_x86_sse2 ) +" + +# we don't use cmake.eclass, but can get a warning +CMAKE_WARN_UNUSED_CLI=no + +QA_FLAGS_IGNORED=" + usr/lib/${PN}/${PV}/bin/.* + usr/lib/${PN}/${PV}/libexec/.* + usr/lib/${PN}/${PV}/lib/lib.*.so + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_SONAME=" + usr/lib/${PN}/${PV}/lib/lib.*.so.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_PRESTRIPPED=" + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +# causes double bootstrap +RESTRICT="test" + +VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc + +PATCHES=( + "${FILESDIR}"/1.78.0-musl-dynamic-linking.patch + "${FILESDIR}"/1.74.1-cross-compile-libz.patch + #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch # pending refresh + "${FILESDIR}"/1.67.0-doc-wasm.patch + "${FILESDIR}"/1.79.0-revert-8c40426.patch + "${FILESDIR}/1.81.0-backport-bug937164.patch" + "${FILESDIR}/1.81.0-backport-llvm-pr101761.patch" + "${FILESDIR}/1.81.0-backport-llvm-pr101766.patch" +) + +clear_vendor_checksums() { + sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die +} + +toml_usex() { + usex "${1}" true false +} + +pre_build_checks() { + local M=9216 + # multiply requirements by 1.3 if we are doing x86-multilib + if use amd64; then + M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) + fi + M=$(( $(usex clippy 128 0) + ${M} )) + M=$(( $(usex miri 128 0) + ${M} )) + M=$(( $(usex rustfmt 256 0) + ${M} )) + # add 2G if we compile llvm and 256M per llvm_target + if ! use system-llvm; then + M=$(( 2048 + ${M} )) + local ltarget + for ltarget in ${ALL_LLVM_TARGETS[@]}; do + M=$(( $(usex ${ltarget} 256 0) + ${M} )) + done + fi + M=$(( $(usex wasm 256 0) + ${M} )) + M=$(( $(usex debug 2 1) * ${M} )) + eshopts_push -s extglob + if is-flagq '-g?(gdb)?([1-9])'; then + M=$(( 15 * ${M} / 10 )) + fi + eshopts_pop + M=$(( $(usex doc 256 0) + ${M} )) + CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} +} + +llvm_check_deps() { + has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" +} + +# Is LLVM being linked against libc++? +is_libcxx_linked() { + local code='#include +#if defined(_LIBCPP_VERSION) + HAVE_LIBCXX +#endif +' + local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 + [[ ${out} == *HAVE_LIBCXX* ]] +} + +pkg_pretend() { + pre_build_checks +} + +pkg_setup() { + pre_build_checks + python-any-r1_pkg_setup + + export LIBGIT2_NO_PKG_CONFIG=1 #749381 + if tc-is-cross-compiler; then + use system-llvm && die "USE=system-llvm not allowed when cross-compiling" + local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" + use "llvm_targets_${cross_llvm_target}" || \ + die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" + fi + + rust_pkg_setup + + if use system-llvm; then + llvm-r1_pkg_setup + + local llvm_config="$(get_llvm_prefix)/bin/llvm-config" + export LLVM_LINK_SHARED=1 + export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" + fi +} + +src_configure() { + if tc-is-cross-compiler; then + export PKG_CONFIG_ALLOW_CROSS=1 + export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" + export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" + export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" + fi + + filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 + + local rust_target="" rust_targets="" arch_cflags + + # Collect rust target names to compile standard libs for all ABIs. + for v in $(multilib_get_enabled_abi_pairs); do + rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" + done + if use wasm; then + rust_targets+=",\"wasm32-unknown-unknown\"" + if use system-llvm; then + # un-hardcode rust-lld linker for this target + # https://bugs.gentoo.org/715348 + sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/base/wasm.rs || die + fi + fi + rust_targets="${rust_targets#,}" + + # cargo and rustdoc are mandatory and should always be included + local tools='"cargo","rustdoc"' + use clippy && tools+=',"clippy"' + use miri && tools+=',"miri"' + use rustfmt && tools+=',"rustfmt"' + use rust-analyzer && tools+=',"rust-analyzer","rust-analyzer-proc-macro-srv"' + use rust-src && tools+=',"src"' + + local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" + # in case of prefix it will be already prefixed, as --print sysroot returns full path + [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" + + rust_target="$(rust_abi)" + rust_build="$(rust_abi "${CBUILD}")" + rust_host="$(rust_abi "${CHOST}")" + + LLVM_EXPERIMENTAL_TARGETS=() + for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do + if use llvm_targets_${_x} ; then + LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) + fi + done + LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} + + local cm_btype="$(usex debug DEBUG RELEASE)" + cat <<- _EOF_ > "${S}"/config.toml + [llvm] + download-ci-llvm = false + optimize = $(toml_usex !debug) + release-debuginfo = $(toml_usex debug) + assertions = $(toml_usex debug) + ninja = true + targets = "${LLVM_TARGETS// /;}" + experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" + link-shared = $(toml_usex system-llvm) + $(if is_libcxx_linked; then + # https://bugs.gentoo.org/732632 + echo "use-libcxx = true" + echo "static-libstdcpp = false" + fi) + $(case "${rust_target}" in + i586-*-linux-*) + # https://github.com/rust-lang/rust/issues/93059 + echo 'cflags = "-fcf-protection=none"' + echo 'cxxflags = "-fcf-protection=none"' + echo 'ldflags = "-fcf-protection=none"' + ;; + *) + ;; + esac) + enable-warnings = false + [llvm.build-config] + CMAKE_VERBOSE_MAKEFILE = "ON" + $(if ! tc-is-cross-compiler; then + # When cross-compiling, LLVM is compiled twice, once for host and + # once for target. Unfortunately, this build configuration applies + # to both, which means any flags applicable to one target but not + # the other will break. Conditionally disable respecting user + # flags when cross-compiling. + echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" + echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" + echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" + fi) + [build] + build-stage = 2 + test-stage = 2 + build = "${rust_build}" + host = ["${rust_host}"] + target = [${rust_targets}] + cargo = "${rust_stage0_root}/bin/cargo" + rustc = "${rust_stage0_root}/bin/rustc" + rustfmt = "${rust_stage0_root}/bin/rustfmt" + docs = $(toml_usex doc) + compiler-docs = false + submodules = false + python = "${EPYTHON}" + locked-deps = true + vendor = true + extended = true + tools = [${tools}] + verbose = 2 + sanitizers = false + profiler = true + cargo-native-static = false + [install] + prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" + sysconfdir = "etc" + docdir = "share/doc/rust" + bindir = "bin" + libdir = "lib" + mandir = "share/man" + [rust] + # https://github.com/rust-lang/rust/issues/54872 + codegen-units-std = 1 + optimize = true + debug = $(toml_usex debug) + debug-assertions = $(toml_usex debug) + debug-assertions-std = $(toml_usex debug) + debuginfo-level = $(usex debug 2 0) + debuginfo-level-rustc = $(usex debug 2 0) + debuginfo-level-std = $(usex debug 2 0) + debuginfo-level-tools = $(usex debug 2 0) + debuginfo-level-tests = 0 + backtrace = true + incremental = false + $(if ! tc-is-cross-compiler; then + echo "default-linker = \"$(tc-getCC)\"" + fi) + parallel-compiler = $(toml_usex parallel-compiler) + channel = "$(usex nightly nightly stable)" + description = "gentoo" + rpath = true + verbose-tests = true + optimize-tests = $(toml_usex !debug) + codegen-tests = true + dist-src = false + remap-debuginfo = true + lld = $(usex system-llvm false $(toml_usex wasm)) + # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it + # https://github.com/rust-lang/rust/issues/74976 + # https://github.com/rust-lang/rust/issues/76526 + deny-warnings = $(usex wasm $(usex doc false true) true) + backtrace-on-ice = true + jemalloc = false + # See https://github.com/rust-lang/rust/issues/121124 + lto = "$(usex lto thin off)" + [dist] + src-tarball = false + compression-formats = ["xz"] + compression-profile = "balanced" + _EOF_ + + for v in $(multilib_get_enabled_abi_pairs); do + rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) + arch_cflags="$(get_abi_CFLAGS ${v##*.})" + + export CFLAGS_${rust_target//-/_}="${arch_cflags}" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${rust_target}] + ar = "$(tc-getAR)" + cc = "$(tc-getCC)" + cxx = "$(tc-getCXX)" + linker = "$(tc-getCC)" + ranlib = "$(tc-getRANLIB)" + llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; + # but we patch it and set to false here as well + if use elibc_musl; then + cat <<- _EOF_ >> "${S}"/config.toml + crt-static = false + musl-root = "$($(tc-getCC) -print-sysroot)/usr" + _EOF_ + fi + done + if use wasm; then + wasm_target="wasm32-unknown-unknown" + export CFLAGS_${wasm_target//-/_}="$(filter-flags '-mcpu*' '-march*' '-mtune*'; echo "$CFLAGS")" + cat <<- _EOF_ >> "${S}"/config.toml + [target.wasm32-unknown-unknown] + linker = "$(usex system-llvm lld rust-lld)" + # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 + profiler = false + _EOF_ + fi + + if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below + # experimental cross support + # discussion: https://bugs.gentoo.org/679878 + # TODO: c*flags, clang, system-llvm, cargo.eclass target support + # it would be much better if we could split out stdlib + # complilation to separate ebuild and abuse CATEGORY to + # just install to /usr/lib/rustlib/ + + # extra targets defined as a bash array + # spec format: :: + # best place would be /etc/portage/env/dev-lang/rust + # Example: + # RUST_CROSS_TARGETS=( + # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" + # ) + # no extra hand holding is done, no target transformations, all + # values are passed as-is with just basic checks, so it's up to user to supply correct values + # valid rust targets can be obtained with + # rustc --print target-list + # matching cross toolchain has to be installed + # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) + # only gcc toolchains installed with crossdev are checked for now. + + # BUG: we can't pass host flags to cross compiler, so just filter for now + # BUG: this should be more fine-grained. + filter-flags '-mcpu=*' '-march=*' '-mtune=*' + + local cross_target_spec + for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do + # extracts first element form :: + local cross_llvm_target="${cross_target_spec%%:*}" + # extracts toolchain triples, : + local cross_triples="${cross_target_spec#*:}" + # extracts first element after before : separator + local cross_rust_target="${cross_triples%%:*}" + # extracts last element after : separator + local cross_toolchain="${cross_triples##*:}" + use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" + command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${cross_rust_target}] + ar = "${cross_toolchain}-ar" + cc = "${cross_toolchain}-gcc" + cxx = "${cross_toolchain}-g++" + linker = "${cross_toolchain}-gcc" + ranlib = "${cross_toolchain}-ranlib" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + if [[ "${cross_toolchain}" == *-musl* ]]; then + cat <<- _EOF_ >> "${S}"/config.toml + musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" + _EOF_ + fi + + # append cross target to "normal" target list + # example 'target = ["powerpc64le-unknown-linux-gnu"]' + # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' + + rust_targets="${rust_targets},\"${cross_rust_target}\"" + sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die + + ewarn + ewarn "Enabled ${cross_rust_target} rust target" + ewarn "Using ${cross_toolchain} cross toolchain" + ewarn + if ! has_version -b 'sys-devel/binutils[multitarget]' ; then + ewarn "'sys-devel/binutils[multitarget]' is not installed" + ewarn "'strip' will be unable to strip cross libraries" + ewarn "cross targets will be installed with full debug information" + ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" + ewarn + ewarn "Alternatively llvm-strip can be used, it supports stripping any target" + ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" + ewarn + fi + done + fi # I_KNOW_WHAT_I_AM_DOING_CROSS + + einfo "Rust configured with the following flags:" + echo + echo RUSTFLAGS="\"${RUSTFLAGS}\"" + echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" + echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" + echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" + env | grep "CARGO_TARGET_.*_RUSTFLAGS=" + env | grep "CFLAGS_.*" + echo + einfo "config.toml contents:" + cat "${S}"/config.toml || die + echo +} + +src_compile() { + RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die +} + +src_test() { + # https://rustc-dev-guide.rust-lang.org/tests/intro.html + + # those are basic and codegen tests. + local tests=( + codegen + codegen-units + compile-fail + incremental + mir-opt + pretty + run-make + ) + + # fails if llvm is not built with ALL targets. + # and known to fail with system llvm sometimes. + use system-llvm || tests+=( assembly ) + + # fragile/expensive/less important tests + # or tests that require extra builds + # TODO: instead of skipping, just make some nonfatal. + if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then + tests+=( + rustdoc + rustdoc-js + rustdoc-js-std + rustdoc-ui + run-make-fulldeps + ui + ui-fulldeps + ) + fi + + local i failed=() + einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" + for i in "${tests[@]}"; do + local t="src/test/${i}" + einfo "rust_src_test: running ${t}" + if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ + -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" + then + failed+=( "${t}" ) + eerror "rust_src_test: ${t} failed" + fi + done + + if [[ ${#failed[@]} -ne 0 ]]; then + eerror "rust_src_test: failure summary: ${failed[@]}" + die "aborting due to test failures" + fi +} + +src_install() { + DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die + + # bug #689562, #689160 + rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die + rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die + + local symlinks=( + cargo + rustc + rustdoc + rust-gdb + rust-gdbgui + rust-lldb + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use miri && symlinks+=( miri cargo-miri ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- + # need to fix eselect-rust to remove this hack. + local ver_i="${i}-${PV}" + if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then + einfo "Installing ${i} symlink" + ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die + else + ewarn "${i} symlink requested, but source file not found" + ewarn "please report this" + fi + dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" + use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" + dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" + dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" + dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" + + newenvd - "50${P}" <<-_EOF_ + MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" + _EOF_ + + rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use miri; then + echo /usr/bin/miri >> "${T}/provider-${P}" + echo /usr/bin/cargo-miri >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/lib/rust/libexec >> "${T}/provider-${P}" + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + + if use dist; then + "${EPYTHON}" ./x.py dist -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die + insinto "/usr/lib/${PN}/${PV}/dist" + doins -r "${S}/build/dist/." + fi +} + +pkg_preinst() { + # 943308 and friends; basically --keep-going can forget to unmerge old rust + # but the soft blocker allows us to install conflicting files. + # This results in duplicated .{rlib,so} files which confuses rustc and results in + # the need for manual intervention. + if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then + # we need to find all .{rlib,so} files in the old rust lib directory + # and store them in an array for later use + readarray -d '' old_rust_libs < <( + find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ + -type f \( -name '*.rlib' -o -name '*.so' \) -print0) + export old_rust_libs + if [[ ${#old_rust_libs[@]} -gt 0 ]]; then + einfo "Found old .rlib and .so files in the old rust lib directory" + else + die "Found no old .rlib and .so files but old rust version is installed. Bailing!" + fi + fi +} + +pkg_postinst() { + + local old_rust="dev-lang/rust:stable/$(ver_cut 1-2)" + if has_version -b ${old_rust}; then + # Be _extra_ careful here as we're removing files from the live filesystem + local f + local only_one_file=() + einfo "Tidying up libraries files from non-slotted \`${old_rust}\`." + for f in "${old_rust_libs[@]}"; do + [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" + local base_name="${f%-*}" + local ext="${f##*.}" + local matching_files=("${base_name}"-*.${ext}) + case ${#matching_files[@]} in + 2) + einfo "Removing old .${ext}: ${f}" + rm "${f}" || die + ;; + 1) + # Turns out fingerprints are not as unique as we'd thought, _sometimes_ they collide, + # so we may have already installed over the old file. + # We'll warn about this just in case, but it's probably fine. + only_one_file+=( "${matching_files[0]}" ) + ;; + *) + die "Expected one or two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" + ;; + esac + done + if [[ ${#only_one_file} -gt 0 ]]; then + einfo "While tidying up non-slotted rust libraries for \`${old_rust}\`," + einfo "the following file(s) did not have a duplicate where one was expected:" + for f in "${only_one_file[@]}"; do + einfo " * ${f}" + done + einfo "" + einfo "This is unlikely to cause problems; the fingerprint for the library ended up being the same." + einfo "However, if you encounter any issues please report them to the Gentoo Rust Team." + fi + fi + + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + optfeature "Emacs support" "app-emacs/rust-mode" + optfeature "Vim support" "app-vim/rust-vim" +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust/rust-1.82.0-r100.ebuild b/dev-lang/rust/rust-1.82.0-r100.ebuild deleted file mode 100644 index 25fbe716b6a7..000000000000 --- a/dev-lang/rust/rust-1.82.0-r100.ebuild +++ /dev/null @@ -1,756 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 19 ) -PYTHON_COMPAT=( python3_{10..13} ) - -RUST_MAX_VER=${PV} -RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" - -inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing optfeature \ - multilib multilib-build python-any-r1 rust rust-toolchain toolchain-funcs verify-sig - -if [[ ${PV} = *beta* ]]; then - betaver=${PV//*beta} - BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" - MY_P="rustc-beta" - SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" -else - MY_P="rustc-${PV}" - SRC="${MY_P}-src.tar.xz" - KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv sparc x86" -fi - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" - -SRC_URI=" - https://static.rust-lang.org/dist/${SRC} - verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) -" -S="${WORKDIR}/${MY_P}-src" - -# keep in sync with llvm ebuild of the same version as bundled one. -ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai - LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE - WebAssembly X86 XCore Xtensa ) -ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) -LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} - -ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" - -IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" - -LLVM_DEPEND=() -# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation -for _x in "${ALL_LLVM_TARGETS[@]}"; do - LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) -done -LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) -LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) - -BDEPEND="${PYTHON_DEPS} - app-eselect/eselect-rust - || ( - >=sys-devel/gcc-4.7 - >=llvm-core/clang-3.5 - ) - !system-llvm? ( - >=dev-build/cmake-3.13.4 - app-alternatives/ninja - ) - test? ( dev-debug/gdb ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -DEPEND=" - >=app-arch/xz-utils-5.2 - net-misc/curl:=[http2,ssl] - sys-libs/zlib:= - dev-libs/openssl:0= - system-llvm? ( - ${LLVM_DEPEND[*]} - llvm-libunwind? ( llvm-runtimes/libunwind:= ) - ) - !system-llvm? ( - !llvm-libunwind? ( - elibc_musl? ( sys-libs/libunwind:= ) - ) - ) -" - -RDEPEND="${DEPEND} - app-eselect/eselect-rust - dev-lang/rust-common - sys-apps/lsb-release - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" - -REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) - miri? ( nightly ) - parallel-compiler? ( nightly ) - rust-analyzer? ( rust-src ) - test? ( ${ALL_LLVM_TARGETS[*]} ) - wasm? ( llvm_targets_WebAssembly ) - x86? ( cpu_flags_x86_sse2 ) -" - -# we don't use cmake.eclass, but can get a warning -CMAKE_WARN_UNUSED_CLI=no - -QA_FLAGS_IGNORED=" - usr/lib/${PN}/${PV}/bin/.* - usr/lib/${PN}/${PV}/libexec/.* - usr/lib/${PN}/${PV}/lib/lib.*.so - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_SONAME=" - usr/lib/${PN}/${PV}/lib/lib.*.so.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_PRESTRIPPED=" - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -# causes double bootstrap -RESTRICT="test" - -VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc - -PATCHES=( - "${FILESDIR}"/1.78.0-musl-dynamic-linking.patch - "${FILESDIR}"/1.74.1-cross-compile-libz.patch - #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch # pending refresh - "${FILESDIR}"/1.67.0-doc-wasm.patch -) - -clear_vendor_checksums() { - sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die -} - -toml_usex() { - usex "${1}" true false -} - -pre_build_checks() { - local M=9216 - # multiply requirements by 1.3 if we are doing x86-multilib - if use amd64; then - M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) - fi - M=$(( $(usex clippy 128 0) + ${M} )) - M=$(( $(usex miri 128 0) + ${M} )) - M=$(( $(usex rustfmt 256 0) + ${M} )) - # add 2G if we compile llvm and 256M per llvm_target - if ! use system-llvm; then - M=$(( 2048 + ${M} )) - local ltarget - for ltarget in ${ALL_LLVM_TARGETS[@]}; do - M=$(( $(usex ${ltarget} 256 0) + ${M} )) - done - fi - M=$(( $(usex wasm 256 0) + ${M} )) - M=$(( $(usex debug 2 1) * ${M} )) - eshopts_push -s extglob - if is-flagq '-g?(gdb)?([1-9])'; then - M=$(( 15 * ${M} / 10 )) - fi - eshopts_pop - M=$(( $(usex doc 256 0) + ${M} )) - CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} -} - -llvm_check_deps() { - has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" -} - -# Is LLVM being linked against libc++? -is_libcxx_linked() { - local code='#include -#if defined(_LIBCPP_VERSION) - HAVE_LIBCXX -#endif -' - local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 - [[ ${out} == *HAVE_LIBCXX* ]] -} - -pkg_pretend() { - pre_build_checks -} - -pkg_setup() { - pre_build_checks - python-any-r1_pkg_setup - - export LIBGIT2_NO_PKG_CONFIG=1 #749381 - if tc-is-cross-compiler; then - use system-llvm && die "USE=system-llvm not allowed when cross-compiling" - local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" - use "llvm_targets_${cross_llvm_target}" || \ - die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" - fi - - rust_pkg_setup - - if use system-llvm; then - llvm-r1_pkg_setup - - local llvm_config="$(get_llvm_prefix)/bin/llvm-config" - export LLVM_LINK_SHARED=1 - export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" - fi -} - -src_prepare() { - # Rust baselines to Pentium4 on x86, this patch lowers the baseline to i586 when sse2 is not set. - if use x86; then - if ! use cpu_flags_x86_sse2; then - eapply "${FILESDIR}/1.82.0-i586-baseline.patch" - #grep -rl cmd.args.push\(\"-march=i686\" . | xargs sed -i 's/march=i686/-march=i586/g' || die - fi - fi - - default -} - -src_configure() { - if tc-is-cross-compiler; then - export PKG_CONFIG_ALLOW_CROSS=1 - export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" - export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" - export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" - fi - - filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 - - local rust_target="" rust_targets="" arch_cflags - - # Collect rust target names to compile standard libs for all ABIs. - for v in $(multilib_get_enabled_abi_pairs); do - rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" - done - if use wasm; then - rust_targets+=",\"wasm32-unknown-unknown\"" - if use system-llvm; then - # un-hardcode rust-lld linker for this target - # https://bugs.gentoo.org/715348 - sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/base/wasm.rs || die - fi - fi - rust_targets="${rust_targets#,}" - - # cargo and rustdoc are mandatory and should always be included - local tools='"cargo","rustdoc"' - use clippy && tools+=',"clippy"' - use miri && tools+=',"miri"' - use rustfmt && tools+=',"rustfmt"' - use rust-analyzer && tools+=',"rust-analyzer","rust-analyzer-proc-macro-srv"' - use rust-src && tools+=',"src"' - - local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" - # in case of prefix it will be already prefixed, as --print sysroot returns full path - [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" - - rust_target="$(rust_abi)" - rust_build="$(rust_abi "${CBUILD}")" - rust_host="$(rust_abi "${CHOST}")" - - LLVM_EXPERIMENTAL_TARGETS=() - for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do - if use llvm_targets_${_x} ; then - LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) - fi - done - LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} - - local cm_btype="$(usex debug DEBUG RELEASE)" - cat <<- _EOF_ > "${S}"/config.toml - [llvm] - download-ci-llvm = false - optimize = $(toml_usex !debug) - release-debuginfo = $(toml_usex debug) - assertions = $(toml_usex debug) - ninja = true - targets = "${LLVM_TARGETS// /;}" - experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" - link-shared = $(toml_usex system-llvm) - $(if is_libcxx_linked; then - # https://bugs.gentoo.org/732632 - echo "use-libcxx = true" - echo "static-libstdcpp = false" - fi) - $(case "${rust_target}" in - i586-*-linux-*) - # https://github.com/rust-lang/rust/issues/93059 - echo 'cflags = "-fcf-protection=none"' - echo 'cxxflags = "-fcf-protection=none"' - echo 'ldflags = "-fcf-protection=none"' - ;; - *) - ;; - esac) - enable-warnings = false - [llvm.build-config] - CMAKE_VERBOSE_MAKEFILE = "ON" - $(if ! tc-is-cross-compiler; then - # When cross-compiling, LLVM is compiled twice, once for host and - # once for target. Unfortunately, this build configuration applies - # to both, which means any flags applicable to one target but not - # the other will break. Conditionally disable respecting user - # flags when cross-compiling. - echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" - echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" - echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" - fi) - [build] - build-stage = 2 - test-stage = 2 - build = "${rust_build}" - host = ["${rust_host}"] - target = [${rust_targets}] - cargo = "${rust_stage0_root}/bin/cargo" - rustc = "${rust_stage0_root}/bin/rustc" - rustfmt = "${rust_stage0_root}/bin/rustfmt" - docs = $(toml_usex doc) - compiler-docs = false - submodules = false - python = "${EPYTHON}" - locked-deps = true - vendor = true - extended = true - tools = [${tools}] - verbose = 2 - sanitizers = false - profiler = true - cargo-native-static = false - [install] - prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" - sysconfdir = "etc" - docdir = "share/doc/rust" - bindir = "bin" - libdir = "lib" - mandir = "share/man" - [rust] - # https://github.com/rust-lang/rust/issues/54872 - codegen-units-std = 1 - optimize = true - debug = $(toml_usex debug) - debug-assertions = $(toml_usex debug) - debug-assertions-std = $(toml_usex debug) - debuginfo-level = $(usex debug 2 0) - debuginfo-level-rustc = $(usex debug 2 0) - debuginfo-level-std = $(usex debug 2 0) - debuginfo-level-tools = $(usex debug 2 0) - debuginfo-level-tests = 0 - backtrace = true - incremental = false - $(if ! tc-is-cross-compiler; then - echo "default-linker = \"$(tc-getCC)\"" - fi) - parallel-compiler = $(toml_usex parallel-compiler) - channel = "$(usex nightly nightly stable)" - description = "gentoo" - rpath = false - verbose-tests = true - optimize-tests = $(toml_usex !debug) - codegen-tests = true - dist-src = false - remap-debuginfo = true - lld = $(usex system-llvm false $(toml_usex wasm)) - # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it - # https://github.com/rust-lang/rust/issues/74976 - # https://github.com/rust-lang/rust/issues/76526 - deny-warnings = $(usex wasm $(usex doc false true) true) - backtrace-on-ice = true - jemalloc = false - # See https://github.com/rust-lang/rust/issues/121124 - lto = "$(usex lto thin off)" - [dist] - src-tarball = false - compression-formats = ["xz"] - compression-profile = "balanced" - _EOF_ - - for v in $(multilib_get_enabled_abi_pairs); do - rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) - arch_cflags="$(get_abi_CFLAGS ${v##*.})" - - export CFLAGS_${rust_target//-/_}="${arch_cflags}" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${rust_target}] - ar = "$(tc-getAR)" - cc = "$(tc-getCC)" - cxx = "$(tc-getCXX)" - linker = "$(tc-getCC)" - ranlib = "$(tc-getRANLIB)" - llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; - # but we patch it and set to false here as well - if use elibc_musl; then - cat <<- _EOF_ >> "${S}"/config.toml - crt-static = false - musl-root = "$($(tc-getCC) -print-sysroot)/usr" - _EOF_ - fi - done - if use wasm; then - wasm_target="wasm32-unknown-unknown" - export CFLAGS_${wasm_target//-/_}="$(filter-flags '-mcpu*' '-march*' '-mtune*'; echo "$CFLAGS")" - cat <<- _EOF_ >> "${S}"/config.toml - [target.wasm32-unknown-unknown] - linker = "$(usex system-llvm lld rust-lld)" - # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 - profiler = false - _EOF_ - fi - - if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below - # experimental cross support - # discussion: https://bugs.gentoo.org/679878 - # TODO: c*flags, clang, system-llvm, cargo.eclass target support - # it would be much better if we could split out stdlib - # complilation to separate ebuild and abuse CATEGORY to - # just install to /usr/lib/rustlib/ - - # extra targets defined as a bash array - # spec format: :: - # best place would be /etc/portage/env/dev-lang/rust - # Example: - # RUST_CROSS_TARGETS=( - # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" - # ) - # no extra hand holding is done, no target transformations, all - # values are passed as-is with just basic checks, so it's up to user to supply correct values - # valid rust targets can be obtained with - # rustc --print target-list - # matching cross toolchain has to be installed - # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) - # only gcc toolchains installed with crossdev are checked for now. - - # BUG: we can't pass host flags to cross compiler, so just filter for now - # BUG: this should be more fine-grained. - filter-flags '-mcpu=*' '-march=*' '-mtune=*' - - local cross_target_spec - for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do - # extracts first element form :: - local cross_llvm_target="${cross_target_spec%%:*}" - # extracts toolchain triples, : - local cross_triples="${cross_target_spec#*:}" - # extracts first element after before : separator - local cross_rust_target="${cross_triples%%:*}" - # extracts last element after : separator - local cross_toolchain="${cross_triples##*:}" - use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" - command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${cross_rust_target}] - ar = "${cross_toolchain}-ar" - cc = "${cross_toolchain}-gcc" - cxx = "${cross_toolchain}-g++" - linker = "${cross_toolchain}-gcc" - ranlib = "${cross_toolchain}-ranlib" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - if [[ "${cross_toolchain}" == *-musl* ]]; then - cat <<- _EOF_ >> "${S}"/config.toml - musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" - _EOF_ - fi - - # append cross target to "normal" target list - # example 'target = ["powerpc64le-unknown-linux-gnu"]' - # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' - - rust_targets="${rust_targets},\"${cross_rust_target}\"" - sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die - - ewarn - ewarn "Enabled ${cross_rust_target} rust target" - ewarn "Using ${cross_toolchain} cross toolchain" - ewarn - if ! has_version -b 'sys-devel/binutils[multitarget]' ; then - ewarn "'sys-devel/binutils[multitarget]' is not installed" - ewarn "'strip' will be unable to strip cross libraries" - ewarn "cross targets will be installed with full debug information" - ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" - ewarn - ewarn "Alternatively llvm-strip can be used, it supports stripping any target" - ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" - ewarn - fi - done - fi # I_KNOW_WHAT_I_AM_DOING_CROSS - - einfo "Rust configured with the following flags:" - echo - echo RUSTFLAGS="\"${RUSTFLAGS}\"" - echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" - echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" - echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" - env | grep "CARGO_TARGET_.*_RUSTFLAGS=" - env | grep "CFLAGS_.*" - echo - einfo "config.toml contents:" - cat "${S}"/config.toml || die - echo -} - -src_compile() { - RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die -} - -src_test() { - # https://rustc-dev-guide.rust-lang.org/tests/intro.html - - # those are basic and codegen tests. - local tests=( - codegen - codegen-units - compile-fail - incremental - mir-opt - pretty - run-make - ) - - # fails if llvm is not built with ALL targets. - # and known to fail with system llvm sometimes. - use system-llvm || tests+=( assembly ) - - # fragile/expensive/less important tests - # or tests that require extra builds - # TODO: instead of skipping, just make some nonfatal. - if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then - tests+=( - rustdoc - rustdoc-js - rustdoc-js-std - rustdoc-ui - run-make-fulldeps - ui - ui-fulldeps - ) - fi - - local i failed=() - einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" - for i in "${tests[@]}"; do - local t="src/test/${i}" - einfo "rust_src_test: running ${t}" - if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ - -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" - then - failed+=( "${t}" ) - eerror "rust_src_test: ${t} failed" - fi - done - - if [[ ${#failed[@]} -ne 0 ]]; then - eerror "rust_src_test: failure summary: ${failed[@]}" - die "aborting due to test failures" - fi -} - -src_install() { - DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die - - docompress /usr/lib/${PN}/${PV}/share/man/ - - # bug #689562, #689160 - rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die - rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use miri && symlinks+=( miri cargo-miri ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- - # need to fix eselect-rust to remove this hack. - local ver_i="${i}-${PV}" - if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then - einfo "Installing ${i} symlink" - ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die - else - ewarn "${i} symlink requested, but source file not found" - ewarn "please report this" - fi - dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" - use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" - dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" - dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" - dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" - - newenvd - "50${P}" <<-_EOF_ - LDPATH="${EPREFIX}/usr/lib/rust/lib-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" - _EOF_ - - rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use miri; then - echo /usr/bin/miri >> "${T}/provider-${P}" - echo /usr/bin/cargo-miri >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/lib/rust/libexec >> "${T}/provider-${P}" - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - - if use dist; then - "${EPYTHON}" ./x.py dist -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die - insinto "/usr/lib/${PN}/${PV}/dist" - doins -r "${S}/build/dist/." - fi -} - -pkg_preinst() { - # 943308 and friends; basically --keep-going can forget to unmerge old rust - # but the soft blocker allows us to install conflicting files. - # This results in duplicated .{rlib,so} files which confuses rustc and results in - # the need for manual intervention. - if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then - # we need to find all .{rlib,so} files in the old rust lib directory - # and store them in an array for later use - readarray -d '' old_rust_libs < <( - find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ - -type f \( -name '*.rlib' -o -name '*.so' \) -print0) - export old_rust_libs - if [[ ${#old_rust_libs[@]} -gt 0 ]]; then - einfo "Found old .rlib and .so files in the old rust lib directory" - else - die "Found no old .rlib and .so files but old rust version is installed. Bailing!" - fi - fi -} - -pkg_postinst() { - - local old_rust="dev-lang/rust:stable/$(ver_cut 1-2)" - if has_version -b ${old_rust}; then - # Be _extra_ careful here as we're removing files from the live filesystem - local f - local only_one_file=() - einfo "Tidying up libraries files from non-slotted \`${old_rust}\`." - for f in "${old_rust_libs[@]}"; do - [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" - local base_name="${f%-*}" - local ext="${f##*.}" - local matching_files=("${base_name}"-*.${ext}) - case ${#matching_files[@]} in - 2) - einfo "Removing old .${ext}: ${f}" - rm "${f}" || die - ;; - 1) - # Turns out fingerprints are not as unique as we'd thought, _sometimes_ they collide, - # so we may have already installed over the old file. - # We'll warn about this just in case, but it's probably fine. - only_one_file+=( "${matching_files[0]}" ) - ;; - *) - die "Expected one or two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" - ;; - esac - done - if [[ ${#only_one_file} -gt 0 ]]; then - einfo "While tidying up non-slotted rust libraries for \`${old_rust}\`," - einfo "the following file(s) did not have a duplicate where one was expected:" - for f in "${only_one_file[@]}"; do - einfo " * ${f}" - done - einfo "" - einfo "This is unlikely to cause problems; the fingerprint for the library ended up being the same." - einfo "However, if you encounter any issues please report them to the Gentoo Rust Team." - fi - fi - - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - optfeature "Emacs support" "app-emacs/rust-mode" - optfeature "Vim support" "app-vim/rust-vim" -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust/rust-1.82.0-r101.ebuild b/dev-lang/rust/rust-1.82.0-r101.ebuild deleted file mode 100644 index 1f70f958d492..000000000000 --- a/dev-lang/rust/rust-1.82.0-r101.ebuild +++ /dev/null @@ -1,757 +0,0 @@ -# Copyright 1999-2024 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 19 ) -PYTHON_COMPAT=( python3_{10..13} ) - -RUST_MAX_VER=${PV} -RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" - -inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing optfeature \ - multilib multilib-build python-any-r1 rust rust-toolchain toolchain-funcs verify-sig - -if [[ ${PV} = *beta* ]]; then - betaver=${PV//*beta} - BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" - MY_P="rustc-beta" - SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" -else - MY_P="rustc-${PV}" - SRC="${MY_P}-src.tar.xz" - KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv sparc x86" -fi - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" - -SRC_URI=" - https://static.rust-lang.org/dist/${SRC} - verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) -" -S="${WORKDIR}/${MY_P}-src" - -# keep in sync with llvm ebuild of the same version as bundled one. -ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai - LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE - WebAssembly X86 XCore Xtensa ) -ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) -LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} - -ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" - -IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" - -LLVM_DEPEND=() -# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation -for _x in "${ALL_LLVM_TARGETS[@]}"; do - LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) -done -LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) -LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) - -BDEPEND="${PYTHON_DEPS} - app-eselect/eselect-rust - || ( - >=sys-devel/gcc-4.7 - >=llvm-core/clang-3.5 - ) - !system-llvm? ( - >=dev-build/cmake-3.13.4 - app-alternatives/ninja - ) - test? ( dev-debug/gdb ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -DEPEND=" - >=app-arch/xz-utils-5.2 - net-misc/curl:=[http2,ssl] - sys-libs/zlib:= - dev-libs/openssl:0= - system-llvm? ( - ${LLVM_DEPEND[*]} - llvm-libunwind? ( llvm-runtimes/libunwind:= ) - ) - !system-llvm? ( - !llvm-libunwind? ( - elibc_musl? ( sys-libs/libunwind:= ) - ) - ) -" - -RDEPEND="${DEPEND} - app-eselect/eselect-rust - dev-lang/rust-common - sys-apps/lsb-release - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" - -REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) - miri? ( nightly ) - parallel-compiler? ( nightly ) - rust-analyzer? ( rust-src ) - test? ( ${ALL_LLVM_TARGETS[*]} ) - wasm? ( llvm_targets_WebAssembly ) - x86? ( cpu_flags_x86_sse2 ) -" - -# we don't use cmake.eclass, but can get a warning -CMAKE_WARN_UNUSED_CLI=no - -QA_FLAGS_IGNORED=" - usr/lib/${PN}/${PV}/bin/.* - usr/lib/${PN}/${PV}/libexec/.* - usr/lib/${PN}/${PV}/lib/lib.*.so - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_SONAME=" - usr/lib/${PN}/${PV}/lib/lib.*.so.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_PRESTRIPPED=" - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -# causes double bootstrap -RESTRICT="test" - -VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc - -PATCHES=( - "${FILESDIR}"/1.78.0-musl-dynamic-linking.patch - "${FILESDIR}"/1.74.1-cross-compile-libz.patch - #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch # pending refresh - "${FILESDIR}"/1.67.0-doc-wasm.patch - "${FILESDIR}"/1.82.0-dwarf-llvm-assertion.patch -) - -clear_vendor_checksums() { - sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die -} - -toml_usex() { - usex "${1}" true false -} - -pre_build_checks() { - local M=9216 - # multiply requirements by 1.3 if we are doing x86-multilib - if use amd64; then - M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) - fi - M=$(( $(usex clippy 128 0) + ${M} )) - M=$(( $(usex miri 128 0) + ${M} )) - M=$(( $(usex rustfmt 256 0) + ${M} )) - # add 2G if we compile llvm and 256M per llvm_target - if ! use system-llvm; then - M=$(( 2048 + ${M} )) - local ltarget - for ltarget in ${ALL_LLVM_TARGETS[@]}; do - M=$(( $(usex ${ltarget} 256 0) + ${M} )) - done - fi - M=$(( $(usex wasm 256 0) + ${M} )) - M=$(( $(usex debug 2 1) * ${M} )) - eshopts_push -s extglob - if is-flagq '-g?(gdb)?([1-9])'; then - M=$(( 15 * ${M} / 10 )) - fi - eshopts_pop - M=$(( $(usex doc 256 0) + ${M} )) - CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} -} - -llvm_check_deps() { - has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" -} - -# Is LLVM being linked against libc++? -is_libcxx_linked() { - local code='#include -#if defined(_LIBCPP_VERSION) - HAVE_LIBCXX -#endif -' - local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 - [[ ${out} == *HAVE_LIBCXX* ]] -} - -pkg_pretend() { - pre_build_checks -} - -pkg_setup() { - pre_build_checks - python-any-r1_pkg_setup - - export LIBGIT2_NO_PKG_CONFIG=1 #749381 - if tc-is-cross-compiler; then - use system-llvm && die "USE=system-llvm not allowed when cross-compiling" - local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" - use "llvm_targets_${cross_llvm_target}" || \ - die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" - fi - - rust_pkg_setup - - if use system-llvm; then - llvm-r1_pkg_setup - - local llvm_config="$(get_llvm_prefix)/bin/llvm-config" - export LLVM_LINK_SHARED=1 - export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" - fi -} - -src_prepare() { - # Rust baselines to Pentium4 on x86, this patch lowers the baseline to i586 when sse2 is not set. - if use x86; then - if ! use cpu_flags_x86_sse2; then - eapply "${FILESDIR}/1.82.0-i586-baseline.patch" - #grep -rl cmd.args.push\(\"-march=i686\" . | xargs sed -i 's/march=i686/-march=i586/g' || die - fi - fi - - default -} - -src_configure() { - if tc-is-cross-compiler; then - export PKG_CONFIG_ALLOW_CROSS=1 - export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" - export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" - export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" - fi - - filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 - - local rust_target="" rust_targets="" arch_cflags - - # Collect rust target names to compile standard libs for all ABIs. - for v in $(multilib_get_enabled_abi_pairs); do - rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" - done - if use wasm; then - rust_targets+=",\"wasm32-unknown-unknown\"" - if use system-llvm; then - # un-hardcode rust-lld linker for this target - # https://bugs.gentoo.org/715348 - sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/base/wasm.rs || die - fi - fi - rust_targets="${rust_targets#,}" - - # cargo and rustdoc are mandatory and should always be included - local tools='"cargo","rustdoc"' - use clippy && tools+=',"clippy"' - use miri && tools+=',"miri"' - use rustfmt && tools+=',"rustfmt"' - use rust-analyzer && tools+=',"rust-analyzer","rust-analyzer-proc-macro-srv"' - use rust-src && tools+=',"src"' - - local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" - # in case of prefix it will be already prefixed, as --print sysroot returns full path - [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" - - rust_target="$(rust_abi)" - rust_build="$(rust_abi "${CBUILD}")" - rust_host="$(rust_abi "${CHOST}")" - - LLVM_EXPERIMENTAL_TARGETS=() - for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do - if use llvm_targets_${_x} ; then - LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) - fi - done - LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} - - local cm_btype="$(usex debug DEBUG RELEASE)" - cat <<- _EOF_ > "${S}"/config.toml - [llvm] - download-ci-llvm = false - optimize = $(toml_usex !debug) - release-debuginfo = $(toml_usex debug) - assertions = $(toml_usex debug) - ninja = true - targets = "${LLVM_TARGETS// /;}" - experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" - link-shared = $(toml_usex system-llvm) - $(if is_libcxx_linked; then - # https://bugs.gentoo.org/732632 - echo "use-libcxx = true" - echo "static-libstdcpp = false" - fi) - $(case "${rust_target}" in - i586-*-linux-*) - # https://github.com/rust-lang/rust/issues/93059 - echo 'cflags = "-fcf-protection=none"' - echo 'cxxflags = "-fcf-protection=none"' - echo 'ldflags = "-fcf-protection=none"' - ;; - *) - ;; - esac) - enable-warnings = false - [llvm.build-config] - CMAKE_VERBOSE_MAKEFILE = "ON" - $(if ! tc-is-cross-compiler; then - # When cross-compiling, LLVM is compiled twice, once for host and - # once for target. Unfortunately, this build configuration applies - # to both, which means any flags applicable to one target but not - # the other will break. Conditionally disable respecting user - # flags when cross-compiling. - echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" - echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" - echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" - fi) - [build] - build-stage = 2 - test-stage = 2 - build = "${rust_build}" - host = ["${rust_host}"] - target = [${rust_targets}] - cargo = "${rust_stage0_root}/bin/cargo" - rustc = "${rust_stage0_root}/bin/rustc" - rustfmt = "${rust_stage0_root}/bin/rustfmt" - docs = $(toml_usex doc) - compiler-docs = false - submodules = false - python = "${EPYTHON}" - locked-deps = true - vendor = true - extended = true - tools = [${tools}] - verbose = 2 - sanitizers = false - profiler = true - cargo-native-static = false - [install] - prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" - sysconfdir = "etc" - docdir = "share/doc/rust" - bindir = "bin" - libdir = "lib" - mandir = "share/man" - [rust] - # https://github.com/rust-lang/rust/issues/54872 - codegen-units-std = 1 - optimize = true - debug = $(toml_usex debug) - debug-assertions = $(toml_usex debug) - debug-assertions-std = $(toml_usex debug) - debuginfo-level = $(usex debug 2 0) - debuginfo-level-rustc = $(usex debug 2 0) - debuginfo-level-std = $(usex debug 2 0) - debuginfo-level-tools = $(usex debug 2 0) - debuginfo-level-tests = 0 - backtrace = true - incremental = false - $(if ! tc-is-cross-compiler; then - echo "default-linker = \"$(tc-getCC)\"" - fi) - parallel-compiler = $(toml_usex parallel-compiler) - channel = "$(usex nightly nightly stable)" - description = "gentoo" - rpath = false - verbose-tests = true - optimize-tests = $(toml_usex !debug) - codegen-tests = true - dist-src = false - remap-debuginfo = true - lld = $(usex system-llvm false $(toml_usex wasm)) - # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it - # https://github.com/rust-lang/rust/issues/74976 - # https://github.com/rust-lang/rust/issues/76526 - deny-warnings = $(usex wasm $(usex doc false true) true) - backtrace-on-ice = true - jemalloc = false - # See https://github.com/rust-lang/rust/issues/121124 - lto = "$(usex lto thin off)" - [dist] - src-tarball = false - compression-formats = ["xz"] - compression-profile = "balanced" - _EOF_ - - for v in $(multilib_get_enabled_abi_pairs); do - rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) - arch_cflags="$(get_abi_CFLAGS ${v##*.})" - - export CFLAGS_${rust_target//-/_}="${arch_cflags}" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${rust_target}] - ar = "$(tc-getAR)" - cc = "$(tc-getCC)" - cxx = "$(tc-getCXX)" - linker = "$(tc-getCC)" - ranlib = "$(tc-getRANLIB)" - llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; - # but we patch it and set to false here as well - if use elibc_musl; then - cat <<- _EOF_ >> "${S}"/config.toml - crt-static = false - musl-root = "$($(tc-getCC) -print-sysroot)/usr" - _EOF_ - fi - done - if use wasm; then - wasm_target="wasm32-unknown-unknown" - export CFLAGS_${wasm_target//-/_}="$(filter-flags '-mcpu*' '-march*' '-mtune*'; echo "$CFLAGS")" - cat <<- _EOF_ >> "${S}"/config.toml - [target.wasm32-unknown-unknown] - linker = "$(usex system-llvm lld rust-lld)" - # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 - profiler = false - _EOF_ - fi - - if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below - # experimental cross support - # discussion: https://bugs.gentoo.org/679878 - # TODO: c*flags, clang, system-llvm, cargo.eclass target support - # it would be much better if we could split out stdlib - # complilation to separate ebuild and abuse CATEGORY to - # just install to /usr/lib/rustlib/ - - # extra targets defined as a bash array - # spec format: :: - # best place would be /etc/portage/env/dev-lang/rust - # Example: - # RUST_CROSS_TARGETS=( - # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" - # ) - # no extra hand holding is done, no target transformations, all - # values are passed as-is with just basic checks, so it's up to user to supply correct values - # valid rust targets can be obtained with - # rustc --print target-list - # matching cross toolchain has to be installed - # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) - # only gcc toolchains installed with crossdev are checked for now. - - # BUG: we can't pass host flags to cross compiler, so just filter for now - # BUG: this should be more fine-grained. - filter-flags '-mcpu=*' '-march=*' '-mtune=*' - - local cross_target_spec - for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do - # extracts first element form :: - local cross_llvm_target="${cross_target_spec%%:*}" - # extracts toolchain triples, : - local cross_triples="${cross_target_spec#*:}" - # extracts first element after before : separator - local cross_rust_target="${cross_triples%%:*}" - # extracts last element after : separator - local cross_toolchain="${cross_triples##*:}" - use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" - command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${cross_rust_target}] - ar = "${cross_toolchain}-ar" - cc = "${cross_toolchain}-gcc" - cxx = "${cross_toolchain}-g++" - linker = "${cross_toolchain}-gcc" - ranlib = "${cross_toolchain}-ranlib" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - if [[ "${cross_toolchain}" == *-musl* ]]; then - cat <<- _EOF_ >> "${S}"/config.toml - musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" - _EOF_ - fi - - # append cross target to "normal" target list - # example 'target = ["powerpc64le-unknown-linux-gnu"]' - # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' - - rust_targets="${rust_targets},\"${cross_rust_target}\"" - sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die - - ewarn - ewarn "Enabled ${cross_rust_target} rust target" - ewarn "Using ${cross_toolchain} cross toolchain" - ewarn - if ! has_version -b 'sys-devel/binutils[multitarget]' ; then - ewarn "'sys-devel/binutils[multitarget]' is not installed" - ewarn "'strip' will be unable to strip cross libraries" - ewarn "cross targets will be installed with full debug information" - ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" - ewarn - ewarn "Alternatively llvm-strip can be used, it supports stripping any target" - ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" - ewarn - fi - done - fi # I_KNOW_WHAT_I_AM_DOING_CROSS - - einfo "Rust configured with the following flags:" - echo - echo RUSTFLAGS="\"${RUSTFLAGS}\"" - echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" - echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" - echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" - env | grep "CARGO_TARGET_.*_RUSTFLAGS=" - env | grep "CFLAGS_.*" - echo - einfo "config.toml contents:" - cat "${S}"/config.toml || die - echo -} - -src_compile() { - RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die -} - -src_test() { - # https://rustc-dev-guide.rust-lang.org/tests/intro.html - - # those are basic and codegen tests. - local tests=( - codegen - codegen-units - compile-fail - incremental - mir-opt - pretty - run-make - ) - - # fails if llvm is not built with ALL targets. - # and known to fail with system llvm sometimes. - use system-llvm || tests+=( assembly ) - - # fragile/expensive/less important tests - # or tests that require extra builds - # TODO: instead of skipping, just make some nonfatal. - if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then - tests+=( - rustdoc - rustdoc-js - rustdoc-js-std - rustdoc-ui - run-make-fulldeps - ui - ui-fulldeps - ) - fi - - local i failed=() - einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" - for i in "${tests[@]}"; do - local t="src/test/${i}" - einfo "rust_src_test: running ${t}" - if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ - -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" - then - failed+=( "${t}" ) - eerror "rust_src_test: ${t} failed" - fi - done - - if [[ ${#failed[@]} -ne 0 ]]; then - eerror "rust_src_test: failure summary: ${failed[@]}" - die "aborting due to test failures" - fi -} - -src_install() { - DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die - - docompress /usr/lib/${PN}/${PV}/share/man/ - - # bug #689562, #689160 - rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die - rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use miri && symlinks+=( miri cargo-miri ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- - # need to fix eselect-rust to remove this hack. - local ver_i="${i}-${PV}" - if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then - einfo "Installing ${i} symlink" - ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die - else - ewarn "${i} symlink requested, but source file not found" - ewarn "please report this" - fi - dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" - use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" - dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" - dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" - dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" - - newenvd - "50${P}" <<-_EOF_ - LDPATH="${EPREFIX}/usr/lib/rust/lib-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" - _EOF_ - - rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use miri; then - echo /usr/bin/miri >> "${T}/provider-${P}" - echo /usr/bin/cargo-miri >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/lib/rust/libexec >> "${T}/provider-${P}" - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - - if use dist; then - "${EPYTHON}" ./x.py dist -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die - insinto "/usr/lib/${PN}/${PV}/dist" - doins -r "${S}/build/dist/." - fi -} - -pkg_preinst() { - # 943308 and friends; basically --keep-going can forget to unmerge old rust - # but the soft blocker allows us to install conflicting files. - # This results in duplicated .{rlib,so} files which confuses rustc and results in - # the need for manual intervention. - if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then - # we need to find all .{rlib,so} files in the old rust lib directory - # and store them in an array for later use - readarray -d '' old_rust_libs < <( - find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ - -type f \( -name '*.rlib' -o -name '*.so' \) -print0) - export old_rust_libs - if [[ ${#old_rust_libs[@]} -gt 0 ]]; then - einfo "Found old .rlib and .so files in the old rust lib directory" - else - die "Found no old .rlib and .so files but old rust version is installed. Bailing!" - fi - fi -} - -pkg_postinst() { - - local old_rust="dev-lang/rust:stable/$(ver_cut 1-2)" - if has_version -b ${old_rust}; then - # Be _extra_ careful here as we're removing files from the live filesystem - local f - local only_one_file=() - einfo "Tidying up libraries files from non-slotted \`${old_rust}\`." - for f in "${old_rust_libs[@]}"; do - [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" - local base_name="${f%-*}" - local ext="${f##*.}" - local matching_files=("${base_name}"-*.${ext}) - case ${#matching_files[@]} in - 2) - einfo "Removing old .${ext}: ${f}" - rm "${f}" || die - ;; - 1) - # Turns out fingerprints are not as unique as we'd thought, _sometimes_ they collide, - # so we may have already installed over the old file. - # We'll warn about this just in case, but it's probably fine. - only_one_file+=( "${matching_files[0]}" ) - ;; - *) - die "Expected one or two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" - ;; - esac - done - if [[ ${#only_one_file} -gt 0 ]]; then - einfo "While tidying up non-slotted rust libraries for \`${old_rust}\`," - einfo "the following file(s) did not have a duplicate where one was expected:" - for f in "${only_one_file[@]}"; do - einfo " * ${f}" - done - einfo "" - einfo "This is unlikely to cause problems; the fingerprint for the library ended up being the same." - einfo "However, if you encounter any issues please report them to the Gentoo Rust Team." - fi - fi - - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - optfeature "Emacs support" "app-emacs/rust-mode" - optfeature "Vim support" "app-vim/rust-vim" -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust/rust-1.82.0-r102.ebuild b/dev-lang/rust/rust-1.82.0-r102.ebuild new file mode 100644 index 000000000000..4408b27683cb --- /dev/null +++ b/dev-lang/rust/rust-1.82.0-r102.ebuild @@ -0,0 +1,756 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 19 ) +PYTHON_COMPAT=( python3_{10..13} ) + +RUST_MAX_VER=${PV} +RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" + +inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing optfeature \ + multilib multilib-build python-any-r1 rust rust-toolchain toolchain-funcs verify-sig + +if [[ ${PV} = *beta* ]]; then + betaver=${PV//*beta} + BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" + MY_P="rustc-beta" + SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" +else + MY_P="rustc-${PV}" + SRC="${MY_P}-src.tar.xz" + KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv sparc x86" +fi + +DESCRIPTION="Systems programming language from Mozilla" +HOMEPAGE="https://www.rust-lang.org/" + +SRC_URI=" + https://static.rust-lang.org/dist/${SRC} + verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) +" +S="${WORKDIR}/${MY_P}-src" + +# keep in sync with llvm ebuild of the same version as bundled one. +ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai + LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE + WebAssembly X86 XCore Xtensa ) +ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) +LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} + +ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" +SLOT="${PV}" + +IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" + +LLVM_DEPEND=() +# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation +for _x in "${ALL_LLVM_TARGETS[@]}"; do + LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) +done +LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) +LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) + +BDEPEND="${PYTHON_DEPS} + app-eselect/eselect-rust + || ( + >=sys-devel/gcc-4.7 + >=llvm-core/clang-3.5 + ) + !system-llvm? ( + >=dev-build/cmake-3.13.4 + app-alternatives/ninja + ) + test? ( dev-debug/gdb ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +DEPEND=" + >=app-arch/xz-utils-5.2 + net-misc/curl:=[http2,ssl] + sys-libs/zlib:= + dev-libs/openssl:0= + system-llvm? ( + ${LLVM_DEPEND[*]} + llvm-libunwind? ( llvm-runtimes/libunwind:= ) + ) + !system-llvm? ( + !llvm-libunwind? ( + elibc_musl? ( sys-libs/libunwind:= ) + ) + ) +" + +RDEPEND="${DEPEND} + app-eselect/eselect-rust + dev-lang/rust-common + sys-apps/lsb-release + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" + +REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) + miri? ( nightly ) + parallel-compiler? ( nightly ) + rust-analyzer? ( rust-src ) + test? ( ${ALL_LLVM_TARGETS[*]} ) + wasm? ( llvm_targets_WebAssembly ) + x86? ( cpu_flags_x86_sse2 ) +" + +# we don't use cmake.eclass, but can get a warning +CMAKE_WARN_UNUSED_CLI=no + +QA_FLAGS_IGNORED=" + usr/lib/${PN}/${PV}/bin/.* + usr/lib/${PN}/${PV}/libexec/.* + usr/lib/${PN}/${PV}/lib/lib.*.so + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_SONAME=" + usr/lib/${PN}/${PV}/lib/lib.*.so.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_PRESTRIPPED=" + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +# causes double bootstrap +RESTRICT="test" + +VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc + +PATCHES=( + "${FILESDIR}"/1.78.0-musl-dynamic-linking.patch + "${FILESDIR}"/1.74.1-cross-compile-libz.patch + #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch # pending refresh + "${FILESDIR}"/1.67.0-doc-wasm.patch + "${FILESDIR}"/1.82.0-dwarf-llvm-assertion.patch +) + +clear_vendor_checksums() { + sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die +} + +toml_usex() { + usex "${1}" true false +} + +pre_build_checks() { + local M=9216 + # multiply requirements by 1.3 if we are doing x86-multilib + if use amd64; then + M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) + fi + M=$(( $(usex clippy 128 0) + ${M} )) + M=$(( $(usex miri 128 0) + ${M} )) + M=$(( $(usex rustfmt 256 0) + ${M} )) + # add 2G if we compile llvm and 256M per llvm_target + if ! use system-llvm; then + M=$(( 2048 + ${M} )) + local ltarget + for ltarget in ${ALL_LLVM_TARGETS[@]}; do + M=$(( $(usex ${ltarget} 256 0) + ${M} )) + done + fi + M=$(( $(usex wasm 256 0) + ${M} )) + M=$(( $(usex debug 2 1) * ${M} )) + eshopts_push -s extglob + if is-flagq '-g?(gdb)?([1-9])'; then + M=$(( 15 * ${M} / 10 )) + fi + eshopts_pop + M=$(( $(usex doc 256 0) + ${M} )) + CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} +} + +llvm_check_deps() { + has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" +} + +# Is LLVM being linked against libc++? +is_libcxx_linked() { + local code='#include +#if defined(_LIBCPP_VERSION) + HAVE_LIBCXX +#endif +' + local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 + [[ ${out} == *HAVE_LIBCXX* ]] +} + +pkg_pretend() { + pre_build_checks +} + +pkg_setup() { + pre_build_checks + python-any-r1_pkg_setup + + export LIBGIT2_NO_PKG_CONFIG=1 #749381 + if tc-is-cross-compiler; then + use system-llvm && die "USE=system-llvm not allowed when cross-compiling" + local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" + use "llvm_targets_${cross_llvm_target}" || \ + die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" + fi + + rust_pkg_setup + + if use system-llvm; then + llvm-r1_pkg_setup + + local llvm_config="$(get_llvm_prefix)/bin/llvm-config" + export LLVM_LINK_SHARED=1 + export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" + fi +} + +src_prepare() { + # Rust baselines to Pentium4 on x86, this patch lowers the baseline to i586 when sse2 is not set. + if use x86; then + if ! use cpu_flags_x86_sse2; then + eapply "${FILESDIR}/1.82.0-i586-baseline.patch" + #grep -rl cmd.args.push\(\"-march=i686\" . | xargs sed -i 's/march=i686/-march=i586/g' || die + fi + fi + + default +} + +src_configure() { + if tc-is-cross-compiler; then + export PKG_CONFIG_ALLOW_CROSS=1 + export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" + export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" + export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" + fi + + filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 + + local rust_target="" rust_targets="" arch_cflags + + # Collect rust target names to compile standard libs for all ABIs. + for v in $(multilib_get_enabled_abi_pairs); do + rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" + done + if use wasm; then + rust_targets+=",\"wasm32-unknown-unknown\"" + if use system-llvm; then + # un-hardcode rust-lld linker for this target + # https://bugs.gentoo.org/715348 + sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/base/wasm.rs || die + fi + fi + rust_targets="${rust_targets#,}" + + # cargo and rustdoc are mandatory and should always be included + local tools='"cargo","rustdoc"' + use clippy && tools+=',"clippy"' + use miri && tools+=',"miri"' + use rustfmt && tools+=',"rustfmt"' + use rust-analyzer && tools+=',"rust-analyzer","rust-analyzer-proc-macro-srv"' + use rust-src && tools+=',"src"' + + local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" + # in case of prefix it will be already prefixed, as --print sysroot returns full path + [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" + + rust_target="$(rust_abi)" + rust_build="$(rust_abi "${CBUILD}")" + rust_host="$(rust_abi "${CHOST}")" + + LLVM_EXPERIMENTAL_TARGETS=() + for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do + if use llvm_targets_${_x} ; then + LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) + fi + done + LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} + + local cm_btype="$(usex debug DEBUG RELEASE)" + cat <<- _EOF_ > "${S}"/config.toml + [llvm] + download-ci-llvm = false + optimize = $(toml_usex !debug) + release-debuginfo = $(toml_usex debug) + assertions = $(toml_usex debug) + ninja = true + targets = "${LLVM_TARGETS// /;}" + experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" + link-shared = $(toml_usex system-llvm) + $(if is_libcxx_linked; then + # https://bugs.gentoo.org/732632 + echo "use-libcxx = true" + echo "static-libstdcpp = false" + fi) + $(case "${rust_target}" in + i586-*-linux-*) + # https://github.com/rust-lang/rust/issues/93059 + echo 'cflags = "-fcf-protection=none"' + echo 'cxxflags = "-fcf-protection=none"' + echo 'ldflags = "-fcf-protection=none"' + ;; + *) + ;; + esac) + enable-warnings = false + [llvm.build-config] + CMAKE_VERBOSE_MAKEFILE = "ON" + $(if ! tc-is-cross-compiler; then + # When cross-compiling, LLVM is compiled twice, once for host and + # once for target. Unfortunately, this build configuration applies + # to both, which means any flags applicable to one target but not + # the other will break. Conditionally disable respecting user + # flags when cross-compiling. + echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" + echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" + echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" + fi) + [build] + build-stage = 2 + test-stage = 2 + build = "${rust_build}" + host = ["${rust_host}"] + target = [${rust_targets}] + cargo = "${rust_stage0_root}/bin/cargo" + rustc = "${rust_stage0_root}/bin/rustc" + rustfmt = "${rust_stage0_root}/bin/rustfmt" + docs = $(toml_usex doc) + compiler-docs = false + submodules = false + python = "${EPYTHON}" + locked-deps = true + vendor = true + extended = true + tools = [${tools}] + verbose = 2 + sanitizers = false + profiler = true + cargo-native-static = false + [install] + prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" + sysconfdir = "etc" + docdir = "share/doc/rust" + bindir = "bin" + libdir = "lib" + mandir = "share/man" + [rust] + # https://github.com/rust-lang/rust/issues/54872 + codegen-units-std = 1 + optimize = true + debug = $(toml_usex debug) + debug-assertions = $(toml_usex debug) + debug-assertions-std = $(toml_usex debug) + debuginfo-level = $(usex debug 2 0) + debuginfo-level-rustc = $(usex debug 2 0) + debuginfo-level-std = $(usex debug 2 0) + debuginfo-level-tools = $(usex debug 2 0) + debuginfo-level-tests = 0 + backtrace = true + incremental = false + $(if ! tc-is-cross-compiler; then + echo "default-linker = \"$(tc-getCC)\"" + fi) + parallel-compiler = $(toml_usex parallel-compiler) + channel = "$(usex nightly nightly stable)" + description = "gentoo" + rpath = true + verbose-tests = true + optimize-tests = $(toml_usex !debug) + codegen-tests = true + dist-src = false + remap-debuginfo = true + lld = $(usex system-llvm false $(toml_usex wasm)) + # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it + # https://github.com/rust-lang/rust/issues/74976 + # https://github.com/rust-lang/rust/issues/76526 + deny-warnings = $(usex wasm $(usex doc false true) true) + backtrace-on-ice = true + jemalloc = false + # See https://github.com/rust-lang/rust/issues/121124 + lto = "$(usex lto thin off)" + [dist] + src-tarball = false + compression-formats = ["xz"] + compression-profile = "balanced" + _EOF_ + + for v in $(multilib_get_enabled_abi_pairs); do + rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) + arch_cflags="$(get_abi_CFLAGS ${v##*.})" + + export CFLAGS_${rust_target//-/_}="${arch_cflags}" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${rust_target}] + ar = "$(tc-getAR)" + cc = "$(tc-getCC)" + cxx = "$(tc-getCXX)" + linker = "$(tc-getCC)" + ranlib = "$(tc-getRANLIB)" + llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; + # but we patch it and set to false here as well + if use elibc_musl; then + cat <<- _EOF_ >> "${S}"/config.toml + crt-static = false + musl-root = "$($(tc-getCC) -print-sysroot)/usr" + _EOF_ + fi + done + if use wasm; then + wasm_target="wasm32-unknown-unknown" + export CFLAGS_${wasm_target//-/_}="$(filter-flags '-mcpu*' '-march*' '-mtune*'; echo "$CFLAGS")" + cat <<- _EOF_ >> "${S}"/config.toml + [target.wasm32-unknown-unknown] + linker = "$(usex system-llvm lld rust-lld)" + # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 + profiler = false + _EOF_ + fi + + if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below + # experimental cross support + # discussion: https://bugs.gentoo.org/679878 + # TODO: c*flags, clang, system-llvm, cargo.eclass target support + # it would be much better if we could split out stdlib + # complilation to separate ebuild and abuse CATEGORY to + # just install to /usr/lib/rustlib/ + + # extra targets defined as a bash array + # spec format: :: + # best place would be /etc/portage/env/dev-lang/rust + # Example: + # RUST_CROSS_TARGETS=( + # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" + # ) + # no extra hand holding is done, no target transformations, all + # values are passed as-is with just basic checks, so it's up to user to supply correct values + # valid rust targets can be obtained with + # rustc --print target-list + # matching cross toolchain has to be installed + # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) + # only gcc toolchains installed with crossdev are checked for now. + + # BUG: we can't pass host flags to cross compiler, so just filter for now + # BUG: this should be more fine-grained. + filter-flags '-mcpu=*' '-march=*' '-mtune=*' + + local cross_target_spec + for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do + # extracts first element form :: + local cross_llvm_target="${cross_target_spec%%:*}" + # extracts toolchain triples, : + local cross_triples="${cross_target_spec#*:}" + # extracts first element after before : separator + local cross_rust_target="${cross_triples%%:*}" + # extracts last element after : separator + local cross_toolchain="${cross_triples##*:}" + use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" + command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${cross_rust_target}] + ar = "${cross_toolchain}-ar" + cc = "${cross_toolchain}-gcc" + cxx = "${cross_toolchain}-g++" + linker = "${cross_toolchain}-gcc" + ranlib = "${cross_toolchain}-ranlib" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + if [[ "${cross_toolchain}" == *-musl* ]]; then + cat <<- _EOF_ >> "${S}"/config.toml + musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" + _EOF_ + fi + + # append cross target to "normal" target list + # example 'target = ["powerpc64le-unknown-linux-gnu"]' + # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' + + rust_targets="${rust_targets},\"${cross_rust_target}\"" + sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die + + ewarn + ewarn "Enabled ${cross_rust_target} rust target" + ewarn "Using ${cross_toolchain} cross toolchain" + ewarn + if ! has_version -b 'sys-devel/binutils[multitarget]' ; then + ewarn "'sys-devel/binutils[multitarget]' is not installed" + ewarn "'strip' will be unable to strip cross libraries" + ewarn "cross targets will be installed with full debug information" + ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" + ewarn + ewarn "Alternatively llvm-strip can be used, it supports stripping any target" + ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" + ewarn + fi + done + fi # I_KNOW_WHAT_I_AM_DOING_CROSS + + einfo "Rust configured with the following flags:" + echo + echo RUSTFLAGS="\"${RUSTFLAGS}\"" + echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" + echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" + echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" + env | grep "CARGO_TARGET_.*_RUSTFLAGS=" + env | grep "CFLAGS_.*" + echo + einfo "config.toml contents:" + cat "${S}"/config.toml || die + echo +} + +src_compile() { + RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die +} + +src_test() { + # https://rustc-dev-guide.rust-lang.org/tests/intro.html + + # those are basic and codegen tests. + local tests=( + codegen + codegen-units + compile-fail + incremental + mir-opt + pretty + run-make + ) + + # fails if llvm is not built with ALL targets. + # and known to fail with system llvm sometimes. + use system-llvm || tests+=( assembly ) + + # fragile/expensive/less important tests + # or tests that require extra builds + # TODO: instead of skipping, just make some nonfatal. + if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then + tests+=( + rustdoc + rustdoc-js + rustdoc-js-std + rustdoc-ui + run-make-fulldeps + ui + ui-fulldeps + ) + fi + + local i failed=() + einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" + for i in "${tests[@]}"; do + local t="src/test/${i}" + einfo "rust_src_test: running ${t}" + if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ + -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" + then + failed+=( "${t}" ) + eerror "rust_src_test: ${t} failed" + fi + done + + if [[ ${#failed[@]} -ne 0 ]]; then + eerror "rust_src_test: failure summary: ${failed[@]}" + die "aborting due to test failures" + fi +} + +src_install() { + DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die + + docompress /usr/lib/${PN}/${PV}/share/man/ + + # bug #689562, #689160 + rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die + rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die + + local symlinks=( + cargo + rustc + rustdoc + rust-gdb + rust-gdbgui + rust-lldb + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use miri && symlinks+=( miri cargo-miri ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- + # need to fix eselect-rust to remove this hack. + local ver_i="${i}-${PV}" + if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then + einfo "Installing ${i} symlink" + ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die + else + ewarn "${i} symlink requested, but source file not found" + ewarn "please report this" + fi + dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" + use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" + dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" + dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" + dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" + + newenvd - "50${P}" <<-_EOF_ + MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" + _EOF_ + + rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use miri; then + echo /usr/bin/miri >> "${T}/provider-${P}" + echo /usr/bin/cargo-miri >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/lib/rust/libexec >> "${T}/provider-${P}" + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + + if use dist; then + "${EPYTHON}" ./x.py dist -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die + insinto "/usr/lib/${PN}/${PV}/dist" + doins -r "${S}/build/dist/." + fi +} + +pkg_preinst() { + # 943308 and friends; basically --keep-going can forget to unmerge old rust + # but the soft blocker allows us to install conflicting files. + # This results in duplicated .{rlib,so} files which confuses rustc and results in + # the need for manual intervention. + if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then + # we need to find all .{rlib,so} files in the old rust lib directory + # and store them in an array for later use + readarray -d '' old_rust_libs < <( + find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ + -type f \( -name '*.rlib' -o -name '*.so' \) -print0) + export old_rust_libs + if [[ ${#old_rust_libs[@]} -gt 0 ]]; then + einfo "Found old .rlib and .so files in the old rust lib directory" + else + die "Found no old .rlib and .so files but old rust version is installed. Bailing!" + fi + fi +} + +pkg_postinst() { + + local old_rust="dev-lang/rust:stable/$(ver_cut 1-2)" + if has_version -b ${old_rust}; then + # Be _extra_ careful here as we're removing files from the live filesystem + local f + local only_one_file=() + einfo "Tidying up libraries files from non-slotted \`${old_rust}\`." + for f in "${old_rust_libs[@]}"; do + [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" + local base_name="${f%-*}" + local ext="${f##*.}" + local matching_files=("${base_name}"-*.${ext}) + case ${#matching_files[@]} in + 2) + einfo "Removing old .${ext}: ${f}" + rm "${f}" || die + ;; + 1) + # Turns out fingerprints are not as unique as we'd thought, _sometimes_ they collide, + # so we may have already installed over the old file. + # We'll warn about this just in case, but it's probably fine. + only_one_file+=( "${matching_files[0]}" ) + ;; + *) + die "Expected one or two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" + ;; + esac + done + if [[ ${#only_one_file} -gt 0 ]]; then + einfo "While tidying up non-slotted rust libraries for \`${old_rust}\`," + einfo "the following file(s) did not have a duplicate where one was expected:" + for f in "${only_one_file[@]}"; do + einfo " * ${f}" + done + einfo "" + einfo "This is unlikely to cause problems; the fingerprint for the library ended up being the same." + einfo "However, if you encounter any issues please report them to the Gentoo Rust Team." + fi + fi + + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + optfeature "Emacs support" "app-emacs/rust-mode" + optfeature "Vim support" "app-vim/rust-vim" +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust/rust-1.83.0-r1.ebuild b/dev-lang/rust/rust-1.83.0-r1.ebuild deleted file mode 100644 index 2262915b0d62..000000000000 --- a/dev-lang/rust/rust-1.83.0-r1.ebuild +++ /dev/null @@ -1,739 +0,0 @@ -# Copyright 1999-2025 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 19 ) -PYTHON_COMPAT=( python3_{10..13} ) - -RUST_MAX_VER=${PV} -RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" - -inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing optfeature \ - multilib multilib-build python-any-r1 rust rust-toolchain toolchain-funcs verify-sig - -if [[ ${PV} = *beta* ]]; then - betaver=${PV//*beta} - BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" - MY_P="rustc-beta" - SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" -else - MY_P="rustc-${PV}" - SRC="${MY_P}-src.tar.xz" - KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv sparc x86" -fi - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" - -SRC_URI=" - https://static.rust-lang.org/dist/${SRC} - verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) -" -S="${WORKDIR}/${MY_P}-src" - -# keep in sync with llvm ebuild of the same version as bundled one. -ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai - LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE - WebAssembly X86 XCore Xtensa ) -ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) -LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} - -ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" - -IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" - -LLVM_DEPEND=() -# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation -for _x in "${ALL_LLVM_TARGETS[@]}"; do - LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) -done -LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) -LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) - -BDEPEND="${PYTHON_DEPS} - app-eselect/eselect-rust - || ( - >=sys-devel/gcc-4.7 - >=llvm-core/clang-3.5 - ) - !system-llvm? ( - >=dev-build/cmake-3.13.4 - app-alternatives/ninja - ) - test? ( dev-debug/gdb ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -DEPEND=" - >=app-arch/xz-utils-5.2 - net-misc/curl:=[http2,ssl] - sys-libs/zlib:= - dev-libs/openssl:0= - system-llvm? ( - ${LLVM_DEPEND[*]} - llvm-libunwind? ( llvm-runtimes/libunwind:= ) - ) - !system-llvm? ( - !llvm-libunwind? ( - elibc_musl? ( sys-libs/libunwind:= ) - ) - ) -" - -RDEPEND="${DEPEND} - app-eselect/eselect-rust - dev-lang/rust-common - sys-apps/lsb-release - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" - -REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) - miri? ( nightly ) - parallel-compiler? ( nightly ) - rust-analyzer? ( rust-src ) - test? ( ${ALL_LLVM_TARGETS[*]} ) - wasm? ( llvm_targets_WebAssembly ) - x86? ( cpu_flags_x86_sse2 ) -" - -# we don't use cmake.eclass, but can get a warning -CMAKE_WARN_UNUSED_CLI=no - -QA_FLAGS_IGNORED=" - usr/lib/${PN}/${PV}/bin/.* - usr/lib/${PN}/${PV}/libexec/.* - usr/lib/${PN}/${PV}/lib/lib.*.so - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_SONAME=" - usr/lib/${PN}/${PV}/lib/lib.*.so.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_PRESTRIPPED=" - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -# causes double bootstrap -RESTRICT="test" - -VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc - -PATCHES=( - "${FILESDIR}"/1.78.0-musl-dynamic-linking.patch - "${FILESDIR}"/1.83.0-cross-compile-libz.patch - #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch # pending refresh - "${FILESDIR}"/1.67.0-doc-wasm.patch - "${FILESDIR}"/1.83.0-dwarf-llvm-assertion.patch -) - -clear_vendor_checksums() { - sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die -} - -toml_usex() { - usex "${1}" true false -} - -pre_build_checks() { - local M=9216 - # multiply requirements by 1.3 if we are doing x86-multilib - if use amd64; then - M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) - fi - M=$(( $(usex clippy 128 0) + ${M} )) - M=$(( $(usex miri 128 0) + ${M} )) - M=$(( $(usex rustfmt 256 0) + ${M} )) - # add 2G if we compile llvm and 256M per llvm_target - if ! use system-llvm; then - M=$(( 2048 + ${M} )) - local ltarget - for ltarget in ${ALL_LLVM_TARGETS[@]}; do - M=$(( $(usex ${ltarget} 256 0) + ${M} )) - done - fi - M=$(( $(usex wasm 256 0) + ${M} )) - M=$(( $(usex debug 2 1) * ${M} )) - eshopts_push -s extglob - if is-flagq '-g?(gdb)?([1-9])'; then - M=$(( 15 * ${M} / 10 )) - fi - eshopts_pop - M=$(( $(usex doc 256 0) + ${M} )) - CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} -} - -llvm_check_deps() { - has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" -} - -# Is LLVM being linked against libc++? -is_libcxx_linked() { - local code='#include -#if defined(_LIBCPP_VERSION) - HAVE_LIBCXX -#endif -' - local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 - [[ ${out} == *HAVE_LIBCXX* ]] -} - -pkg_pretend() { - pre_build_checks -} - -pkg_setup() { - pre_build_checks - python-any-r1_pkg_setup - - export LIBGIT2_NO_PKG_CONFIG=1 #749381 - if tc-is-cross-compiler; then - use system-llvm && die "USE=system-llvm not allowed when cross-compiling" - local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" - use "llvm_targets_${cross_llvm_target}" || \ - die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" - fi - - rust_pkg_setup - - if use system-llvm; then - llvm-r1_pkg_setup - - local llvm_config="$(get_llvm_prefix)/bin/llvm-config" - export LLVM_LINK_SHARED=1 - export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" - fi -} - -src_prepare() { - # Rust baselines to Pentium4 on x86, this patch lowers the baseline to i586 when sse2 is not set. - if use x86; then - if ! use cpu_flags_x86_sse2; then - eapply "${FILESDIR}/1.82.0-i586-baseline.patch" - #grep -rl cmd.args.push\(\"-march=i686\" . | xargs sed -i 's/march=i686/-march=i586/g' || die - fi - fi - - default -} - -src_configure() { - if tc-is-cross-compiler; then - export PKG_CONFIG_ALLOW_CROSS=1 - export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" - export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" - export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" - fi - - filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 - - local rust_target="" rust_targets="" arch_cflags - - # Collect rust target names to compile standard libs for all ABIs. - for v in $(multilib_get_enabled_abi_pairs); do - rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" - done - if use wasm; then - rust_targets+=",\"wasm32-unknown-unknown\"" - if use system-llvm; then - # un-hardcode rust-lld linker for this target - # https://bugs.gentoo.org/715348 - sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/base/wasm.rs || die - fi - fi - rust_targets="${rust_targets#,}" - - # cargo and rustdoc are mandatory and should always be included - local tools='"cargo","rustdoc"' - use clippy && tools+=',"clippy"' - use miri && tools+=',"miri"' - use rustfmt && tools+=',"rustfmt"' - use rust-analyzer && tools+=',"rust-analyzer","rust-analyzer-proc-macro-srv"' - use rust-src && tools+=',"src"' - - local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" - # in case of prefix it will be already prefixed, as --print sysroot returns full path - [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" - - rust_target="$(rust_abi)" - rust_build="$(rust_abi "${CBUILD}")" - rust_host="$(rust_abi "${CHOST}")" - - LLVM_EXPERIMENTAL_TARGETS=() - for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do - if use llvm_targets_${_x} ; then - LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) - fi - done - LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} - - local cm_btype="$(usex debug DEBUG RELEASE)" - cat <<- _EOF_ > "${S}"/config.toml - [llvm] - download-ci-llvm = false - optimize = $(toml_usex !debug) - release-debuginfo = $(toml_usex debug) - assertions = $(toml_usex debug) - ninja = true - targets = "${LLVM_TARGETS// /;}" - experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" - link-shared = $(toml_usex system-llvm) - $(if is_libcxx_linked; then - # https://bugs.gentoo.org/732632 - echo "use-libcxx = true" - echo "static-libstdcpp = false" - fi) - $(case "${rust_target}" in - i586-*-linux-*) - # https://github.com/rust-lang/rust/issues/93059 - echo 'cflags = "-fcf-protection=none"' - echo 'cxxflags = "-fcf-protection=none"' - echo 'ldflags = "-fcf-protection=none"' - ;; - *) - ;; - esac) - enable-warnings = false - [llvm.build-config] - CMAKE_VERBOSE_MAKEFILE = "ON" - $(if ! tc-is-cross-compiler; then - # When cross-compiling, LLVM is compiled twice, once for host and - # once for target. Unfortunately, this build configuration applies - # to both, which means any flags applicable to one target but not - # the other will break. Conditionally disable respecting user - # flags when cross-compiling. - echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" - echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" - echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" - fi) - [build] - build-stage = 2 - test-stage = 2 - build = "${rust_build}" - host = ["${rust_host}"] - target = [${rust_targets}] - cargo = "${rust_stage0_root}/bin/cargo" - rustc = "${rust_stage0_root}/bin/rustc" - rustfmt = "${rust_stage0_root}/bin/rustfmt" - docs = $(toml_usex doc) - compiler-docs = false - submodules = false - python = "${EPYTHON}" - locked-deps = true - vendor = true - extended = true - tools = [${tools}] - verbose = 2 - sanitizers = false - profiler = true - cargo-native-static = false - [install] - prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" - sysconfdir = "etc" - docdir = "share/doc/rust" - bindir = "bin" - libdir = "lib" - mandir = "share/man" - [rust] - # https://github.com/rust-lang/rust/issues/54872 - codegen-units-std = 1 - optimize = true - debug = $(toml_usex debug) - debug-assertions = $(toml_usex debug) - debug-assertions-std = $(toml_usex debug) - debuginfo-level = $(usex debug 2 0) - debuginfo-level-rustc = $(usex debug 2 0) - debuginfo-level-std = $(usex debug 2 0) - debuginfo-level-tools = $(usex debug 2 0) - debuginfo-level-tests = 0 - backtrace = true - incremental = false - $(if ! tc-is-cross-compiler; then - echo "default-linker = \"$(tc-getCC)\"" - fi) - parallel-compiler = $(toml_usex parallel-compiler) - channel = "$(usex nightly nightly stable)" - description = "gentoo" - rpath = false - verbose-tests = true - optimize-tests = $(toml_usex !debug) - codegen-tests = true - dist-src = false - remap-debuginfo = true - lld = $(usex system-llvm false $(toml_usex wasm)) - # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it - # https://github.com/rust-lang/rust/issues/74976 - # https://github.com/rust-lang/rust/issues/76526 - deny-warnings = $(usex wasm $(usex doc false true) true) - backtrace-on-ice = true - jemalloc = false - # See https://github.com/rust-lang/rust/issues/121124 - lto = "$(usex lto thin off)" - [dist] - src-tarball = false - compression-formats = ["xz"] - compression-profile = "balanced" - _EOF_ - - for v in $(multilib_get_enabled_abi_pairs); do - rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) - arch_cflags="$(get_abi_CFLAGS ${v##*.})" - - export CFLAGS_${rust_target//-/_}="${arch_cflags}" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${rust_target}] - ar = "$(tc-getAR)" - cc = "$(tc-getCC)" - cxx = "$(tc-getCXX)" - linker = "$(tc-getCC)" - ranlib = "$(tc-getRANLIB)" - llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; - # but we patch it and set to false here as well - if use elibc_musl; then - cat <<- _EOF_ >> "${S}"/config.toml - crt-static = false - musl-root = "$($(tc-getCC) -print-sysroot)/usr" - _EOF_ - fi - done - if use wasm; then - wasm_target="wasm32-unknown-unknown" - export CFLAGS_${wasm_target//-/_}="$(filter-flags '-mcpu*' '-march*' '-mtune*'; echo "$CFLAGS")" - cat <<- _EOF_ >> "${S}"/config.toml - [target.wasm32-unknown-unknown] - linker = "$(usex system-llvm lld rust-lld)" - # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 - profiler = false - _EOF_ - fi - - if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below - # experimental cross support - # discussion: https://bugs.gentoo.org/679878 - # TODO: c*flags, clang, system-llvm, cargo.eclass target support - # it would be much better if we could split out stdlib - # complilation to separate ebuild and abuse CATEGORY to - # just install to /usr/lib/rustlib/ - - # extra targets defined as a bash array - # spec format: :: - # best place would be /etc/portage/env/dev-lang/rust - # Example: - # RUST_CROSS_TARGETS=( - # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" - # ) - # no extra hand holding is done, no target transformations, all - # values are passed as-is with just basic checks, so it's up to user to supply correct values - # valid rust targets can be obtained with - # rustc --print target-list - # matching cross toolchain has to be installed - # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) - # only gcc toolchains installed with crossdev are checked for now. - - # BUG: we can't pass host flags to cross compiler, so just filter for now - # BUG: this should be more fine-grained. - filter-flags '-mcpu=*' '-march=*' '-mtune=*' - - local cross_target_spec - for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do - # extracts first element form :: - local cross_llvm_target="${cross_target_spec%%:*}" - # extracts toolchain triples, : - local cross_triples="${cross_target_spec#*:}" - # extracts first element after before : separator - local cross_rust_target="${cross_triples%%:*}" - # extracts last element after : separator - local cross_toolchain="${cross_triples##*:}" - use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" - command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${cross_rust_target}] - ar = "${cross_toolchain}-ar" - cc = "${cross_toolchain}-gcc" - cxx = "${cross_toolchain}-g++" - linker = "${cross_toolchain}-gcc" - ranlib = "${cross_toolchain}-ranlib" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - if [[ "${cross_toolchain}" == *-musl* ]]; then - cat <<- _EOF_ >> "${S}"/config.toml - musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" - _EOF_ - fi - - # append cross target to "normal" target list - # example 'target = ["powerpc64le-unknown-linux-gnu"]' - # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' - - rust_targets="${rust_targets},\"${cross_rust_target}\"" - sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die - - ewarn - ewarn "Enabled ${cross_rust_target} rust target" - ewarn "Using ${cross_toolchain} cross toolchain" - ewarn - if ! has_version -b 'sys-devel/binutils[multitarget]' ; then - ewarn "'sys-devel/binutils[multitarget]' is not installed" - ewarn "'strip' will be unable to strip cross libraries" - ewarn "cross targets will be installed with full debug information" - ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" - ewarn - ewarn "Alternatively llvm-strip can be used, it supports stripping any target" - ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" - ewarn - fi - done - fi # I_KNOW_WHAT_I_AM_DOING_CROSS - - einfo "Rust configured with the following flags:" - echo - echo RUSTFLAGS="\"${RUSTFLAGS}\"" - echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" - echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" - echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" - env | grep "CARGO_TARGET_.*_RUSTFLAGS=" - env | grep "CFLAGS_.*" - echo - einfo "config.toml contents:" - cat "${S}"/config.toml || die - echo -} - -src_compile() { - RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die -} - -src_test() { - # https://rustc-dev-guide.rust-lang.org/tests/intro.html - - # those are basic and codegen tests. - local tests=( - codegen - codegen-units - compile-fail - incremental - mir-opt - pretty - run-make - ) - - # fails if llvm is not built with ALL targets. - # and known to fail with system llvm sometimes. - use system-llvm || tests+=( assembly ) - - # fragile/expensive/less important tests - # or tests that require extra builds - # TODO: instead of skipping, just make some nonfatal. - if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then - tests+=( - rustdoc - rustdoc-js - rustdoc-js-std - rustdoc-ui - run-make-fulldeps - ui - ui-fulldeps - ) - fi - - local i failed=() - einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" - for i in "${tests[@]}"; do - local t="src/test/${i}" - einfo "rust_src_test: running ${t}" - if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ - -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" - then - failed+=( "${t}" ) - eerror "rust_src_test: ${t} failed" - fi - done - - if [[ ${#failed[@]} -ne 0 ]]; then - eerror "rust_src_test: failure summary: ${failed[@]}" - die "aborting due to test failures" - fi -} - -src_install() { - DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die - - docompress /usr/lib/${PN}/${PV}/share/man/ - - # bug #689562, #689160 - rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die - rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use miri && symlinks+=( miri cargo-miri ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- - # need to fix eselect-rust to remove this hack. - local ver_i="${i}-${PV}" - if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then - einfo "Installing ${i} symlink" - ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die - else - ewarn "${i} symlink requested, but source file not found" - ewarn "please report this" - fi - dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" - use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" - dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" - dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" - dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" - - newenvd - "50${P}" <<-_EOF_ - LDPATH="${EPREFIX}/usr/lib/rust/lib-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" - _EOF_ - - rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use miri; then - echo /usr/bin/miri >> "${T}/provider-${P}" - echo /usr/bin/cargo-miri >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/lib/rust/libexec >> "${T}/provider-${P}" - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - - if use dist; then - "${EPYTHON}" ./x.py dist -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die - insinto "/usr/lib/${PN}/${PV}/dist" - doins -r "${S}/build/dist/." - fi -} - -pkg_preinst() { - # 943308 and friends; basically --keep-going can forget to unmerge old rust - # but the soft blocker allows us to install conflicting files. - # This results in duplicated .{rlib,so} files which confuses rustc and results in - # the need for manual intervention. - if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then - # we need to find all .{rlib,so} files in the old rust lib directory - # and store them in an array for later use - readarray -d '' old_rust_libs < <( - find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ - -type f \( -name '*.rlib' -o -name '*.so' \) -print0) - export old_rust_libs - if [[ ${#old_rust_libs[@]} -gt 0 ]]; then - einfo "Found old .rlib and .so files in the old rust lib directory" - else - die "Found no old .rlib and .so files but old rust version is installed. Bailing!" - fi - fi -} - -pkg_postinst() { - - if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then - # Be _extra_ careful here as we're removing files from the live filesystem - local f - for f in "${old_rust_libs[@]}"; do - [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" - local base_name="${f%-*}" - local ext="${f##*.}" - local matching_files=("${base_name}"-*.${ext}) - if [[ ${#matching_files[@]} -ne 2 ]]; then - die "Expected exactly two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" - fi - einfo "Removing old .rlib file ${f}" - rm "${f}" || die - done - fi - - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - if has_version app-editors/emacs; then - optfeature "emacs support for rust" app-emacs/rust-mode - fi - - if has_version app-editors/gvim || has_version app-editors/vim; then - optfeature "vim support for rust" app-vim/rust-vim - fi -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust/rust-1.83.0-r2.ebuild b/dev-lang/rust/rust-1.83.0-r2.ebuild new file mode 100644 index 000000000000..d98a717dc572 --- /dev/null +++ b/dev-lang/rust/rust-1.83.0-r2.ebuild @@ -0,0 +1,738 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 19 ) +PYTHON_COMPAT=( python3_{10..13} ) + +RUST_MAX_VER=${PV} +RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" + +inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing optfeature \ + multilib multilib-build python-any-r1 rust rust-toolchain toolchain-funcs verify-sig + +if [[ ${PV} = *beta* ]]; then + betaver=${PV//*beta} + BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" + MY_P="rustc-beta" + SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" +else + MY_P="rustc-${PV}" + SRC="${MY_P}-src.tar.xz" + KEYWORDS="amd64 arm arm64 ~loong ~mips ppc ppc64 ~riscv sparc x86" +fi + +DESCRIPTION="Systems programming language from Mozilla" +HOMEPAGE="https://www.rust-lang.org/" + +SRC_URI=" + https://static.rust-lang.org/dist/${SRC} + verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) +" +S="${WORKDIR}/${MY_P}-src" + +# keep in sync with llvm ebuild of the same version as bundled one. +ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai + LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE + WebAssembly X86 XCore Xtensa ) +ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) +LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} + +ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" +SLOT="${PV}" + +IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" + +LLVM_DEPEND=() +# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation +for _x in "${ALL_LLVM_TARGETS[@]}"; do + LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) +done +LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) +LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) + +BDEPEND="${PYTHON_DEPS} + app-eselect/eselect-rust + || ( + >=sys-devel/gcc-4.7 + >=llvm-core/clang-3.5 + ) + !system-llvm? ( + >=dev-build/cmake-3.13.4 + app-alternatives/ninja + ) + test? ( dev-debug/gdb ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +DEPEND=" + >=app-arch/xz-utils-5.2 + net-misc/curl:=[http2,ssl] + sys-libs/zlib:= + dev-libs/openssl:0= + system-llvm? ( + ${LLVM_DEPEND[*]} + llvm-libunwind? ( llvm-runtimes/libunwind:= ) + ) + !system-llvm? ( + !llvm-libunwind? ( + elibc_musl? ( sys-libs/libunwind:= ) + ) + ) +" + +RDEPEND="${DEPEND} + app-eselect/eselect-rust + dev-lang/rust-common + sys-apps/lsb-release + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" + +REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) + miri? ( nightly ) + parallel-compiler? ( nightly ) + rust-analyzer? ( rust-src ) + test? ( ${ALL_LLVM_TARGETS[*]} ) + wasm? ( llvm_targets_WebAssembly ) + x86? ( cpu_flags_x86_sse2 ) +" + +# we don't use cmake.eclass, but can get a warning +CMAKE_WARN_UNUSED_CLI=no + +QA_FLAGS_IGNORED=" + usr/lib/${PN}/${PV}/bin/.* + usr/lib/${PN}/${PV}/libexec/.* + usr/lib/${PN}/${PV}/lib/lib.*.so + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_SONAME=" + usr/lib/${PN}/${PV}/lib/lib.*.so.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_PRESTRIPPED=" + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +# causes double bootstrap +RESTRICT="test" + +VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc + +PATCHES=( + "${FILESDIR}"/1.78.0-musl-dynamic-linking.patch + "${FILESDIR}"/1.83.0-cross-compile-libz.patch + #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch # pending refresh + "${FILESDIR}"/1.67.0-doc-wasm.patch + "${FILESDIR}"/1.83.0-dwarf-llvm-assertion.patch +) + +clear_vendor_checksums() { + sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die +} + +toml_usex() { + usex "${1}" true false +} + +pre_build_checks() { + local M=9216 + # multiply requirements by 1.3 if we are doing x86-multilib + if use amd64; then + M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) + fi + M=$(( $(usex clippy 128 0) + ${M} )) + M=$(( $(usex miri 128 0) + ${M} )) + M=$(( $(usex rustfmt 256 0) + ${M} )) + # add 2G if we compile llvm and 256M per llvm_target + if ! use system-llvm; then + M=$(( 2048 + ${M} )) + local ltarget + for ltarget in ${ALL_LLVM_TARGETS[@]}; do + M=$(( $(usex ${ltarget} 256 0) + ${M} )) + done + fi + M=$(( $(usex wasm 256 0) + ${M} )) + M=$(( $(usex debug 2 1) * ${M} )) + eshopts_push -s extglob + if is-flagq '-g?(gdb)?([1-9])'; then + M=$(( 15 * ${M} / 10 )) + fi + eshopts_pop + M=$(( $(usex doc 256 0) + ${M} )) + CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} +} + +llvm_check_deps() { + has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" +} + +# Is LLVM being linked against libc++? +is_libcxx_linked() { + local code='#include +#if defined(_LIBCPP_VERSION) + HAVE_LIBCXX +#endif +' + local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 + [[ ${out} == *HAVE_LIBCXX* ]] +} + +pkg_pretend() { + pre_build_checks +} + +pkg_setup() { + pre_build_checks + python-any-r1_pkg_setup + + export LIBGIT2_NO_PKG_CONFIG=1 #749381 + if tc-is-cross-compiler; then + use system-llvm && die "USE=system-llvm not allowed when cross-compiling" + local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" + use "llvm_targets_${cross_llvm_target}" || \ + die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" + fi + + rust_pkg_setup + + if use system-llvm; then + llvm-r1_pkg_setup + + local llvm_config="$(get_llvm_prefix)/bin/llvm-config" + export LLVM_LINK_SHARED=1 + export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" + fi +} + +src_prepare() { + # Rust baselines to Pentium4 on x86, this patch lowers the baseline to i586 when sse2 is not set. + if use x86; then + if ! use cpu_flags_x86_sse2; then + eapply "${FILESDIR}/1.82.0-i586-baseline.patch" + #grep -rl cmd.args.push\(\"-march=i686\" . | xargs sed -i 's/march=i686/-march=i586/g' || die + fi + fi + + default +} + +src_configure() { + if tc-is-cross-compiler; then + export PKG_CONFIG_ALLOW_CROSS=1 + export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" + export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" + export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" + fi + + filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 + + local rust_target="" rust_targets="" arch_cflags + + # Collect rust target names to compile standard libs for all ABIs. + for v in $(multilib_get_enabled_abi_pairs); do + rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" + done + if use wasm; then + rust_targets+=",\"wasm32-unknown-unknown\"" + if use system-llvm; then + # un-hardcode rust-lld linker for this target + # https://bugs.gentoo.org/715348 + sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/base/wasm.rs || die + fi + fi + rust_targets="${rust_targets#,}" + + # cargo and rustdoc are mandatory and should always be included + local tools='"cargo","rustdoc"' + use clippy && tools+=',"clippy"' + use miri && tools+=',"miri"' + use rustfmt && tools+=',"rustfmt"' + use rust-analyzer && tools+=',"rust-analyzer","rust-analyzer-proc-macro-srv"' + use rust-src && tools+=',"src"' + + local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" + # in case of prefix it will be already prefixed, as --print sysroot returns full path + [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" + + rust_target="$(rust_abi)" + rust_build="$(rust_abi "${CBUILD}")" + rust_host="$(rust_abi "${CHOST}")" + + LLVM_EXPERIMENTAL_TARGETS=() + for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do + if use llvm_targets_${_x} ; then + LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) + fi + done + LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} + + local cm_btype="$(usex debug DEBUG RELEASE)" + cat <<- _EOF_ > "${S}"/config.toml + [llvm] + download-ci-llvm = false + optimize = $(toml_usex !debug) + release-debuginfo = $(toml_usex debug) + assertions = $(toml_usex debug) + ninja = true + targets = "${LLVM_TARGETS// /;}" + experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" + link-shared = $(toml_usex system-llvm) + $(if is_libcxx_linked; then + # https://bugs.gentoo.org/732632 + echo "use-libcxx = true" + echo "static-libstdcpp = false" + fi) + $(case "${rust_target}" in + i586-*-linux-*) + # https://github.com/rust-lang/rust/issues/93059 + echo 'cflags = "-fcf-protection=none"' + echo 'cxxflags = "-fcf-protection=none"' + echo 'ldflags = "-fcf-protection=none"' + ;; + *) + ;; + esac) + enable-warnings = false + [llvm.build-config] + CMAKE_VERBOSE_MAKEFILE = "ON" + $(if ! tc-is-cross-compiler; then + # When cross-compiling, LLVM is compiled twice, once for host and + # once for target. Unfortunately, this build configuration applies + # to both, which means any flags applicable to one target but not + # the other will break. Conditionally disable respecting user + # flags when cross-compiling. + echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" + echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" + echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" + fi) + [build] + build-stage = 2 + test-stage = 2 + build = "${rust_build}" + host = ["${rust_host}"] + target = [${rust_targets}] + cargo = "${rust_stage0_root}/bin/cargo" + rustc = "${rust_stage0_root}/bin/rustc" + rustfmt = "${rust_stage0_root}/bin/rustfmt" + docs = $(toml_usex doc) + compiler-docs = false + submodules = false + python = "${EPYTHON}" + locked-deps = true + vendor = true + extended = true + tools = [${tools}] + verbose = 2 + sanitizers = false + profiler = true + cargo-native-static = false + [install] + prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" + sysconfdir = "etc" + docdir = "share/doc/rust" + bindir = "bin" + libdir = "lib" + mandir = "share/man" + [rust] + # https://github.com/rust-lang/rust/issues/54872 + codegen-units-std = 1 + optimize = true + debug = $(toml_usex debug) + debug-assertions = $(toml_usex debug) + debug-assertions-std = $(toml_usex debug) + debuginfo-level = $(usex debug 2 0) + debuginfo-level-rustc = $(usex debug 2 0) + debuginfo-level-std = $(usex debug 2 0) + debuginfo-level-tools = $(usex debug 2 0) + debuginfo-level-tests = 0 + backtrace = true + incremental = false + $(if ! tc-is-cross-compiler; then + echo "default-linker = \"$(tc-getCC)\"" + fi) + parallel-compiler = $(toml_usex parallel-compiler) + channel = "$(usex nightly nightly stable)" + description = "gentoo" + rpath = true + verbose-tests = true + optimize-tests = $(toml_usex !debug) + codegen-tests = true + dist-src = false + remap-debuginfo = true + lld = $(usex system-llvm false $(toml_usex wasm)) + # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it + # https://github.com/rust-lang/rust/issues/74976 + # https://github.com/rust-lang/rust/issues/76526 + deny-warnings = $(usex wasm $(usex doc false true) true) + backtrace-on-ice = true + jemalloc = false + # See https://github.com/rust-lang/rust/issues/121124 + lto = "$(usex lto thin off)" + [dist] + src-tarball = false + compression-formats = ["xz"] + compression-profile = "balanced" + _EOF_ + + for v in $(multilib_get_enabled_abi_pairs); do + rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) + arch_cflags="$(get_abi_CFLAGS ${v##*.})" + + export CFLAGS_${rust_target//-/_}="${arch_cflags}" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${rust_target}] + ar = "$(tc-getAR)" + cc = "$(tc-getCC)" + cxx = "$(tc-getCXX)" + linker = "$(tc-getCC)" + ranlib = "$(tc-getRANLIB)" + llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; + # but we patch it and set to false here as well + if use elibc_musl; then + cat <<- _EOF_ >> "${S}"/config.toml + crt-static = false + musl-root = "$($(tc-getCC) -print-sysroot)/usr" + _EOF_ + fi + done + if use wasm; then + wasm_target="wasm32-unknown-unknown" + export CFLAGS_${wasm_target//-/_}="$(filter-flags '-mcpu*' '-march*' '-mtune*'; echo "$CFLAGS")" + cat <<- _EOF_ >> "${S}"/config.toml + [target.wasm32-unknown-unknown] + linker = "$(usex system-llvm lld rust-lld)" + # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 + profiler = false + _EOF_ + fi + + if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below + # experimental cross support + # discussion: https://bugs.gentoo.org/679878 + # TODO: c*flags, clang, system-llvm, cargo.eclass target support + # it would be much better if we could split out stdlib + # complilation to separate ebuild and abuse CATEGORY to + # just install to /usr/lib/rustlib/ + + # extra targets defined as a bash array + # spec format: :: + # best place would be /etc/portage/env/dev-lang/rust + # Example: + # RUST_CROSS_TARGETS=( + # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" + # ) + # no extra hand holding is done, no target transformations, all + # values are passed as-is with just basic checks, so it's up to user to supply correct values + # valid rust targets can be obtained with + # rustc --print target-list + # matching cross toolchain has to be installed + # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) + # only gcc toolchains installed with crossdev are checked for now. + + # BUG: we can't pass host flags to cross compiler, so just filter for now + # BUG: this should be more fine-grained. + filter-flags '-mcpu=*' '-march=*' '-mtune=*' + + local cross_target_spec + for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do + # extracts first element form :: + local cross_llvm_target="${cross_target_spec%%:*}" + # extracts toolchain triples, : + local cross_triples="${cross_target_spec#*:}" + # extracts first element after before : separator + local cross_rust_target="${cross_triples%%:*}" + # extracts last element after : separator + local cross_toolchain="${cross_triples##*:}" + use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" + command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${cross_rust_target}] + ar = "${cross_toolchain}-ar" + cc = "${cross_toolchain}-gcc" + cxx = "${cross_toolchain}-g++" + linker = "${cross_toolchain}-gcc" + ranlib = "${cross_toolchain}-ranlib" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + if [[ "${cross_toolchain}" == *-musl* ]]; then + cat <<- _EOF_ >> "${S}"/config.toml + musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" + _EOF_ + fi + + # append cross target to "normal" target list + # example 'target = ["powerpc64le-unknown-linux-gnu"]' + # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' + + rust_targets="${rust_targets},\"${cross_rust_target}\"" + sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die + + ewarn + ewarn "Enabled ${cross_rust_target} rust target" + ewarn "Using ${cross_toolchain} cross toolchain" + ewarn + if ! has_version -b 'sys-devel/binutils[multitarget]' ; then + ewarn "'sys-devel/binutils[multitarget]' is not installed" + ewarn "'strip' will be unable to strip cross libraries" + ewarn "cross targets will be installed with full debug information" + ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" + ewarn + ewarn "Alternatively llvm-strip can be used, it supports stripping any target" + ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" + ewarn + fi + done + fi # I_KNOW_WHAT_I_AM_DOING_CROSS + + einfo "Rust configured with the following flags:" + echo + echo RUSTFLAGS="\"${RUSTFLAGS}\"" + echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" + echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" + echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" + env | grep "CARGO_TARGET_.*_RUSTFLAGS=" + env | grep "CFLAGS_.*" + echo + einfo "config.toml contents:" + cat "${S}"/config.toml || die + echo +} + +src_compile() { + RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die +} + +src_test() { + # https://rustc-dev-guide.rust-lang.org/tests/intro.html + + # those are basic and codegen tests. + local tests=( + codegen + codegen-units + compile-fail + incremental + mir-opt + pretty + run-make + ) + + # fails if llvm is not built with ALL targets. + # and known to fail with system llvm sometimes. + use system-llvm || tests+=( assembly ) + + # fragile/expensive/less important tests + # or tests that require extra builds + # TODO: instead of skipping, just make some nonfatal. + if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then + tests+=( + rustdoc + rustdoc-js + rustdoc-js-std + rustdoc-ui + run-make-fulldeps + ui + ui-fulldeps + ) + fi + + local i failed=() + einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" + for i in "${tests[@]}"; do + local t="src/test/${i}" + einfo "rust_src_test: running ${t}" + if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ + -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" + then + failed+=( "${t}" ) + eerror "rust_src_test: ${t} failed" + fi + done + + if [[ ${#failed[@]} -ne 0 ]]; then + eerror "rust_src_test: failure summary: ${failed[@]}" + die "aborting due to test failures" + fi +} + +src_install() { + DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die + + docompress /usr/lib/${PN}/${PV}/share/man/ + + # bug #689562, #689160 + rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die + rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die + + local symlinks=( + cargo + rustc + rustdoc + rust-gdb + rust-gdbgui + rust-lldb + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use miri && symlinks+=( miri cargo-miri ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- + # need to fix eselect-rust to remove this hack. + local ver_i="${i}-${PV}" + if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then + einfo "Installing ${i} symlink" + ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die + else + ewarn "${i} symlink requested, but source file not found" + ewarn "please report this" + fi + dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" + use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" + dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" + dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" + dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" + + newenvd - "50${P}" <<-_EOF_ + MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" + _EOF_ + + rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use miri; then + echo /usr/bin/miri >> "${T}/provider-${P}" + echo /usr/bin/cargo-miri >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/lib/rust/libexec >> "${T}/provider-${P}" + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + + if use dist; then + "${EPYTHON}" ./x.py dist -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die + insinto "/usr/lib/${PN}/${PV}/dist" + doins -r "${S}/build/dist/." + fi +} + +pkg_preinst() { + # 943308 and friends; basically --keep-going can forget to unmerge old rust + # but the soft blocker allows us to install conflicting files. + # This results in duplicated .{rlib,so} files which confuses rustc and results in + # the need for manual intervention. + if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then + # we need to find all .{rlib,so} files in the old rust lib directory + # and store them in an array for later use + readarray -d '' old_rust_libs < <( + find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ + -type f \( -name '*.rlib' -o -name '*.so' \) -print0) + export old_rust_libs + if [[ ${#old_rust_libs[@]} -gt 0 ]]; then + einfo "Found old .rlib and .so files in the old rust lib directory" + else + die "Found no old .rlib and .so files but old rust version is installed. Bailing!" + fi + fi +} + +pkg_postinst() { + + if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then + # Be _extra_ careful here as we're removing files from the live filesystem + local f + for f in "${old_rust_libs[@]}"; do + [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" + local base_name="${f%-*}" + local ext="${f##*.}" + local matching_files=("${base_name}"-*.${ext}) + if [[ ${#matching_files[@]} -ne 2 ]]; then + die "Expected exactly two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" + fi + einfo "Removing old .rlib file ${f}" + rm "${f}" || die + done + fi + + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + if has_version app-editors/emacs; then + optfeature "emacs support for rust" app-emacs/rust-mode + fi + + if has_version app-editors/gvim || has_version app-editors/vim; then + optfeature "vim support for rust" app-vim/rust-vim + fi +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust/rust-1.84.0-r1.ebuild b/dev-lang/rust/rust-1.84.0-r1.ebuild new file mode 100644 index 000000000000..10294bcfad06 --- /dev/null +++ b/dev-lang/rust/rust-1.84.0-r1.ebuild @@ -0,0 +1,704 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 19 ) +PYTHON_COMPAT=( python3_{10..13} ) + +RUST_MAX_VER=${PV} +RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" + +inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing optfeature \ + multilib multilib-build python-any-r1 rust rust-toolchain toolchain-funcs verify-sig + +if [[ ${PV} = *beta* ]]; then + betaver=${PV//*beta} + BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" + MY_P="rustc-beta" + SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" +else + MY_P="rustc-${PV}" + SRC="${MY_P}-src.tar.xz" + KEYWORDS="~amd64 ~arm ~arm64 ~loong ~mips ~ppc ~ppc64 ~riscv ~sparc ~x86" +fi + +DESCRIPTION="Systems programming language from Mozilla" +HOMEPAGE="https://www.rust-lang.org/" + +SRC_URI=" + https://static.rust-lang.org/dist/${SRC} + verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) +" +S="${WORKDIR}/${MY_P}-src" + +# keep in sync with llvm ebuild of the same version as bundled one. +ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai + LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE + WebAssembly X86 XCore Xtensa ) +ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) +LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} + +# https://github.com/rust-lang/llvm-project/blob/rustc-1.84.0/llvm/CMakeLists.txt +ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" +SLOT="${PV}" + +IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" + +LLVM_DEPEND=() +# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation +for _x in "${ALL_LLVM_TARGETS[@]}"; do + LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) +done +LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) +LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) + +BDEPEND="${PYTHON_DEPS} + app-eselect/eselect-rust + || ( + >=sys-devel/gcc-4.7 + >=llvm-core/clang-3.5 + ) + !system-llvm? ( + >=dev-build/cmake-3.13.4 + app-alternatives/ninja + ) + test? ( dev-debug/gdb ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +DEPEND=" + >=app-arch/xz-utils-5.2 + net-misc/curl:=[http2,ssl] + sys-libs/zlib:= + dev-libs/openssl:0= + system-llvm? ( + ${LLVM_DEPEND[*]} + llvm-libunwind? ( llvm-runtimes/libunwind:= ) + ) + !system-llvm? ( + !llvm-libunwind? ( + elibc_musl? ( sys-libs/libunwind:= ) + ) + ) +" + +RDEPEND="${DEPEND} + app-eselect/eselect-rust + dev-lang/rust-common + sys-apps/lsb-release + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" + +REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) + miri? ( nightly ) + parallel-compiler? ( nightly ) + rust-analyzer? ( rust-src ) + test? ( ${ALL_LLVM_TARGETS[*]} ) + wasm? ( llvm_targets_WebAssembly ) + x86? ( cpu_flags_x86_sse2 ) +" + +# we don't use cmake.eclass, but can get a warning +CMAKE_WARN_UNUSED_CLI=no + +QA_FLAGS_IGNORED=" + usr/lib/${PN}/${PV}/bin/.* + usr/lib/${PN}/${PV}/libexec/.* + usr/lib/${PN}/${PV}/lib/lib.*.so + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_SONAME=" + usr/lib/${PN}/${PV}/lib/lib.*.so.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_PRESTRIPPED=" + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +# causes double bootstrap +RESTRICT="test" + +VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc + +PATCHES=( + "${FILESDIR}"/1.78.0-musl-dynamic-linking.patch + "${FILESDIR}"/1.83.0-cross-compile-libz.patch + #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch # pending refresh + "${FILESDIR}"/1.67.0-doc-wasm.patch +) + +clear_vendor_checksums() { + sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die +} + +toml_usex() { + usex "${1}" true false +} + +pre_build_checks() { + local M=9216 + # multiply requirements by 1.3 if we are doing x86-multilib + if use amd64; then + M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) + fi + M=$(( $(usex clippy 128 0) + ${M} )) + M=$(( $(usex miri 128 0) + ${M} )) + M=$(( $(usex rustfmt 256 0) + ${M} )) + # add 2G if we compile llvm and 256M per llvm_target + if ! use system-llvm; then + M=$(( 2048 + ${M} )) + local ltarget + for ltarget in ${ALL_LLVM_TARGETS[@]}; do + M=$(( $(usex ${ltarget} 256 0) + ${M} )) + done + fi + M=$(( $(usex wasm 256 0) + ${M} )) + M=$(( $(usex debug 2 1) * ${M} )) + eshopts_push -s extglob + if is-flagq '-g?(gdb)?([1-9])'; then + M=$(( 15 * ${M} / 10 )) + fi + eshopts_pop + M=$(( $(usex doc 256 0) + ${M} )) + CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} +} + +llvm_check_deps() { + has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" +} + +# Is LLVM being linked against libc++? +is_libcxx_linked() { + local code='#include +#if defined(_LIBCPP_VERSION) + HAVE_LIBCXX +#endif +' + local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 + [[ ${out} == *HAVE_LIBCXX* ]] +} + +pkg_pretend() { + pre_build_checks +} + +pkg_setup() { + pre_build_checks + python-any-r1_pkg_setup + + export LIBGIT2_NO_PKG_CONFIG=1 #749381 + if tc-is-cross-compiler; then + use system-llvm && die "USE=system-llvm not allowed when cross-compiling" + local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" + use "llvm_targets_${cross_llvm_target}" || \ + die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" + fi + + rust_pkg_setup + + if use system-llvm; then + llvm-r1_pkg_setup + + local llvm_config="$(get_llvm_prefix)/bin/llvm-config" + export LLVM_LINK_SHARED=1 + export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" + fi +} + +src_prepare() { + # Rust baselines to Pentium4 on x86, this patch lowers the baseline to i586 when sse2 is not set. + if use x86; then + if ! use cpu_flags_x86_sse2; then + eapply "${FILESDIR}/1.82.0-i586-baseline.patch" + #grep -rl cmd.args.push\(\"-march=i686\" . | xargs sed -i 's/march=i686/-march=i586/g' || die + fi + fi + + default +} + +src_configure() { + if tc-is-cross-compiler; then + export PKG_CONFIG_ALLOW_CROSS=1 + export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" + export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" + export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" + fi + + filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 + + local rust_target="" rust_targets="" arch_cflags + + # Collect rust target names to compile standard libs for all ABIs. + for v in $(multilib_get_enabled_abi_pairs); do + rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" + done + if use wasm; then + rust_targets+=",\"wasm32-unknown-unknown\"" + if use system-llvm; then + # un-hardcode rust-lld linker for this target + # https://bugs.gentoo.org/715348 + sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/base/wasm.rs || die + fi + fi + rust_targets="${rust_targets#,}" + + # cargo and rustdoc are mandatory and should always be included + local tools='"cargo","rustdoc"' + use clippy && tools+=',"clippy"' + use miri && tools+=',"miri"' + use rustfmt && tools+=',"rustfmt"' + use rust-analyzer && tools+=',"rust-analyzer","rust-analyzer-proc-macro-srv"' + use rust-src && tools+=',"src"' + + local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" + # in case of prefix it will be already prefixed, as --print sysroot returns full path + [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" + + rust_target="$(rust_abi)" + rust_build="$(rust_abi "${CBUILD}")" + rust_host="$(rust_abi "${CHOST}")" + + LLVM_EXPERIMENTAL_TARGETS=() + for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do + if use llvm_targets_${_x} ; then + LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) + fi + done + LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} + + local cm_btype="$(usex debug DEBUG RELEASE)" + cat <<- _EOF_ > "${S}"/config.toml + # https://github.com/rust-lang/rust/issues/135358 (bug #947897) + profile = "dist" + [llvm] + download-ci-llvm = false + optimize = $(toml_usex !debug) + release-debuginfo = $(toml_usex debug) + assertions = $(toml_usex debug) + ninja = true + targets = "${LLVM_TARGETS// /;}" + experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" + link-shared = $(toml_usex system-llvm) + $(if is_libcxx_linked; then + # https://bugs.gentoo.org/732632 + echo "use-libcxx = true" + echo "static-libstdcpp = false" + fi) + $(case "${rust_target}" in + i586-*-linux-*) + # https://github.com/rust-lang/rust/issues/93059 + echo 'cflags = "-fcf-protection=none"' + echo 'cxxflags = "-fcf-protection=none"' + echo 'ldflags = "-fcf-protection=none"' + ;; + *) + ;; + esac) + enable-warnings = false + [llvm.build-config] + CMAKE_VERBOSE_MAKEFILE = "ON" + $(if ! tc-is-cross-compiler; then + # When cross-compiling, LLVM is compiled twice, once for host and + # once for target. Unfortunately, this build configuration applies + # to both, which means any flags applicable to one target but not + # the other will break. Conditionally disable respecting user + # flags when cross-compiling. + echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" + echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" + echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" + fi) + [build] + build-stage = 2 + test-stage = 2 + build = "${rust_build}" + host = ["${rust_host}"] + target = [${rust_targets}] + cargo = "${rust_stage0_root}/bin/cargo" + rustc = "${rust_stage0_root}/bin/rustc" + rustfmt = "${rust_stage0_root}/bin/rustfmt" + docs = $(toml_usex doc) + compiler-docs = false + submodules = false + python = "${EPYTHON}" + locked-deps = true + vendor = true + extended = true + tools = [${tools}] + verbose = 2 + sanitizers = false + profiler = true + cargo-native-static = false + [install] + prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" + sysconfdir = "etc" + docdir = "share/doc/rust" + bindir = "bin" + libdir = "lib" + mandir = "share/man" + [rust] + # https://github.com/rust-lang/rust/issues/54872 + codegen-units-std = 1 + optimize = true + debug = $(toml_usex debug) + debug-assertions = $(toml_usex debug) + debug-assertions-std = $(toml_usex debug) + debuginfo-level = $(usex debug 2 0) + debuginfo-level-rustc = $(usex debug 2 0) + debuginfo-level-std = $(usex debug 2 0) + debuginfo-level-tools = $(usex debug 2 0) + debuginfo-level-tests = 0 + backtrace = true + incremental = false + $(if ! tc-is-cross-compiler; then + echo "default-linker = \"$(tc-getCC)\"" + fi) + parallel-compiler = $(toml_usex parallel-compiler) + channel = "$(usex nightly nightly stable)" + description = "gentoo" + rpath = true + verbose-tests = true + optimize-tests = $(toml_usex !debug) + codegen-tests = true + dist-src = false + remap-debuginfo = true + lld = $(usex system-llvm false $(toml_usex wasm)) + # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it + # https://github.com/rust-lang/rust/issues/74976 + # https://github.com/rust-lang/rust/issues/76526 + deny-warnings = $(usex wasm $(usex doc false true) true) + backtrace-on-ice = true + jemalloc = false + # See https://github.com/rust-lang/rust/issues/121124 + lto = "$(usex lto thin off)" + [dist] + src-tarball = false + compression-formats = ["xz"] + compression-profile = "balanced" + _EOF_ + + for v in $(multilib_get_enabled_abi_pairs); do + rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) + arch_cflags="$(get_abi_CFLAGS ${v##*.})" + + export CFLAGS_${rust_target//-/_}="${arch_cflags}" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${rust_target}] + ar = "$(tc-getAR)" + cc = "$(tc-getCC)" + cxx = "$(tc-getCXX)" + linker = "$(tc-getCC)" + ranlib = "$(tc-getRANLIB)" + llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; + # but we patch it and set to false here as well + if use elibc_musl; then + cat <<- _EOF_ >> "${S}"/config.toml + crt-static = false + musl-root = "$($(tc-getCC) -print-sysroot)/usr" + _EOF_ + fi + done + if use wasm; then + wasm_target="wasm32-unknown-unknown" + export CFLAGS_${wasm_target//-/_}="$(filter-flags '-mcpu*' '-march*' '-mtune*'; echo "$CFLAGS")" + cat <<- _EOF_ >> "${S}"/config.toml + [target.wasm32-unknown-unknown] + linker = "$(usex system-llvm lld rust-lld)" + # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 + profiler = false + _EOF_ + fi + + if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below + # experimental cross support + # discussion: https://bugs.gentoo.org/679878 + # TODO: c*flags, clang, system-llvm, cargo.eclass target support + # it would be much better if we could split out stdlib + # complilation to separate ebuild and abuse CATEGORY to + # just install to /usr/lib/rustlib/ + + # extra targets defined as a bash array + # spec format: :: + # best place would be /etc/portage/env/dev-lang/rust + # Example: + # RUST_CROSS_TARGETS=( + # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" + # ) + # no extra hand holding is done, no target transformations, all + # values are passed as-is with just basic checks, so it's up to user to supply correct values + # valid rust targets can be obtained with + # rustc --print target-list + # matching cross toolchain has to be installed + # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) + # only gcc toolchains installed with crossdev are checked for now. + + # BUG: we can't pass host flags to cross compiler, so just filter for now + # BUG: this should be more fine-grained. + filter-flags '-mcpu=*' '-march=*' '-mtune=*' + + local cross_target_spec + for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do + # extracts first element form :: + local cross_llvm_target="${cross_target_spec%%:*}" + # extracts toolchain triples, : + local cross_triples="${cross_target_spec#*:}" + # extracts first element after before : separator + local cross_rust_target="${cross_triples%%:*}" + # extracts last element after : separator + local cross_toolchain="${cross_triples##*:}" + use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" + command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${cross_rust_target}] + ar = "${cross_toolchain}-ar" + cc = "${cross_toolchain}-gcc" + cxx = "${cross_toolchain}-g++" + linker = "${cross_toolchain}-gcc" + ranlib = "${cross_toolchain}-ranlib" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + if [[ "${cross_toolchain}" == *-musl* ]]; then + cat <<- _EOF_ >> "${S}"/config.toml + musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" + _EOF_ + fi + + # append cross target to "normal" target list + # example 'target = ["powerpc64le-unknown-linux-gnu"]' + # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' + + rust_targets="${rust_targets},\"${cross_rust_target}\"" + sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die + + ewarn + ewarn "Enabled ${cross_rust_target} rust target" + ewarn "Using ${cross_toolchain} cross toolchain" + ewarn + if ! has_version -b 'sys-devel/binutils[multitarget]' ; then + ewarn "'sys-devel/binutils[multitarget]' is not installed" + ewarn "'strip' will be unable to strip cross libraries" + ewarn "cross targets will be installed with full debug information" + ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" + ewarn + ewarn "Alternatively llvm-strip can be used, it supports stripping any target" + ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" + ewarn + fi + done + fi # I_KNOW_WHAT_I_AM_DOING_CROSS + + einfo "Rust configured with the following flags:" + echo + echo RUSTFLAGS="\"${RUSTFLAGS}\"" + echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" + echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" + echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" + env | grep "CARGO_TARGET_.*_RUSTFLAGS=" + env | grep "CFLAGS_.*" + echo + einfo "config.toml contents:" + cat "${S}"/config.toml || die + echo +} + +src_compile() { + RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die +} + +src_test() { + # https://rustc-dev-guide.rust-lang.org/tests/intro.html + + # those are basic and codegen tests. + local tests=( + codegen + codegen-units + compile-fail + incremental + mir-opt + pretty + run-make + ) + + # fails if llvm is not built with ALL targets. + # and known to fail with system llvm sometimes. + use system-llvm || tests+=( assembly ) + + # fragile/expensive/less important tests + # or tests that require extra builds + # TODO: instead of skipping, just make some nonfatal. + if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then + tests+=( + rustdoc + rustdoc-js + rustdoc-js-std + rustdoc-ui + run-make-fulldeps + ui + ui-fulldeps + ) + fi + + local i failed=() + einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" + for i in "${tests[@]}"; do + local t="src/test/${i}" + einfo "rust_src_test: running ${t}" + if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ + -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" + then + failed+=( "${t}" ) + eerror "rust_src_test: ${t} failed" + fi + done + + if [[ ${#failed[@]} -ne 0 ]]; then + eerror "rust_src_test: failure summary: ${failed[@]}" + die "aborting due to test failures" + fi +} + +src_install() { + DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die + + docompress /usr/lib/${PN}/${PV}/share/man/ + + # bug #689562, #689160 + rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die + rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die + + local symlinks=( + cargo + rustc + rustdoc + rust-gdb + rust-gdbgui + rust-lldb + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use miri && symlinks+=( miri cargo-miri ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- + # need to fix eselect-rust to remove this hack. + local ver_i="${i}-${PV}" + if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then + einfo "Installing ${i} symlink" + ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die + else + ewarn "${i} symlink requested, but source file not found" + ewarn "please report this" + fi + dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" + use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" + dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" + dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" + dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" + + newenvd - "50${P}" <<-_EOF_ + MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" + _EOF_ + + rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use miri; then + echo /usr/bin/miri >> "${T}/provider-${P}" + echo /usr/bin/cargo-miri >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/lib/rust/libexec >> "${T}/provider-${P}" + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + + if use dist; then + "${EPYTHON}" ./x.py dist -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die + insinto "/usr/lib/${PN}/${PV}/dist" + doins -r "${S}/build/dist/." + fi +} + +pkg_postinst() { + + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + if has_version app-editors/emacs; then + optfeature "emacs support for rust" app-emacs/rust-mode + fi + + if has_version app-editors/gvim || has_version app-editors/vim; then + optfeature "vim support for rust" app-vim/rust-vim + fi +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust/rust-1.84.0.ebuild b/dev-lang/rust/rust-1.84.0.ebuild deleted file mode 100644 index e40d98a96166..000000000000 --- a/dev-lang/rust/rust-1.84.0.ebuild +++ /dev/null @@ -1,741 +0,0 @@ -# Copyright 1999-2025 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 19 ) -PYTHON_COMPAT=( python3_{10..13} ) - -RUST_MAX_VER=${PV} -RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" - -inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing optfeature \ - multilib multilib-build python-any-r1 rust rust-toolchain toolchain-funcs verify-sig - -if [[ ${PV} = *beta* ]]; then - betaver=${PV//*beta} - BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" - MY_P="rustc-beta" - SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" -else - MY_P="rustc-${PV}" - SRC="${MY_P}-src.tar.xz" - KEYWORDS="~amd64 ~arm ~arm64 ~loong ~mips ~ppc ~ppc64 ~riscv ~sparc ~x86" -fi - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" - -SRC_URI=" - https://static.rust-lang.org/dist/${SRC} - verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) -" -S="${WORKDIR}/${MY_P}-src" - -# keep in sync with llvm ebuild of the same version as bundled one. -ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai - LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE - WebAssembly X86 XCore Xtensa ) -ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) -LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} - -# https://github.com/rust-lang/llvm-project/blob/rustc-1.84.0/llvm/CMakeLists.txt -ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" - -IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" - -LLVM_DEPEND=() -# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation -for _x in "${ALL_LLVM_TARGETS[@]}"; do - LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) -done -LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) -LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) - -BDEPEND="${PYTHON_DEPS} - app-eselect/eselect-rust - || ( - >=sys-devel/gcc-4.7 - >=llvm-core/clang-3.5 - ) - !system-llvm? ( - >=dev-build/cmake-3.13.4 - app-alternatives/ninja - ) - test? ( dev-debug/gdb ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -DEPEND=" - >=app-arch/xz-utils-5.2 - net-misc/curl:=[http2,ssl] - sys-libs/zlib:= - dev-libs/openssl:0= - system-llvm? ( - ${LLVM_DEPEND[*]} - llvm-libunwind? ( llvm-runtimes/libunwind:= ) - ) - !system-llvm? ( - !llvm-libunwind? ( - elibc_musl? ( sys-libs/libunwind:= ) - ) - ) -" - -RDEPEND="${DEPEND} - app-eselect/eselect-rust - dev-lang/rust-common - sys-apps/lsb-release - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" - -REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) - miri? ( nightly ) - parallel-compiler? ( nightly ) - rust-analyzer? ( rust-src ) - test? ( ${ALL_LLVM_TARGETS[*]} ) - wasm? ( llvm_targets_WebAssembly ) - x86? ( cpu_flags_x86_sse2 ) -" - -# we don't use cmake.eclass, but can get a warning -CMAKE_WARN_UNUSED_CLI=no - -QA_FLAGS_IGNORED=" - usr/lib/${PN}/${PV}/bin/.* - usr/lib/${PN}/${PV}/libexec/.* - usr/lib/${PN}/${PV}/lib/lib.*.so - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_SONAME=" - usr/lib/${PN}/${PV}/lib/lib.*.so.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_PRESTRIPPED=" - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -# causes double bootstrap -RESTRICT="test" - -VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc - -PATCHES=( - "${FILESDIR}"/1.78.0-musl-dynamic-linking.patch - "${FILESDIR}"/1.83.0-cross-compile-libz.patch - #"${FILESDIR}"/1.72.0-bump-libc-deps-to-0.2.146.patch # pending refresh - "${FILESDIR}"/1.67.0-doc-wasm.patch -) - -clear_vendor_checksums() { - sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die -} - -toml_usex() { - usex "${1}" true false -} - -pre_build_checks() { - local M=9216 - # multiply requirements by 1.3 if we are doing x86-multilib - if use amd64; then - M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) - fi - M=$(( $(usex clippy 128 0) + ${M} )) - M=$(( $(usex miri 128 0) + ${M} )) - M=$(( $(usex rustfmt 256 0) + ${M} )) - # add 2G if we compile llvm and 256M per llvm_target - if ! use system-llvm; then - M=$(( 2048 + ${M} )) - local ltarget - for ltarget in ${ALL_LLVM_TARGETS[@]}; do - M=$(( $(usex ${ltarget} 256 0) + ${M} )) - done - fi - M=$(( $(usex wasm 256 0) + ${M} )) - M=$(( $(usex debug 2 1) * ${M} )) - eshopts_push -s extglob - if is-flagq '-g?(gdb)?([1-9])'; then - M=$(( 15 * ${M} / 10 )) - fi - eshopts_pop - M=$(( $(usex doc 256 0) + ${M} )) - CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} -} - -llvm_check_deps() { - has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" -} - -# Is LLVM being linked against libc++? -is_libcxx_linked() { - local code='#include -#if defined(_LIBCPP_VERSION) - HAVE_LIBCXX -#endif -' - local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 - [[ ${out} == *HAVE_LIBCXX* ]] -} - -pkg_pretend() { - pre_build_checks -} - -pkg_setup() { - pre_build_checks - python-any-r1_pkg_setup - - export LIBGIT2_NO_PKG_CONFIG=1 #749381 - if tc-is-cross-compiler; then - use system-llvm && die "USE=system-llvm not allowed when cross-compiling" - local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" - use "llvm_targets_${cross_llvm_target}" || \ - die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" - fi - - rust_pkg_setup - - if use system-llvm; then - llvm-r1_pkg_setup - - local llvm_config="$(get_llvm_prefix)/bin/llvm-config" - export LLVM_LINK_SHARED=1 - export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" - fi -} - -src_prepare() { - # Rust baselines to Pentium4 on x86, this patch lowers the baseline to i586 when sse2 is not set. - if use x86; then - if ! use cpu_flags_x86_sse2; then - eapply "${FILESDIR}/1.82.0-i586-baseline.patch" - #grep -rl cmd.args.push\(\"-march=i686\" . | xargs sed -i 's/march=i686/-march=i586/g' || die - fi - fi - - default -} - -src_configure() { - if tc-is-cross-compiler; then - export PKG_CONFIG_ALLOW_CROSS=1 - export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" - export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" - export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" - fi - - filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 - - local rust_target="" rust_targets="" arch_cflags - - # Collect rust target names to compile standard libs for all ABIs. - for v in $(multilib_get_enabled_abi_pairs); do - rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" - done - if use wasm; then - rust_targets+=",\"wasm32-unknown-unknown\"" - if use system-llvm; then - # un-hardcode rust-lld linker for this target - # https://bugs.gentoo.org/715348 - sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/base/wasm.rs || die - fi - fi - rust_targets="${rust_targets#,}" - - # cargo and rustdoc are mandatory and should always be included - local tools='"cargo","rustdoc"' - use clippy && tools+=',"clippy"' - use miri && tools+=',"miri"' - use rustfmt && tools+=',"rustfmt"' - use rust-analyzer && tools+=',"rust-analyzer","rust-analyzer-proc-macro-srv"' - use rust-src && tools+=',"src"' - - local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" - # in case of prefix it will be already prefixed, as --print sysroot returns full path - [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" - - rust_target="$(rust_abi)" - rust_build="$(rust_abi "${CBUILD}")" - rust_host="$(rust_abi "${CHOST}")" - - LLVM_EXPERIMENTAL_TARGETS=() - for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do - if use llvm_targets_${_x} ; then - LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) - fi - done - LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} - - local cm_btype="$(usex debug DEBUG RELEASE)" - cat <<- _EOF_ > "${S}"/config.toml - # https://github.com/rust-lang/rust/issues/135358 (bug #947897) - profile = "dist" - [llvm] - download-ci-llvm = false - optimize = $(toml_usex !debug) - release-debuginfo = $(toml_usex debug) - assertions = $(toml_usex debug) - ninja = true - targets = "${LLVM_TARGETS// /;}" - experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" - link-shared = $(toml_usex system-llvm) - $(if is_libcxx_linked; then - # https://bugs.gentoo.org/732632 - echo "use-libcxx = true" - echo "static-libstdcpp = false" - fi) - $(case "${rust_target}" in - i586-*-linux-*) - # https://github.com/rust-lang/rust/issues/93059 - echo 'cflags = "-fcf-protection=none"' - echo 'cxxflags = "-fcf-protection=none"' - echo 'ldflags = "-fcf-protection=none"' - ;; - *) - ;; - esac) - enable-warnings = false - [llvm.build-config] - CMAKE_VERBOSE_MAKEFILE = "ON" - $(if ! tc-is-cross-compiler; then - # When cross-compiling, LLVM is compiled twice, once for host and - # once for target. Unfortunately, this build configuration applies - # to both, which means any flags applicable to one target but not - # the other will break. Conditionally disable respecting user - # flags when cross-compiling. - echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" - echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" - echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" - fi) - [build] - build-stage = 2 - test-stage = 2 - build = "${rust_build}" - host = ["${rust_host}"] - target = [${rust_targets}] - cargo = "${rust_stage0_root}/bin/cargo" - rustc = "${rust_stage0_root}/bin/rustc" - rustfmt = "${rust_stage0_root}/bin/rustfmt" - docs = $(toml_usex doc) - compiler-docs = false - submodules = false - python = "${EPYTHON}" - locked-deps = true - vendor = true - extended = true - tools = [${tools}] - verbose = 2 - sanitizers = false - profiler = true - cargo-native-static = false - [install] - prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" - sysconfdir = "etc" - docdir = "share/doc/rust" - bindir = "bin" - libdir = "lib" - mandir = "share/man" - [rust] - # https://github.com/rust-lang/rust/issues/54872 - codegen-units-std = 1 - optimize = true - debug = $(toml_usex debug) - debug-assertions = $(toml_usex debug) - debug-assertions-std = $(toml_usex debug) - debuginfo-level = $(usex debug 2 0) - debuginfo-level-rustc = $(usex debug 2 0) - debuginfo-level-std = $(usex debug 2 0) - debuginfo-level-tools = $(usex debug 2 0) - debuginfo-level-tests = 0 - backtrace = true - incremental = false - $(if ! tc-is-cross-compiler; then - echo "default-linker = \"$(tc-getCC)\"" - fi) - parallel-compiler = $(toml_usex parallel-compiler) - channel = "$(usex nightly nightly stable)" - description = "gentoo" - rpath = false - verbose-tests = true - optimize-tests = $(toml_usex !debug) - codegen-tests = true - dist-src = false - remap-debuginfo = true - lld = $(usex system-llvm false $(toml_usex wasm)) - # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it - # https://github.com/rust-lang/rust/issues/74976 - # https://github.com/rust-lang/rust/issues/76526 - deny-warnings = $(usex wasm $(usex doc false true) true) - backtrace-on-ice = true - jemalloc = false - # See https://github.com/rust-lang/rust/issues/121124 - lto = "$(usex lto thin off)" - [dist] - src-tarball = false - compression-formats = ["xz"] - compression-profile = "balanced" - _EOF_ - - for v in $(multilib_get_enabled_abi_pairs); do - rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) - arch_cflags="$(get_abi_CFLAGS ${v##*.})" - - export CFLAGS_${rust_target//-/_}="${arch_cflags}" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${rust_target}] - ar = "$(tc-getAR)" - cc = "$(tc-getCC)" - cxx = "$(tc-getCXX)" - linker = "$(tc-getCC)" - ranlib = "$(tc-getRANLIB)" - llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; - # but we patch it and set to false here as well - if use elibc_musl; then - cat <<- _EOF_ >> "${S}"/config.toml - crt-static = false - musl-root = "$($(tc-getCC) -print-sysroot)/usr" - _EOF_ - fi - done - if use wasm; then - wasm_target="wasm32-unknown-unknown" - export CFLAGS_${wasm_target//-/_}="$(filter-flags '-mcpu*' '-march*' '-mtune*'; echo "$CFLAGS")" - cat <<- _EOF_ >> "${S}"/config.toml - [target.wasm32-unknown-unknown] - linker = "$(usex system-llvm lld rust-lld)" - # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 - profiler = false - _EOF_ - fi - - if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below - # experimental cross support - # discussion: https://bugs.gentoo.org/679878 - # TODO: c*flags, clang, system-llvm, cargo.eclass target support - # it would be much better if we could split out stdlib - # complilation to separate ebuild and abuse CATEGORY to - # just install to /usr/lib/rustlib/ - - # extra targets defined as a bash array - # spec format: :: - # best place would be /etc/portage/env/dev-lang/rust - # Example: - # RUST_CROSS_TARGETS=( - # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" - # ) - # no extra hand holding is done, no target transformations, all - # values are passed as-is with just basic checks, so it's up to user to supply correct values - # valid rust targets can be obtained with - # rustc --print target-list - # matching cross toolchain has to be installed - # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) - # only gcc toolchains installed with crossdev are checked for now. - - # BUG: we can't pass host flags to cross compiler, so just filter for now - # BUG: this should be more fine-grained. - filter-flags '-mcpu=*' '-march=*' '-mtune=*' - - local cross_target_spec - for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do - # extracts first element form :: - local cross_llvm_target="${cross_target_spec%%:*}" - # extracts toolchain triples, : - local cross_triples="${cross_target_spec#*:}" - # extracts first element after before : separator - local cross_rust_target="${cross_triples%%:*}" - # extracts last element after : separator - local cross_toolchain="${cross_triples##*:}" - use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" - command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${cross_rust_target}] - ar = "${cross_toolchain}-ar" - cc = "${cross_toolchain}-gcc" - cxx = "${cross_toolchain}-g++" - linker = "${cross_toolchain}-gcc" - ranlib = "${cross_toolchain}-ranlib" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - if [[ "${cross_toolchain}" == *-musl* ]]; then - cat <<- _EOF_ >> "${S}"/config.toml - musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" - _EOF_ - fi - - # append cross target to "normal" target list - # example 'target = ["powerpc64le-unknown-linux-gnu"]' - # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' - - rust_targets="${rust_targets},\"${cross_rust_target}\"" - sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die - - ewarn - ewarn "Enabled ${cross_rust_target} rust target" - ewarn "Using ${cross_toolchain} cross toolchain" - ewarn - if ! has_version -b 'sys-devel/binutils[multitarget]' ; then - ewarn "'sys-devel/binutils[multitarget]' is not installed" - ewarn "'strip' will be unable to strip cross libraries" - ewarn "cross targets will be installed with full debug information" - ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" - ewarn - ewarn "Alternatively llvm-strip can be used, it supports stripping any target" - ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" - ewarn - fi - done - fi # I_KNOW_WHAT_I_AM_DOING_CROSS - - einfo "Rust configured with the following flags:" - echo - echo RUSTFLAGS="\"${RUSTFLAGS}\"" - echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" - echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" - echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" - env | grep "CARGO_TARGET_.*_RUSTFLAGS=" - env | grep "CFLAGS_.*" - echo - einfo "config.toml contents:" - cat "${S}"/config.toml || die - echo -} - -src_compile() { - RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die -} - -src_test() { - # https://rustc-dev-guide.rust-lang.org/tests/intro.html - - # those are basic and codegen tests. - local tests=( - codegen - codegen-units - compile-fail - incremental - mir-opt - pretty - run-make - ) - - # fails if llvm is not built with ALL targets. - # and known to fail with system llvm sometimes. - use system-llvm || tests+=( assembly ) - - # fragile/expensive/less important tests - # or tests that require extra builds - # TODO: instead of skipping, just make some nonfatal. - if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then - tests+=( - rustdoc - rustdoc-js - rustdoc-js-std - rustdoc-ui - run-make-fulldeps - ui - ui-fulldeps - ) - fi - - local i failed=() - einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" - for i in "${tests[@]}"; do - local t="src/test/${i}" - einfo "rust_src_test: running ${t}" - if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ - -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" - then - failed+=( "${t}" ) - eerror "rust_src_test: ${t} failed" - fi - done - - if [[ ${#failed[@]} -ne 0 ]]; then - eerror "rust_src_test: failure summary: ${failed[@]}" - die "aborting due to test failures" - fi -} - -src_install() { - DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die - - docompress /usr/lib/${PN}/${PV}/share/man/ - - # bug #689562, #689160 - rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die - rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use miri && symlinks+=( miri cargo-miri ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- - # need to fix eselect-rust to remove this hack. - local ver_i="${i}-${PV}" - if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then - einfo "Installing ${i} symlink" - ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die - else - ewarn "${i} symlink requested, but source file not found" - ewarn "please report this" - fi - dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" - use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" - dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" - dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" - dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" - - newenvd - "50${P}" <<-_EOF_ - LDPATH="${EPREFIX}/usr/lib/rust/lib-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" - _EOF_ - - rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use miri; then - echo /usr/bin/miri >> "${T}/provider-${P}" - echo /usr/bin/cargo-miri >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/lib/rust/libexec >> "${T}/provider-${P}" - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - - if use dist; then - "${EPYTHON}" ./x.py dist -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die - insinto "/usr/lib/${PN}/${PV}/dist" - doins -r "${S}/build/dist/." - fi -} - -pkg_preinst() { - # 943308 and friends; basically --keep-going can forget to unmerge old rust - # but the soft blocker allows us to install conflicting files. - # This results in duplicated .{rlib,so} files which confuses rustc and results in - # the need for manual intervention. - if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then - # we need to find all .{rlib,so} files in the old rust lib directory - # and store them in an array for later use - readarray -d '' old_rust_libs < <( - find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ - -type f \( -name '*.rlib' -o -name '*.so' \) -print0) - export old_rust_libs - if [[ ${#old_rust_libs[@]} -gt 0 ]]; then - einfo "Found old .rlib and .so files in the old rust lib directory" - else - die "Found no old .rlib and .so files but old rust version is installed. Bailing!" - fi - fi -} - -pkg_postinst() { - - if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then - # Be _extra_ careful here as we're removing files from the live filesystem - local f - for f in "${old_rust_libs[@]}"; do - [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" - local base_name="${f%-*}" - local ext="${f##*.}" - local matching_files=("${base_name}"-*.${ext}) - if [[ ${#matching_files[@]} -ne 2 ]]; then - die "Expected exactly two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" - fi - einfo "Removing old .rlib file ${f}" - rm "${f}" || die - done - fi - - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - if has_version app-editors/emacs; then - optfeature "emacs support for rust" app-emacs/rust-mode - fi - - if has_version app-editors/gvim || has_version app-editors/vim; then - optfeature "vim support for rust" app-vim/rust-vim - fi -} - -pkg_postrm() { - eselect rust cleanup -} diff --git a/dev-lang/rust/rust-1.84.1-r1.ebuild b/dev-lang/rust/rust-1.84.1-r1.ebuild new file mode 100644 index 000000000000..8ae682155bcc --- /dev/null +++ b/dev-lang/rust/rust-1.84.1-r1.ebuild @@ -0,0 +1,704 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LLVM_COMPAT=( 19 ) +PYTHON_COMPAT=( python3_{10..13} ) + +RUST_MAX_VER=${PV} +RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" + +inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing optfeature \ + multilib multilib-build python-any-r1 rust rust-toolchain toolchain-funcs verify-sig + +if [[ ${PV} = *beta* ]]; then + betaver=${PV//*beta} + BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" + MY_P="rustc-beta" + SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" +else + MY_P="rustc-${PV}" + SRC="${MY_P}-src.tar.xz" + KEYWORDS="~amd64 ~arm ~arm64 ~loong ~mips ~ppc ~ppc64 ~riscv ~sparc ~x86" +fi + +DESCRIPTION="Systems programming language from Mozilla" +HOMEPAGE="https://www.rust-lang.org/" + +SRC_URI=" + https://static.rust-lang.org/dist/${SRC} + verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) +" +S="${WORKDIR}/${MY_P}-src" + +# keep in sync with llvm ebuild of the same version as bundled one. +ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai + LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE + WebAssembly X86 XCore Xtensa ) +ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) +LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} + +# https://github.com/rust-lang/llvm-project/blob/rustc-1.84.0/llvm/CMakeLists.txt +ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) + +LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" +SLOT="${PV}" + +IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" + +LLVM_DEPEND=() +# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation +for _x in "${ALL_LLVM_TARGETS[@]}"; do + LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) +done +LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) +LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) + +BDEPEND="${PYTHON_DEPS} + app-eselect/eselect-rust + || ( + >=sys-devel/gcc-4.7 + >=llvm-core/clang-3.5 + ) + !system-llvm? ( + >=dev-build/cmake-3.13.4 + app-alternatives/ninja + ) + test? ( dev-debug/gdb ) + verify-sig? ( sec-keys/openpgp-keys-rust ) +" + +DEPEND=" + >=app-arch/xz-utils-5.2 + net-misc/curl:=[http2,ssl] + sys-libs/zlib:= + dev-libs/openssl:0= + system-llvm? ( + ${LLVM_DEPEND[*]} + llvm-libunwind? ( llvm-runtimes/libunwind:= ) + ) + !system-llvm? ( + !llvm-libunwind? ( + elibc_musl? ( sys-libs/libunwind:= ) + ) + ) +" + +RDEPEND="${DEPEND} + app-eselect/eselect-rust + dev-lang/rust-common + sys-apps/lsb-release + !dev-lang/rust:stable + !dev-lang/rust-bin:stable +" + +REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) + miri? ( nightly ) + parallel-compiler? ( nightly ) + rust-analyzer? ( rust-src ) + test? ( ${ALL_LLVM_TARGETS[*]} ) + wasm? ( llvm_targets_WebAssembly ) + x86? ( cpu_flags_x86_sse2 ) +" + +# we don't use cmake.eclass, but can get a warning +CMAKE_WARN_UNUSED_CLI=no + +QA_FLAGS_IGNORED=" + usr/lib/${PN}/${PV}/bin/.* + usr/lib/${PN}/${PV}/libexec/.* + usr/lib/${PN}/${PV}/lib/lib.*.so + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_SONAME=" + usr/lib/${PN}/${PV}/lib/lib.*.so.* + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so +" + +QA_PRESTRIPPED=" + usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp + usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o +" + +# An rmeta file is custom binary format that contains the metadata for the crate. +# rmeta files do not support linking, since they do not contain compiled object files. +# so we can safely silence the warning for this QA check. +QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" + +# causes double bootstrap +RESTRICT="test" + +VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc + +PATCHES=( + "${FILESDIR}"/1.78.0-musl-dynamic-linking.patch + "${FILESDIR}"/1.83.0-cross-compile-libz.patch + "${FILESDIR}"/1.67.0-doc-wasm.patch + "${FILESDIR}"/1.84.1-fix-cross.patch # already upstreamed +) + +clear_vendor_checksums() { + sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die +} + +toml_usex() { + usex "${1}" true false +} + +pre_build_checks() { + local M=9216 + # multiply requirements by 1.3 if we are doing x86-multilib + if use amd64; then + M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) + fi + M=$(( $(usex clippy 128 0) + ${M} )) + M=$(( $(usex miri 128 0) + ${M} )) + M=$(( $(usex rustfmt 256 0) + ${M} )) + # add 2G if we compile llvm and 256M per llvm_target + if ! use system-llvm; then + M=$(( 2048 + ${M} )) + local ltarget + for ltarget in ${ALL_LLVM_TARGETS[@]}; do + M=$(( $(usex ${ltarget} 256 0) + ${M} )) + done + fi + M=$(( $(usex wasm 256 0) + ${M} )) + M=$(( $(usex debug 2 1) * ${M} )) + eshopts_push -s extglob + if is-flagq '-g?(gdb)?([1-9])'; then + M=$(( 15 * ${M} / 10 )) + fi + eshopts_pop + M=$(( $(usex doc 256 0) + ${M} )) + CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} +} + +llvm_check_deps() { + has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" +} + +# Is LLVM being linked against libc++? +is_libcxx_linked() { + local code='#include +#if defined(_LIBCPP_VERSION) + HAVE_LIBCXX +#endif +' + local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 + [[ ${out} == *HAVE_LIBCXX* ]] +} + +pkg_pretend() { + pre_build_checks +} + +pkg_setup() { + pre_build_checks + python-any-r1_pkg_setup + + export LIBGIT2_NO_PKG_CONFIG=1 #749381 + if tc-is-cross-compiler; then + use system-llvm && die "USE=system-llvm not allowed when cross-compiling" + local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" + use "llvm_targets_${cross_llvm_target}" || \ + die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" + fi + + rust_pkg_setup + + if use system-llvm; then + llvm-r1_pkg_setup + + local llvm_config="$(get_llvm_prefix)/bin/llvm-config" + export LLVM_LINK_SHARED=1 + export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" + fi +} + +src_prepare() { + # Rust baselines to Pentium4 on x86, this patch lowers the baseline to i586 when sse2 is not set. + if use x86; then + if ! use cpu_flags_x86_sse2; then + eapply "${FILESDIR}/1.82.0-i586-baseline.patch" + #grep -rl cmd.args.push\(\"-march=i686\" . | xargs sed -i 's/march=i686/-march=i586/g' || die + fi + fi + + default +} + +src_configure() { + if tc-is-cross-compiler; then + export PKG_CONFIG_ALLOW_CROSS=1 + export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" + export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" + export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" + fi + + filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 + + local rust_target="" rust_targets="" arch_cflags + + # Collect rust target names to compile standard libs for all ABIs. + for v in $(multilib_get_enabled_abi_pairs); do + rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" + done + if use wasm; then + rust_targets+=",\"wasm32-unknown-unknown\"" + if use system-llvm; then + # un-hardcode rust-lld linker for this target + # https://bugs.gentoo.org/715348 + sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/base/wasm.rs || die + fi + fi + rust_targets="${rust_targets#,}" + + # cargo and rustdoc are mandatory and should always be included + local tools='"cargo","rustdoc"' + use clippy && tools+=',"clippy"' + use miri && tools+=',"miri"' + use rustfmt && tools+=',"rustfmt"' + use rust-analyzer && tools+=',"rust-analyzer","rust-analyzer-proc-macro-srv"' + use rust-src && tools+=',"src"' + + local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" + # in case of prefix it will be already prefixed, as --print sysroot returns full path + [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" + + rust_target="$(rust_abi)" + rust_build="$(rust_abi "${CBUILD}")" + rust_host="$(rust_abi "${CHOST}")" + + LLVM_EXPERIMENTAL_TARGETS=() + for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do + if use llvm_targets_${_x} ; then + LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) + fi + done + LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} + + local cm_btype="$(usex debug DEBUG RELEASE)" + cat <<- _EOF_ > "${S}"/config.toml + # https://github.com/rust-lang/rust/issues/135358 (bug #947897) + profile = "dist" + [llvm] + download-ci-llvm = false + optimize = $(toml_usex !debug) + release-debuginfo = $(toml_usex debug) + assertions = $(toml_usex debug) + ninja = true + targets = "${LLVM_TARGETS// /;}" + experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" + link-shared = $(toml_usex system-llvm) + $(if is_libcxx_linked; then + # https://bugs.gentoo.org/732632 + echo "use-libcxx = true" + echo "static-libstdcpp = false" + fi) + $(case "${rust_target}" in + i586-*-linux-*) + # https://github.com/rust-lang/rust/issues/93059 + echo 'cflags = "-fcf-protection=none"' + echo 'cxxflags = "-fcf-protection=none"' + echo 'ldflags = "-fcf-protection=none"' + ;; + *) + ;; + esac) + enable-warnings = false + [llvm.build-config] + CMAKE_VERBOSE_MAKEFILE = "ON" + $(if ! tc-is-cross-compiler; then + # When cross-compiling, LLVM is compiled twice, once for host and + # once for target. Unfortunately, this build configuration applies + # to both, which means any flags applicable to one target but not + # the other will break. Conditionally disable respecting user + # flags when cross-compiling. + echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" + echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" + echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" + echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" + fi) + [build] + build-stage = 2 + test-stage = 2 + build = "${rust_build}" + host = ["${rust_host}"] + target = [${rust_targets}] + cargo = "${rust_stage0_root}/bin/cargo" + rustc = "${rust_stage0_root}/bin/rustc" + rustfmt = "${rust_stage0_root}/bin/rustfmt" + docs = $(toml_usex doc) + compiler-docs = false + submodules = false + python = "${EPYTHON}" + locked-deps = true + vendor = true + extended = true + tools = [${tools}] + verbose = 2 + sanitizers = false + profiler = true + cargo-native-static = false + [install] + prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" + sysconfdir = "etc" + docdir = "share/doc/rust" + bindir = "bin" + libdir = "lib" + mandir = "share/man" + [rust] + # https://github.com/rust-lang/rust/issues/54872 + codegen-units-std = 1 + optimize = true + debug = $(toml_usex debug) + debug-assertions = $(toml_usex debug) + debug-assertions-std = $(toml_usex debug) + debuginfo-level = $(usex debug 2 0) + debuginfo-level-rustc = $(usex debug 2 0) + debuginfo-level-std = $(usex debug 2 0) + debuginfo-level-tools = $(usex debug 2 0) + debuginfo-level-tests = 0 + backtrace = true + incremental = false + $(if ! tc-is-cross-compiler; then + echo "default-linker = \"$(tc-getCC)\"" + fi) + parallel-compiler = $(toml_usex parallel-compiler) + channel = "$(usex nightly nightly stable)" + description = "gentoo" + rpath = true + verbose-tests = true + optimize-tests = $(toml_usex !debug) + codegen-tests = true + dist-src = false + remap-debuginfo = true + lld = $(usex system-llvm false $(toml_usex wasm)) + # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it + # https://github.com/rust-lang/rust/issues/74976 + # https://github.com/rust-lang/rust/issues/76526 + deny-warnings = $(usex wasm $(usex doc false true) true) + backtrace-on-ice = true + jemalloc = false + # See https://github.com/rust-lang/rust/issues/121124 + lto = "$(usex lto thin off)" + [dist] + src-tarball = false + compression-formats = ["xz"] + compression-profile = "balanced" + _EOF_ + + for v in $(multilib_get_enabled_abi_pairs); do + rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) + arch_cflags="$(get_abi_CFLAGS ${v##*.})" + + export CFLAGS_${rust_target//-/_}="${arch_cflags}" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${rust_target}] + ar = "$(tc-getAR)" + cc = "$(tc-getCC)" + cxx = "$(tc-getCXX)" + linker = "$(tc-getCC)" + ranlib = "$(tc-getRANLIB)" + llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; + # but we patch it and set to false here as well + if use elibc_musl; then + cat <<- _EOF_ >> "${S}"/config.toml + crt-static = false + musl-root = "$($(tc-getCC) -print-sysroot)/usr" + _EOF_ + fi + done + if use wasm; then + wasm_target="wasm32-unknown-unknown" + export CFLAGS_${wasm_target//-/_}="$(filter-flags '-mcpu*' '-march*' '-mtune*'; echo "$CFLAGS")" + cat <<- _EOF_ >> "${S}"/config.toml + [target.wasm32-unknown-unknown] + linker = "$(usex system-llvm lld rust-lld)" + # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 + profiler = false + _EOF_ + fi + + if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below + # experimental cross support + # discussion: https://bugs.gentoo.org/679878 + # TODO: c*flags, clang, system-llvm, cargo.eclass target support + # it would be much better if we could split out stdlib + # complilation to separate ebuild and abuse CATEGORY to + # just install to /usr/lib/rustlib/ + + # extra targets defined as a bash array + # spec format: :: + # best place would be /etc/portage/env/dev-lang/rust + # Example: + # RUST_CROSS_TARGETS=( + # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" + # ) + # no extra hand holding is done, no target transformations, all + # values are passed as-is with just basic checks, so it's up to user to supply correct values + # valid rust targets can be obtained with + # rustc --print target-list + # matching cross toolchain has to be installed + # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) + # only gcc toolchains installed with crossdev are checked for now. + + # BUG: we can't pass host flags to cross compiler, so just filter for now + # BUG: this should be more fine-grained. + filter-flags '-mcpu=*' '-march=*' '-mtune=*' + + local cross_target_spec + for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do + # extracts first element form :: + local cross_llvm_target="${cross_target_spec%%:*}" + # extracts toolchain triples, : + local cross_triples="${cross_target_spec#*:}" + # extracts first element after before : separator + local cross_rust_target="${cross_triples%%:*}" + # extracts last element after : separator + local cross_toolchain="${cross_triples##*:}" + use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" + command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" + + cat <<- _EOF_ >> "${S}"/config.toml + [target.${cross_rust_target}] + ar = "${cross_toolchain}-ar" + cc = "${cross_toolchain}-gcc" + cxx = "${cross_toolchain}-g++" + linker = "${cross_toolchain}-gcc" + ranlib = "${cross_toolchain}-ranlib" + _EOF_ + if use system-llvm; then + cat <<- _EOF_ >> "${S}"/config.toml + llvm-config = "$(get_llvm_prefix)/bin/llvm-config" + _EOF_ + fi + if [[ "${cross_toolchain}" == *-musl* ]]; then + cat <<- _EOF_ >> "${S}"/config.toml + musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" + _EOF_ + fi + + # append cross target to "normal" target list + # example 'target = ["powerpc64le-unknown-linux-gnu"]' + # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' + + rust_targets="${rust_targets},\"${cross_rust_target}\"" + sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die + + ewarn + ewarn "Enabled ${cross_rust_target} rust target" + ewarn "Using ${cross_toolchain} cross toolchain" + ewarn + if ! has_version -b 'sys-devel/binutils[multitarget]' ; then + ewarn "'sys-devel/binutils[multitarget]' is not installed" + ewarn "'strip' will be unable to strip cross libraries" + ewarn "cross targets will be installed with full debug information" + ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" + ewarn + ewarn "Alternatively llvm-strip can be used, it supports stripping any target" + ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" + ewarn + fi + done + fi # I_KNOW_WHAT_I_AM_DOING_CROSS + + einfo "Rust configured with the following flags:" + echo + echo RUSTFLAGS="\"${RUSTFLAGS}\"" + echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" + echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" + echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" + env | grep "CARGO_TARGET_.*_RUSTFLAGS=" + env | grep "CFLAGS_.*" + echo + einfo "config.toml contents:" + cat "${S}"/config.toml || die + echo +} + +src_compile() { + RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die +} + +src_test() { + # https://rustc-dev-guide.rust-lang.org/tests/intro.html + + # those are basic and codegen tests. + local tests=( + codegen + codegen-units + compile-fail + incremental + mir-opt + pretty + run-make + ) + + # fails if llvm is not built with ALL targets. + # and known to fail with system llvm sometimes. + use system-llvm || tests+=( assembly ) + + # fragile/expensive/less important tests + # or tests that require extra builds + # TODO: instead of skipping, just make some nonfatal. + if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then + tests+=( + rustdoc + rustdoc-js + rustdoc-js-std + rustdoc-ui + run-make-fulldeps + ui + ui-fulldeps + ) + fi + + local i failed=() + einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" + for i in "${tests[@]}"; do + local t="src/test/${i}" + einfo "rust_src_test: running ${t}" + if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ + -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" + then + failed+=( "${t}" ) + eerror "rust_src_test: ${t} failed" + fi + done + + if [[ ${#failed[@]} -ne 0 ]]; then + eerror "rust_src_test: failure summary: ${failed[@]}" + die "aborting due to test failures" + fi +} + +src_install() { + DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die + + docompress /usr/lib/${PN}/${PV}/share/man/ + + # bug #689562, #689160 + rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die + rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die + + local symlinks=( + cargo + rustc + rustdoc + rust-gdb + rust-gdbgui + rust-lldb + ) + + use clippy && symlinks+=( clippy-driver cargo-clippy ) + use miri && symlinks+=( miri cargo-miri ) + use rustfmt && symlinks+=( rustfmt cargo-fmt ) + use rust-analyzer && symlinks+=( rust-analyzer ) + + einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" + local i + for i in "${symlinks[@]}"; do + # we need realpath on /usr/bin/* symlink return version-appended binary path. + # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- + # need to fix eselect-rust to remove this hack. + local ver_i="${i}-${PV}" + if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then + einfo "Installing ${i} symlink" + ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die + else + ewarn "${i} symlink requested, but source file not found" + ewarn "please report this" + fi + dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" + done + + # symlinks to switch components to active rust in eselect + dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" + use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" + dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" + dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" + dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" + + newenvd - "50${P}" <<-_EOF_ + MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" + _EOF_ + + rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die + rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die + + # note: eselect-rust adds EROOT to all paths below + cat <<-_EOF_ > "${T}/provider-${P}" + /usr/bin/cargo + /usr/bin/rustdoc + /usr/bin/rust-gdb + /usr/bin/rust-gdbgui + /usr/bin/rust-lldb + /usr/lib/rustlib + /usr/lib/rust/lib + /usr/lib/rust/man + /usr/share/doc/rust + _EOF_ + + if use clippy; then + echo /usr/bin/clippy-driver >> "${T}/provider-${P}" + echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" + fi + if use miri; then + echo /usr/bin/miri >> "${T}/provider-${P}" + echo /usr/bin/cargo-miri >> "${T}/provider-${P}" + fi + if use rustfmt; then + echo /usr/bin/rustfmt >> "${T}/provider-${P}" + echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" + fi + if use rust-analyzer; then + echo /usr/lib/rust/libexec >> "${T}/provider-${P}" + echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" + fi + + insinto /etc/env.d/rust + doins "${T}/provider-${P}" + + if use dist; then + "${EPYTHON}" ./x.py dist -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die + insinto "/usr/lib/${PN}/${PV}/dist" + doins -r "${S}/build/dist/." + fi +} + +pkg_postinst() { + + eselect rust update + + if has_version dev-debug/gdb || has_version llvm-core/lldb; then + elog "Rust installs helper scripts for calling GDB and LLDB," + elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." + fi + + if has_version app-editors/emacs; then + optfeature "emacs support for rust" app-emacs/rust-mode + fi + + if has_version app-editors/gvim || has_version app-editors/vim; then + optfeature "vim support for rust" app-vim/rust-vim + fi +} + +pkg_postrm() { + eselect rust cleanup +} diff --git a/dev-lang/rust/rust-1.84.1.ebuild b/dev-lang/rust/rust-1.84.1.ebuild deleted file mode 100644 index 12a8d60e406a..000000000000 --- a/dev-lang/rust/rust-1.84.1.ebuild +++ /dev/null @@ -1,741 +0,0 @@ -# Copyright 1999-2025 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -LLVM_COMPAT=( 19 ) -PYTHON_COMPAT=( python3_{10..13} ) - -RUST_MAX_VER=${PV} -RUST_MIN_VER="$(ver_cut 1).$(($(ver_cut 2) - 1)).0" - -inherit check-reqs estack flag-o-matic llvm-r1 multiprocessing optfeature \ - multilib multilib-build python-any-r1 rust rust-toolchain toolchain-funcs verify-sig - -if [[ ${PV} = *beta* ]]; then - betaver=${PV//*beta} - BETA_SNAPSHOT="${betaver:0:4}-${betaver:4:2}-${betaver:6:2}" - MY_P="rustc-beta" - SRC="${BETA_SNAPSHOT}/rustc-beta-src.tar.xz -> rustc-${PV}-src.tar.xz" -else - MY_P="rustc-${PV}" - SRC="${MY_P}-src.tar.xz" - KEYWORDS="~amd64 ~arm ~arm64 ~loong ~mips ~ppc ~ppc64 ~riscv ~sparc ~x86" -fi - -DESCRIPTION="Systems programming language from Mozilla" -HOMEPAGE="https://www.rust-lang.org/" - -SRC_URI=" - https://static.rust-lang.org/dist/${SRC} - verify-sig? ( https://static.rust-lang.org/dist/${SRC}.asc ) -" -S="${WORKDIR}/${MY_P}-src" - -# keep in sync with llvm ebuild of the same version as bundled one. -ALL_LLVM_TARGETS=( AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai - LoongArch M68k Mips MSP430 NVPTX PowerPC RISCV Sparc SPIRV SystemZ VE - WebAssembly X86 XCore Xtensa ) -ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" ) -LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?} - -# https://github.com/rust-lang/llvm-project/blob/rustc-1.84.0/llvm/CMakeLists.txt -ALL_LLVM_EXPERIMENTAL_TARGETS=( ARC CSKY DirectX M68k SPIRV Xtensa ) - -LICENSE="|| ( MIT Apache-2.0 ) BSD BSD-1 BSD-2 BSD-4" -SLOT="${PV}" - -IUSE="big-endian clippy cpu_flags_x86_sse2 debug dist doc llvm-libunwind lto miri nightly parallel-compiler rustfmt rust-analyzer rust-src system-llvm test wasm ${ALL_LLVM_TARGETS[*]}" - -LLVM_DEPEND=() -# splitting usedeps needed to avoid CI/pkgcheck's UncheckableDep limitation -for _x in "${ALL_LLVM_TARGETS[@]}"; do - LLVM_DEPEND+=( " ${_x}? ( $(llvm_gen_dep "llvm-core/llvm:\${LLVM_SLOT}[${_x}]") )" ) -done -LLVM_DEPEND+=( " wasm? ( $(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}') )" ) -LLVM_DEPEND+=( " $(llvm_gen_dep 'llvm-core/llvm:${LLVM_SLOT}')" ) - -BDEPEND="${PYTHON_DEPS} - app-eselect/eselect-rust - || ( - >=sys-devel/gcc-4.7 - >=llvm-core/clang-3.5 - ) - !system-llvm? ( - >=dev-build/cmake-3.13.4 - app-alternatives/ninja - ) - test? ( dev-debug/gdb ) - verify-sig? ( sec-keys/openpgp-keys-rust ) -" - -DEPEND=" - >=app-arch/xz-utils-5.2 - net-misc/curl:=[http2,ssl] - sys-libs/zlib:= - dev-libs/openssl:0= - system-llvm? ( - ${LLVM_DEPEND[*]} - llvm-libunwind? ( llvm-runtimes/libunwind:= ) - ) - !system-llvm? ( - !llvm-libunwind? ( - elibc_musl? ( sys-libs/libunwind:= ) - ) - ) -" - -RDEPEND="${DEPEND} - app-eselect/eselect-rust - dev-lang/rust-common - sys-apps/lsb-release - !dev-lang/rust:stable - !dev-lang/rust-bin:stable -" - -REQUIRED_USE="|| ( ${ALL_LLVM_TARGETS[*]} ) - miri? ( nightly ) - parallel-compiler? ( nightly ) - rust-analyzer? ( rust-src ) - test? ( ${ALL_LLVM_TARGETS[*]} ) - wasm? ( llvm_targets_WebAssembly ) - x86? ( cpu_flags_x86_sse2 ) -" - -# we don't use cmake.eclass, but can get a warning -CMAKE_WARN_UNUSED_CLI=no - -QA_FLAGS_IGNORED=" - usr/lib/${PN}/${PV}/bin/.* - usr/lib/${PN}/${PV}/libexec/.* - usr/lib/${PN}/${PV}/lib/lib.*.so - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_SONAME=" - usr/lib/${PN}/${PV}/lib/lib.*.so.* - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/lib.*.so -" - -QA_PRESTRIPPED=" - usr/lib/${PN}/${PV}/lib/rustlib/.*/bin/rust-llvm-dwp - usr/lib/${PN}/${PV}/lib/rustlib/.*/lib/self-contained/crtn.o -" - -# An rmeta file is custom binary format that contains the metadata for the crate. -# rmeta files do not support linking, since they do not contain compiled object files. -# so we can safely silence the warning for this QA check. -QA_EXECSTACK="usr/lib/${PN}/${PV}/lib/rustlib/*/lib*.rlib:lib.rmeta" - -# causes double bootstrap -RESTRICT="test" - -VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/rust.asc - -PATCHES=( - "${FILESDIR}"/1.78.0-musl-dynamic-linking.patch - "${FILESDIR}"/1.83.0-cross-compile-libz.patch - "${FILESDIR}"/1.67.0-doc-wasm.patch - "${FILESDIR}"/1.84.1-fix-cross.patch # already upstreamed -) - -clear_vendor_checksums() { - sed -i 's/\("files":{\)[^}]*/\1/' "vendor/${1}/.cargo-checksum.json" || die -} - -toml_usex() { - usex "${1}" true false -} - -pre_build_checks() { - local M=9216 - # multiply requirements by 1.3 if we are doing x86-multilib - if use amd64; then - M=$(( $(usex abi_x86_32 13 10) * ${M} / 10 )) - fi - M=$(( $(usex clippy 128 0) + ${M} )) - M=$(( $(usex miri 128 0) + ${M} )) - M=$(( $(usex rustfmt 256 0) + ${M} )) - # add 2G if we compile llvm and 256M per llvm_target - if ! use system-llvm; then - M=$(( 2048 + ${M} )) - local ltarget - for ltarget in ${ALL_LLVM_TARGETS[@]}; do - M=$(( $(usex ${ltarget} 256 0) + ${M} )) - done - fi - M=$(( $(usex wasm 256 0) + ${M} )) - M=$(( $(usex debug 2 1) * ${M} )) - eshopts_push -s extglob - if is-flagq '-g?(gdb)?([1-9])'; then - M=$(( 15 * ${M} / 10 )) - fi - eshopts_pop - M=$(( $(usex doc 256 0) + ${M} )) - CHECKREQS_DISK_BUILD=${M}M check-reqs_pkg_${EBUILD_PHASE} -} - -llvm_check_deps() { - has_version -r "llvm-core/llvm:${LLVM_SLOT}[${LLVM_TARGET_USEDEPS// /,}]" -} - -# Is LLVM being linked against libc++? -is_libcxx_linked() { - local code='#include -#if defined(_LIBCPP_VERSION) - HAVE_LIBCXX -#endif -' - local out=$($(tc-getCXX) ${CXXFLAGS} ${CPPFLAGS} -x c++ -E -P - <<<"${code}") || return 1 - [[ ${out} == *HAVE_LIBCXX* ]] -} - -pkg_pretend() { - pre_build_checks -} - -pkg_setup() { - pre_build_checks - python-any-r1_pkg_setup - - export LIBGIT2_NO_PKG_CONFIG=1 #749381 - if tc-is-cross-compiler; then - use system-llvm && die "USE=system-llvm not allowed when cross-compiling" - local cross_llvm_target="$(llvm_tuple_to_target "${CBUILD}")" - use "llvm_targets_${cross_llvm_target}" || \ - die "Must enable LLVM_TARGETS=${cross_llvm_target} matching CBUILD=${CBUILD} when cross-compiling" - fi - - rust_pkg_setup - - if use system-llvm; then - llvm-r1_pkg_setup - - local llvm_config="$(get_llvm_prefix)/bin/llvm-config" - export LLVM_LINK_SHARED=1 - export RUSTFLAGS="${RUSTFLAGS} -Lnative=$("${llvm_config}" --libdir)" - fi -} - -src_prepare() { - # Rust baselines to Pentium4 on x86, this patch lowers the baseline to i586 when sse2 is not set. - if use x86; then - if ! use cpu_flags_x86_sse2; then - eapply "${FILESDIR}/1.82.0-i586-baseline.patch" - #grep -rl cmd.args.push\(\"-march=i686\" . | xargs sed -i 's/march=i686/-march=i586/g' || die - fi - fi - - default -} - -src_configure() { - if tc-is-cross-compiler; then - export PKG_CONFIG_ALLOW_CROSS=1 - export PKG_CONFIG_PATH="${ESYSROOT}/usr/$(get_libdir)/pkgconfig" - export OPENSSL_INCLUDE_DIR="${ESYSROOT}/usr/include" - export OPENSSL_LIB_DIR="${ESYSROOT}/usr/$(get_libdir)" - fi - - filter-lto # https://bugs.gentoo.org/862109 https://bugs.gentoo.org/866231 - - local rust_target="" rust_targets="" arch_cflags - - # Collect rust target names to compile standard libs for all ABIs. - for v in $(multilib_get_enabled_abi_pairs); do - rust_targets+=",\"$(rust_abi $(get_abi_CHOST ${v##*.}))\"" - done - if use wasm; then - rust_targets+=",\"wasm32-unknown-unknown\"" - if use system-llvm; then - # un-hardcode rust-lld linker for this target - # https://bugs.gentoo.org/715348 - sed -i '/linker:/ s/rust-lld/wasm-ld/' compiler/rustc_target/src/spec/base/wasm.rs || die - fi - fi - rust_targets="${rust_targets#,}" - - # cargo and rustdoc are mandatory and should always be included - local tools='"cargo","rustdoc"' - use clippy && tools+=',"clippy"' - use miri && tools+=',"miri"' - use rustfmt && tools+=',"rustfmt"' - use rust-analyzer && tools+=',"rust-analyzer","rust-analyzer-proc-macro-srv"' - use rust-src && tools+=',"src"' - - local rust_stage0_root="$(${RUSTC} --print sysroot || die "Can't determine rust's sysroot")" - # in case of prefix it will be already prefixed, as --print sysroot returns full path - [[ -d ${rust_stage0_root} ]] || die "${rust_stage0_root} is not a directory" - - rust_target="$(rust_abi)" - rust_build="$(rust_abi "${CBUILD}")" - rust_host="$(rust_abi "${CHOST}")" - - LLVM_EXPERIMENTAL_TARGETS=() - for _x in "${ALL_LLVM_EXPERIMENTAL_TARGETS[@]}"; do - if use llvm_targets_${_x} ; then - LLVM_EXPERIMENTAL_TARGETS+=( ${_x} ) - fi - done - LLVM_EXPERIMENTAL_TARGETS=${LLVM_EXPERIMENTAL_TARGETS[@]} - - local cm_btype="$(usex debug DEBUG RELEASE)" - cat <<- _EOF_ > "${S}"/config.toml - # https://github.com/rust-lang/rust/issues/135358 (bug #947897) - profile = "dist" - [llvm] - download-ci-llvm = false - optimize = $(toml_usex !debug) - release-debuginfo = $(toml_usex debug) - assertions = $(toml_usex debug) - ninja = true - targets = "${LLVM_TARGETS// /;}" - experimental-targets = "${LLVM_EXPERIMENTAL_TARGETS// /;}" - link-shared = $(toml_usex system-llvm) - $(if is_libcxx_linked; then - # https://bugs.gentoo.org/732632 - echo "use-libcxx = true" - echo "static-libstdcpp = false" - fi) - $(case "${rust_target}" in - i586-*-linux-*) - # https://github.com/rust-lang/rust/issues/93059 - echo 'cflags = "-fcf-protection=none"' - echo 'cxxflags = "-fcf-protection=none"' - echo 'ldflags = "-fcf-protection=none"' - ;; - *) - ;; - esac) - enable-warnings = false - [llvm.build-config] - CMAKE_VERBOSE_MAKEFILE = "ON" - $(if ! tc-is-cross-compiler; then - # When cross-compiling, LLVM is compiled twice, once for host and - # once for target. Unfortunately, this build configuration applies - # to both, which means any flags applicable to one target but not - # the other will break. Conditionally disable respecting user - # flags when cross-compiling. - echo "CMAKE_C_FLAGS_${cm_btype} = \"${CFLAGS}\"" - echo "CMAKE_CXX_FLAGS_${cm_btype} = \"${CXXFLAGS}\"" - echo "CMAKE_EXE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_MODULE_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_SHARED_LINKER_FLAGS_${cm_btype} = \"${LDFLAGS}\"" - echo "CMAKE_STATIC_LINKER_FLAGS_${cm_btype} = \"${ARFLAGS}\"" - fi) - [build] - build-stage = 2 - test-stage = 2 - build = "${rust_build}" - host = ["${rust_host}"] - target = [${rust_targets}] - cargo = "${rust_stage0_root}/bin/cargo" - rustc = "${rust_stage0_root}/bin/rustc" - rustfmt = "${rust_stage0_root}/bin/rustfmt" - docs = $(toml_usex doc) - compiler-docs = false - submodules = false - python = "${EPYTHON}" - locked-deps = true - vendor = true - extended = true - tools = [${tools}] - verbose = 2 - sanitizers = false - profiler = true - cargo-native-static = false - [install] - prefix = "${EPREFIX}/usr/lib/${PN}/${PV}" - sysconfdir = "etc" - docdir = "share/doc/rust" - bindir = "bin" - libdir = "lib" - mandir = "share/man" - [rust] - # https://github.com/rust-lang/rust/issues/54872 - codegen-units-std = 1 - optimize = true - debug = $(toml_usex debug) - debug-assertions = $(toml_usex debug) - debug-assertions-std = $(toml_usex debug) - debuginfo-level = $(usex debug 2 0) - debuginfo-level-rustc = $(usex debug 2 0) - debuginfo-level-std = $(usex debug 2 0) - debuginfo-level-tools = $(usex debug 2 0) - debuginfo-level-tests = 0 - backtrace = true - incremental = false - $(if ! tc-is-cross-compiler; then - echo "default-linker = \"$(tc-getCC)\"" - fi) - parallel-compiler = $(toml_usex parallel-compiler) - channel = "$(usex nightly nightly stable)" - description = "gentoo" - rpath = false - verbose-tests = true - optimize-tests = $(toml_usex !debug) - codegen-tests = true - dist-src = false - remap-debuginfo = true - lld = $(usex system-llvm false $(toml_usex wasm)) - # only deny warnings if doc+wasm are NOT requested, documenting stage0 wasm std fails without it - # https://github.com/rust-lang/rust/issues/74976 - # https://github.com/rust-lang/rust/issues/76526 - deny-warnings = $(usex wasm $(usex doc false true) true) - backtrace-on-ice = true - jemalloc = false - # See https://github.com/rust-lang/rust/issues/121124 - lto = "$(usex lto thin off)" - [dist] - src-tarball = false - compression-formats = ["xz"] - compression-profile = "balanced" - _EOF_ - - for v in $(multilib_get_enabled_abi_pairs); do - rust_target=$(rust_abi $(get_abi_CHOST ${v##*.})) - arch_cflags="$(get_abi_CFLAGS ${v##*.})" - - export CFLAGS_${rust_target//-/_}="${arch_cflags}" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${rust_target}] - ar = "$(tc-getAR)" - cc = "$(tc-getCC)" - cxx = "$(tc-getCXX)" - linker = "$(tc-getCC)" - ranlib = "$(tc-getRANLIB)" - llvm-libunwind = "$(usex llvm-libunwind $(usex system-llvm system in-tree) no)" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - # by default librustc_target/spec/linux_musl_base.rs sets base.crt_static_default = true; - # but we patch it and set to false here as well - if use elibc_musl; then - cat <<- _EOF_ >> "${S}"/config.toml - crt-static = false - musl-root = "$($(tc-getCC) -print-sysroot)/usr" - _EOF_ - fi - done - if use wasm; then - wasm_target="wasm32-unknown-unknown" - export CFLAGS_${wasm_target//-/_}="$(filter-flags '-mcpu*' '-march*' '-mtune*'; echo "$CFLAGS")" - cat <<- _EOF_ >> "${S}"/config.toml - [target.wasm32-unknown-unknown] - linker = "$(usex system-llvm lld rust-lld)" - # wasm target does not have profiler_builtins https://bugs.gentoo.org/848483 - profiler = false - _EOF_ - fi - - if [[ -n ${I_KNOW_WHAT_I_AM_DOING_CROSS} ]]; then # whitespace intentionally shifted below - # experimental cross support - # discussion: https://bugs.gentoo.org/679878 - # TODO: c*flags, clang, system-llvm, cargo.eclass target support - # it would be much better if we could split out stdlib - # complilation to separate ebuild and abuse CATEGORY to - # just install to /usr/lib/rustlib/ - - # extra targets defined as a bash array - # spec format: :: - # best place would be /etc/portage/env/dev-lang/rust - # Example: - # RUST_CROSS_TARGETS=( - # "AArch64:aarch64-unknown-linux-gnu:aarch64-unknown-linux-gnu" - # ) - # no extra hand holding is done, no target transformations, all - # values are passed as-is with just basic checks, so it's up to user to supply correct values - # valid rust targets can be obtained with - # rustc --print target-list - # matching cross toolchain has to be installed - # matching LLVM_TARGET has to be enabled for both rust and llvm (if using system one) - # only gcc toolchains installed with crossdev are checked for now. - - # BUG: we can't pass host flags to cross compiler, so just filter for now - # BUG: this should be more fine-grained. - filter-flags '-mcpu=*' '-march=*' '-mtune=*' - - local cross_target_spec - for cross_target_spec in "${RUST_CROSS_TARGETS[@]}";do - # extracts first element form :: - local cross_llvm_target="${cross_target_spec%%:*}" - # extracts toolchain triples, : - local cross_triples="${cross_target_spec#*:}" - # extracts first element after before : separator - local cross_rust_target="${cross_triples%%:*}" - # extracts last element after : separator - local cross_toolchain="${cross_triples##*:}" - use llvm_targets_${cross_llvm_target} || die "need llvm_targets_${cross_llvm_target} target enabled" - command -v ${cross_toolchain}-gcc > /dev/null 2>&1 || die "need ${cross_toolchain} cross toolchain" - - cat <<- _EOF_ >> "${S}"/config.toml - [target.${cross_rust_target}] - ar = "${cross_toolchain}-ar" - cc = "${cross_toolchain}-gcc" - cxx = "${cross_toolchain}-g++" - linker = "${cross_toolchain}-gcc" - ranlib = "${cross_toolchain}-ranlib" - _EOF_ - if use system-llvm; then - cat <<- _EOF_ >> "${S}"/config.toml - llvm-config = "$(get_llvm_prefix)/bin/llvm-config" - _EOF_ - fi - if [[ "${cross_toolchain}" == *-musl* ]]; then - cat <<- _EOF_ >> "${S}"/config.toml - musl-root = "$(${cross_toolchain}-gcc -print-sysroot)/usr" - _EOF_ - fi - - # append cross target to "normal" target list - # example 'target = ["powerpc64le-unknown-linux-gnu"]' - # becomes 'target = ["powerpc64le-unknown-linux-gnu","aarch64-unknown-linux-gnu"]' - - rust_targets="${rust_targets},\"${cross_rust_target}\"" - sed -i "/^target = \[/ s#\[.*\]#\[${rust_targets}\]#" config.toml || die - - ewarn - ewarn "Enabled ${cross_rust_target} rust target" - ewarn "Using ${cross_toolchain} cross toolchain" - ewarn - if ! has_version -b 'sys-devel/binutils[multitarget]' ; then - ewarn "'sys-devel/binutils[multitarget]' is not installed" - ewarn "'strip' will be unable to strip cross libraries" - ewarn "cross targets will be installed with full debug information" - ewarn "enable 'multitarget' USE flag for binutils to be able to strip object files" - ewarn - ewarn "Alternatively llvm-strip can be used, it supports stripping any target" - ewarn "define STRIP=\"llvm-strip\" to use it (experimental)" - ewarn - fi - done - fi # I_KNOW_WHAT_I_AM_DOING_CROSS - - einfo "Rust configured with the following flags:" - echo - echo RUSTFLAGS="\"${RUSTFLAGS}\"" - echo RUSTFLAGS_BOOTSTRAP="\"${RUSTFLAGS_BOOTSTRAP}\"" - echo RUSTFLAGS_NOT_BOOTSTRAP="\"${RUSTFLAGS_NOT_BOOTSTRAP}\"" - echo MAGIC_EXTRA_RUSTFLAGS="\"${MAGIC_EXTRA_RUSTFLAGS}\"" - env | grep "CARGO_TARGET_.*_RUSTFLAGS=" - env | grep "CFLAGS_.*" - echo - einfo "config.toml contents:" - cat "${S}"/config.toml || die - echo -} - -src_compile() { - RUST_BACKTRACE=1 "${EPYTHON}" ./x.py build -vvv --config="${S}"/config.toml -j$(makeopts_jobs) || die -} - -src_test() { - # https://rustc-dev-guide.rust-lang.org/tests/intro.html - - # those are basic and codegen tests. - local tests=( - codegen - codegen-units - compile-fail - incremental - mir-opt - pretty - run-make - ) - - # fails if llvm is not built with ALL targets. - # and known to fail with system llvm sometimes. - use system-llvm || tests+=( assembly ) - - # fragile/expensive/less important tests - # or tests that require extra builds - # TODO: instead of skipping, just make some nonfatal. - if [[ ${ERUST_RUN_EXTRA_TESTS:-no} != no ]]; then - tests+=( - rustdoc - rustdoc-js - rustdoc-js-std - rustdoc-ui - run-make-fulldeps - ui - ui-fulldeps - ) - fi - - local i failed=() - einfo "rust_src_test: enabled tests ${tests[@]/#/src/test/}" - for i in "${tests[@]}"; do - local t="src/test/${i}" - einfo "rust_src_test: running ${t}" - if ! RUST_BACKTRACE=1 "${EPYTHON}" ./x.py test -vv --config="${S}"/config.toml \ - -j$(makeopts_jobs) --no-doc --no-fail-fast "${t}" - then - failed+=( "${t}" ) - eerror "rust_src_test: ${t} failed" - fi - done - - if [[ ${#failed[@]} -ne 0 ]]; then - eerror "rust_src_test: failure summary: ${failed[@]}" - die "aborting due to test failures" - fi -} - -src_install() { - DESTDIR="${D}" "${EPYTHON}" ./x.py install -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die - - docompress /usr/lib/${PN}/${PV}/share/man/ - - # bug #689562, #689160 - rm -v "${ED}/usr/lib/${PN}/${PV}/etc/bash_completion.d/cargo" || die - rmdir -v "${ED}/usr/lib/${PN}/${PV}"/etc{/bash_completion.d,} || die - - local symlinks=( - cargo - rustc - rustdoc - rust-gdb - rust-gdbgui - rust-lldb - ) - - use clippy && symlinks+=( clippy-driver cargo-clippy ) - use miri && symlinks+=( miri cargo-miri ) - use rustfmt && symlinks+=( rustfmt cargo-fmt ) - use rust-analyzer && symlinks+=( rust-analyzer ) - - einfo "installing eselect-rust symlinks and paths: ${symlinks[@]}" - local i - for i in "${symlinks[@]}"; do - # we need realpath on /usr/bin/* symlink return version-appended binary path. - # so /usr/bin/rustc should point to /usr/lib/rust//bin/rustc- - # need to fix eselect-rust to remove this hack. - local ver_i="${i}-${PV}" - if [[ -f "${ED}/usr/lib/${PN}/${PV}/bin/${i}" ]]; then - einfo "Installing ${i} symlink" - ln -v "${ED}/usr/lib/${PN}/${PV}/bin/${i}" "${ED}/usr/lib/${PN}/${PV}/bin/${ver_i}" || die - else - ewarn "${i} symlink requested, but source file not found" - ewarn "please report this" - fi - dosym "../lib/${PN}/${PV}/bin/${ver_i}" "/usr/bin/${ver_i}" - done - - # symlinks to switch components to active rust in eselect - dosym "${PV}/lib" "/usr/lib/${PN}/lib-${PV}" - use rust-analyzer && dosym "${PV}/libexec" "/usr/lib/${PN}/libexec-${PV}" - dosym "${PV}/share/man" "/usr/lib/${PN}/man-${PV}" - dosym "rust/${PV}/lib/rustlib" "/usr/lib/rustlib-${PV}" - dosym "../../lib/${PN}/${PV}/share/doc/rust" "/usr/share/doc/${P}" - - newenvd - "50${P}" <<-_EOF_ - LDPATH="${EPREFIX}/usr/lib/rust/lib-${PV}" - MANPATH="${EPREFIX}/usr/lib/rust/man-${PV}" - _EOF_ - - rm -rf "${ED}/usr/lib/${PN}/${PV}"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/bin"/*.old || die - rm -rf "${ED}/usr/lib/${PN}/${PV}/doc"/*.old || die - - # note: eselect-rust adds EROOT to all paths below - cat <<-_EOF_ > "${T}/provider-${P}" - /usr/bin/cargo - /usr/bin/rustdoc - /usr/bin/rust-gdb - /usr/bin/rust-gdbgui - /usr/bin/rust-lldb - /usr/lib/rustlib - /usr/lib/rust/lib - /usr/lib/rust/man - /usr/share/doc/rust - _EOF_ - - if use clippy; then - echo /usr/bin/clippy-driver >> "${T}/provider-${P}" - echo /usr/bin/cargo-clippy >> "${T}/provider-${P}" - fi - if use miri; then - echo /usr/bin/miri >> "${T}/provider-${P}" - echo /usr/bin/cargo-miri >> "${T}/provider-${P}" - fi - if use rustfmt; then - echo /usr/bin/rustfmt >> "${T}/provider-${P}" - echo /usr/bin/cargo-fmt >> "${T}/provider-${P}" - fi - if use rust-analyzer; then - echo /usr/lib/rust/libexec >> "${T}/provider-${P}" - echo /usr/bin/rust-analyzer >> "${T}/provider-${P}" - fi - - insinto /etc/env.d/rust - doins "${T}/provider-${P}" - - if use dist; then - "${EPYTHON}" ./x.py dist -vv --config="${S}"/config.toml -j$(makeopts_jobs) || die - insinto "/usr/lib/${PN}/${PV}/dist" - doins -r "${S}/build/dist/." - fi -} - -pkg_preinst() { - # 943308 and friends; basically --keep-going can forget to unmerge old rust - # but the soft blocker allows us to install conflicting files. - # This results in duplicated .{rlib,so} files which confuses rustc and results in - # the need for manual intervention. - if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then - # we need to find all .{rlib,so} files in the old rust lib directory - # and store them in an array for later use - readarray -d '' old_rust_libs < <( - find "${EROOT}/usr/lib/rust/${PV}/lib/rustlib" \ - -type f \( -name '*.rlib' -o -name '*.so' \) -print0) - export old_rust_libs - if [[ ${#old_rust_libs[@]} -gt 0 ]]; then - einfo "Found old .rlib and .so files in the old rust lib directory" - else - die "Found no old .rlib and .so files but old rust version is installed. Bailing!" - fi - fi -} - -pkg_postinst() { - - if has_version -b "dev-lang/rust:stable/$(ver_cut 1-2)"; then - # Be _extra_ careful here as we're removing files from the live filesystem - local f - for f in "${old_rust_libs[@]}"; do - [[ -f ${f} ]] || die "old_rust_libs array contains non-existent file" - local base_name="${f%-*}" - local ext="${f##*.}" - local matching_files=("${base_name}"-*.${ext}) - if [[ ${#matching_files[@]} -ne 2 ]]; then - die "Expected exactly two files matching ${base_name}-\*.rlib, but found ${#matching_files[@]}" - fi - einfo "Removing old .rlib file ${f}" - rm "${f}" || die - done - fi - - eselect rust update - - if has_version dev-debug/gdb || has_version llvm-core/lldb; then - elog "Rust installs helper scripts for calling GDB and LLDB," - elog "for convenience they are installed under /usr/bin/rust-{gdb,lldb}-${PV}." - fi - - if has_version app-editors/emacs; then - optfeature "emacs support for rust" app-emacs/rust-mode - fi - - if has_version app-editors/gvim || has_version app-editors/vim; then - optfeature "vim support for rust" app-vim/rust-vim - fi -} - -pkg_postrm() { - eselect rust cleanup -} -- cgit v1.2.3