diff options
Diffstat (limited to 'dev-lang/ghc')
35 files changed, 5644 insertions, 0 deletions
diff --git a/dev-lang/ghc/Manifest b/dev-lang/ghc/Manifest new file mode 100644 index 000000000000..7406de315e95 --- /dev/null +++ b/dev-lang/ghc/Manifest @@ -0,0 +1,34 @@ +DIST binary-0.7.5.0.tar.gz 45764 SHA256 4709c5aa7cc99cb4a465a68de1648968208d0c60c368e2fece476d977530ef19 SHA512 232e7c3da1c0055f3e9f211a86e81c76bc44ab1b70cabd23c93634dbaa42eed8bd9314fbedc16b9703d3ca92b0bbf232e6c30bb1384687dad0e6e85c9abb8947 WHIRLPOOL 1d8dcf9d5125ff398375f4024c0e43fa168004811db7824e2739ec5c0451b38dae9ad74f757c7708427deed0044580b182e35d1c7ecffec25f7b10c70bd32075 +DIST ghc-7.10.2-src.tar.bz2 12651156 SHA256 908a01ca86238318f4e880fda400ea399d0a0008d699c912b85d0e0f746e5689 SHA512 e3f99a9e848c12b728212da24bf9029ec8cde88cdfa7eeb4ee2ea223ad8bcaae3e7c27456d09d60a3d21efa8f907ccd2490caf5630ca5fe3ce87f04901275a66 WHIRLPOOL dee757e79de8ac6bcf127212703985282ce96d050be50e78c3f249f13dc0212c9fd96899502748ceb26b9fc3a804379a456e19a9bedfef72f6890992b00492da +DIST ghc-7.4.2-src.tar.bz2 25836446 SHA256 f2ee1289a33cc70539287129841acc7eaf16112bb60c59b5a6ee91887bfd836d SHA512 5a3d06a36702fa7e337b482c9de92ce1f84a68f18d8560bcc11f3617d6d46f93167fee27e786de6483a9ef0eab3b1ac6909a71dd53908d36156df4e465075050 WHIRLPOOL 61865eed2bf92728e7c4c4a0c48be44081bf728cfd824760d643e2fad838d96c19e173052d3aac073e0795b5efa3720ba5ddf13cca1ec7952b7524bbe1f204bc +DIST ghc-7.6.3-src.tar.bz2 110763823 SHA256 bd43823d31f6b5d0b2ca7b74151a8f98336ab0800be85f45bb591c9c26aac998 SHA512 ac86f18b4feeb0bdc9e867261600b210caf62740d73ae657259bbe8149b8c2c4f5a73d09d74d944d4e50f85cc87503485365f0a0ae65befe8d2b6844e5e1253a WHIRLPOOL 0fe1f5f2987699067494559e6a679d28f027eee8fb2a00c683161dbce5443b1faeebfb51572209b75231cee24c7f0c929cabbc82a93f70e16d05e351fdfe2eaf +DIST ghc-7.8.3-src.tar.xz 9160092 SHA256 b0cd96a549ba3b5e512847a4a8cd1a3174e4b2b75dadfc41c568fb812887b958 SHA512 2cc8c2aa6f18ba565c1e2aa637045e246f1214c2a77e95c2a97dfb97203b8983e4ad3cc13178b4b51aff70c58d59a1f68f94cd813d043745cb02411bad04bb00 WHIRLPOOL 3a2e8eea0db7a150e4732efed488a3a5eb56da00a9a90a3379afcb4090323925a2a7485fec6676e784139f112d7c825e8d18a576c34c760af4a7f3adb22c021a +DIST ghc-7.8.4-ia64-CLOSUREs-regenerated.patch.gz 13268 SHA256 3bdff22e654aee6f942d43edf1bf6cf70404c0152c4fcf89276f10d2c4c5b4b9 SHA512 a655713e06324b56f0041edf70837487e296d28e6f3ee35fe116b9938765aaf3469d25e92645e0940655ed3607dff27d3826fe0f995c84e81b51bfc956816e7d WHIRLPOOL d2cb53bdc6debc0278d554168ea3ab22b0fd8314adac81444637278a92d21b766280fedfb4b7d1b4540c7381c7962dec6b13a799ab2fee4d456fe2875d5c6a5b +DIST ghc-7.8.4-src.tar.bz2 10600755 SHA256 59e3bd514a1820cc1c03e1808282205c0b8518369acae12645ceaf839e6f114b SHA512 079a53891d8ebd8d9b88da96170e60981608a619f8282e4b7948f35244e99bd87277649ac7fcebc227a61a4d21960db8d5e5b9e92f2c69c82d8d68d7fd0a41d3 WHIRLPOOL a9be7641adbd237ed6e0f644c312e655e98be9566097aee5e2c0022e8756d5b2236e42dd86d76c638a001b5ca3f67307e89ec0cd003a92cd112a5d6d3e3d8467 +DIST ghc-bin-7.10.2-amd64.tbz2 112028560 SHA256 536297ac402da44ec1aafb1a937960883d12d192db16715ca34ab6469773a4c7 SHA512 207d8032c99d52bf4215ddeea2dbcd5816bb8d4caf2c3c31190e3ca92b49667d98a4f97aaf4cd6b40090f150854d520f75b5420dfe1ade7f036cf35d3dcb5100 WHIRLPOOL 8e43956a61c2c0fead242e3b179cde4918c04f3db7dbb27cc986f00f981261d98028ead82548b87d183d8da928635d5db4aa62ff1161f4077e5370483530a316 +DIST ghc-bin-7.10.2-x86.tbz2 113900477 SHA256 eefb7a3002e3dcdd6d936b2b2826eadf3cd100352babad4c9a355b944064240a SHA512 61dae4b9c80bfef6b1e0550c77b70f25d11f4a9fbe3b57d6c4ad451b4b584884432405d39dc32b9f85f3a5ad9d02657356ae0ebd99518848f3d330314c74b595 WHIRLPOOL da0d7eb62d2ee2aeb80a3f495da2ff123e29151b7517fbcd212f83ab3722638f10019511f4f237e8e001c68dd957ed2817fb0f1a2b42c2710239343f1d801496 +DIST ghc-bin-7.4.2-alpha.tbz2 130483507 SHA256 cd8e72e569574f137bf10fcdb4337bb0dc320deb2a2c4d72529a821735c53ae6 SHA512 6fb99dea706965afa60f4aeb68da3da1c69dda477f5fcfb4e67b73d75b78583193148ce9f623a356679a57f1a740f8010f28a22f08e56ace50f3fcd42142f83f WHIRLPOOL e5ec69ab24dc963ac709f13928c0e35931d5d50ca6b21dfb0aa79f9088c0ce1196b64bb4d9668e35d73dcdf9e2df9c3da59c95eaf3db8b793a6bb65b1f4ba6c0 +DIST ghc-bin-7.4.2-amd64-stable-glibc.tbz2 93139900 SHA256 f06dff00585cc1a8ecc8ac29aeca7fdc601d272eed29d7613f7a2f2924cad585 SHA512 9b725f2613dd9013851a16eaea4000ea424c51cbafa97d3860f120fdb9936247f8c65208775a80a2f49b74946ddda2e843a54dec00b78c521197374aa3dd2d50 WHIRLPOOL 9e2630b1de40a059c324be38a1fe68b16ea484bc7afc2a397ea05192263d1964aed1d29fde543622ceab12ed2df111204576fdc72b7e35b2bbf9c6b9519901d1 +DIST ghc-bin-7.4.2-ia64.tbz2 155787636 SHA256 a1d89221645832cc5d11cde4937cce75d564e6a79eba334b92a4c465eb3f161f SHA512 c7138ed8eaf40ee7e7559b6063096351b64fc35cbd1adb4c734b2f2c6b77fb98368b1296fcb67c1a0b21b0faf053a82f8f98c3656b89c593e677ce78165d0c74 WHIRLPOOL 7ff2db2932a6d56961dcca386c9ec8f8eb1ee12e1b84230fbb089ff137eeb216117eecaa37b33b4c037ebee0063a07cd380077b754e64ef0219759b54a4f7fe2 +DIST ghc-bin-7.4.2-ppc.tbz2 89396808 SHA256 ebf6083a1f3256a978a9408cffa2562e837b641136e5d6ad41a8ab5c2f50e804 SHA512 d7abd4a2612f26b6937dd20c11d2081b2c846178347a8e09f4ef5d8b1ef2ad3eabb9d5429fd0c214f6c5bd53eb194ccf199745904d6b861650c9eef681a48bc1 WHIRLPOOL e2f8a4c8e3209432a744fd8587be39591d7b4fb026dca36755933f49e6f650e1b34e6087d9260aee65206a700f9d70e2fb6cbe42d29645b52f060729845a347e +DIST ghc-bin-7.4.2-ppc64.tbz2 105431655 SHA256 d0aecf47749a9862085aec6403f25197465d99a02a3c721dffd5314bf81d74eb SHA512 f220fb91b1856da37f72166fe050d4908049845eec03626d09c5b6e88701b0002835c3343c3584baf9f9d9efb5c7cbc210eb64c6eb711a58764d0fea92e8ac9f WHIRLPOOL e27022a72c254fd189995fd1b39629d5328927b83237ae4e61e97ab5efb5c451c92fe77f944c724bf9d14130d5a6cd2e0896a7cd6052de1ef7091531aa39fa0f +DIST ghc-bin-7.4.2-sparc.tbz2 121224130 SHA256 e5eaf1f31ddc4790e0226f0075236af340ec9674d98701452d5c51455ca1cb52 SHA512 a3647d82bbb36fe0ca55185ebc9479a264e785eb5a8a33be6c37b8a6cbcf8c55373374801c685eef004de78db5aa1c96760b2bedb2ca0ac9097d39fe286984e9 WHIRLPOOL d2d5f8c5abb001fb5425e68d3d26d941569b832c373e40b5a96aaa11f589db9e2b72eb1cbcf8df7b8d4473e2cc1c61498b284d8b006cc20822c3a203fd0fe2cd +DIST ghc-bin-7.4.2-x86-stable-glibc.tbz2 92394017 SHA256 2c42257a60aec03ae622c1a600cd210a6094f26ac310fbd307006e7f2260e2a4 SHA512 9e8ef72d2aeb5681e6bb71e2eb875587ddd51089cfc3443c33c69f93274a29e5680de4bf4884af05cd84f0e9cea13d66d20f1e89994460137910cbc987b64359 WHIRLPOOL 5722824af91f1191e6a38a8eb4696e765468e3bf54ad411b1d387ae4bcc7cd4cb772bdf2054d7013a3cff41feaaf5607f051b3c0d9f609ca19f1a1f92dd02586 +DIST ghc-bin-7.6.3-amd64.tbz2 94441516 SHA256 3ef747e96a40c9d5021e88b8afee0a97838c27b00619d9187783d95279c31779 SHA512 89f6c693d83d6309a0e44fcc68e30279c858adb0a0ea9317dd168b2e632c22a8507da78ed953523f5d7156db98e06c6df56d6edc19c0c50b3941ea578263dc64 WHIRLPOOL 891dfbfc9d88fa579b6a837651f7cc6d9aecef8b8752ec7bcebbdfef2a6d8929d0edaceff27ec61d6160d36d1b0e8406b7829a04a858ed64210b5c57b9c98940 +DIST ghc-bin-7.6.3-r1-alpha.tbz2 123486983 SHA256 fb6828d9dff7b90563cc7b3277ed38801907930aebd6042a7e5ba61e5f50db73 SHA512 7821bdf7490283dc062be090d224138dd34641e014cc6742edaa51dcc9cb1de9724d575955b596c9273b878dfe79023daf172b132b124f67567132649cf9a30d WHIRLPOOL 4e51a7e7f54fcb4aeb7a4ade4140533413348f9aacf04f683fe7cc5e20843dc6a95bdd6d79a995e5e1085747be9e584df6ada61430662f06eb600abae0c7eabd +DIST ghc-bin-7.6.3-r1-ia64.tbz2 154480728 SHA256 9a176312f796a189c0354deab9a7c446db274f75f40554963c2f86597a5951fb SHA512 2aa945cebcd3d0c26af5ddb53cf2002ec6d263d071173495905dd52898bd2ab6605370b0025554c1f6afbd28e276abc708708e4add9a9b8cb08b4bb39f8f50a1 WHIRLPOOL 6371531141e707618577e924c01102481a12d91e2c85e24694ba64f9b2545869c248999138146f63ca379a4243ccd0dfa322ea01a23d222b9757584787c5a899 +DIST ghc-bin-7.6.3-r1-ppc.tbz2 91800558 SHA256 c9b2262957585c9f02136014aa05423e1b7674c8eb0731a6d991e400e053e33a SHA512 2a101a30a4324780f1a614e044ba614f9094cd57d026c56f2b3ba514ae049c26ce8e4acbc89e93229da451b6fbe05ba0980b500cdd785bb2bce968a60434403a WHIRLPOOL 3a3b7e1eb945be01ab195880c7709514d2d11d25bab12fc15c2257207da48a37e6d6d7699c9ed5c1cc32d01057240a4d795e43cdf9d9d2748a1d94b93fb283ed +DIST ghc-bin-7.6.3-r1-ppc64.tbz2 121213680 SHA256 7d820988a762dc56ec471c9fcb5510f2e0bb47560181aa7dea8a934e73952477 SHA512 17fb269a2eae326db927b8734cd8326061b059ecd50a377c51c37cd657380be1ae61964df299009259de6e4e00aa71a525a9224f8fa607d6cc7994c221848358 WHIRLPOOL 76e9664a535e6be54c5288be683959ab6aadafb04d03c5d2f08f8ee663868b3ed390e2a0c8e6d233a532af694709e03dc0f78d16dfe51b87e201655219da4704 +DIST ghc-bin-7.6.3-r1-sparc.tbz2 121641337 SHA256 0fb31b9584c1c6caafb44a51158bfd3d85c28d2313f8201855f58c019a1692c0 SHA512 d71efc47769efb091f93cb288b54a1fadfd4184053149b1cd7c219a0c9c95ed97c32b101c712e20643fea12546357b70a11f2852bebeac2141e961a3e4bf8764 WHIRLPOOL 37d320e01d8e43ecba6e90f8d0a9c440d30ea31ff79d9094a8205d9ce892570f81b8641080034215fdddf71131de1acc364e2a485383af8346190c36201c1e91 +DIST ghc-bin-7.6.3-x86.tbz2 93718672 SHA256 a55024f66a048437fcd6ef0f33cdb994a43628998a2f0fe4d094cc9ba83d1615 SHA512 624f2a3238dee15853018d45632d1363e42d34099a77e5e9ce5c8da976cb4c33578144f7c39dbf25ee68c17d8d42910db2347186849eeeda6bc20053ce2be990 WHIRLPOOL bc646fc19906b59416358fb7558b6e2c3f7ad069c2fcf443be36b621894cfcecb0844acf5b5f9c383e034dfff3e24d312a7da0d7a629836134ec5dc1ecd6f139 +DIST ghc-bin-7.8.3-amd64.tbz2 100786052 SHA256 af49f547336a4f9f13cd625155d5a6a998e52ae7da8bbbddc856f88b00b6aff4 SHA512 b1826095b67fa2028678057f70909bff4e082b82f3b70f1aedbc91073efad54334fa1864bc8248c9249eec6edab3671dc38ac1650be86f1245e2fecf92528952 WHIRLPOOL 5b44fff77a0d79c6f7c5c8ca792eb6b36987d1de58d5ebc0a9b05da9c19a2c312eca6b9d40e7e63437742b7f9c28c925feb3bea7f9803dda95fac7acaa7a3132 +DIST ghc-bin-7.8.3-x86.tbz2 102583755 SHA256 c67f0d2471e594b4fdfc5b219bb6b61e57e6ba75132aa3f63d171550af8cbe3c SHA512 badabbba2f46b5ab3a2601e53997ce6533162afeec7dc36eeb877a62680a9f599aeb05dd3682f45d3e273d71d28b8bd01eee37dcad3c7354e8f83b7be4e58536 WHIRLPOOL 7b99b6bbeb4ad6d203f270d8446285825ad0857a8ab058d8c126155b49e8819e0efc2f6c42b5ff775dc0ece5488e97fcc7ae2459fe87fdceef43d63a75443430 +DIST ghc-bin-7.8.4-alpha.tbz2 210691009 SHA256 23c9e5ef97b444fa87d3b9509a7b2b7b68c526ca4139739dd60c08fb1279d48a SHA512 f08230de82f0c4112da9d0b48227ca74d5d0b4a84046d746b023557b7aeeb9678f5ac037fe89a863178df4b9036e5c5c63182d14dfbb42c772011de883e3966f WHIRLPOOL d624b4d5eac8aa68f389b81e68d7fa2ea960c9b9c5fabb27ddf4da5140c18fd0ee9080725fb645e2c532bb0a01ade32da2cf6aac08707f9d89a94ea9752b8e72 +DIST ghc-bin-7.8.4-amd64.tbz2 100573133 SHA256 bd9d144c08caa0ff345ada8d7eed7592531b8f8b9ef2f94d0b9a42fd747440aa SHA512 e4416d6dae3c644f74bafb3aecf1a123f985427aba32d0e0c43143a137d64a9220fc5947cd9bde8a3bc44555ae71184fc06a3f7df7976aadd065ad5681b90954 WHIRLPOOL ab0bd6219d68e08cb473cf2f3f15538d65940f28e84f026361032c3a6bc09f7820faf67629e915f27c2afda7de41fa9c6010a1b5cd487df0936d968c7e58a3a4 +DIST ghc-bin-7.8.4-ia64.tbz2 222789275 SHA256 8bbbc11ba64d08bad691593afafc4c6a7cf078b10cf33cb8508bf0a0b3ccf523 SHA512 2d8b89e399cbe9bfeae29cf3ceea736bfaa65ea21483fa2ee95d9814e122fcfbb67ce22ad8175493fab088e9a9d0139610c67e9d5c8b4f797b5e14846df32b6e WHIRLPOOL 181d48bbb53d181c8febf63ddae620bec1a6c212a5b5bf938228689df2ff45ba68d7d4a99ebb1b68aa516d5633be41125321e3f8fdef6e5f0cd1e4a7f9b8774c +DIST ghc-bin-7.8.4-ppc.tbz2 112803496 SHA256 a47e0fb17137878af1e7b5a166046bee20d456d49da6ba8cde990173f4b3be8d SHA512 9581f55a088e53edcc969960e45c9ad7227d71198ce2d241a4a066a138450a879287e55e7d2210e86143670539711387e36c7f60660c4422dc1b4122278fe4a0 WHIRLPOOL 4904414cbfafdb48f0539b071fe80568da74beb174948ee426da5c22acf1d0c35ade89d2e160ddd109d2fbc0a508459a8e249f3b732b88735070b9522b417108 +DIST ghc-bin-7.8.4-ppc64.tbz2 129284515 SHA256 1e8a350af39d1db1e58a74c9bc4a4c57765eceb33e5b32751fb31340b9ff02ff SHA512 53974e15c26cf6b62d8f838607abd209ec57cf0f45fcc48b90ad62736f5e4e7ff263dcd326ae03d8d5557a22eb9730e5eb8ae4eda55e52dd3d973bc73c84935e WHIRLPOOL adaaa92323d319f6576423ac41678f7d263f36e0e30d89fc14ee89104b006772c26d7b408be7f85225d1bddaf5f15ebdcbb7136f5c8bf7bda4bb0938eefbe6c2 +DIST ghc-bin-7.8.4-sparc.tbz2 147340595 SHA256 1cde749ce3c47016c5c7a7179423d0aa2b174ddae4af0392ae3b7f57b098ec0c SHA512 ee5f0b2f1cf2693a0f2be9df71ef61b52bc2327225d40b8be955c1584b9901ffc6aaab63c1e46bf9bb352633b605c98378f8fd3e6cd71aef1c089007e4110217 WHIRLPOOL 27d55a016ffb49852553f920c29929c3bdf383e28b4b806ceb9ffc8b46a59b438801101402e498b069aa6eb56870b70a00ba7b1f4098f3fd8d8ddf1b20caa626 +DIST ghc-bin-7.8.4-x86.tbz2 102312459 SHA256 4c53148836e5a1ba55b8db5bb7c3eb915103e0955fb503b2facdc5a72f12a974 SHA512 cabc5bd6d8760ce4120e7053f6c1dffca7d161ba454b6201087760096c037c932e3ff8c82e53346c8278855bf0cff1c2f5fb8046242ca4d8307355b060a9556e WHIRLPOOL 0171d67dc1b63381a491e1577a783eb0e8f53cb579ba96a9b4fdf6685d494d78eb2be780f77ff33422d3b7c320ed102d9b48f6e954f8fee5532982575001a4a5 +DIST hoopl-3.10.1.0.tar.gz 241582 SHA256 7af615dfd4051670dccf31e5a7e1e71a9ae5f301e6a0668557fd84f61f6bc2d4 SHA512 943fe7034c89f4f914617cf1bccf7f66c3e660328fbbd9ae40f78a3f78a4a5b6fdd86c2afd40c11d4c4c4a34bc8fd47ab7e6227cdf9f3f4887b5cc796720e7aa WHIRLPOOL 3a410081f70c4ebbb563a48d71ec6f1e226a13b965ea12d01ca521b32041308394c7da6d3b3e36e75d1322c188b81fc08f4b2bf6037df5d8ac4998a944326be2 +DIST transformers-0.4.3.0.tar.gz 28632 SHA256 b3d0a797e815ca50d411e20c02f781efe7751308007d880af7f0b5c4365c3a9d SHA512 c3ec0893ebba4fbd6087c3202e919552c4a9bff3350b5c0589e7ebb18751a515d98b8cac15b0a3252906ea72b5a0eb09b7fe88c8da88b09d6ce4fbf0f50b2780 WHIRLPOOL 89591781926b1d025056dedcfc5de61705056c1e3a8eba72f2e89789e78d2ed4d8909f84d6560dfc66bc0b360f98cb3dc3835f3a05c2325f747498373c88aa4b diff --git a/dev-lang/ghc/files/ghc-7.0.4-CHOST-prefix.patch b/dev-lang/ghc/files/ghc-7.0.4-CHOST-prefix.patch new file mode 100644 index 000000000000..682c573c90a6 --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.0.4-CHOST-prefix.patch @@ -0,0 +1,17 @@ +Strip versioning components from *HOST for Darwin and Solaris + +--- aclocal.m4 ++++ aclocal.m4 +@@ -1358,6 +1358,12 @@ + freebsd*) + $2="freebsd" + ;; ++ darwin*) ++ $2="darwin" ++ ;; ++ solaris2.*) ++ $2="solaris2" ++ ;; + *) + echo "Unknown OS $1" + exit 1 diff --git a/dev-lang/ghc/files/ghc-7.0.4-darwin8.patch b/dev-lang/ghc/files/ghc-7.0.4-darwin8.patch new file mode 100644 index 000000000000..bfbee41b4f93 --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.0.4-darwin8.patch @@ -0,0 +1,18 @@ +Workaround headers problem in Darwin 8 as well. + +--- rts/PosixSource.h ++++ rts/PosixSource.h +@@ -11,6 +11,13 @@ + + #include <ghcplatform.h> + ++#if defined(darwin_HOST_OS) ++/* unfortunately the hack below only works for Darwin 9 and ++ * above, so as hack include sys/types early (before setting ++ * _POSIX_C_SOURCE) (this obviously obsoletes the hack below) */ ++#include <sys/types.h> ++#endif ++ + #if defined(freebsd_HOST_OS) + #define _POSIX_C_SOURCE 200112L + #define _XOPEN_SOURCE 600 diff --git a/dev-lang/ghc/files/ghc-7.10.1-T10590-dequeue.patch b/dev-lang/ghc/files/ghc-7.10.1-T10590-dequeue.patch new file mode 100644 index 000000000000..be0f7a05b1e3 --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.10.1-T10590-dequeue.patch @@ -0,0 +1,89 @@ +diff --git a/rts/RaiseAsync.c b/rts/RaiseAsync.c +index 3b206ff..08c031c 100644 +--- a/rts/RaiseAsync.c ++++ b/rts/RaiseAsync.c +@@ -56,7 +56,8 @@ static void throwToSendMsg (Capability *cap USED_IF_THREADS, + + static void + throwToSingleThreaded__ (Capability *cap, StgTSO *tso, StgClosure *exception, +- rtsBool stop_at_atomically, StgUpdateFrame *stop_here) ++ rtsBool stop_at_atomically, StgUpdateFrame *stop_here, ++ rtsBool dequeue) + { + // Thread already dead? + if (tso->what_next == ThreadComplete || tso->what_next == ThreadKilled) { +@@ -64,7 +65,9 @@ throwToSingleThreaded__ (Capability *cap, StgTSO *tso, StgClosure *exception, + } + + // Remove it from any blocking queues +- removeFromQueues(cap,tso); ++ if (dequeue) { ++ removeFromQueues(cap,tso); ++ } + + raiseAsync(cap, tso, exception, stop_at_atomically, stop_here); + } +@@ -72,20 +75,26 @@ throwToSingleThreaded__ (Capability *cap, StgTSO *tso, StgClosure *exception, + void + throwToSingleThreaded (Capability *cap, StgTSO *tso, StgClosure *exception) + { +- throwToSingleThreaded__(cap, tso, exception, rtsFalse, NULL); ++ throwToSingleThreaded__(cap, tso, exception, rtsFalse, NULL, rtsTrue); ++} ++ ++void ++throwToSingleThreadedNoDequeue (Capability *cap, StgTSO *tso, StgClosure *exception) ++{ ++ throwToSingleThreaded__(cap, tso, exception, rtsFalse, NULL, rtsFalse); + } + + void + throwToSingleThreaded_ (Capability *cap, StgTSO *tso, StgClosure *exception, + rtsBool stop_at_atomically) + { +- throwToSingleThreaded__ (cap, tso, exception, stop_at_atomically, NULL); ++ throwToSingleThreaded__ (cap, tso, exception, stop_at_atomically, NULL, rtsTrue); + } + + void // cannot return a different TSO + suspendComputation (Capability *cap, StgTSO *tso, StgUpdateFrame *stop_here) + { +- throwToSingleThreaded__ (cap, tso, NULL, rtsFalse, stop_here); ++ throwToSingleThreaded__ (cap, tso, NULL, rtsFalse, stop_here, rtsTrue); + } + + /* ----------------------------------------------------------------------------- +diff --git a/rts/RaiseAsync.h b/rts/RaiseAsync.h +index 6bfed8d..2e8a7a3 100644 +--- a/rts/RaiseAsync.h ++++ b/rts/RaiseAsync.h +@@ -23,6 +23,10 @@ void throwToSingleThreaded (Capability *cap, + StgTSO *tso, + StgClosure *exception); + ++void throwToSingleThreadedNoDequeue (Capability *cap, ++ StgTSO *tso, ++ StgClosure *exception); ++ + void throwToSingleThreaded_ (Capability *cap, + StgTSO *tso, + StgClosure *exception, +diff --git a/rts/posix/Select.c b/rts/posix/Select.c +index 4b19235..6889499 100644 +--- a/rts/posix/Select.c ++++ b/rts/posix/Select.c +@@ -412,8 +412,12 @@ awaitEvent(rtsBool wait) + IF_DEBUG(scheduler, + debugBelch("Killing blocked thread %lu on bad fd=%i\n", + (unsigned long)tso->id, fd)); +- throwToSingleThreaded(&MainCapability, tso, +- (StgClosure *)blockedOnBadFD_closure); ++ /* ++ * We can't use throwToSingleThreaded() here ++ * as 'RTS_FD_IS_READY' breaks blocked_queue_hd list ++ */ ++ throwToSingleThreadedNoDequeue(&MainCapability, tso, ++ (StgClosure *)blockedOnBadFD_closure); + break; + case RTS_FD_IS_READY: + IF_DEBUG(scheduler, diff --git a/dev-lang/ghc/files/ghc-7.10.1-rc3-ghc-7.10-bootstrap.patch b/dev-lang/ghc/files/ghc-7.10.1-rc3-ghc-7.10-bootstrap.patch new file mode 100644 index 000000000000..60db34b8b362 --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.10.1-rc3-ghc-7.10-bootstrap.patch @@ -0,0 +1,78 @@ +--- ghc-7.10.0.20150316-orig/compiler/utils/Pair.hs 2015-03-10 05:43:13.000000000 +1100 ++++ ghc-7.10.0.20150316/compiler/utils/Pair.hs 2015-03-17 09:50:48.491115080 +1100 +@@ -15,6 +15,8 @@ + import Data.Foldable + import Data.Monoid + import Data.Traversable ++#else ++import Control.Applicative ((<$>)) + #endif + + data Pair a = Pair { pFst :: a, pSnd :: a } +--- ghc-7.10.0.20150316-orig/compiler/types/Coercion.hs 2015-03-10 05:43:13.000000000 +1100 ++++ ghc-7.10.0.20150316/compiler/types/Coercion.hs 2015-03-17 10:11:21.636047380 +1100 +@@ -104,6 +104,8 @@ + #if __GLASGOW_HASKELL__ < 709 + import Control.Applicative hiding ( empty ) + import Data.Traversable (traverse, sequenceA) ++#else ++import Control.Applicative ((<$>)) + #endif + import FastString + import ListSetOps +--- ghc-7.10.0.20150316-orig/compiler/typecheck/TcEvidence.hs 2015-03-14 08:48:57.000000000 +1100 ++++ ghc-7.10.0.20150316/compiler/typecheck/TcEvidence.hs 2015-03-17 10:26:03.251433371 +1100 +@@ -50,6 +50,8 @@ + #if __GLASGOW_HASKELL__ < 709 + import Control.Applicative + import Data.Traversable (traverse, sequenceA) ++#else ++import Control.Applicative ((<$>)) + #endif + import qualified Data.Data as Data + import Outputable +--- ghc-7.10.0.20150316-orig/compiler/hsSyn/HsBinds.hs 2015-03-10 05:43:13.000000000 +1100 ++++ ghc-7.10.0.20150316/compiler/hsSyn/HsBinds.hs 2015-03-17 10:42:21.459519033 +1100 +@@ -47,6 +47,8 @@ + import Data.Traversable ( Traversable(..) ) + import Data.Monoid ( mappend ) + import Control.Applicative hiding (empty) ++#else ++import Control.Applicative ((<$>)) + #endif + + {- +--- ghc-7.10.0.20150316-orig/compiler/parser/RdrHsSyn.hs 2015-03-10 05:43:13.000000000 +1100 ++++ ghc-7.10.0.20150316/compiler/parser/RdrHsSyn.hs 2015-03-17 11:17:48.950929542 +1100 +@@ -91,9 +91,7 @@ + import Util + import ApiAnnotation + +-#if __GLASGOW_HASKELL__ < 709 + import Control.Applicative ((<$>)) +-#endif + import Control.Monad + + import Text.ParserCombinators.ReadP as ReadP +--- ghc-7.10.0.20150316-orig/compiler/typecheck/TcGenDeriv.hs 2015-03-14 08:48:57.000000000 +1100 ++++ ghc-7.10.0.20150316/compiler/typecheck/TcGenDeriv.hs 2015-03-17 11:30:39.106508173 +1100 +@@ -59,6 +59,8 @@ + import Var + #if __GLASGOW_HASKELL__ < 709 + import MonadUtils ++#else ++import Control.Applicative ((<$>)) + #endif + import Outputable + import Lexeme +--- ghc-7.10.0.20150316-orig/compiler/vectorise/Vectorise/Exp.hs 2015-03-10 05:43:13.000000000 +1100 ++++ ghc-7.10.0.20150316/compiler/vectorise/Vectorise/Exp.hs 2015-03-17 11:46:41.829481669 +1100 +@@ -46,6 +46,8 @@ + import Util + #if __GLASGOW_HASKELL__ < 709 + import MonadUtils ++#else ++import Control.Applicative ((<$>)) + #endif + + import Control.Monad diff --git a/dev-lang/ghc/files/ghc-7.2.1-freebsd-CHOST.patch b/dev-lang/ghc/files/ghc-7.2.1-freebsd-CHOST.patch new file mode 100644 index 000000000000..da59cd789f99 --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.2.1-freebsd-CHOST.patch @@ -0,0 +1,13 @@ +diff --git a/aclocal.m4 b/aclocal.m4 +index 11bb003..52df243 100644 +--- a/aclocal.m4 ++++ b/aclocal.m4 +@@ -1545,7 +1545,7 @@ case "$1" in + freebsd|netbsd|openbsd|dragonfly|osf1|osf3|hpux|linuxaout|kfreebsdgnu|freebsd2|solaris2|cygwin32|mingw32|darwin|gnu|nextstep2|nextstep3|sunos4|ultrix|irix|aix|haiku) + $2="$1" + ;; +- freebsd8) # like i686-gentoo-freebsd8 ++ freebsd*) # like i686-gentoo-freebsd8 or i686-gentoo-freebsd8.2 + $2="freebsd" + ;; + darwin*) diff --git a/dev-lang/ghc/files/ghc-7.4-rc2-macos-prefix-respect-gcc.patch b/dev-lang/ghc/files/ghc-7.4-rc2-macos-prefix-respect-gcc.patch new file mode 100644 index 000000000000..770fd650606b --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.4-rc2-macos-prefix-respect-gcc.patch @@ -0,0 +1,23 @@ +diff --git a/aclocal.m4 b/aclocal.m4 +index a377cb9..4f8fd69 100644 +--- a/aclocal.m4 ++++ b/aclocal.m4 +@@ -1950,17 +1950,7 @@ AC_DEFUN([XCODE_VERSION],[ + # -------------------------------- + # Finds where gcc is + AC_DEFUN([FIND_GCC],[ +- if test "$TargetOS_CPP" = "darwin" && +- test "$XCodeVersion1" -eq 4 && +- test "$XCodeVersion2" -lt 2 +- then +- # In Xcode 4.1, 'gcc-4.2' is the gcc legacy backend (rather +- # than the LLVM backend). We prefer the legacy gcc, but in +- # Xcode 4.2 'gcc-4.2' was removed. +- FP_ARG_WITH_PATH_GNU_PROG([CC], [gcc-4.2]) +- else +- FP_ARG_WITH_PATH_GNU_PROG([CC], [gcc]) +- fi ++ FP_ARG_WITH_PATH_GNU_PROG([CC], [gcc]) + export CC + WhatGccIsCalled="$CC" + AC_SUBST(WhatGccIsCalled) diff --git a/dev-lang/ghc/files/ghc-7.4.1-darwin-CHOST.patch b/dev-lang/ghc/files/ghc-7.4.1-darwin-CHOST.patch new file mode 100644 index 000000000000..348158882aaf --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.4.1-darwin-CHOST.patch @@ -0,0 +1,18 @@ +like the other CHOST patches, but this one catches another case where +$host is used (instead of the cannonicalised variables) + +--- aclocal.m4 ++++ aclocal.m4 +@@ -93,10 +93,10 @@ + exeext='.exe' + soext='.dll' + ;; +- i386-apple-darwin|powerpc-apple-darwin) ++ i386-apple-darwin*|powerpc-apple-darwin*) + soext='.dylib' + ;; +- x86_64-apple-darwin) ++ x86_64-apple-darwin*) + soext='.dylib' + ;; + esac diff --git a/dev-lang/ghc/files/ghc-7.4.1-ticket-7339-fix-unaligned-unreg.patch b/dev-lang/ghc/files/ghc-7.4.1-ticket-7339-fix-unaligned-unreg.patch new file mode 100644 index 000000000000..f2f19f1bbab4 --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.4.1-ticket-7339-fix-unaligned-unreg.patch @@ -0,0 +1,28 @@ +From 26f8466507bd9383e0a7d1e62e397eca4a13822a Mon Sep 17 00:00:00 2001 +From: Sergei Trofimovich <slyfox@gentoo.org> +Date: Tue, 13 Nov 2012 01:39:14 +0300 +Subject: [PATCH] Fix unaligned access on alpha and friends (ticket #7339) + +Assume unknown arch (alpha and mips) an alignment sensitive target. +Otherwise on alpha it causes ghc-7.4.1 to generate invalud lexers. + +Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org> +--- + compiler/cmm/PprC.hs | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/compiler/cmm/PprC.hs b/compiler/cmm/PprC.hs +index 21826f8..8cdcde6 100644 +--- a/compiler/cmm/PprC.hs ++++ b/compiler/cmm/PprC.hs +@@ -963,6 +963,7 @@ cLoad platform expr rep + | otherwise + = char '*' <> parens (cCast platform (machRepPtrCType rep) expr) + where -- On these platforms, unaligned loads are known to cause problems ++ bewareLoadStoreAlignment ArchUnknown = True -- like alpha or mips + bewareLoadStoreAlignment (ArchARM {}) = True + bewareLoadStoreAlignment _ = False + +-- +1.8.0 + diff --git a/dev-lang/ghc/files/ghc-7.4.2-system-libffi.patch b/dev-lang/ghc/files/ghc-7.4.2-system-libffi.patch new file mode 100644 index 000000000000..73c4aa278dd8 --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.4.2-system-libffi.patch @@ -0,0 +1,119 @@ +Make ghc use the libffi installed on the system instead of the bundled one. + +This patch is based on the one used by Debian and Fedora, but was +augmented by additional lines to identify the libffi include directory +using pkg-config, as libffi on Gentoo installs into a subdirectory of +the system include directory. + +2012-04-24 Martin von Gagern + +References: +https://bugs.gentoo.org/411925 +http://hackage.haskell.org/trac/ghc/ticket/5743 + +Index: ghc-7.4.1/ghc.mk +=================================================================== +--- ghc-7.4.1.orig/ghc.mk ++++ ghc-7.4.1/ghc.mk +@@ -579,7 +579,6 @@ BUILD_DIRS += \ + driver/ghci \ + driver/ghc \ + driver/haddock \ +- libffi \ + includes \ + rts + +Index: ghc-7.4.1/rts/ghc.mk +=================================================================== +--- ghc-7.4.1.orig/rts/ghc.mk ++++ ghc-7.4.1/rts/ghc.mk +@@ -86,8 +86,7 @@ + ALL_RTS_DEF_LIBNAMES = base ghc-prim + ALL_RTS_DEF_LIBS = \ + rts/dist/build/win32/libHSbase.dll.a \ +- rts/dist/build/win32/libHSghc-prim.dll.a \ +- libffi/build/inst/lib/libffi.dll.a ++ rts/dist/build/win32/libHSghc-prim.dll.a + + # -- import libs for the regular Haskell libraries + define make-importlib-def # args $1 = lib name +@@ -172,12 +171,12 @@ + # Making a shared library for the RTS. + ifneq "$$(findstring dyn, $1)" "" + ifeq "$$(HOSTPLATFORM)" "i386-unknown-mingw32" +-$$(rts_$1_LIB) : $$(rts_$1_OBJS) $$(ALL_RTS_DEF_LIBS) rts/libs.depend rts/dist/build/libffi-5.dll ++$$(rts_$1_LIB) : $$(rts_$1_OBJS) $$(ALL_RTS_DEF_LIBS) rts/libs.depend + "$$(RM)" $$(RM_OPTS) $$@ + "$$(rts_dist_HC)" -package-name rts -shared -dynamic -dynload deploy \ + -no-auto-link-packages -Lrts/dist/build -lffi-5 `cat rts/libs.depend` $$(rts_$1_OBJS) $$(ALL_RTS_DEF_LIBS) -o $$@ + else +-$$(rts_$1_LIB) : $$(rts_$1_OBJS) $$(rts_$1_DTRACE_OBJS) rts/libs.depend rts/dist/build/libffi$$(soext) ++$$(rts_$1_LIB) : $$(rts_$1_OBJS) $$(rts_$1_DTRACE_OBJS) rts/libs.depend + "$$(RM)" $$(RM_OPTS) $$@ + "$$(rts_dist_HC)" -package-name rts -shared -dynamic -dynload deploy \ + -no-auto-link-packages -Lrts/dist/build -lffi `cat rts/libs.depend` $$(rts_$1_OBJS) \ +@@ -188,9 +187,9 @@ + endif + endif + else +-$$(rts_$1_LIB) : $$(rts_$1_OBJS) $$(rts_$1_DTRACE_OBJS) $$(rts_ffi_objs_stamp) ++$$(rts_$1_LIB) : $$(rts_$1_OBJS) $$(rts_$1_DTRACE_OBJS) + "$$(RM)" $$(RM_OPTS) $$@ +- echo $$(rts_ffi_objs) $$(rts_$1_OBJS) $$(rts_$1_DTRACE_OBJS) | "$$(XARGS)" $$(XARGS_OPTS) "$$(AR_STAGE1)" \ ++ echo $$(rts_$1_OBJS) $$(rts_$1_DTRACE_OBJS) | "$$(XARGS)" $$(XARGS_OPTS) "$$(AR_STAGE1)" \ + $$(AR_OPTS_STAGE1) $$(EXTRA_AR_ARGS_STAGE1) $$@ + endif + +@@ -403,6 +402,12 @@ + rts/dist/build/sm/Evac_thr_CC_OPTS += -DPARALLEL_GC -Irts/sm + rts/dist/build/sm/Scav_thr_CC_OPTS += -DPARALLEL_GC -Irts/sm + ++# Use system libffi ++libffi_include_flags:=$(shell pkg-config --cflags-only-I libffi) ++rts/Adjustor_CC_OPTS += $(libffi_include_flags) ++rts/Interpreter_CC_OPTS += $(libffi_include_flags) ++rts/sm/Storage_CC_OPTS += $(libffi_include_flags) ++ + #----------------------------------------------------------------------------- + # Add PAPI library if needed + +@@ -504,10 +509,8 @@ + # installing + + INSTALL_LIBS += $(ALL_RTS_LIBS) +-INSTALL_LIBS += $(wildcard rts/dist/build/libffi$(soext)*) +-INSTALL_LIBS += $(wildcard rts/dist/build/libffi-5.dll) + +-install: install_libffi_headers ++install: + + .PHONY: install_libffi_headers + install_libffi_headers : +Index: ghc-7.4.1/rts/package.conf.in +=================================================================== +--- ghc-7.4.1.orig/rts/package.conf.in ++++ ghc-7.4.1/rts/package.conf.in +@@ -24,8 +24,9 @@ + hs-libraries: "HSrts" + + extra-libraries: ++ "ffi" + #ifdef HAVE_LIBM +- "m" /* for ldexp() */ ++ , "m" /* for ldexp() */ + #endif + #ifdef HAVE_LIBRT + , "rt" +Index: ghc-7.4.1/compiler/ghc.mk +=================================================================== +--- ghc-7.4.1.orig/compiler/ghc.mk ++++ ghc-7.4.1/compiler/ghc.mk +@@ -260,6 +260,8 @@ + + compiler_CPP_OPTS += -I$(GHC_INCLUDE_DIR) + compiler_CPP_OPTS += ${GhcCppOpts} ++libffi_include_flags := $(shell pkg-config --cflags-only-I libffi) ++compiler/ghci/LibFFI_HSC2HS_OPTS += $(addprefix --cflag=,$(libffi_include_flags)) + + $(PRIMOPS_TXT) compiler/parser/Parser.y: %: %.pp compiler/stage1/$(PLATFORM_H) + $(CPP) $(RAWCPP_FLAGS) -P $(compiler_CPP_OPTS) -x c $< | grep -v '^#pragma GCC' > $@ diff --git a/dev-lang/ghc/files/ghc-7.5.20120505-system-libffi.patch b/dev-lang/ghc/files/ghc-7.5.20120505-system-libffi.patch new file mode 100644 index 000000000000..f3b0c71c5454 --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.5.20120505-system-libffi.patch @@ -0,0 +1,88 @@ +--- ghc-7.5.20120505-orig/ghc.mk 2012-05-06 03:01:29.000000000 +1000 ++++ ghc-7.5.20120505/ghc.mk 2012-05-06 17:22:01.023416003 +1000 +@@ -584,7 +584,6 @@ + $(MAYBE_GHCI) \ + driver/ghc \ + driver/haddock \ +- libffi \ + includes \ + rts + +--- ghc-7.5.20120505-orig/rts/ghc.mk 2012-05-06 03:01:30.000000000 +1000 ++++ ghc-7.5.20120505/rts/ghc.mk 2012-05-06 17:28:31.925897226 +1000 +@@ -171,12 +171,12 @@ + # Making a shared library for the RTS. + ifneq "$$(findstring dyn, $1)" "" + ifeq "$$(HostOS_CPP)" "mingw32" +-$$(rts_$1_LIB) : $$(rts_$1_OBJS) $$(ALL_RTS_DEF_LIBS) rts/libs.depend rts/dist/build/$$(LIBFFI_DLL) ++$$(rts_$1_LIB) : $$(rts_$1_OBJS) $$(ALL_RTS_DEF_LIBS) rts/libs.depend + "$$(RM)" $$(RM_OPTS) $$@ + "$$(rts_dist_HC)" -package-name rts -shared -dynamic -dynload deploy \ + -no-auto-link-packages -Lrts/dist/build -l$(LIBFFI_WINDOWS_LIB) `cat rts/libs.depend` $$(rts_$1_OBJS) $$(ALL_RTS_DEF_LIBS) -o $$@ + else +-$$(rts_$1_LIB) : $$(rts_$1_OBJS) $$(rts_$1_DTRACE_OBJS) rts/libs.depend rts/dist/build/libffi$$(soext) ++$$(rts_$1_LIB) : $$(rts_$1_OBJS) $$(rts_$1_DTRACE_OBJS) rts/libs.depend + "$$(RM)" $$(RM_OPTS) $$@ + "$$(rts_dist_HC)" -package-name rts -shared -dynamic -dynload deploy \ + -no-auto-link-packages -Lrts/dist/build -lffi `cat rts/libs.depend` $$(rts_$1_OBJS) \ +@@ -187,9 +187,9 @@ + endif + endif + else +-$$(rts_$1_LIB) : $$(rts_$1_OBJS) $$(rts_$1_DTRACE_OBJS) $$(rts_ffi_objs_stamp) ++$$(rts_$1_LIB) : $$(rts_$1_OBJS) $$(rts_$1_DTRACE_OBJS) + "$$(RM)" $$(RM_OPTS) $$@ +- echo $$(rts_ffi_objs) $$(rts_$1_OBJS) $$(rts_$1_DTRACE_OBJS) | "$$(XARGS)" $$(XARGS_OPTS) "$$(AR_STAGE1)" \ ++ echo $$(rts_$1_OBJS) $$(rts_$1_DTRACE_OBJS) | "$$(XARGS)" $$(XARGS_OPTS) "$$(AR_STAGE1)" \ + $$(AR_OPTS_STAGE1) $$(EXTRA_AR_ARGS_STAGE1) $$@ + endif + +@@ -407,6 +407,12 @@ + rts/dist/build/sm/Evac_thr_CC_OPTS += -DPARALLEL_GC -Irts/sm + rts/dist/build/sm/Scav_thr_CC_OPTS += -DPARALLEL_GC -Irts/sm + ++# Use system libffi ++libffi_include_flags:=$(shell pkg-config --cflags-only-I libffi) ++rts/Adjustor_CC_OPTS += $(libffi_include_flags) ++rts/Interpreter_CC_OPTS += $(libffi_include_flags) ++rts/sm/Storage_CC_OPTS += $(libffi_include_flags) ++ + #----------------------------------------------------------------------------- + # Add PAPI library if needed + +@@ -508,10 +514,8 @@ + # installing + + INSTALL_LIBS += $(ALL_RTS_LIBS) +-INSTALL_LIBS += $(wildcard rts/dist/build/libffi$(soext)*) +-INSTALL_LIBS += $(wildcard rts/dist/build/$(LIBFFI_DLL)) + +-install: install_libffi_headers ++install: + + .PHONY: install_libffi_headers + install_libffi_headers : +--- ghc-7.5.20120505-orig/rts/package.conf.in 2012-05-06 03:01:30.000000000 +1000 ++++ ghc-7.5.20120505/rts/package.conf.in 2012-05-06 17:22:01.025416056 +1000 +@@ -24,8 +24,9 @@ + hs-libraries: "HSrts" + + extra-libraries: ++ "ffi" + #ifdef HAVE_LIBM +- "m" /* for ldexp() */ ++ , "m" /* for ldexp() */ + #endif + #ifdef HAVE_LIBRT + , "rt" +--- ghc-7.5.20120505-orig/compiler/ghc.mk 2012-05-06 03:01:29.000000000 +1000 ++++ ghc-7.5.20120505/compiler/ghc.mk 2012-05-06 17:22:01.026416083 +1000 +@@ -260,6 +260,8 @@ + + compiler_CPP_OPTS += $(addprefix -I,$(GHC_INCLUDE_DIRS)) + compiler_CPP_OPTS += ${GhcCppOpts} ++libffi_include_flags := $(shell pkg-config --cflags-only-I libffi) ++compiler/ghci/LibFFI_HSC2HS_OPTS += $(addprefix --cflag=,$(libffi_include_flags)) + + $(PRIMOPS_TXT) compiler/parser/Parser.y: %: %.pp compiler/stage1/$(PLATFORM_H) + $(CPP) $(RAWCPP_FLAGS) -P $(compiler_CPP_OPTS) -x c $< | grep -v '^#pragma GCC' > $@ diff --git a/dev-lang/ghc/files/ghc-7.6.2-integer-simple-div-mod.patch b/dev-lang/ghc/files/ghc-7.6.2-integer-simple-div-mod.patch new file mode 100644 index 000000000000..0dc5391678f2 --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.6.2-integer-simple-div-mod.patch @@ -0,0 +1,57 @@ +commit de13417726b90b0945aaaf0b9cfbaf8ab975d8b5 +Author: Gabor Greif <ggreif@gmail.com> +Date: Tue Jul 24 14:31:36 2012 +0200 + + track integer-gmp and add 'divInteger', 'modInteger' + +diff --git a/libraries/integer-simple/GHC/Integer.hs b/libraries/integer-simple/GHC/Integer.hs +index c9b50a7..4122d38 100644 +--- a/libraries/integer-simple/GHC/Integer.hs ++++ b/libraries/integer-simple/GHC/Integer.hs +@@ -4,7 +4,7 @@ + ----------------------------------------------------------------------------- + -- | + -- Module : GHC.Integer +--- Copyright : (c) Ian Lynagh 2007-2008 ++-- Copyright : (c) Ian Lynagh 2007-2012 + -- License : BSD3 + -- + -- Maintainer : igloo@earth.li +@@ -27,6 +27,7 @@ module GHC.Integer ( + plusInteger, minusInteger, timesInteger, negateInteger, + eqInteger, neqInteger, absInteger, signumInteger, + leInteger, gtInteger, ltInteger, geInteger, compareInteger, ++ divInteger, modInteger, + divModInteger, quotRemInteger, quotInteger, remInteger, + encodeFloatInteger, decodeFloatInteger, floatFromInteger, + encodeDoubleInteger, decodeDoubleInteger, doubleFromInteger, +diff --git a/libraries/integer-simple/GHC/Integer/Type.hs b/libraries/integer-simple/GHC/Integer/Type.hs +index c3d812c..67ed19c 100644 +--- a/libraries/integer-simple/GHC/Integer/Type.hs ++++ b/libraries/integer-simple/GHC/Integer/Type.hs +@@ -7,7 +7,7 @@ + ----------------------------------------------------------------------------- + -- | + -- Module : GHC.Integer.Type +--- Copyright : (c) Ian Lynagh 2007-2008 ++-- Copyright : (c) Ian Lynagh 2007-2012 + -- License : BSD3 + -- + -- Maintainer : igloo@earth.li +@@ -370,6 +370,16 @@ n `divModInteger` d = + then (# q `minusInteger` oneInteger, r `plusInteger` d #) + else (# q, r #) + ++{-# NOINLINE divInteger #-} ++divInteger :: Integer -> Integer -> Integer ++n `divInteger` d = quotient ++ where (# quotient, _ #) = n `divModInteger` d ++ ++{-# NOINLINE modInteger #-} ++modInteger :: Integer -> Integer -> Integer ++n `modInteger` d = modulus ++ where (# _, modulus #) = n `divModInteger` d ++ + {-# NOINLINE quotRemInteger #-} + quotRemInteger :: Integer -> Integer -> (# Integer, Integer #) + Naught `quotRemInteger` (!_) = (# Naught, Naught #) diff --git a/dev-lang/ghc/files/ghc-7.6.3-preserve-inplace-xattr.patch b/dev-lang/ghc/files/ghc-7.6.3-preserve-inplace-xattr.patch new file mode 100644 index 000000000000..08410fa0cd9b --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.6.3-preserve-inplace-xattr.patch @@ -0,0 +1,14 @@ +On hardened 'cp' drops out XT-pax parking. +perfinion suggested using 'install', where portage +might have a chance to save our marking. + +Reported-by: Jay Yang +Gentoo-bug: https://bugs.gentoo.org/518734 +diff --git a/rules/build-prog.mk b/rules/build-prog.mk +index 399369e..2ee9cd5 100644 +--- a/rules/build-prog.mk ++++ b/rules/build-prog.mk +@@ -288,3 +288,3 @@ endif + $$($1_$2_INPLACE) : $1/$2/build/tmp/$$($1_$2_PROG_INPLACE) | $$$$(dir $$$$@)/. +- "$$(CP)" -p $$< $$@ ++ $$(INSTALL) -m 755 $$< $$@ diff --git a/dev-lang/ghc/files/ghc-7.6.3-trac-3333-weak-syms.patch b/dev-lang/ghc/files/ghc-7.6.3-trac-3333-weak-syms.patch new file mode 100644 index 000000000000..c3184a68c1e7 --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.6.3-trac-3333-weak-syms.patch @@ -0,0 +1,387 @@ +The patch set adds support for weak symbols to ghci. + +For gentoo it fixes nonworking ghci / template haskell +for package base. + +Steps to reproduce: + 1. CFLAGS=-Os emerge ghc + 2. ghci -package base + Loading package base ... linking ... ghc: /usr/lib64/ghc-7.6.3/base-4.6.0.1/HSbase-4.6.0.1.o: unknown symbol `stat' + +When built with -O2 weak 'stat' resolved to '__xstat' and we don't see any errors. +But on olwer optimization levels 'stat' remains. + +Patches-by: akio +Gentoo-bug: http://bugs.gentoo.org/452442 +Upstream-bug: http://ghc.haskell.org/trac/ghc/ticket/3333 + +From 500d57d3a18412c78cab5abc4d91f1564edc964d Mon Sep 17 00:00:00 2001 +From: Takano Akio <aljee@hyper.cx> +Date: Sat, 29 Dec 2012 11:47:22 +0900 +Subject: [PATCH 1/3] Linker.c: remove stablehash, which is no longer used + +--- + includes/rts/Linker.h | 3 --- + rts/Linker.c | 31 ++----------------------------- + 2 files changed, 2 insertions(+), 32 deletions(-) + +diff --git a/includes/rts/Linker.h b/includes/rts/Linker.h +index e900e85..d20ebc2 100644 +--- a/includes/rts/Linker.h ++++ b/includes/rts/Linker.h +@@ -23,9 +23,6 @@ typedef char pathchar; + /* initialize the object linker */ + void initLinker( void ); + +-/* insert a stable symbol in the hash table */ +-void insertStableSymbol(pathchar* obj_name, char* key, StgPtr data); +- + /* insert a symbol in the hash table */ + void insertSymbol(pathchar* obj_name, char* key, void* data); + +diff --git a/rts/Linker.c b/rts/Linker.c +index fa1de89..513fe3f 100644 +--- a/rts/Linker.c ++++ b/rts/Linker.c +@@ -30,1 +30,0 @@ +-#include "Stable.h" +@@ -150,9 +149,6 @@ int dynamicByDefault = 0; + /* Hash table mapping symbol names to Symbol */ + static /*Str*/HashTable *symhash; + +-/* Hash table mapping symbol names to StgStablePtr */ +-static /*Str*/HashTable *stablehash; +- + /* List of currently loaded objects */ + ObjectCode *objects = NULL; /* initially empty */ + +@@ -1126,1 +1126,0 @@ typedef struct _RtsSymbolVal { +- SymI_HasProto(insertStableSymbol) \ +@@ -1488,7 +1483,6 @@ initLinker( void ) + #if defined(THREADED_RTS) && (defined(OBJFORMAT_ELF) || defined(OBJFORMAT_MACHO)) + initMutex(&dl_mutex); + #endif +- stablehash = allocStrHashTable(); + symhash = allocStrHashTable(); + + /* populate the symbol table with stuff from the RTS */ +@@ -1817,17 +1811,6 @@ error: + } + + /* ----------------------------------------------------------------------------- +- * insert a stable symbol in the hash table +- */ +- +-void +-insertStableSymbol(pathchar* obj_name, char* key, StgPtr p) +-{ +- ghciInsertStrHashTable(obj_name, stablehash, key, getStablePtr(p)); +-} +- +- +-/* ----------------------------------------------------------------------------- + * insert a symbol in the hash table + */ + void +@@ -4749,8 +4732,6 @@ do_Elf_Rel_relocations ( ObjectCode* oc, char* ehdrC, + #ifdef i386_HOST_ARCH + Elf_Addr value; + #endif +- StgStablePtr stablePtr; +- StgPtr stableVal; + #ifdef arm_HOST_ARCH + int is_target_thm=0, T=0; + #endif +@@ -4773,16 +4754,8 @@ do_Elf_Rel_relocations ( ObjectCode* oc, char* ehdrC, + + } else { + symbol = strtab + sym.st_name; +- stablePtr = (StgStablePtr)lookupHashTable(stablehash, (StgWord)symbol); +- if (NULL == stablePtr) { +- /* No, so look up the name in our global table. */ +- S_tmp = lookupSymbol( symbol ); +- S = (Elf_Addr)S_tmp; +- } else { +- stableVal = deRefStablePtr( stablePtr ); +- S_tmp = stableVal; +- S = (Elf_Addr)S_tmp; +- } ++ S_tmp = lookupSymbol( symbol ); ++ S = (Elf_Addr)S_tmp; + } + if (!S) { + errorBelch("%s: unknown symbol `%s'", oc->fileName, symbol); +-- +1.7.9.5 + +From 2e5e0f7a90dd390adc5ae5fb2a3bc6e879aa42d6 Mon Sep 17 00:00:00 2001 +From: Takano Akio <aljee@hyper.cx> +Date: Sat, 29 Dec 2012 11:59:34 +0900 +Subject: [PATCH 2/3] ghci: add support for ELF weak symbols + +--- + rts/Linker.c | 102 ++++++++++++++++++++++++++++++++++++++++++++-------------- + 1 file changed, 78 insertions(+), 24 deletions(-) + +diff --git a/rts/Linker.c b/rts/Linker.c +index 513fe3f..5105085 100644 +--- a/rts/Linker.c ++++ b/rts/Linker.c +@@ -146,7 +146,13 @@ int dynamicByDefault = 1; + int dynamicByDefault = 0; + #endif + +-/* Hash table mapping symbol names to Symbol */ ++typedef struct _RtsSymbolInfo { ++ void *value; ++ const ObjectCode *owner; ++ HsBool weak; ++} RtsSymbolInfo; ++ ++/* Hash table mapping symbol names to RtsSymbolInfo */ + static /*Str*/HashTable *symhash; + + /* List of currently loaded objects */ +@@ -1415,15 +1421,31 @@ static RtsSymbolVal rtsSyms[] = { + * Insert symbols into hash tables, checking for duplicates. + */ + +-static void ghciInsertStrHashTable ( pathchar* obj_name, +- HashTable *table, +- char* key, +- void *data +- ) ++static void ghciInsertSymbolTable( ++ pathchar* obj_name, ++ HashTable *table, ++ char* key, ++ void *data, ++ HsBool weak, ++ ObjectCode *owner) + { +- if (lookupHashTable(table, (StgWord)key) == NULL) ++ RtsSymbolInfo *pinfo = lookupStrHashTable(table, key); ++ if (!pinfo) /* new entry */ ++ { ++ pinfo = stgMallocBytes(sizeof (*pinfo), "ghciInsertToSymbolTable"); ++ pinfo->value = data; ++ pinfo->owner = owner; ++ pinfo->weak = weak; ++ insertStrHashTable(table, key, pinfo); ++ return; ++ } else if ((!pinfo->weak || pinfo->value) && weak) { ++ return; /* duplicate weak symbol, throw it away */ ++ } else if (pinfo->weak) /* weak symbol is in the table */ + { +- insertStrHashTable(table, (StgWord)key, data); ++ /* override the weak definition with the non-weak one */ ++ pinfo->value = data; ++ pinfo->owner = owner; ++ pinfo->weak = HS_BOOL_FALSE; + return; + } + debugBelch( +@@ -1444,6 +1466,32 @@ static void ghciInsertStrHashTable ( pathchar* obj_name, + ); + stg_exit(1); + } ++ ++static HsBool ghciLookupSymbolTable(HashTable *table, ++ const char *key, void **result) ++{ ++ RtsSymbolInfo *pinfo = lookupStrHashTable(table, key); ++ if (!pinfo) { ++ *result = NULL; ++ return HS_BOOL_FALSE; ++ } ++ if (pinfo->weak) ++ IF_DEBUG(linker, debugBelch("lookup: promoting %s\n", key)); ++ /* Once it's looked up, it can no longer be overridden */ ++ pinfo->weak = HS_BOOL_FALSE; ++ ++ *result = pinfo->value; ++ return HS_BOOL_TRUE; ++} ++ ++static void ghciRemoveSymbolTable(HashTable *table, const char *key, ++ ObjectCode *owner) ++{ ++ RtsSymbolInfo *pinfo = lookupStrHashTable(table, key); ++ if (!pinfo || owner != pinfo->owner) return; ++ removeStrHashTable(table, key, NULL); ++ stgFree(pinfo); ++} + /* ----------------------------------------------------------------------------- + * initialize the object linker + */ +@@ -1487,8 +1535,8 @@ initLinker( void ) + + /* populate the symbol table with stuff from the RTS */ + for (sym = rtsSyms; sym->lbl != NULL; sym++) { +- ghciInsertStrHashTable(WSTR("(GHCi built-in symbols)"), +- symhash, sym->lbl, sym->addr); ++ ghciInsertSymbolTable(WSTR("(GHCi built-in symbols)"), ++ symhash, sym->lbl, sym->addr, HS_BOOL_FALSE, NULL); + IF_DEBUG(linker, debugBelch("initLinker: inserting rts symbol %s, %p\n", sym->lbl, sym->addr)); + } + # if defined(OBJFORMAT_MACHO) && defined(powerpc_HOST_ARCH) +@@ -1816,7 +1864,7 @@ error: + void + insertSymbol(pathchar* obj_name, char* key, void* data) + { +- ghciInsertStrHashTable(obj_name, symhash, key, data); ++ ghciInsertSymbolTable(obj_name, symhash, key, data, HS_BOOL_FALSE, NULL); + } + + /* ----------------------------------------------------------------------------- +@@ -1829,9 +1877,8 @@ lookupSymbol( char *lbl ) + IF_DEBUG(linker, debugBelch("lookupSymbol: looking up %s\n", lbl)); + initLinker() ; + ASSERT(symhash != NULL); +- val = lookupStrHashTable(symhash, lbl); + +- if (val == NULL) { ++ if (!ghciLookupSymbolTable(symhash, lbl, &val)) { + IF_DEBUG(linker, debugBelch("lookupSymbol: symbol not found\n")); + # if defined(OBJFORMAT_ELF) + return internal_dlsym(dl_prog_handle, lbl); +@@ -1903,7 +1950,7 @@ void ghci_enquire ( char* addr ) + if (sym == NULL) continue; + a = NULL; + if (a == NULL) { +- a = lookupStrHashTable(symhash, sym); ++ ghciLookupSymbolTable(symhash, sym, (void **)&a); + } + if (a == NULL) { + // debugBelch("ghci_enquire: can't find %s\n", sym); +@@ -2715,7 +2762,7 @@ unloadObj( pathchar *path ) + int i; + for (i = 0; i < oc->n_symbols; i++) { + if (oc->symbols[i] != NULL) { +- removeStrHashTable(symhash, oc->symbols[i], NULL); ++ ghciRemoveSymbolTable(symhash, oc->symbols[i], oc); + } + } + } +@@ -3802,7 +3849,8 @@ ocGetNames_PEi386 ( ObjectCode* oc ) + ASSERT(i >= 0 && i < oc->n_symbols); + /* cstring_from_COFF_symbol_name always succeeds. */ + oc->symbols[i] = (char*)sname; +- ghciInsertStrHashTable(oc->fileName, symhash, (char*)sname, addr); ++ ghciInsertSymbolTable(oc->fileName, symhash, (char*)sname, addr, ++ HS_BOOL_FALSE, oc); + } else { + # if 0 + debugBelch( +@@ -4595,6 +4643,7 @@ ocGetNames_ELF ( ObjectCode* oc ) + for (j = 0; j < nent; j++) { + + char isLocal = FALSE; /* avoids uninit-var warning */ ++ HsBool isWeak = HS_BOOL_FALSE; + char* ad = NULL; + char* nm = strtab + stab[j].st_name; + int secno = stab[j].st_shndx; +@@ -4615,6 +4664,7 @@ ocGetNames_ELF ( ObjectCode* oc ) + else + if ( ( ELF_ST_BIND(stab[j].st_info)==STB_GLOBAL + || ELF_ST_BIND(stab[j].st_info)==STB_LOCAL ++ || ELF_ST_BIND(stab[j].st_info)==STB_WEAK + ) + /* and not an undefined symbol */ + && stab[j].st_shndx != SHN_UNDEF +@@ -4638,7 +4688,8 @@ ocGetNames_ELF ( ObjectCode* oc ) + ad = ehdrC + shdr[ secno ].sh_offset + stab[j].st_value; + if (ELF_ST_BIND(stab[j].st_info)==STB_LOCAL) { + isLocal = TRUE; +- } else { ++ isWeak = FALSE; ++ } else { /* STB_GLOBAL or STB_WEAK */ + #ifdef ELF_FUNCTION_DESC + /* dlsym() and the initialisation table both give us function + * descriptors, so to be consistent we store function descriptors +@@ -4649,6 +4700,7 @@ ocGetNames_ELF ( ObjectCode* oc ) + IF_DEBUG(linker,debugBelch( "addOTabName(GLOB): %10p %s %s\n", + ad, oc->fileName, nm )); + isLocal = FALSE; ++ isWeak = (ELF_ST_BIND(stab[j].st_info)==STB_WEAK); + } + } + +@@ -4661,7 +4713,7 @@ ocGetNames_ELF ( ObjectCode* oc ) + if (isLocal) { + /* Ignore entirely. */ + } else { +- ghciInsertStrHashTable(oc->fileName, symhash, nm, ad); ++ ghciInsertSymbolTable(oc->fileName, symhash, nm, ad, isWeak, oc); + } + } else { + /* Skip. */ +@@ -6306,11 +6358,13 @@ ocGetNames_MachO(ObjectCode* oc) + else + { + IF_DEBUG(linker, debugBelch("ocGetNames_MachO: inserting %s\n", nm)); +- ghciInsertStrHashTable(oc->fileName, symhash, nm, ++ ghciInsertSymbolTable(oc->fileName, symhash, nm, + image + + sections[nlist[i].n_sect-1].offset + - sections[nlist[i].n_sect-1].addr +- + nlist[i].n_value); ++ + nlist[i].n_value, ++ HS_BOOL_FALSE, ++ oc); + oc->symbols[curSymbol++] = nm; + } + } +@@ -6341,8 +6395,8 @@ ocGetNames_MachO(ObjectCode* oc) + nlist[i].n_value = commonCounter; + + IF_DEBUG(linker, debugBelch("ocGetNames_MachO: inserting common symbol: %s\n", nm)); +- ghciInsertStrHashTable(oc->fileName, symhash, nm, +- (void*)commonCounter); ++ ghciInsertSymbolTable(oc->fileName, symhash, nm, ++ (void*)commonCounter, HS_BOOL_FALSE, oc); + oc->symbols[curSymbol++] = nm; + + commonCounter += sz; +@@ -6466,7 +6520,7 @@ machoInitSymbolsWithoutUnderscore(void) + + #undef SymI_NeedsProto + #define SymI_NeedsProto(x) \ +- ghciInsertStrHashTable("(GHCi built-in symbols)", symhash, #x, *p++); ++ ghciInsertSymbolTable("(GHCi built-in symbols)", symhash, #x, *p++, HS_BOOL_FALSE, NULL); + + RTS_MACHO_NOUNDERLINE_SYMBOLS + +-- +1.7.9.5 + +From 916d7713b34b529ae7ec24eaa836a4eaca7724fc Mon Sep 17 00:00:00 2001 +From: Takano Akio <aljee@hyper.cx> +Date: Sun, 6 Jan 2013 17:51:19 +0900 +Subject: [PATCH 3/3] Linker.c: add dso_handle to the symbol table + +--- + rts/Linker.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/rts/Linker.c b/rts/Linker.c +index 5105085..0b2bf63 100644 +--- a/rts/Linker.c ++++ b/rts/Linker.c +@@ -1542,6 +1542,13 @@ initLinker( void ) + # if defined(OBJFORMAT_MACHO) && defined(powerpc_HOST_ARCH) + machoInitSymbolsWithoutUnderscore(); + # endif ++ /* GCC defines a special symbol __dso_handle which is resolved to NULL if ++ referenced from a statically linked module. We need to mimic this, but ++ we cannot use NULL because we use it to mean nonexistent symbols. So we ++ use an arbitrary (hopefully unique) address here. ++ */ ++ ghciInsertSymbolTable(WSTR("(GHCi special symbols)"), ++ symhash, "__dso_handle", (void *)0x12345687, HS_BOOL_FALSE, NULL); + + # if defined(OBJFORMAT_ELF) || defined(OBJFORMAT_MACHO) + # if defined(RTLD_DEFAULT) +-- +1.7.9.5 + diff --git a/dev-lang/ghc/files/ghc-7.8.1_rc1-libbfd.patch b/dev-lang/ghc/files/ghc-7.8.1_rc1-libbfd.patch new file mode 100644 index 000000000000..d01cb49affbd --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.8.1_rc1-libbfd.patch @@ -0,0 +1,81 @@ +commit bb5953484579968c984d074ca1af5d21e1c9e7a0 +Author: Sergei Trofimovich <slyfox@gentoo.org> +Date: Mon Feb 10 12:45:58 2014 +0300 + + rts: unrust 'libbfd' debug symbols parser + + Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org> + +diff --git a/configure.ac b/configure.ac +index e7fbc7f..e47979c 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -801,7 +801,8 @@ fi + dnl ** check whether this machine has BFD and libiberty installed (used for debugging) + dnl the order of these tests matters: bfd needs libiberty + AC_CHECK_LIB(iberty, xmalloc) +-AC_CHECK_LIB(bfd, bfd_uncompress_section_contents) ++dnl 'bfd_init' is a rare non-macro in libbfd ++AC_CHECK_LIB(bfd, bfd_init) + + dnl ################################################################ + dnl Check for libraries +diff --git a/rts/Printer.c b/rts/Printer.c +index ca9ca49..ce02b02 100644 +--- a/rts/Printer.c ++++ b/rts/Printer.c +@@ -48,6 +48,9 @@ void printPtr( StgPtr p ) + raw = lookupGHCName(p); + if (raw != NULL) { + printZcoded(raw); ++ /* it can be just a C symbol, like 'stg_returnToStackTop' */ ++ debugBelch("<%s>", raw); ++ debugBelch("[%p]", p); + } else { + debugBelch("%p", p); + } +@@ -794,7 +797,7 @@ static void printZcoded( const char *raw ) + disabling this for now. + */ + #ifdef USING_LIBBFD +- ++#include "../mk/config.h" /* silly BFD's requirement */ + #include <bfd.h> + + /* Fairly ad-hoc piece of code that seems to filter out a lot of +@@ -863,7 +866,10 @@ extern void DEBUG_LoadSymbols( char *name ) + for( i = 0; i != number_of_symbols; ++i ) { + symbol_info info; + bfd_get_symbol_info(abfd,symbol_table[i],&info); +- /*debugBelch("\t%c\t0x%x \t%s\n",info.type,(nat)info.value,info.name); */ ++ if (0) ++ { ++ debugBelch("\t%c\t0x%x \t%s\n",info.type,(nat)info.value,info.name); ++ } + if (isReal(info.type, info.name)) { + num_real_syms += 1; + } +diff --git a/rts/RtsStartup.c b/rts/RtsStartup.c +index aa7306f..5bdef94 100644 +--- a/rts/RtsStartup.c ++++ b/rts/RtsStartup.c +@@ -19,6 +19,7 @@ + #include "RtsFlags.h" + #include "RtsUtils.h" + #include "Prelude.h" ++#include "Printer.h" /* DEBUG_LoadSymbols */ + #include "Schedule.h" /* initScheduler */ + #include "Stats.h" /* initStats */ + #include "STM.h" /* initSTM */ +@@ -162,6 +163,11 @@ hs_init_ghc(int *argc, char **argv[], RtsConfig rts_config) + rts_config.rts_opts_enabled, rts_config.rts_opts, rts_config.rts_hs_main); + } + ++#ifdef DEBUG ++ /* load debugging symbols */ ++ DEBUG_LoadSymbols((*argv)[0]); ++#endif /* DEBUG */ ++ + /* Initialise the stats department, phase 1 */ + initStats1(); + diff --git a/dev-lang/ghc/files/ghc-7.8.2-cgen-constify.patch b/dev-lang/ghc/files/ghc-7.8.2-cgen-constify.patch new file mode 100644 index 000000000000..efdd54fbf3fb --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.8.2-cgen-constify.patch @@ -0,0 +1,34 @@ +commit b0cf3ab7a69b878a4335d21a347b56e4b0ca0b7b +Author: Sergei Trofimovich <slyfox@gentoo.org> +Date: Mon Apr 14 19:06:24 2014 +0300 + + compiler/cmm/PprC.hs: constify local string literals + + Consider one-line module + module B (v) where v = "hello" + in -fvia-C mode it generates code like + static char gibberish_str[] = "hello"; + + It uselessly eats data section (precious resource on ia64!). + The patch switches genrator to emit: + static const char gibberish_str[] = "hello"; + + Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org> + +diff --git a/compiler/cmm/PprC.hs b/compiler/cmm/PprC.hs +index 2398981..fdb578d 100644 +--- a/compiler/cmm/PprC.hs ++++ b/compiler/cmm/PprC.hs +@@ -112,6 +112,12 @@ pprTop (CmmProc infos clbl _ graph) = + + -- We only handle (a) arrays of word-sized things and (b) strings. + ++pprTop (CmmData ReadOnlyData (Statics lbl [CmmString str])) = ++ hcat [ ++ pprLocalness lbl, ptext (sLit "const char "), ppr lbl, ++ ptext (sLit "[] = "), pprStringInCStyle str, semi ++ ] ++ + pprTop (CmmData _section (Statics lbl [CmmString str])) = + hcat [ + pprLocalness lbl, ptext (sLit "char "), ppr lbl, diff --git a/dev-lang/ghc/files/ghc-7.8.3-cc-lang.patch b/dev-lang/ghc/files/ghc-7.8.3-cc-lang.patch new file mode 100644 index 000000000000..032dc9a67624 --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.8.3-cc-lang.patch @@ -0,0 +1,129 @@ +commit 4d4d07704ee78221607a18b8118294b0aea1bac4 +Author: Sergei Trofimovich <slyfox@gentoo.org> +Date: Tue Sep 2 00:06:56 2014 +0300 + + systools: fix gcc version detecton on non-english locale + + Summary: + ghc runs 'gcc -v' to check if we run under vanilla gcc + or disaguised clang by checking for string + + "gcc version <something>" + + But this check does not always work as gcc has that string + localized via gettext mechanism: + + (some gcc's locale strings) + be.po-msgstr "версія gcc %s\n" + da.po-msgstr "GCC version %s\n" + de.po-msgstr "gcc-Version %s %s\n" + el.po-msgstr "έκδοση gcc %s\n" + ... + + To ping gcc to English locale we now override environment + variable with 'LANGUAGE=en' value. + + Fixes Issue #8825 + + Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org> + + Test Plan: validate + + Reviewers: austin + + Reviewed By: austin + + Subscribers: simonmar, ezyang, carter + + Differential Revision: https://phabricator.haskell.org/D185 + + GHC Trac Issues: #8825 + +diff --git a/compiler/main/SysTools.lhs b/compiler/main/SysTools.lhs +index 72fa19b..67926f5 100644 +--- a/compiler/main/SysTools.lhs ++++ b/compiler/main/SysTools.lhs +@@ -492,6 +492,51 @@ readCreateProcess proc = do + + return (ex, output) + ++readProcessEnvWithExitCode ++ :: String -- ^ program path ++ -> [String] -- ^ program args ++ -> [(String, String)] -- ^ environment to override ++ -> IO (ExitCode, String, String) -- ^ (exit_code, stdout, stderr) ++readProcessEnvWithExitCode prog args env_update = do ++ current_env <- getEnvironment ++ let new_env = env_update ++ [ (k, v) ++ | let overriden_keys = map fst env_update ++ , (k, v) <- current_env ++ , k `notElem` overriden_keys ++ ] ++ p = proc prog args ++ ++ (_stdin, Just stdoh, Just stdeh, pid) <- ++ createProcess p{ std_out = CreatePipe ++ , std_err = CreatePipe ++ , env = Just new_env ++ } ++ ++ outMVar <- newEmptyMVar ++ errMVar <- newEmptyMVar ++ ++ _ <- forkIO $ do ++ stdo <- hGetContents stdoh ++ _ <- evaluate (length stdo) ++ putMVar outMVar stdo ++ ++ _ <- forkIO $ do ++ stde <- hGetContents stdeh ++ _ <- evaluate (length stde) ++ putMVar errMVar stde ++ ++ out <- takeMVar outMVar ++ hClose stdoh ++ err <- takeMVar errMVar ++ hClose stdeh ++ ++ ex <- waitForProcess pid ++ ++ return (ex, out, err) ++ ++-- Don't let gcc localize version info string, #8825 ++en_locale_env :: [(String, String)] ++en_locale_env = [("LANGUAGE", "en")] + + -- If the -B<dir> option is set, add <dir> to PATH. This works around + -- a bug in gcc on Windows Vista where it can't find its auxiliary +@@ -746,8 +791,9 @@ getLinkerInfo' dflags = do + _ -> do + -- In practice, we use the compiler as the linker here. Pass + -- -Wl,--version to get linker version info. +- (exitc, stdo, stde) <- readProcessWithExitCode pgm +- ["-Wl,--version"] "" ++ (exitc, stdo, stde) <- readProcessEnvWithExitCode pgm ++ ["-Wl,--version"] ++ en_locale_env + -- Split the output by lines to make certain kinds + -- of processing easier. In particular, 'clang' and 'gcc' + -- have slightly different outputs for '-Wl,--version', but +@@ -802,7 +848,8 @@ getCompilerInfo' dflags = do + + -- Process the executable call + info <- catchIO (do +- (exitc, stdo, stde) <- readProcessWithExitCode pgm ["-v"] "" ++ (exitc, stdo, stde) <- ++ readProcessEnvWithExitCode pgm ["-v"] en_locale_env + -- Split the output by lines to make certain kinds + -- of processing easier. + parseCompilerInfo (lines stdo) (lines stde) exitc +@@ -952,7 +999,8 @@ readElfSection _dflags section exe = do + prog = "readelf" + args = [Option "-p", Option section, FileOption "" exe] + -- +- r <- readProcessWithExitCode prog (filter notNull (map showOpt args)) "" ++ r <- readProcessEnvWithExitCode prog (filter notNull (map showOpt args)) ++ en_locale_env + case r of + (ExitSuccess, out, _err) -> return (doFilter (lines out)) + _ -> return Nothing diff --git a/dev-lang/ghc/files/ghc-7.8.3-deRefStablePtr.patch b/dev-lang/ghc/files/ghc-7.8.3-deRefStablePtr.patch new file mode 100644 index 000000000000..8deec21edc5c --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.8.3-deRefStablePtr.patch @@ -0,0 +1,38 @@ +commit 104a66a461f4f89b8e5ad9c829923bb7ca8ceddb +Author: Sergei Trofimovich <slyfox@gentoo.org> +Date: Sat Aug 23 13:11:23 2014 +0300 + + rts/Linker.c: declare 'deRefStablePtr' as an exported 'rts' symbol + + $ inplace/bin/ghc-stage2 -fforce-recomp -dcore-lint -dcmm-lint -dno-debug-output -no-user-package-db -rtsopts -optc-fno-builtin -fno-ghci-history \ + testsuite/tests/ffi/should_run/T4038.hs --interactive -v0 -ignore-dot-ghci +RTS -I0.1 -RTS + + *Main> main + <interactive>: /tmp/ghc16668_0/ghc16668_5.o: unknown symbol `deRefStablePtr' + + The reference to 'deRefStablePtr' is generated by 'compiler/deSugar/DsForeign.lhs': + the_cfun + = case maybe_target of + Nothing -> text "(StgClosure*)deRefStablePtr(the_stableptr)" + Just hs_fn -> char '&' <> ppr hs_fn <> text "_closure" + + Patch fixes all broken tests using 'import wrapper': + TEST="ffi013 ffi010 ffi011 ffi005 ffi020 ffi006 ffi019 fed001 T1679 T4038" + + Tests manifested as broken only in DYNAMIC_GHC_PROGRAMS=NO builds, + where GHCi's custom linker is used instead of system's linker. + + Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org> + +diff --git a/rts/Linker.c b/rts/Linker.c +index e97580d..b24be58 100644 +--- a/rts/Linker.c ++++ b/rts/Linker.c +@@ -1092,6 +1092,7 @@ typedef struct _RtsSymbolVal { + SymI_HasProto(__word_encodeFloat) \ + SymI_HasProto(stg_atomicallyzh) \ + SymI_HasProto(barf) \ ++ SymI_HasProto(deRefStablePtr) \ + SymI_HasProto(debugBelch) \ + SymI_HasProto(errorBelch) \ + SymI_HasProto(sysErrorBelch) \ diff --git a/dev-lang/ghc/files/ghc-7.8.3-ia64-prim.patch b/dev-lang/ghc/files/ghc-7.8.3-ia64-prim.patch new file mode 100644 index 000000000000..9026ecfdf4b1 --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.8.3-ia64-prim.patch @@ -0,0 +1,69 @@ +commit e2a8801b9779949010f30db6f6ef66f3c3a70776 +Author: Sergei Trofimovich <slyfox@gentoo.org> +Date: Thu Sep 4 17:50:45 2014 +0300 + + pprC: declare extern cmm primitives as functions, not data + + Summary: + The commit fixes incorrect code generation of + integer-gmp package on ia64 due to C prototype mismatch. + Before patch prototype was + StgWord poizh[]; + After patch it became + StgFunPtr poizh(); + + Long story: + + Consider the following simple example: + + {-# LANGUAGE MagicHash, GHCForeignImportPrim, UnliftedFFITypes #-} + module M where + import GHC.Prim -- Int# + foreign import prim "poizh" poi# :: Int# -> Int# + + Before the patch Unregisterised build generated the + following 'poizh' reference: + EI_(poizh); /* StgWord poizh[]; */ + FN_(M_poizh_entry) { + // ... + JMP_((W_)&poizh); + } + + After the patch it looks this way: + EF_(poizh); /* StgFunPtr poizh(); */ + FN_(M_poizh_entry) { + // ... + JMP_((W_)&poizh); + } + + On ia64 it leads to different relocation types being generated: + incorrect one: + addl r14 = @ltoffx(poizh#) + ld8.mov r14 = [r14], poizh# + correct one: + addl r14 = @ltoff(@fptr(poizh#)), gp + ld8 r14 = [r14] + + '@fptr(poizh#)' basically instructs assembler to creates + another obect consisting of real address to 'poizh' instructions + and module address. That '@fptr' object is used as a function "address". + This object is different for every module referencing 'poizh' symbol. + + All indirect function calls expect '@fptr' object. That way + call site can read real destination address and set destination + module address in 'gp' register. + + Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org> + +diff --git a/compiler/cmm/CLabel.hs b/compiler/cmm/CLabel.hs +index 02ad026..0f2c0ae 100644 +--- a/compiler/cmm/CLabel.hs ++++ b/compiler/cmm/CLabel.hs +@@ -813,6 +813,7 @@ labelType (CmmLabel _ _ CmmClosure) = GcPtrLabel + labelType (CmmLabel _ _ CmmCode) = CodeLabel + labelType (CmmLabel _ _ CmmInfo) = DataLabel + labelType (CmmLabel _ _ CmmEntry) = CodeLabel ++labelType (CmmLabel _ _ CmmPrimCall) = CodeLabel + labelType (CmmLabel _ _ CmmRetInfo) = DataLabel + labelType (CmmLabel _ _ CmmRet) = CodeLabel + labelType (RtsLabel (RtsSelectorInfoTable _ _)) = DataLabel diff --git a/dev-lang/ghc/files/ghc-7.8.3-linker-warn.patch b/dev-lang/ghc/files/ghc-7.8.3-linker-warn.patch new file mode 100644 index 000000000000..c8570c06940b --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.8.3-linker-warn.patch @@ -0,0 +1,35 @@ +commit 326046739801a380c5457ef4c87bce8fb95497ba +Author: Sergei Trofimovich <slyfox@gentoo.org> +Date: Sun Aug 10 22:12:28 2014 +0300 + + systools info: fix warning about C compiler (message said about linker) + + Summary: Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org> + + Test Plan: build-tested + + Reviewers: austin + + Reviewed By: austin + + Subscribers: phaskell, simonmar, relrod, ezyang, carter + + Differential Revision: https://phabricator.haskell.org/D132 + +diff --git a/compiler/main/SysTools.lhs b/compiler/main/SysTools.lhs +index 1c1c52c..72fa19b 100644 +--- a/compiler/main/SysTools.lhs ++++ b/compiler/main/SysTools.lhs +@@ -809,10 +809,10 @@ getCompilerInfo' dflags = do + ) + (\err -> do + debugTraceMsg dflags 2 +- (text "Error (figuring out compiler information):" <+> ++ (text "Error (figuring out C compiler information):" <+> + text (show err)) + errorMsg dflags $ hang (text "Warning:") 9 $ +- text "Couldn't figure out linker information!" $$ ++ text "Couldn't figure out C compiler information!" $$ + text "Make sure you're using GNU gcc, or clang" + return UnknownCC) + return info diff --git a/dev-lang/ghc/files/ghc-7.8.3-pic-asm.patch b/dev-lang/ghc/files/ghc-7.8.3-pic-asm.patch new file mode 100644 index 000000000000..10c41d5b29f6 --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.8.3-pic-asm.patch @@ -0,0 +1,107 @@ +commit a93ab43ab5f40cadbedea2f6342b93c245e91434 +Author: Sergei Trofimovich <slyfox@gentoo.org> +Date: Wed Aug 27 22:19:52 2014 +0300 + + driver: pass '-fPIC' option to assembler as well + + Summary: + Before the patch '-fPIC' was passed only to C compiler, + but not to assembler itself. + + It led to runtime crash in GHC_DYNAMIC_PROGRAMS=YES mode + on sparc32. + + Technical details are in 'Note [-fPIC for assembler]'. + + Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org> + + Test Plan: validate on sparc + + Reviewers: simonmar, austin, kgardas + + Reviewed By: austin + + Subscribers: simonmar, ezyang, carter + + Differential Revision: https://phabricator.haskell.org/D177 + +diff --git a/compiler/main/DriverPipeline.hs b/compiler/main/DriverPipeline.hs +index 183f435..5a18e6e 100644 +--- a/compiler/main/DriverPipeline.hs ++++ b/compiler/main/DriverPipeline.hs +@@ -1199,6 +1199,7 @@ runPhase (RealPhase (As with_cpp)) input_fn dflags + + as_prog <- whichAsProg + let cmdline_include_paths = includePaths dflags ++ let pic_c_flags = picCCOpts dflags + + next_phase <- maybeMergeStub + output_fn <- phaseOutputFilename next_phase +@@ -1212,6 +1213,9 @@ runPhase (RealPhase (As with_cpp)) input_fn dflags + = liftIO $ as_prog dflags + ([ SysTools.Option ("-I" ++ p) | p <- cmdline_include_paths ] + ++ -- See Note [-fPIC for assembler] ++ ++ map SysTools.Option pic_c_flags ++ + -- We only support SparcV9 and better because V8 lacks an atomic CAS + -- instruction so we have to make sure that the assembler accepts the + -- instruction set. Note that the user can still override this +@@ -1253,6 +1257,8 @@ runPhase (RealPhase SplitAs) _input_fn dflags + osuf = objectSuf dflags + split_odir = base_o ++ "_" ++ osuf ++ "_split" + ++ let pic_c_flags = picCCOpts dflags ++ + -- this also creates the hierarchy + liftIO $ createDirectoryIfMissing True split_odir + +@@ -1286,6 +1292,9 @@ runPhase (RealPhase SplitAs) _input_fn dflags + then [SysTools.Option "-mcpu=v9"] + else []) ++ + ++ -- See Note [-fPIC for assembler] ++ map SysTools.Option pic_c_flags ++ ++ + [ SysTools.Option "-c" + , SysTools.Option "-o" + , SysTools.FileOption "" (split_obj n) +@@ -2203,3 +2212,38 @@ haveRtsOptsFlags dflags = + isJust (rtsOpts dflags) || case rtsOptsEnabled dflags of + RtsOptsSafeOnly -> False + _ -> True ++ ++-- Note [-fPIC for assembler] ++-- When compiling .c source file GHC's driver pipeline basically ++-- does the following two things: ++-- 1. ${CC} -S 'PIC_CFLAGS' source.c ++-- 2. ${CC} -x assembler -c 'PIC_CFLAGS' source.S ++-- ++-- Why do we need to pass 'PIC_CFLAGS' both to C compiler and assembler? ++-- Because on some architectures (at least sparc32) assembler also choses ++-- relocation type! ++-- Consider the following C module: ++-- ++-- /* pic-sample.c */ ++-- int v; ++-- void set_v (int n) { v = n; } ++-- int get_v (void) { return v; } ++-- ++-- $ gcc -S -fPIC pic-sample.c ++-- $ gcc -c pic-sample.s -o pic-sample.no-pic.o # incorrect binary ++-- $ gcc -c -fPIC pic-sample.s -o pic-sample.pic.o # correct binary ++-- ++-- $ objdump -r -d pic-sample.pic.o > pic-sample.pic.o.od ++-- $ objdump -r -d pic-sample.no-pic.o > pic-sample.no-pic.o.od ++-- $ diff -u pic-sample.pic.o.od pic-sample.no-pic.o.od ++-- ++-- Most of architectures won't show any difference in this test, but on sparc32 ++-- the following assembly snippet: ++-- ++-- sethi %hi(_GLOBAL_OFFSET_TABLE_-8), %l7 ++-- ++-- generates two kinds or relocations, only 'R_SPARC_PC22' is correct: ++-- ++-- 3c: 2f 00 00 00 sethi %hi(0), %l7 ++-- - 3c: R_SPARC_PC22 _GLOBAL_OFFSET_TABLE_-0x8 ++-- + 3c: R_SPARC_HI22 _GLOBAL_OFFSET_TABLE_-0x8 diff --git a/dev-lang/ghc/files/ghc-7.8.3-pic-sparc.patch b/dev-lang/ghc/files/ghc-7.8.3-pic-sparc.patch new file mode 100644 index 000000000000..16a552fdd4be --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.8.3-pic-sparc.patch @@ -0,0 +1,31 @@ +commit 78863edbb0751f5c9694ea10c6132a87cfd0ee10 +Author: Sergei Trofimovich <slyfox@gentoo.org> +Date: Wed Aug 27 22:20:33 2014 +0300 + + Revert "disable shared libs on sparc (linux/solaris) (fixes #8857)" + + This reverts commit 623883f1ed0ee11cc925c4590fb09565403fd231. + + The commit a93ab43ab5f40cadbedea2f6342b93c245e91434 + driver: pass '-fPIC' option to assembler as well + fixes shared libraries on sparc at least on linux. + + Properly fixes Issue #8857 + + Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org> + +diff --git a/mk/config.mk.in b/mk/config.mk.in +index c210cd3..392237f 100644 +--- a/mk/config.mk.in ++++ b/mk/config.mk.in +@@ -97,9 +97,7 @@ endif + # Some platforms don't support shared libraries + NoSharedLibsPlatformList = powerpc-unknown-linux \ + x86_64-unknown-mingw32 \ +- i386-unknown-mingw32 \ +- sparc-sun-solaris2 \ +- sparc-unknown-linux ++ i386-unknown-mingw32 + + ifeq "$(SOLARIS_BROKEN_SHLD)" "YES" + NoSharedLibsPlatformList += i386-unknown-solaris2 diff --git a/dev-lang/ghc/files/ghc-7.8.3-ppc32-fPIC.patch b/dev-lang/ghc/files/ghc-7.8.3-ppc32-fPIC.patch new file mode 100644 index 000000000000..434be8b1bdad --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.8.3-ppc32-fPIC.patch @@ -0,0 +1,351 @@ +commit fa31e8f4a0f853848d96549a429083941877bf8d +Author: Sergei Trofimovich <siarheit@google.com> +Date: Sun Dec 14 14:30:12 2014 +0000 + + powerpc: fix and enable shared libraries by default on linux + + Summary: + And fix things all the way down to it. Namely: + - remove 'r30' from free registers, it's an .LCTOC1 register + for gcc. generated .plt stubs expect it to be initialised. + - fix PicBase computation, which originally forgot to use 'tmp' + reg in 'initializePicBase_ppc.fetchPC' + - mark 'ForeighTarget's as implicitly using 'PicBase' register + (see comment for details) + - add 64-bit MO_Sub and test on alloclimit3/4 regtests + - fix dynamic label offsets to match with .LCTOC1 offset + + Signed-off-by: Sergei Trofimovich <siarheit@google.com> + + Test Plan: validate passes equal amount of vanilla/dyn tests + + Reviewers: simonmar, erikd, austin + + Reviewed By: erikd, austin + + Subscribers: carter, thomie + + Differential Revision: https://phabricator.haskell.org/D560 + + GHC Trac Issues: #8024, #9831 + +diff --git a/compiler/cmm/CLabel.hs b/compiler/cmm/CLabel.hs +index 0f2c0ae..37b8ada 100644 +--- a/compiler/cmm/CLabel.hs ++++ b/compiler/cmm/CLabel.hs +@@ -1170,7 +1170,8 @@ pprDynamicLinkerAsmLabel platform dllInfo lbl + else if osElfTarget (platformOS platform) + then if platformArch platform == ArchPPC + then case dllInfo of +- CodeStub -> ppr lbl <> text "@plt" ++ CodeStub -> -- See Note [.LCTOC1 in PPC PIC code] ++ ppr lbl <> text "+32768@plt" + SymbolPtr -> text ".LC_" <> ppr lbl + _ -> panic "pprDynamicLinkerAsmLabel" + else if platformArch platform == ArchX86_64 +diff --git a/compiler/nativeGen/PIC.hs b/compiler/nativeGen/PIC.hs +index 9b5c080..6326a8b 100644 +--- a/compiler/nativeGen/PIC.hs ++++ b/compiler/nativeGen/PIC.hs +@@ -54,7 +54,6 @@ import qualified X86.Instr as X86 + + import Platform + import Instruction +-import Size + import Reg + import NCGMonad + +@@ -468,11 +467,8 @@ pprGotDeclaration dflags ArchX86 OSDarwin + pprGotDeclaration _ _ OSDarwin + = empty + +--- pprGotDeclaration ++-- Emit GOT declaration + -- Output whatever needs to be output once per .s file. +--- The .LCTOC1 label is defined to point 32768 bytes into the table, +--- to make the most of the PPC's 16-bit displacements. +--- Only needed for PIC. + pprGotDeclaration dflags arch os + | osElfTarget os + , arch /= ArchPPC_64 +@@ -482,6 +478,7 @@ pprGotDeclaration dflags arch os + | osElfTarget os + , arch /= ArchPPC_64 + = vcat [ ++ -- See Note [.LCTOC1 in PPC PIC code] + ptext (sLit ".section \".got2\",\"aw\""), + ptext (sLit ".LCTOC1 = .+32768") ] + +@@ -688,12 +685,7 @@ pprImportedSymbol _ _ _ + + + -- Get a pointer to our own fake GOT, which is defined on a per-module basis. +--- This is exactly how GCC does it, and it's quite horrible: +--- We first fetch the address of a local label (mkPicBaseLabel). +--- Then we add a 16-bit offset to that to get the address of a .long that we +--- define in .text space right next to the proc. This .long literal contains +--- the (32-bit) offset from our local label to our global offset table +--- (.LCTOC1 aka gotOffLabel). ++-- This is exactly how GCC does it in linux. + + initializePicBase_ppc + :: Arch -> OS -> Reg +@@ -704,18 +696,9 @@ initializePicBase_ppc ArchPPC os picReg + (CmmProc info lab live (ListGraph blocks) : statics) + | osElfTarget os + = do +- dflags <- getDynFlags +- gotOffLabel <- getNewLabelNat +- tmp <- getNewRegNat $ intSize (wordWidth dflags) + let +- gotOffset = CmmData Text $ Statics gotOffLabel [ +- CmmStaticLit (CmmLabelDiffOff gotLabel +- mkPicBaseLabel +- 0) +- ] +- offsetToOffset +- = PPC.ImmConstantDiff +- (PPC.ImmCLbl gotOffLabel) ++ gotOffset = PPC.ImmConstantDiff ++ (PPC.ImmCLbl gotLabel) + (PPC.ImmCLbl mkPicBaseLabel) + + blocks' = case blocks of +@@ -726,15 +709,23 @@ initializePicBase_ppc ArchPPC os picReg + | bID `mapMember` info = fetchPC b + | otherwise = b + ++ -- GCC does PIC prologs thusly: ++ -- bcl 20,31,.L1 ++ -- .L1: ++ -- mflr 30 ++ -- addis 30,30,.LCTOC1-.L1@ha ++ -- addi 30,30,.LCTOC1-.L1@l ++ -- TODO: below we use it over temporary register, ++ -- it can and should be optimised by picking ++ -- correct PIC reg. + fetchPC (BasicBlock bID insns) = + BasicBlock bID (PPC.FETCHPC picReg +- : PPC.ADDIS tmp picReg (PPC.HI offsetToOffset) +- : PPC.LD PPC.archWordSize tmp +- (PPC.AddrRegImm tmp (PPC.LO offsetToOffset)) +- : PPC.ADD picReg picReg (PPC.RIReg picReg) ++ : PPC.ADDIS picReg picReg (PPC.HA gotOffset) ++ : PPC.ADDI picReg picReg (PPC.LO gotOffset) ++ : PPC.MR PPC.r30 picReg + : insns) + +- return (CmmProc info lab live (ListGraph blocks') : gotOffset : statics) ++ return (CmmProc info lab live (ListGraph blocks') : statics) + + + initializePicBase_ppc ArchPPC OSDarwin picReg +diff --git a/compiler/nativeGen/PPC/CodeGen.hs b/compiler/nativeGen/PPC/CodeGen.hs +index ddf483a..c1c4a74 100644 +--- a/compiler/nativeGen/PPC/CodeGen.hs ++++ b/compiler/nativeGen/PPC/CodeGen.hs +@@ -54,7 +54,7 @@ import Outputable + import Unique + import DynFlags + +-import Control.Monad ( mapAndUnzipM ) ++import Control.Monad ( mapAndUnzipM, when ) + import Data.Bits + import Data.Word + +@@ -355,6 +355,19 @@ iselExpr64 (CmmMachOp (MO_Add _) [e1,e2]) = do + ADDE rhi r1hi r2hi ] + return (ChildCode64 code rlo) + ++iselExpr64 (CmmMachOp (MO_Sub _) [e1,e2]) = do ++ ChildCode64 code1 r1lo <- iselExpr64 e1 ++ ChildCode64 code2 r2lo <- iselExpr64 e2 ++ (rlo,rhi) <- getNewRegPairNat II32 ++ let ++ r1hi = getHiVRegFromLo r1lo ++ r2hi = getHiVRegFromLo r2lo ++ code = code1 `appOL` ++ code2 `appOL` ++ toOL [ SUBFC rlo r2lo r1lo, ++ SUBFE rhi r2hi r1hi ] ++ return (ChildCode64 code rlo) ++ + iselExpr64 (CmmMachOp (MO_UU_Conv W32 W64) [expr]) = do + (expr_reg,expr_code) <- getSomeReg expr + (rlo, rhi) <- getNewRegPairNat II32 +@@ -918,8 +931,12 @@ genCCall' dflags gcp target dest_regs args0 + (toOL []) [] + + (labelOrExpr, reduceToFF32) <- case target of +- ForeignTarget (CmmLit (CmmLabel lbl)) _ -> return (Left lbl, False) +- ForeignTarget expr _ -> return (Right expr, False) ++ ForeignTarget (CmmLit (CmmLabel lbl)) _ -> do ++ uses_pic_base_implicitly ++ return (Left lbl, False) ++ ForeignTarget expr _ -> do ++ uses_pic_base_implicitly ++ return (Right expr, False) + PrimTarget mop -> outOfLineMachOp mop + + let codeBefore = move_sp_down finalStack `appOL` passArgumentsCode +@@ -940,6 +957,13 @@ genCCall' dflags gcp target dest_regs args0 + where + platform = targetPlatform dflags + ++ uses_pic_base_implicitly = do ++ -- See Note [implicit register in PPC PIC code] ++ -- on why we claim to use PIC register here ++ when (gopt Opt_PIC dflags) $ do ++ _ <- getPicBaseNat archWordSize ++ return () ++ + initialStackOffset = case gcp of + GCPDarwin -> 24 + GCPLinux -> 8 +@@ -1431,3 +1455,21 @@ coerceFP2Int _ toRep x = do + -- read low word of value (high word is undefined) + LD II32 dst (spRel dflags 3)] + return (Any (intSize toRep) code') ++ ++-- Note [.LCTOC1 in PPC PIC code] ++-- The .LCTOC1 label is defined to point 32768 bytes into the GOT table ++-- to make the most of the PPC's 16-bit displacements. ++-- As 16-bit signed offset is used (usually via addi/lwz instructions) ++-- first element will have '-32768' offset against .LCTOC1. ++ ++-- Note [implicit register in PPC PIC code] ++-- PPC generates calls by labels in assembly ++-- in form of: ++-- bl puts+32768@plt ++-- in this form it's not seen directly (by GHC NCG) ++-- that r30 (PicBaseReg) is used, ++-- but r30 is a required part of PLT code setup: ++-- puts+32768@plt: ++-- lwz r11,-30484(r30) ; offset in .LCTOC1 ++-- mtctr r11 ++-- bctr +diff --git a/compiler/nativeGen/PPC/Instr.hs b/compiler/nativeGen/PPC/Instr.hs +index f5b9506..b7081f9 100644 +--- a/compiler/nativeGen/PPC/Instr.hs ++++ b/compiler/nativeGen/PPC/Instr.hs +@@ -205,8 +205,11 @@ data Instr + | ADD Reg Reg RI -- dst, src1, src2 + | ADDC Reg Reg Reg -- (carrying) dst, src1, src2 + | ADDE Reg Reg Reg -- (extend) dst, src1, src2 ++ | ADDI Reg Reg Imm -- Add Immediate dst, src1, src2 + | ADDIS Reg Reg Imm -- Add Immediate Shifted dst, src1, src2 + | SUBF Reg Reg Reg -- dst, src1, src2 ; dst = src2 - src1 ++ | SUBFC Reg Reg Reg -- (carrying) dst, src1, src2 ; dst = src2 - src1 ++ | SUBFE Reg Reg Reg -- (extend) dst, src1, src2 ; dst = src2 - src1 + | MULLW Reg Reg RI + | DIVW Reg Reg Reg + | DIVWU Reg Reg Reg +@@ -284,8 +287,11 @@ ppc_regUsageOfInstr platform instr + ADD reg1 reg2 ri -> usage (reg2 : regRI ri, [reg1]) + ADDC reg1 reg2 reg3 -> usage ([reg2,reg3], [reg1]) + ADDE reg1 reg2 reg3 -> usage ([reg2,reg3], [reg1]) ++ ADDI reg1 reg2 _ -> usage ([reg2], [reg1]) + ADDIS reg1 reg2 _ -> usage ([reg2], [reg1]) + SUBF reg1 reg2 reg3 -> usage ([reg2,reg3], [reg1]) ++ SUBFC reg1 reg2 reg3 -> usage ([reg2,reg3], [reg1]) ++ SUBFE reg1 reg2 reg3 -> usage ([reg2,reg3], [reg1]) + MULLW reg1 reg2 ri -> usage (reg2 : regRI ri, [reg1]) + DIVW reg1 reg2 reg3 -> usage ([reg2,reg3], [reg1]) + DIVWU reg1 reg2 reg3 -> usage ([reg2,reg3], [reg1]) +@@ -358,8 +364,11 @@ ppc_patchRegsOfInstr instr env + ADD reg1 reg2 ri -> ADD (env reg1) (env reg2) (fixRI ri) + ADDC reg1 reg2 reg3 -> ADDC (env reg1) (env reg2) (env reg3) + ADDE reg1 reg2 reg3 -> ADDE (env reg1) (env reg2) (env reg3) ++ ADDI reg1 reg2 imm -> ADDI (env reg1) (env reg2) imm + ADDIS reg1 reg2 imm -> ADDIS (env reg1) (env reg2) imm + SUBF reg1 reg2 reg3 -> SUBF (env reg1) (env reg2) (env reg3) ++ SUBFC reg1 reg2 reg3 -> SUBFC (env reg1) (env reg2) (env reg3) ++ SUBFE reg1 reg2 reg3 -> SUBFE (env reg1) (env reg2) (env reg3) + MULLW reg1 reg2 ri -> MULLW (env reg1) (env reg2) (fixRI ri) + DIVW reg1 reg2 reg3 -> DIVW (env reg1) (env reg2) (env reg3) + DIVWU reg1 reg2 reg3 -> DIVWU (env reg1) (env reg2) (env reg3) +diff --git a/compiler/nativeGen/PPC/Ppr.hs b/compiler/nativeGen/PPC/Ppr.hs +index 6851769..f59d51f 100644 +--- a/compiler/nativeGen/PPC/Ppr.hs ++++ b/compiler/nativeGen/PPC/Ppr.hs +@@ -525,6 +525,16 @@ pprInstr (BCTRL _) = hcat [ + ptext (sLit "bctrl") + ] + pprInstr (ADD reg1 reg2 ri) = pprLogic (sLit "add") reg1 reg2 ri ++pprInstr (ADDI reg1 reg2 imm) = hcat [ ++ char '\t', ++ ptext (sLit "addi"), ++ char '\t', ++ pprReg reg1, ++ ptext (sLit ", "), ++ pprReg reg2, ++ ptext (sLit ", "), ++ pprImm imm ++ ] + pprInstr (ADDIS reg1 reg2 imm) = hcat [ + char '\t', + ptext (sLit "addis"), +@@ -539,6 +549,8 @@ pprInstr (ADDIS reg1 reg2 imm) = hcat [ + pprInstr (ADDC reg1 reg2 reg3) = pprLogic (sLit "addc") reg1 reg2 (RIReg reg3) + pprInstr (ADDE reg1 reg2 reg3) = pprLogic (sLit "adde") reg1 reg2 (RIReg reg3) + pprInstr (SUBF reg1 reg2 reg3) = pprLogic (sLit "subf") reg1 reg2 (RIReg reg3) ++pprInstr (SUBFC reg1 reg2 reg3) = pprLogic (sLit "subfc") reg1 reg2 (RIReg reg3) ++pprInstr (SUBFE reg1 reg2 reg3) = pprLogic (sLit "subfe") reg1 reg2 (RIReg reg3) + pprInstr (MULLW reg1 reg2 ri@(RIReg _)) = pprLogic (sLit "mullw") reg1 reg2 ri + pprInstr (MULLW reg1 reg2 ri@(RIImm _)) = pprLogic (sLit "mull") reg1 reg2 ri + pprInstr (DIVW reg1 reg2 reg3) = pprLogic (sLit "divw") reg1 reg2 (RIReg reg3) +diff --git a/compiler/nativeGen/PPC/Regs.hs b/compiler/nativeGen/PPC/Regs.hs +index 0f636bf..69e69c0 100644 +--- a/compiler/nativeGen/PPC/Regs.hs ++++ b/compiler/nativeGen/PPC/Regs.hs +@@ -37,7 +37,8 @@ module PPC.Regs ( + fits16Bits, + makeImmediate, + fReg, +- sp, r3, r4, r27, r28, f1, f20, f21, ++ sp, r3, r4, r27, r28, r30, ++ f1, f20, f21, + + allocatableRegs + +@@ -295,12 +296,13 @@ point registers. + fReg :: Int -> RegNo + fReg x = (32 + x) + +-sp, r3, r4, r27, r28, f1, f20, f21 :: Reg ++sp, r3, r4, r27, r28, r30, f1, f20, f21 :: Reg + sp = regSingle 1 + r3 = regSingle 3 + r4 = regSingle 4 + r27 = regSingle 27 + r28 = regSingle 28 ++r30 = regSingle 30 + f1 = regSingle $ fReg 1 + f20 = regSingle $ fReg 20 + f21 = regSingle $ fReg 21 +diff --git a/includes/CodeGen.Platform.hs b/includes/CodeGen.Platform.hs +index 9916e0e..1d46a01 100644 +--- a/includes/CodeGen.Platform.hs ++++ b/includes/CodeGen.Platform.hs +@@ -881,6 +881,8 @@ freeReg 1 = fastBool False -- The Stack Pointer + # if !MACHREGS_darwin + -- most non-darwin powerpc OSes use r2 as a TOC pointer or something like that + freeReg 2 = fastBool False ++-- at least linux in -fPIC relies on r30 in PLT stubs ++freeReg 30 = fastBool False + # endif + # ifdef REG_Base + freeReg REG_Base = fastBool False +diff --git a/mk/config.mk.in b/mk/config.mk.in +index 0f5820f..8f134bc 100644 +--- a/mk/config.mk.in ++++ b/mk/config.mk.in +@@ -95,7 +95,7 @@ TargetElf = YES + endif + + # Some platforms don't support shared libraries +-NoSharedLibsPlatformList = powerpc-unknown-linux \ ++NoSharedLibsPlatformList = \ + x86_64-unknown-mingw32 \ + i386-unknown-mingw32 + diff --git a/dev-lang/ghc/files/ghc-7.8.3-prim-lm.patch b/dev-lang/ghc/files/ghc-7.8.3-prim-lm.patch new file mode 100644 index 000000000000..3ef2313fcec1 --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.8.3-prim-lm.patch @@ -0,0 +1,12 @@ +Fix underlinking on ghc-prim. +Fixes ghc-stage2 crahs on hardened toolchain. +Reported-by: aranea +diff --git a/libraries/ghc-prim/ghc-prim.cabal b/libraries/ghc-prim/ghc-prim.cabal +index ffb32af..0431380 100644 +--- a/libraries/ghc-prim/ghc-prim.cabal ++++ b/libraries/ghc-prim/ghc-prim.cabal +@@ -68,0 +68,4 @@ Library ++ ++ -- ghc 'sin' (and other) primops generate 'libm' calls, ++ -- but ghc itself does not add '-lm' ++ extra-libraries: m diff --git a/dev-lang/ghc/files/ghc-7.8.3-unreg-lit.patch b/dev-lang/ghc/files/ghc-7.8.3-unreg-lit.patch new file mode 100644 index 000000000000..632696d6fde7 --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.8.3-unreg-lit.patch @@ -0,0 +1,84 @@ +commit a6ea05e21e175407dc9e45f18c56c1d727fd0f26 +Author: Sergei Trofimovich <slyfox@gentoo.org> +Date: Fri Aug 22 23:24:32 2014 +0300 + + UNREG: fix emission of large Integer literals in C codegen + + Summary: + On amd64/UNREG build there is many failing tests trying + to deal with 'Integer' types. + + Looking at 'overflow1' test I've observed invalid C code generated by + GHC. + + Cmm code + CInt a = -1; (a == -1) + yields 'False' with optimisations enabled via the following C code: + StgWord64 a = (StgWord32)0xFFFFffffFFFFffffu; (a == 0xFFFFffffFFFFffffu) + + The patch fixes it by shrinking emitted literals to required sizes: + StgWord64 a = (StgWord32)0xFFFFffffu; (a == 0xFFFFffffu) + + Thanks to Reid Barton for tracking down and fixing the issue. + + Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org> + + Test Plan: validate on UNREG build (amd64) + + Reviewers: simonmar, rwbarton, austin + + Subscribers: simonmar, ezyang, carter + + Differential Revision: https://phabricator.haskell.org/D173 + +diff --git a/compiler/cmm/PprC.hs b/compiler/cmm/PprC.hs +index 93a5d06..8605988 100644 +--- a/compiler/cmm/PprC.hs ++++ b/compiler/cmm/PprC.hs +@@ -1221,8 +1221,9 @@ commafy xs = hsep $ punctuate comma xs + pprHexVal :: Integer -> Width -> SDoc + pprHexVal 0 _ = ptext (sLit "0x0") + pprHexVal w rep +- | w < 0 = parens (char '-' <> ptext (sLit "0x") <> go (-w) <> repsuffix rep) +- | otherwise = ptext (sLit "0x") <> go w <> repsuffix rep ++ | w < 0 = parens (char '-' <> ++ ptext (sLit "0x") <> intToDoc (-w) <> repsuffix rep) ++ | otherwise = ptext (sLit "0x") <> intToDoc w <> repsuffix rep + where + -- type suffix for literals: + -- Integer literals are unsigned in Cmm/C. We explicitly cast to +@@ -1237,10 +1238,33 @@ pprHexVal w rep + else panic "pprHexVal: Can't find a 64-bit type" + repsuffix _ = char 'U' + ++ intToDoc :: Integer -> SDoc ++ intToDoc i = go (truncInt i) ++ ++ -- We need to truncate value as Cmm backend does not drop ++ -- redundant bits to ease handling of negative values. ++ -- Thus the following Cmm code on 64-bit arch, like amd64: ++ -- CInt v; ++ -- v = {something}; ++ -- if (v == %lobits32(-1)) { ... ++ -- leads to the following C code: ++ -- StgWord64 v = (StgWord32)({something}); ++ -- if (v == 0xFFFFffffFFFFffffU) { ... ++ -- Such code is incorrect as it promotes both operands to StgWord64 ++ -- and the whole condition is always false. ++ truncInt :: Integer -> Integer ++ truncInt i = ++ case rep of ++ W8 -> i `rem` (2^(8 :: Int)) ++ W16 -> i `rem` (2^(16 :: Int)) ++ W32 -> i `rem` (2^(32 :: Int)) ++ W64 -> i `rem` (2^(64 :: Int)) ++ _ -> panic ("pprHexVal/truncInt: C backend can't encode " ++ ++ show rep ++ " literals") ++ + go 0 = empty + go w' = go q <> dig + where + (q,r) = w' `quotRem` 16 + dig | r < 10 = char (chr (fromInteger r + ord '0')) + | otherwise = char (chr (fromInteger r - 10 + ord 'a')) +- diff --git a/dev-lang/ghc/files/ghc-7.8.4-gold.patch b/dev-lang/ghc/files/ghc-7.8.4-gold.patch new file mode 100644 index 000000000000..a8e9b1e6c857 --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.8.4-gold.patch @@ -0,0 +1,27 @@ +Gentoo-bug: https://bugs.gentoo.org/536426 +Reported-by: Eric Siegel +commit 021b7978d14799bae779907faf7490cfd21b3f46 +Author: Austin Seipp <austin@well-typed.com> +Date: Sun Jul 20 10:13:15 2014 -0500 + + driver: use absolute paths in ld scripts (#7452) + + Patch contributed by slowmo. + + Signed-off-by: Austin Seipp <austin@well-typed.com> + +diff --git a/compiler/main/DriverPipeline.hs b/compiler/main/DriverPipeline.hs +index 11427e2..49126fe 100644 +--- a/compiler/main/DriverPipeline.hs ++++ b/compiler/main/DriverPipeline.hs +@@ -2166,7 +2166,9 @@ joinObjectFiles dflags o_files output_fn = do + if ldIsGnuLd + then do + script <- newTempName dflags "ldscript" +- writeFile script $ "INPUT(" ++ unwords o_files ++ ")" ++ cwd <- getCurrentDirectory ++ let o_files_abs = map (cwd </>) o_files ++ writeFile script $ "INPUT(" ++ unwords o_files_abs ++ ")" + ld_r [SysTools.FileOption "" script] ccInfo + else if sLdSupportsFilelist mySettings + then do diff --git a/dev-lang/ghc/files/ghc-7.8.4-ia64-CLOSUREs.patch b/dev-lang/ghc/files/ghc-7.8.4-ia64-CLOSUREs.patch new file mode 100644 index 000000000000..9d50792bcf45 --- /dev/null +++ b/dev-lang/ghc/files/ghc-7.8.4-ia64-CLOSUREs.patch @@ -0,0 +1,66 @@ +From b677ba51cf8131a6f6ddcdfee8dd2a8c4c2b4ac7 Mon Sep 17 00:00:00 2001 +From: Sergei Trofimovich <siarheit@google.com> +Date: Sat, 17 Jan 2015 14:27:13 +0000 +Subject: [PATCH 1/3] CMM: add a mechanism to import C data labels + +Fixes threaded runtime on ia64. +sm_mutex there was not referenced correctly. + +Signed-off-by: Sergei Trofimovich <siarheit@google.com> +--- + compiler/cmm/CmmParse.y | 4 ++++ + rts/Exception.cmm | 2 +- + rts/PrimOps.cmm | 6 +++--- + 3 files changed, 8 insertions(+), 4 deletions(-) + +diff --git a/compiler/cmm/CmmParse.y.source b/compiler/cmm/CmmParse.y.source +index 6b51e51..fd9489b 100644 +--- a/compiler/cmm/CmmParse.y.source ++++ b/compiler/cmm/CmmParse.y.source +@@ -575,6 +575,10 @@ importName + : NAME + { ($1, mkForeignLabel $1 Nothing ForeignLabelInExternalPackage IsFunction) } + ++ -- as previous 'NAME', but 'IsData' ++ | 'CLOSURE' NAME ++ { ($2, mkForeignLabel $2 Nothing ForeignLabelInExternalPackage IsData) } ++ + -- A label imported with an explicit packageId. + | STRING NAME + { ($2, mkCmmCodeLabel (fsToPackageKey (mkFastString $1)) $2) } +diff --git a/rts/Exception.cmm b/rts/Exception.cmm +index 5007ef3..8d19c14 100644 +--- a/rts/Exception.cmm ++++ b/rts/Exception.cmm +@@ -13,7 +13,7 @@ + #include "Cmm.h" + #include "RaiseAsync.h" + +-import ghczmprim_GHCziTypes_True_closure; ++import CLOSURE ghczmprim_GHCziTypes_True_closure; + + /* ----------------------------------------------------------------------------- + Exception Primitives +diff --git a/rts/PrimOps.cmm b/rts/PrimOps.cmm +index 3e8612c..2e6ca46 100644 +--- a/rts/PrimOps.cmm ++++ b/rts/PrimOps.cmm +@@ -28,12 +28,12 @@ + import pthread_mutex_lock; + import pthread_mutex_unlock; + #endif +-import base_ControlziExceptionziBase_nestedAtomically_closure; ++import CLOSURE base_ControlziExceptionziBase_nestedAtomically_closure; + import EnterCriticalSection; + import LeaveCriticalSection; +-import ghczmprim_GHCziTypes_False_closure; ++import CLOSURE ghczmprim_GHCziTypes_False_closure; + #if defined(USE_MINIINTERPRETER) || !defined(mingw32_HOST_OS) +-import sm_mutex; ++import CLOSURE sm_mutex; + #endif + + /*----------------------------------------------------------------------------- +-- +2.2.1 + diff --git a/dev-lang/ghc/files/ghc-bash-completion b/dev-lang/ghc/files/ghc-bash-completion new file mode 100644 index 000000000000..0ee2149cd81b --- /dev/null +++ b/dev-lang/ghc/files/ghc-bash-completion @@ -0,0 +1,218 @@ +# ghc-pkg command line completion for bash +# +# Copyright 2006-2007 Lennart Kolmodin <kolmodin@dtek.chalmers.se> + +_ghc-pkg-get-ghc-pkg() +{ + echo ghc-pkg +} + +_ghc-pkg-pkg-fields() +{ + # usage: _ghc-pkg-pkg-fields pkg-id + # + # list all fields of the pkg-id + + # same fields for all packages but different in different versions of + # ghc-pkg? this can probably be done better/faster + + if [[ -z "$1" ]]; then + echo "usage: _ghc-pkg-pkg-fields pkg-id" + return 1 + fi + + local fields + + fields="$( $(_ghc-pkg-get-ghc-pkg) describe $1 )" + + #if [[ fields != *"cannot find package"* ]]; then + echo "$fields" | grep ".*:.*" | sed "s/^\(.*\):.*\$/\1/" + #fi +} + +_ghc-pkg-pkg-ids() +{ + # usage: _ghc-pkg-pkg-ids + # + # simply lists all package ids known by ghc-pkg. + $(_ghc-pkg-get-ghc-pkg) list --simple-output +} + +_ghc-pkg-pkgs() +{ + # usage: _ghc-pkg-pkgs [include-pkgs] [include-ids] + # + # with optional parameter include-pkgs it will list all packages known + # to ghc-pkg. + # with optional parameter include-ids it will list all package-ids known + # to ghc-pkg. + local pkgs + local result + pkgs=( $( _ghc-pkg-pkg-ids ) ) + result=( ) + + local withPkgs="no" withIds="no" + while [[ -n "$1" ]]; do + case "$1" in + include-pkgs) + withPkgs="yes" ;; + include-ids) + withIds="yes" ;; + *) + echo "unknown parameter '$1' to _ghc-pkg-pkgs" + return 1 ;; + esac + shift + done + + # user must supply either include-pkgs, include-ids or both + if [[ $withPkgs != "yes" && $withIds != "yes" ]]; then + echo "usage: _ghc-pkg-pkgs [include-pkgs] [include-ids]" + return 1 + fi + + # find all packages if the user requested them + if [[ $withPkgs == "yes" ]]; then + # O(n^2) algorithm to exclude duplicates + for p in ${pkgs[*]}; do + p="${p//-[0-9.]*/}" + for existing in ${result[*]}; do + if [[ "$existing" == "$p" ]]; then + continue 2 + fi + done + result=( "${result[@]}" "${p}" ) + done + fi + + # include all pkg-ids if requested + if [[ $withIds == "yes" ]]; then + result=( "${result[@]}" "${pkgs[@]}" ) + fi + + # we are finished, echo the result + echo "${result[*]}" + + # happy ending + return 0 +} + +_ghc-pkg() +{ + local cur + cur=${COMP_WORDS[COMP_CWORD]} + + COMPREPLY=() + + local actions flags + actions='register update unregister expose hide list latest describe field' + dbflags="--user \ + --global \ + -f --package-conf= \ + --global-conf=" + registerflags="--force \ + -g --auto-ghci-libs \ + -D --define-name=" + listflags="--simple-output" + flags="$dbflags \ + $registerflags \ + $listflags \ + -? --help \ + -V --version" + + # if it's the users first word; complete it and return + if (($COMP_CWORD == 1)); then + COMPREPLY=( $( compgen -W "$actions $flags" -- $cur ) ) + return 0 + fi + + # now we know we have at least one word written + + local action="unknown" \ + prev numwords \ + cword act + prev=${COMP_WORDS[COMP_CWORD-1]} + numwords=${#COMP_WORDS[@]} + + # find the action with O(n*m) algorithm + # where n = ${#COMP_WORDS[*]} + # m = number of actions + for cword in ${COMP_WORDS[*]}; do + for act in $actions; do + if [[ "$cword" == "$act" ]]; then + action=$cword + fi + done + done + + case $action in + register|update) + # we want to complete both flags and paths, how? + # we do it by checking if the user has started to write a flag + # or a path, and then decide what to complete. + # that is, to complete a flag, the user must start to write a '-' + if [[ "$cur" == -* ]]; then + # (we assume) it's the start of a flag + # set COMPREPLY to flags relevant to these actions + COMPREPLY=( $( compgen -W "$dbflags $registerflags" -- $cur ) ) + fi + ;; + unregister|expose|hide|list|describe) + # all these actions can be completed with exactly one argument, + # a pkg-id. + COMPREPLY=( $( compgen -W "$dbflags" -- $cur ) ) + + # add special flags for some actions + if [[ "$action" == "list" ]]; then + COMPREPLY+=( $( compgen -W "$listflags" -- $cur ) ) + fi + + COMPREPLY+=( $( compgen -W "$( _ghc-pkg-pkgs include-ids )" -- $cur ) ) + ;; + latest) + # complete only packages, not package ids + COMPREPLY=( $( compgen -W "$( _ghc-pkg-pkgs include-pkgs )" -- $cur ) ) + ;; + field) + # we should always complete on the flags... + COMPREPLY=( $( compgen -W "$dbflags" -- $cur ) ) + + # then, we should either complete the package name or the field + # lets find out which one + + # find the number of words in COMP_WORDS before COMP_CWORD that + # isn't flags. it should be 2 or 3 for us to complete it, + # exactly 2 if we should complete the package name + # exactly 3 if we should complete the field name + # otherwise, don't do any additional completion except the + # flags + + # count the number of non flags up till the current word + local numnonflags=0 lastword i + for (( i=0 ; $i < $COMP_CWORD ; i++ )); do + if [[ ${COMP_WORDS[$i]} != -* ]]; then + lastword=${COMP_WORDS[$i]} + numnonflags=$(( ++numnonflags )) + fi + done + + case $numnonflags in + 2) + # complete on pkg-ids + COMPREPLY+=( $( compgen -W "$( _ghc-pkg-pkgs include-ids )" -- $cur ) ) ;; + 3) + # complete on fields + COMPREPLY+=( $( compgen -W "$( _ghc-pkg-pkg-fields $lastword )" -- $cur ) ) ;; + esac + ;; + *) + # unknown action, not yet given by the user + # return all possible completions + COMPREPLY=( $( compgen -W "$actions $flags" -- $cur ) ) + ;; + esac +} + +complete -F _ghc-pkg -o default ghc-pkg + +# vim: set ft=sh tw=80 sw=4 et : diff --git a/dev-lang/ghc/files/terminfo-0.3.2.5-tinfo.patch b/dev-lang/ghc/files/terminfo-0.3.2.5-tinfo.patch new file mode 100644 index 000000000000..ca10da2e03ae --- /dev/null +++ b/dev-lang/ghc/files/terminfo-0.3.2.5-tinfo.patch @@ -0,0 +1,25 @@ +http://bugs.gentoo.org/454216 + +Mon Jan 7 16:34:47 FET 2013 Judah Jacobson <judah.jacobson@gmail.com> + * Search for terminfo in libtinfo; fixes GHC #7281. + + Patch from Paul Johnson. +diff -rN -u old-terminfo/configure.ac new-terminfo/configure.ac +--- old-terminfo/configure.ac 2013-02-14 00:16:11.816111434 +0300 ++++ new-terminfo/configure.ac 2013-02-14 00:16:11.819111434 +0300 +@@ -39,10 +39,11 @@ + TERMINFO_INCLUDES="$CursesIncludes term.h" + fi + +-AC_CHECK_LIB(ncursesw, setupterm, HaveLibCurses=YES; LibCurses=ncursesw, +- [AC_CHECK_LIB(ncurses, setupterm, HaveLibCurses=YES; LibCurses=ncurses, +- [AC_CHECK_LIB(curses, setupterm, HaveLibCurses=YES; LibCurses=curses, +- HaveLibCurses=NO; LibCurses=not-installed)])]) ++AC_CHECK_LIB(tinfo, setupterm, HaveLibCurses=YES; LibCurses=tinfo, ++ [AC_CHECK_LIB(ncursesw, setupterm, HaveLibCurses=YES; LibCurses=ncursesw, ++ [AC_CHECK_LIB(ncurses, setupterm, HaveLibCurses=YES; LibCurses=ncurses, ++ [AC_CHECK_LIB(curses, setupterm, HaveLibCurses=YES; LibCurses=curses, ++ HaveLibCurses=NO; LibCurses=not-installed)])])]) + + if test "x$HaveLibCurses" = "xNO" ; then + AC_MSG_FAILURE([curses library not found, so this package cannot be built]) diff --git a/dev-lang/ghc/ghc-7.10.2.ebuild b/dev-lang/ghc/ghc-7.10.2.ebuild new file mode 100644 index 000000000000..9aab30fd6f2d --- /dev/null +++ b/dev-lang/ghc/ghc-7.10.2.ebuild @@ -0,0 +1,643 @@ +# Copyright 1999-2015 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id$ + +EAPI=5 + +# to make make a crosscompiler use crossdev and symlink ghc tree into +# cross overlay. result would look like 'cross-sparc-unknown-linux-gnu/ghc' +# +# 'CTARGET' definition and 'is_crosscompile' are taken from 'toolchain.eclass' +export CTARGET=${CTARGET:-${CHOST}} +if [[ ${CTARGET} = ${CHOST} ]] ; then + if [[ ${CATEGORY/cross-} != ${CATEGORY} ]] ; then + export CTARGET=${CATEGORY/cross-} + fi +fi + +inherit autotools bash-completion-r1 eutils flag-o-matic ghc-package +inherit multilib pax-utils toolchain-funcs versionator + +DESCRIPTION="The Glasgow Haskell Compiler" +HOMEPAGE="http://www.haskell.org/ghc/" + +# we don't have any binaries yet +arch_binaries="" + +# sorted! +#arch_binaries="$arch_binaries alpha? ( http://code.haskell.org/~slyfox/ghc-alpha/ghc-bin-${PV}-alpha.tbz2 )" +#arch_binaries="$arch_binaries arm? ( http://code.haskell.org/~slyfox/ghc-arm/ghc-bin-${PV}-arm.tbz2 )" +arch_binaries="$arch_binaries amd64? ( http://code.haskell.org/~slyfox/ghc-amd64/ghc-bin-${PV}-amd64.tbz2 )" +#arch_binaries="$arch_binaries ia64? ( http://code.haskell.org/~slyfox/ghc-ia64/ghc-bin-${PV}-ia64-fixed-fiw.tbz2 )" +#arch_binaries="$arch_binaries ppc? ( http://code.haskell.org/~slyfox/ghc-ppc/ghc-bin-${PV}-ppc.tbz2 )" +#arch_binaries="$arch_binaries ppc64? ( http://code.haskell.org/~slyfox/ghc-ppc64/ghc-bin-${PV}-ppc64.tbz2 )" +#arch_binaries="$arch_binaries sparc? ( http://code.haskell.org/~slyfox/ghc-sparc/ghc-bin-${PV}-sparc.tbz2 )" +arch_binaries="$arch_binaries x86? ( http://code.haskell.org/~slyfox/ghc-x86/ghc-bin-${PV}-x86.tbz2 )" + +# various ports: +#arch_binaries="$arch_binaries x86-fbsd? ( http://code.haskell.org/~slyfox/ghc-x86-fbsd/ghc-bin-${PV}-x86-fbsd.tbz2 )" + +# 0 - yet +yet_binary() { + case "${ARCH}" in + #alpha) return 0 ;; + #arm) + # ewarn "ARM binary is built on armv5tel-eabi toolchain. Use with caution." + # return 0 + #;; + amd64) return 0 ;; + #ia64) return 0 ;; + #ppc) return 0 ;; + #ppc64) return 0 ;; + #sparc) return 0 ;; + x86) return 0 ;; + *) return 1 ;; + esac +} + +GHC_PV=${PV} +#GHC_PV=7.10.1.20150630 # uncomment only for -rc ebuilds +GHC_P=${PN}-${GHC_PV} # using ${P} is almost never correct + +#SRC_URI="!binary? ( http://downloads.haskell.org/~ghc/${PV/_rc/-rc}/${GHC_P}-src.tar.bz2 )" +# Upstream tarball was repackaged and inplace-updated. CDN cached old version for +# many users +SRC_URI="!binary? ( http://dev.gentoo.org/~slyfox/distfiles/${GHC_P}-src.tar.bz2 )" +S="${WORKDIR}"/${GHC_P} + +[[ -n $arch_binaries ]] && SRC_URI+=" !ghcbootstrap? ( $arch_binaries )" + +BUMP_LIBRARIES=( + # "hackage-name hackage-version" + "binary 0.7.5.0" + "hoopl 3.10.1.0" + "transformers 0.4.3.0" +) + +LICENSE="BSD" +SLOT="0/${PV}" +KEYWORDS="~amd64 ~x86 ~amd64-linux ~x86-linux" +IUSE="doc ghcbootstrap ghcmakebinary +gmp" +IUSE+=" binary" +IUSE+=" elibc_glibc" # system stuff + +RDEPEND=" + >=dev-lang/perl-5.6.1 + >=dev-libs/gmp-5:= + sys-libs/ncurses:=[unicode] + !ghcmakebinary? ( virtual/libffi:= ) + !kernel_Darwin? ( >=sys-devel/gcc-2.95.3:* ) + kernel_linux? ( >=sys-devel/binutils-2.17:* ) + kernel_SunOS? ( >=sys-devel/binutils-2.17:* ) +" + +# force dependency on >=gmp-5, even if >=gmp-4.1 would be enough. this is due to +# that we want the binaries to use the latest versioun available, and not to be +# built against gmp-4 + +# similar for glibc. we have bootstrapped binaries against glibc-2.17 +DEPEND="${RDEPEND} + doc? ( app-text/docbook-xml-dtd:4.2 + app-text/docbook-xml-dtd:4.5 + app-text/docbook-xsl-stylesheets + >=dev-libs/libxslt-1.1.2 ) + !ghcbootstrap? ( !prefix? ( elibc_glibc? ( >=sys-libs/glibc-2.17 ) ) )" + +PDEPEND="!ghcbootstrap? ( =app-admin/haskell-updater-1.2* )" + +REQUIRED_USE="?? ( ghcbootstrap binary )" + +# yeah, top-level 'use' sucks. I'd like to have it in 'src_install()' +use binary && QA_PREBUILT="*" + +# haskell libraries built with cabal in configure mode, #515354 +QA_CONFIGURE_OPTIONS+=" --with-compiler --with-gcc" + +is_crosscompile() { + [[ ${CHOST} != ${CTARGET} ]] +} + +append-ghc-cflags() { + local persistent compile assemble link + local flag ghcflag + + for flag in $*; do + case ${flag} in + persistent) persistent="yes";; + compile) compile="yes";; + assemble) assemble="yes";; + link) link="yes";; + *) + [[ ${compile} ]] && ghcflag="-optc${flag}" CFLAGS+=" ${flag}" && GHC_FLAGS+=" ${ghcflag}" && + [[ ${persistent} ]] && GHC_PERSISTENT_FLAGS+=" ${ghcflag}" + [[ ${assemble} ]] && ghcflag="-opta${flag}" CFLAGS+=" ${flag}" && GHC_FLAGS+=" ${ghcflag}" && + [[ ${persistent} ]] && GHC_PERSISTENT_FLAGS+=" ${ghcflag}" + [[ ${link} ]] && ghcflag="-optl${flag}" LDFLAGS+=" ${flag}" && GHC_FLAGS+=" ${ghcflag}" && + [[ ${persistent} ]] && GHC_PERSISTENT_FLAGS+=" ${ghcflag}" + ;; + esac + done +} + +# $1 - lib name (under libraries/) +# $2 - lib version +# example: bump_lib "transformers" "0.4.2.0" +bump_lib() { + local pn=$1 pv=$2 + local p=${pn}-${pv} + local f + + einfo "Bumping ${pn} up to ${pv}" + + for f in ghc.mk GNUmakefile; do + mv libraries/"${pn}"/$f "${WORKDIR}"/"${p}"/$f || die + done + mv libraries/"${pn}" "${WORKDIR}"/"${pn}".old || die + mv "${WORKDIR}"/"${p}" libraries/"${pn}" || die +} + +update_SRC_URI() { + local p pn pv + for p in "${BUMP_LIBRARIES[@]}"; do + set -- $p + pn=$1 pv=$2 + + SRC_URI+=" mirror://hackage/package/${pn}/${pn}-${pv}.tar.gz" + done +} + +update_SRC_URI + +bump_libs() { + local p pn pv + for p in "${BUMP_LIBRARIES[@]}"; do + set -- $p + pn=$1 pv=$2 + + bump_lib "${pn}" "${pv}" + done +} + +ghc_setup_cflags() { + if is_crosscompile; then + export CFLAGS=${GHC_CFLAGS-"-O2 -pipe"} + export LDFLAGS=${GHC_LDFLAGS-"-Wl,-O1"} + einfo "Crosscompiling mode:" + einfo " CHOST: ${CHOST}" + einfo " CTARGET: ${CTARGET}" + einfo " CFLAGS: ${CFLAGS}" + einfo " LDFLAGS: ${LDFLAGS}" + return + fi + # We need to be very careful with the CFLAGS we ask ghc to pass through to + # gcc. There are plenty of flags which will make gcc produce output that + # breaks ghc in various ways. The main ones we want to pass through are + # -mcpu / -march flags. These are important for arches like alpha & sparc. + # We also use these CFLAGS for building the C parts of ghc, ie the rts. + strip-flags + strip-unsupported-flags + + # Cmm can't parse line numbers #482086 + replace-flags -ggdb[3-9] -ggdb2 + + GHC_FLAGS="" + GHC_PERSISTENT_FLAGS="" + for flag in ${CFLAGS}; do + case ${flag} in + + # Ignore extra optimisation (ghc passes -O to gcc anyway) + # -O2 and above break on too many systems + -O*) ;; + + # Arch and ABI flags are what we're really after + -m*) append-ghc-cflags compile assemble ${flag};; + + # Sometimes it's handy to see backtrace of RTS + # to get an idea what happens there + -g*) append-ghc-cflags compile ${flag};; + + # Ignore all other flags, including all -f* flags + esac + done + + for flag in ${LDFLAGS}; do + append-ghc-cflags link ${flag} + done + + # hardened-gcc needs to be disabled, because the mangler doesn't accept + # its output. + gcc-specs-pie && append-ghc-cflags persistent compile link -nopie + gcc-specs-ssp && append-ghc-cflags persistent compile -fno-stack-protector + + # prevent from failind building unregisterised ghc: + # http://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg171602.html + use ppc64 && append-ghc-cflags persistent compile -mminimal-toc + # fix the similar issue as ppc64 TOC on ia64. ia64 has limited size of small data + # currently ghc fails to build haddock + # http://osdir.com/ml/gnu.binutils.bugs/2004-10/msg00050.html + use ia64 && append-ghc-cflags persistent compile -G0 +} + +# substitutes string $1 to $2 in files $3 $4 ... +relocate_path() { + local from=$1 + local to=$2 + shift 2 + local file= + for file in "$@" + do + sed -i -e "s|$from|$to|g" \ + "$file" || die "path relocation failed for '$file'" + done +} + +# changes hardcoded ghc paths and updates package index +# $1 - new absolute root path +relocate_ghc() { + local to=$1 + + # libdir for prebuilt binary and for current system may mismatch + # It does for prefix installation for example: bug #476998 + local bin_ghc_prefix=${WORKDIR}/usr + local bin_libpath=$(echo "${bin_ghc_prefix}"/lib*) + local bin_libdir=${bin_libpath#${bin_ghc_prefix}/} + + # backup original script to use it later after relocation + local gp_back="${T}/ghc-pkg-${GHC_PV}-orig" + cp "${WORKDIR}/usr/bin/ghc-pkg-${GHC_PV}" "$gp_back" || die "unable to backup ghc-pkg wrapper" + + if [[ ${bin_libdir} != $(get_libdir) ]]; then + einfo "Relocating '${bin_libdir}' to '$(get_libdir)' (bug #476998)" + # moving the dir itself is not strictly needed + # but then USE=binary would result in installing + # in '${bin_libdir}' + mv "${bin_ghc_prefix}/${bin_libdir}" "${bin_ghc_prefix}/$(get_libdir)" || die + + relocate_path "/usr/${bin_libdir}" "/usr/$(get_libdir)" \ + "${WORKDIR}/usr/bin/ghc-${GHC_PV}" \ + "${WORKDIR}/usr/bin/ghci-${GHC_PV}" \ + "${WORKDIR}/usr/bin/ghc-pkg-${GHC_PV}" \ + "${WORKDIR}/usr/bin/hsc2hs" \ + "${WORKDIR}/usr/bin/runghc-${GHC_PV}" \ + "$gp_back" \ + "${WORKDIR}/usr/$(get_libdir)/${GHC_P}/package.conf.d/"* + fi + + # Relocate from /usr to ${EPREFIX}/usr + relocate_path "/usr" "${to}/usr" \ + "${WORKDIR}/usr/bin/ghc-${GHC_PV}" \ + "${WORKDIR}/usr/bin/ghci-${GHC_PV}" \ + "${WORKDIR}/usr/bin/ghc-pkg-${GHC_PV}" \ + "${WORKDIR}/usr/bin/hsc2hs" \ + "${WORKDIR}/usr/bin/runghc-${GHC_PV}" \ + "${WORKDIR}/usr/$(get_libdir)/${GHC_P}/package.conf.d/"* + + # this one we will use to regenerate cache + # so it should point to current tree location + relocate_path "/usr" "${WORKDIR}/usr" "$gp_back" + + if use prefix; then + # and insert LD_LIBRARY_PATH entry to EPREFIX dir tree + # TODO: add the same for darwin's CHOST and it's DYLD_ + local new_ldpath='LD_LIBRARY_PATH="'${EPREFIX}/$(get_libdir):${EPREFIX}/usr/$(get_libdir)'${LD_LIBRARY_PATH:+:}${LD_LIBRARY_PATH}"\nexport LD_LIBRARY_PATH' + sed -i -e '2i'"$new_ldpath" \ + "${WORKDIR}/usr/bin/ghc-${GHC_PV}" \ + "${WORKDIR}/usr/bin/ghci-${GHC_PV}" \ + "${WORKDIR}/usr/bin/ghc-pkg-${GHC_PV}" \ + "${WORKDIR}/usr/bin/hsc2hs" \ + "${WORKDIR}/usr/bin/runghc-${GHC_PV}" \ + "$gp_back" \ + "${WORKDIR}/usr/bin/hsc2hs" \ + || die "Adding LD_LIBRARY_PATH for wrappers failed" + fi + + # regenerate the binary package cache + "$gp_back" recache || die "failed to update cache after relocation" + rm "$gp_back" +} + +pkg_setup() { + [[ ${MERGE_TYPE} == binary ]] && return + + if use ghcbootstrap; then + ewarn "You requested ghc bootstrapping, this is usually only used" + ewarn "by Gentoo developers to make binary .tbz2 packages." + + [[ -z $(type -P ghc) ]] && \ + die "Could not find a ghc to bootstrap with." + else + if ! yet_binary; then + eerror "Please try emerging with USE=ghcbootstrap and report build" + eerror "sucess or failure to the haskell team (haskell@gentoo.org)" + die "No binary available for '${ARCH}' arch yet, USE=ghcbootstrap" + fi + fi +} + +src_unpack() { + # Create the ${S} dir if we're using the binary version + use binary && mkdir "${S}" + + # the Solaris and Darwin binaries from ghc (maeder) need to be + # unpacked separately, so prevent them from being unpacked + local ONLYA=${A} + case ${CHOST} in + *-darwin* | *-solaris*) ONLYA=${GHC_P}-src.tar.bz2 ;; + esac + unpack ${ONLYA} + + if [[ -d "${S}"/libraries/dph ]]; then + # Sometimes dph libs get accidentally shipped with ghc + # but they are not installed unless user requests it. + # We never install them. + elog "Removing 'libraries/dph'" + rm -rf "${S}"/libraries/dph + fi +} + +src_prepare() { + ghc_setup_cflags + + if ! use ghcbootstrap && [[ ${CHOST} != *-darwin* && ${CHOST} != *-solaris* ]]; then + # Modify the wrapper script from the binary tarball to use GHC_PERSISTENT_FLAGS. + # See bug #313635. + sed -i -e "s|\"\$topdir\"|\"\$topdir\" ${GHC_PERSISTENT_FLAGS}|" \ + "${WORKDIR}/usr/bin/ghc-${GHC_PV}" + + # allow hardened users use vanilla binary to bootstrap ghc + # ghci uses mmap with rwx protection at it implements dynamic + # linking on it's own (bug #299709) + pax-mark -m "${WORKDIR}/usr/$(get_libdir)/${GHC_P}/bin/ghc" + fi + + if use binary; then + if use prefix; then + relocate_ghc "${EPREFIX}" + fi + + # Move unpacked files to the expected place + mv "${WORKDIR}/usr" "${S}" + else + if ! use ghcbootstrap; then + case ${CHOST} in + *-darwin* | *-solaris*) + # UPDATE ME for ghc-7 + mkdir "${WORKDIR}"/ghc-bin-installer || die + pushd "${WORKDIR}"/ghc-bin-installer > /dev/null || die + use sparc-solaris && unpack ghc-6.10.4-sparc-sun-solaris2.tar.bz2 + use x86-solaris && unpack ghc-7.0.3-i386-unknown-solaris2.tar.bz2 + use x86-macos && unpack ghc-7.4.1-i386-apple-darwin.tar.bz2 + use x64-macos && unpack ghc-7.4.1-x86_64-apple-darwin.tar.bz2 + popd > /dev/null + + pushd "${WORKDIR}"/ghc-bin-installer/ghc-[67].?*.? > /dev/null || die + # fix the binaries so they run, on Solaris we need an + # LD_LIBRARY_PATH which has our prefix libdirs, on + # Darwin we need to replace the frameworks with our libs + # from the prefix fix before installation, because some + # of the tools are actually used during configure/make + if [[ ${CHOST} == *-solaris* ]] ; then + export LD_LIBRARY_PATH="${EPREFIX}/$(get_libdir):${EPREFIX}/usr/$(get_libdir):${LD_LIBRARY_PATH}" + elif [[ ${CHOST} == *-darwin* ]] ; then + local readline_framework=GNUreadline.framework/GNUreadline + local gmp_framework=/opt/local/lib/libgmp.10.dylib + local ncurses_file=/opt/local/lib/libncurses.5.dylib + for binary in $(scanmacho -BRE MH_EXECUTE -F '%F' .) ; do + install_name_tool -change \ + ${readline_framework} \ + "${EPREFIX}"/lib/libreadline.dylib \ + ${binary} || die + install_name_tool -change \ + ${gmp_framework} \ + "${EPREFIX}"/usr/lib/libgmp.dylib \ + ${binary} || die + install_name_tool -change \ + ${ncurses_file} \ + "${EPREFIX}"/usr/lib/libncurses.dylib \ + ${binary} || die + done + # we don't do frameworks! + sed -i \ + -e 's/\(frameworks = \)\["GMP"\]/\1[]/g' \ + -e 's/\(extraLibraries = \)\["m"\]/\1["m","gmp"]/g' \ + rts/package.conf.in || die + fi + + # it is autoconf, but we really don't want to give it too + # much arguments, in fact we do the make in-place anyway + ./configure --prefix="${WORKDIR}"/usr || die + make install || die + popd > /dev/null + ;; + *) + relocate_ghc "${WORKDIR}" + ;; + esac + fi + + sed -i -e "s|\"\$topdir\"|\"\$topdir\" ${GHC_PERSISTENT_FLAGS}|" \ + "${S}/ghc/ghc.wrapper" + + cd "${S}" # otherwise epatch will break + + epatch "${FILESDIR}"/${PN}-7.0.4-CHOST-prefix.patch + + epatch "${FILESDIR}"/${PN}-7.8.2-cgen-constify.patch + epatch "${FILESDIR}"/${PN}-7.8.3-prim-lm.patch + epatch "${FILESDIR}"/${PN}-7.10.1-rc3-ghc-7.10-bootstrap.patch + epatch "${FILESDIR}"/${PN}-7.10.1-T10590-dequeue.patch + # Since ${S}/packages does not include base, etc. add them to gen_contents_index + sed -e 's@\(for REPO in .*\)@\1 base integer-gmp integer-gmp2 integer-simple template-haskell@' \ + -i libraries/gen_contents_index || die + + if use prefix; then + # Make configure find docbook-xsl-stylesheets from Prefix + sed -e '/^FP_DIR_DOCBOOK_XSL/s:\[.*\]:['"${EPREFIX}"'/usr/share/sgml/docbook/xsl-stylesheets/]:' \ + -i utils/haddock/doc/configure.ac || die + fi + + bump_libs + + # as we have changed the build system + eautoreconf + fi +} + +src_configure() { + if ! use binary; then + # initialize build.mk + echo '# Gentoo changes' > mk/build.mk + + # Put docs into the right place, ie /usr/share/doc/ghc-${GHC_PV} + echo "docdir = ${EPREFIX}/usr/share/doc/${P}" >> mk/build.mk + echo "htmldir = ${EPREFIX}/usr/share/doc/${P}" >> mk/build.mk + + # We also need to use the GHC_FLAGS flags when building ghc itself + echo "SRC_HC_OPTS+=${HCFLAGS} ${GHC_FLAGS}" >> mk/build.mk + echo "SRC_CC_OPTS+=${CFLAGS}" >> mk/build.mk + echo "SRC_LD_OPTS+=${LDFLAGS}" >> mk/build.mk + + # We can't depend on haddock except when bootstrapping when we + # must build docs and include them into the binary .tbz2 package + # app-text/dblatex is not in portage, can not build PDF or PS + echo "BUILD_DOCBOOK_PDF = NO" >> mk/build.mk + echo "BUILD_DOCBOOK_PS = NO" >> mk/build.mk + if use doc; then + echo "BUILD_DOCBOOK_HTML = YES" >> mk/build.mk + else + echo "BUILD_DOCBOOK_HTML = NO" >> mk/build.mk + fi + + # this controls presence on 'xhtml' and 'haddock' in final install + echo "HADDOCK_DOCS = YES" >> mk/build.mk + + # allows overriding build flavours for libraries: + # v - vanilla (static libs) + # p - profiled + # dyn - shared libraries + # example: GHC_LIBRARY_WAYS="v dyn" + if [[ -n ${GHC_LIBRARY_WAYS} ]]; then + echo "GhcLibWays=${GHC_LIBRARY_WAYS}" >> mk/build.mk + fi + + # Get ghc from the unpacked binary .tbz2 + # except when bootstrapping we just pick ghc up off the path + if ! use ghcbootstrap; then + export PATH="${WORKDIR}/usr/bin:${PATH}" + fi + + if use gmp; then + echo "INTEGER_LIBRARY=integer-gmp2" >> mk/build.mk + else + echo "INTEGER_LIBRARY=integer-simple" >> mk/build.mk + fi + + # don't strip anything. Very useful when stage2 SIGSEGVs on you + echo "STRIP_CMD = :" >> mk/build.mk + + elog "Final mk/build.mk:" + cat mk/build.mk || die + + local econf_args=() + + # GHC embeds 'gcc' it was built by and uses it later. + # Don't allow things like ccache or versioned binary slip. + # We use stable thing across gcc upgrades. + is_crosscompile || econf_args+=(--with-gcc=${CHOST}-gcc) + + if ! use ghcmakebinary; then + econf_args+=(--with-system-libffi) + econf_args+=(--with-ffi-includes=$(pkg-config libffi --cflags-only-I | sed -e 's@^-I@@')) + fi + + econf ${econf_args[@]} --enable-bootstrap-with-devel-snapshot + + if [[ ${PV} == *9999* ]]; then + GHC_PV="$(grep 'S\[\"PACKAGE_VERSION\"\]' config.status | sed -e 's@^.*=\"\(.*\)\"@\1@')" + GHC_P=${PN}-${GHC_PV} + fi + GHC_TPF="$(grep 'S\[\"TargetPlatformFull\"\]' config.status | sed -e 's@^.*=\"\(.*\)\"@\1@')" + fi # ! use binary +} + +src_compile() { + if ! use binary; then + # 1. build compiler binary first + emake ghc/stage2/build/tmp/ghc-stage2 + # 2. pax-mark (bug #516430) + pax-mark -m ghc/stage2/build/tmp/ghc-stage2 + # 3. and then all the rest + emake all + fi # ! use binary +} + +src_install() { + if use binary; then + use prefix && mkdir -p "${ED}" + mv "${S}/usr" "${ED}" + else + + emake -j1 install DESTDIR="${D}" + dodoc "distrib/README" "ANNOUNCE" "LICENSE" "VERSION" + + # rename ghc-shipped files to avoid collision + # of external packages. Motivating example: + # user had installed: + # dev-lang/ghc-7.8.4-r0 (with transformers-0.3.0.0) + # dev-haskell/transformers-0.4.2.0 + # then user tried to update to + # dev-lang/ghc-7.8.4-r1 (with transformers-0.4.2.0) + # this will lead to single .conf file collision. + local shipped_conf renamed_conf + local package_confdir="${ED}/usr/$(get_libdir)/${GHC_P}/package.conf.d" + for shipped_conf in "${package_confdir}"/*.conf; do + # rename 'pkg-ver-id.conf' to 'pkg-ver-id-gentoo-${PF}.conf' + renamed_conf=${shipped_conf%.conf}-gentoo-${PF}.conf + mv "${shipped_conf}" "${renamed_conf}" || die + done + + # remove link, but leave 'haddock-${GHC_P}' + rm -f "${ED}"/usr/bin/haddock + + if [[ ! -f "${S}/VERSION" ]]; then + echo "${GHC_PV}" > "${S}/VERSION" \ + || die "Could not create file ${S}/VERSION" + fi + newbashcomp "${FILESDIR}"/ghc-bash-completion ghc-pkg + newbashcomp utils/completion/ghc.bash ghc + fi + + # path to the package.cache + local package_confdir="${ED}/usr/$(get_libdir)/${GHC_P}/package.conf.d" + PKGCACHE="${package_confdir}"/package.cache + # copy the package.conf.d, including timestamp, save it so we can help + # users that have a broken package.conf.d + cp -pR "${package_confdir}"{,.initial} || die "failed to backup intial package.conf.d" + + # copy the package.conf, including timestamp, save it so we later can put it + # back before uninstalling, or when upgrading. + cp -p "${PKGCACHE}"{,.shipped} \ + || die "failed to copy package.conf.d/package.cache" +} + +pkg_preinst() { + # have we got an earlier version of ghc installed? + if has_version "<${CATEGORY}/${PF}"; then + haskell_updater_warn="1" + fi +} + +pkg_postinst() { + ghc-reregister + + # path to the package.cache + PKGCACHE="${EROOT}/usr/$(get_libdir)/${GHC_P}/package.conf.d/package.cache" + + # give the cache a new timestamp, it must be as recent as + # the package.conf.d directory. + touch "${PKGCACHE}" + + if [[ "${haskell_updater_warn}" == "1" ]]; then + ewarn + ewarn "\e[1;31m************************************************************************\e[0m" + ewarn + ewarn "You have just upgraded from an older version of GHC." + ewarn "You may have to run" + ewarn " 'haskell-updater'" + ewarn "to rebuild all ghc-based Haskell libraries." + ewarn + ewarn "\e[1;31m************************************************************************\e[0m" + ewarn + fi +} + +pkg_prerm() { + PKGCACHE="${EROOT}/usr/$(get_libdir)/${GHC_P}/package.conf.d/package.cache" + rm -rf "${PKGCACHE}" + + cp -p "${PKGCACHE}"{.shipped,} +} + +pkg_postrm() { + ghc-package_pkg_postrm +} diff --git a/dev-lang/ghc/ghc-7.4.2.ebuild b/dev-lang/ghc/ghc-7.4.2.ebuild new file mode 100644 index 000000000000..0706220fa159 --- /dev/null +++ b/dev-lang/ghc/ghc-7.4.2.ebuild @@ -0,0 +1,639 @@ +# Copyright 1999-2015 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id$ + +# Brief explanation of the bootstrap logic: +# +# Previous ghc ebuilds have been split into two: ghc and ghc-bin, +# where ghc-bin was primarily used for bootstrapping purposes. +# From now on, these two ebuilds have been combined, with the +# binary USE flag used to determine whether or not the pre-built +# binary package should be emerged or whether ghc should be compiled +# from source. If the latter, then the relevant ghc-bin for the +# arch in question will be used in the working directory to compile +# ghc from source. +# +# This solution has the advantage of allowing us to retain the one +# ebuild for both packages, and thus phase out virtual/ghc. + +# Note to users of hardened gcc-3.x: +# +# If you emerge ghc with hardened gcc it should work fine (because we +# turn off the hardened features that would otherwise break ghc). +# However, emerging ghc while using a vanilla gcc and then switching to +# hardened gcc (using gcc-config) will leave you with a broken ghc. To +# fix it you would need to either switch back to vanilla gcc or re-emerge +# ghc (or ghc-bin). Note that also if you are using hardened gcc-3.x and +# you switch to gcc-4.x that this will also break ghc and you'll need to +# re-emerge ghc (or ghc-bin). People using vanilla gcc can switch between +# gcc-3.x and 4.x with no problems. + +EAPI="5" + +inherit base autotools bash-completion-r1 eutils flag-o-matic multilib toolchain-funcs ghc-package versionator pax-utils + +DESCRIPTION="The Glasgow Haskell Compiler" +HOMEPAGE="http://www.haskell.org/ghc/" + +# we don't have any binaries yet +arch_binaries="" + +# sorted! +arch_binaries="$arch_binaries alpha? ( http://code.haskell.org/~slyfox/ghc-alpha/ghc-bin-${PV}-alpha.tbz2 )" +#arch_binaries="$arch_binaries arm? ( http://code.haskell.org/~slyfox/ghc-arm/ghc-bin-${PV}-arm.tbz2 )" +arch_binaries="$arch_binaries amd64? ( http://code.haskell.org/~slyfox/ghc-amd64/ghc-bin-${PV}-amd64-stable-glibc.tbz2 )" +arch_binaries="$arch_binaries ia64? ( http://code.haskell.org/~slyfox/ghc-ia64/ghc-bin-${PV}-ia64.tbz2 )" +arch_binaries="$arch_binaries ppc? ( http://code.haskell.org/~slyfox/ghc-ppc/ghc-bin-${PV}-ppc.tbz2 )" +arch_binaries="$arch_binaries ppc64? ( http://code.haskell.org/~slyfox/ghc-ppc64/ghc-bin-${PV}-ppc64.tbz2 )" +arch_binaries="$arch_binaries sparc? ( http://code.haskell.org/~slyfox/ghc-sparc/ghc-bin-${PV}-sparc.tbz2 )" +arch_binaries="$arch_binaries x86? ( http://code.haskell.org/~slyfox/ghc-x86/ghc-bin-${PV}-x86-stable-glibc.tbz2 )" + +# various ports: +#arch_binaries="$arch_binaries x86-fbsd? ( http://code.haskell.org/~slyfox/ghc-x86-fbsd/ghc-bin-${PV}-x86-fbsd.tbz2 )" + +# 0 - yet +yet_binary() { + case "${ARCH}" in + alpha) return 0 ;; + #arm) + # ewarn "ARM binary is built on armv5tel-eabi toolchain. Use with caution." + # return 0 + #;; + amd64) return 0 ;; + ia64) return 0 ;; + ppc) return 0 ;; + ppc64) return 0 ;; + sparc) return 0 ;; + x86) return 0 ;; + *) return 1 ;; + esac +} + +SRC_URI="!binary? ( http://www.haskell.org/ghc/dist/${PV}/${P}-src.tar.bz2 )" +[[ -n $arch_binaries ]] && SRC_URI+=" !ghcbootstrap? ( $arch_binaries )" +LICENSE="BSD" +SLOT="0/${PV}" +# ghc on ia64 needs gcc to support -mcmodel=medium (or some dark hackery) to avoid TOC overflow +KEYWORDS="alpha amd64 ia64 ppc ppc64 sparc x86 ~x86-fbsd ~amd64-linux ~x86-linux ~ppc-macos ~x86-macos ~sparc-solaris ~x86-solaris" +IUSE="doc ghcbootstrap ghcmakebinary +gmp llvm" +IUSE+=" binary" # don't forget about me later! +IUSE+=" elibc_glibc" # system stuff + +RDEPEND=" + !kernel_Darwin? ( >=sys-devel/gcc-2.95.3 ) + kernel_linux? ( >=sys-devel/binutils-2.17 ) + kernel_SunOS? ( >=sys-devel/binutils-2.17 ) + >=dev-lang/perl-5.6.1 + >=dev-libs/gmp-5 + virtual/libffi + !<dev-haskell/haddock-2.10.0 + sys-libs/ncurses[unicode]" +# earlier versions than 2.4.2 of haddock only works with older ghc releases + +# force dependency on >=gmp-5, even if >=gmp-4.1 would be enough. this is due to +# that we want the binaries to use the latest versioun available, and not to be +# built against gmp-4 + +# similar for glibc. we have bootstrapped binaries against glibc-2.14 +DEPEND="${RDEPEND} + ghcbootstrap? ( + doc? ( app-text/docbook-xml-dtd:4.2 + app-text/docbook-xml-dtd:4.5 + app-text/docbook-xsl-stylesheets + >=dev-libs/libxslt-1.1.2 ) ) + !ghcbootstrap? ( !prefix? ( elibc_glibc? ( >=sys-libs/glibc-2.14 ) ) )" + +PDEPEND="!ghcbootstrap? ( =app-admin/haskell-updater-1.2* )" +PDEPEND=" + ${PDEPEND} + llvm? ( sys-devel/llvm )" + +# ia64 fails to return from STG GMP primitives (stage2 always SIGSEGVs) +REQUIRED_USE="ia64? ( !gmp )" + +use binary && QA_PREBUILT="*" + +append-ghc-cflags() { + local flag compile assemble link + for flag in $*; do + case ${flag} in + compile) compile="yes";; + assemble) assemble="yes";; + link) link="yes";; + *) + [[ ${compile} ]] && GHC_FLAGS="${GHC_FLAGS} -optc${flag}" CFLAGS="${CFLAGS} ${flag}" + [[ ${assemble} ]] && GHC_FLAGS="${GHC_FLAGS} -opta${flag}" CFLAGS="${CFLAGS} ${flag}" + [[ ${link} ]] && GHC_FLAGS="${GHC_FLAGS} -optl${flag}" FILTERED_LDFLAGS="${FILTERED_LDFLAGS} ${flag}";; + esac + done +} + +ghc_setup_cflags() { + # We need to be very careful with the CFLAGS we ask ghc to pass through to + # gcc. There are plenty of flags which will make gcc produce output that + # breaks ghc in various ways. The main ones we want to pass through are + # -mcpu / -march flags. These are important for arches like alpha & sparc. + # We also use these CFLAGS for building the C parts of ghc, ie the rts. + strip-flags + strip-unsupported-flags + + # Cmm can't parse line numbers #482086 + replace-flags -ggdb[3-9] -ggdb2 + + GHC_FLAGS="" + for flag in ${CFLAGS}; do + case ${flag} in + + # Ignore extra optimisation (ghc passes -O to gcc anyway) + # -O2 and above break on too many systems + -O*) ;; + + # Arch and ABI flags are what we're really after + -m*) append-ghc-cflags compile assemble ${flag};; + + # Debugging flags don't help either. You can't debug Haskell code + # at the C source level and the mangler discards the debug info. + -g*) ;; + + # Ignore all other flags, including all -f* flags + esac + done + + FILTERED_LDFLAGS="" + for flag in ${LDFLAGS}; do + case ${flag} in + # Pass the canary. we don't quite respect LDFLAGS, but we have an excuse! + "-Wl,--hash-style="*) append-ghc-cflags link ${flag};; + + # Ignore all other flags + esac + done + + # hardened-gcc needs to be disabled, because the mangler doesn't accept + # its output. + gcc-specs-pie && append-ghc-cflags compile link -nopie + gcc-specs-ssp && append-ghc-cflags compile -fno-stack-protector + + # prevent from failind building unregisterised ghc: + # http://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg171602.html + use ppc64 && append-ghc-cflags compile -mminimal-toc + # fix the similar issue as ppc64 TOC on ia64. ia64 has limited size of small data + # currently ghc fails to build haddock + # http://osdir.com/ml/gnu.binutils.bugs/2004-10/msg00050.html + use ia64 && append-ghc-cflags compile -G0 + + # Unfortunately driver/split/ghc-split.lprl is dumb + # enough to preserve stack marking for each split object + # and it flags stack marking violation: + # * !WX --- --- usr/lib64/ghc-7.4.1/base-4.5.0.0/libHSbase-4.5.0.0.a:Fingerprint__1.o + # * !WX --- --- usr/lib64/ghc-7.4.1/base-4.5.0.0/libHSbase-4.5.0.0.a:Fingerprint__2.o + # * !WX --- --- usr/lib64/ghc-7.4.1/base-4.5.0.0/libHSbase-4.5.0.0.a:Fingerprint__3.o + case $($(tc-getAS) -v 2>&1 </dev/null) in + *"GNU Binutils"*) # GNU ld + append-ghc-cflags compile assemble -Wa,--noexecstack + ;; + esac +} + +# substitutes string $1 to $2 in files $3 $4 ... +relocate_path() { + local from=$1 + local to=$2 + shift 2 + local file= + for file in "$@" + do + sed -i -e "s|$from|$to|g" \ + "$file" || die "path relocation failed for '$file'" + done +} + +# changes hardcoded ghc paths and updates package index +# $1 - new absolute root path +relocate_ghc() { + local to=$1 + + # backup original script to use it later after relocation + local gp_back="${T}/ghc-pkg-${PV}-orig" + cp "${WORKDIR}/usr/bin/ghc-pkg-${PV}" "$gp_back" || die "unable to backup ghc-pkg wrapper" + + # Relocate from /usr to ${EPREFIX}/usr + relocate_path "/usr" "${to}/usr" \ + "${WORKDIR}/usr/bin/ghc-${PV}" \ + "${WORKDIR}/usr/bin/ghci-${PV}" \ + "${WORKDIR}/usr/bin/ghc-pkg-${PV}" \ + "${WORKDIR}/usr/bin/hsc2hs" \ + "${WORKDIR}/usr/$(get_libdir)/${P}/package.conf.d/"* + + # this one we will use to regenerate cache + # so it shoult point to current tree location + relocate_path "/usr" "${WORKDIR}/usr" "$gp_back" + + if use prefix; then + # and insert LD_LIBRARY_PATH entry to EPREFIX dir tree + # TODO: add the same for darwin's CHOST and it's DYLD_ + local new_ldpath='LD_LIBRARY_PATH="'${EPREFIX}/$(get_libdir):${EPREFIX}/usr/$(get_libdir)'${LD_LIBRARY_PATH:+:}${LD_LIBRARY_PATH}"\nexport LD_LIBRARY_PATH' + sed -i -e '2i'"$new_ldpath" \ + "${WORKDIR}/usr/bin/ghc-${PV}" \ + "${WORKDIR}/usr/bin/ghci-${PV}" \ + "${WORKDIR}/usr/bin/ghc-pkg-${PV}" \ + "$gp_back" \ + "${WORKDIR}/usr/bin/hsc2hs" \ + || die "Adding LD_LIBRARY_PATH for wrappers failed" + fi + + # regenerate the binary package cache + "$gp_back" recache || die "failed to update cache after relocation" + rm "$gp_back" +} + +pkg_setup() { + if use ghcbootstrap; then + ewarn "You requested ghc bootstrapping, this is usually only used" + ewarn "by Gentoo developers to make binary .tbz2 packages for" + ewarn "use with the ghc ebuild's USE=\"binary\" feature." + use binary && \ + die "USE=\"ghcbootstrap binary\" is not a valid combination." + [[ -z $(type -P ghc) ]] && \ + die "Could not find a ghc to bootstrap with." + else + if ! yet_binary; then + eerror "Please try emerging with USE=ghcbootstrap and report build" + eerror "sucess or failure to the haskell team (haskell@gentoo.org)" + die "No binary available for '${ARCH}' arch yet, USE=ghcbootstrap" + fi + fi +} + +src_unpack() { + # Create the ${S} dir if we're using the binary version + use binary && mkdir "${S}" + + # the Solaris and Darwin binaries from ghc (maeder) need to be + # unpacked separately, so prevent them from being unpacked + local ONLYA=${A} + case ${CHOST} in + *-darwin* | *-solaris*) ONLYA=${P}-src.tar.bz2 ;; + esac + unpack ${ONLYA} +} + +src_prepare() { + ghc_setup_cflags + + if ! use ghcbootstrap && [[ ${CHOST} != *-darwin* && ${CHOST} != *-solaris* ]]; then + # Modify the wrapper script from the binary tarball to use GHC_FLAGS. + # See bug #313635. + sed -i -e "s|\"\$topdir\"|\"\$topdir\" ${GHC_FLAGS}|" \ + "${WORKDIR}/usr/bin/ghc-${PV}" + + # allow hardened users use vanilla binary to bootstrap ghc + # ghci uses mmap with rwx protection at it implements dynamic + # linking on it's own (bug #299709) + pax-mark -m "${WORKDIR}/usr/$(get_libdir)/${P}/ghc" + fi + + if use binary; then + if use prefix; then + relocate_ghc "${EPREFIX}" + fi + + # Move unpacked files to the expected place + mv "${WORKDIR}/usr" "${S}" + else + if ! use ghcbootstrap; then + case ${CHOST} in + *-darwin* | *-solaris*) + mkdir "${WORKDIR}"/ghc-bin-installer || die + pushd "${WORKDIR}"/ghc-bin-installer > /dev/null || die + use sparc-solaris && unpack ghc-6.10.4-sparc-sun-solaris2.tar.bz2 + use x86-solaris && unpack ghc-7.0.3-i386-unknown-solaris2.tar.bz2 + use x86-macos && unpack ghc-7.4.1-i386-apple-darwin.tar.bz2 + use x64-macos && unpack ghc-7.4.1-x86_64-apple-darwin.tar.bz2 + popd > /dev/null + + pushd "${WORKDIR}"/ghc-bin-installer/ghc-[67].?*.? > /dev/null || die + # fix the binaries so they run, on Solaris we need an + # LD_LIBRARY_PATH which has our prefix libdirs, on + # Darwin we need to replace the frameworks with our libs + # from the prefix fix before installation, because some + # of the tools are actually used during configure/make + if [[ ${CHOST} == *-solaris* ]] ; then + export LD_LIBRARY_PATH="${EPREFIX}/$(get_libdir):${EPREFIX}/usr/$(get_libdir):${LD_LIBRARY_PATH}" + elif [[ ${CHOST} == *-darwin* ]] ; then + local readline_framework=GNUreadline.framework/GNUreadline + local gmp_framework=/opt/local/lib/libgmp.10.dylib + local ncurses_file=/opt/local/lib/libncurses.5.dylib + for binary in $(scanmacho -BRE MH_EXECUTE -F '%F' .) ; do + install_name_tool -change \ + ${readline_framework} \ + "${EPREFIX}"/lib/libreadline.dylib \ + ${binary} || die + install_name_tool -change \ + ${gmp_framework} \ + "${EPREFIX}"/usr/lib/libgmp.dylib \ + ${binary} || die + install_name_tool -change \ + ${ncurses_file} \ + "${EPREFIX}"/usr/lib/libncurses.dylib \ + ${binary} || die + done + # we don't do frameworks! + sed -i \ + -e 's/\(frameworks = \)\["GMP"\]/\1[]/g' \ + -e 's/\(extraLibraries = \)\["m"\]/\1["m","gmp"]/g' \ + rts/package.conf.in || die + fi + + # it is autoconf, but we really don't want to give it too + # much arguments, in fact we do the make in-place anyway + ./configure --prefix="${WORKDIR}"/usr || die + make install || die + popd > /dev/null + ;; + *) + relocate_ghc "${WORKDIR}" + ;; + esac + fi + + sed -i -e "s|\"\$topdir\"|\"\$topdir\" ${GHC_FLAGS}|" \ + "${S}/ghc/ghc.wrapper" + + cd "${S}" # otherwise epatch will break + + epatch "${FILESDIR}"/${PN}-7.0.4-CHOST-prefix.patch + + epatch "${FILESDIR}"/${PN}-7.0.4-darwin8.patch + # failed to apply. FIXME + #epatch "${FILESDIR}"/${PN}-6.12.3-mach-o-relocation-limit.patch + + epatch "${FILESDIR}"/${PN}-7.4-rc2-macos-prefix-respect-gcc.patch + epatch "${FILESDIR}"/${PN}-7.4.1-darwin-CHOST.patch + epatch "${FILESDIR}"/${PN}-7.2.1-freebsd-CHOST.patch + + we_want_libffi_workaround() { + use ghcmakebinary && return 1 + + # pick only registerised arches + # http://bugs.gentoo.org/463814 + use amd64 && return 0 + use x86 && return 0 + return 1 + } + # one mode external depend with unstable ABI be careful to stash it + # avoid external libffi runtime when we build binaries + we_want_libffi_workaround && epatch "${FILESDIR}"/${PN}-7.4.2-system-libffi.patch + + epatch "${FILESDIR}"/${PN}-7.4.1-ticket-7339-fix-unaligned-unreg.patch + + if use prefix; then + # Make configure find docbook-xsl-stylesheets from Prefix + sed -i -e '/^FP_DIR_DOCBOOK_XSL/s:\[.*\]:['"${EPREFIX}"'/usr/share/sgml/docbook/xsl-stylesheets/]:' utils/haddock/doc/configure.ac || die + fi + + cd "${S}"/libraries/terminfo + # bug #454216 + epatch "${FILESDIR}"/terminfo-0.3.2.5-tinfo.patch + + cd "${S}" + # as we have changed the build system + eautoreconf + fi +} + +src_configure() { + if ! use binary; then + + # initialize build.mk + echo '# Gentoo changes' > mk/build.mk + + # Put docs into the right place, ie /usr/share/doc/ghc-${PV} + echo "docdir = ${EPREFIX}/usr/share/doc/${P}" >> mk/build.mk + echo "htmldir = ${EPREFIX}/usr/share/doc/${P}" >> mk/build.mk + + # We also need to use the GHC_FLAGS flags when building ghc itself + echo "SRC_HC_OPTS+=${GHC_FLAGS}" >> mk/build.mk + echo "SRC_CC_OPTS+=${CFLAGS}" >> mk/build.mk + echo "SRC_LD_OPTS+=${FILTERED_LDFLAGS}" >> mk/build.mk + + # We can't depend on haddock except when bootstrapping when we + # must build docs and include them into the binary .tbz2 package + if use ghcbootstrap && use doc; then + echo "BUILD_DOCBOOK_PDF = NO" >> mk/build.mk + echo "BUILD_DOCBOOK_PS = NO" >> mk/build.mk + echo "BUILD_DOCBOOK_HTML = YES" >> mk/build.mk + echo "HADDOCK_DOCS = YES" >> mk/build.mk + else + echo "BUILD_DOCBOOK_PDF = NO" >> mk/build.mk + echo "BUILD_DOCBOOK_PS = NO" >> mk/build.mk + echo "BUILD_DOCBOOK_HTML = NO" >> mk/build.mk + echo "HADDOCK_DOCS = NO" >> mk/build.mk + fi + + # circumvent a very strange bug that seems related with ghc producing + # too much output while being filtered through tee (e.g. due to + # portage logging) reported as bug #111183 + echo "SRC_HC_OPTS+=-w" >> mk/build.mk + + # some arches do not support ELF parsing for ghci module loading + # PPC64: never worked (should be easy to implement) + # alpha: never worked + # arm: unimplemented or never worked + if use alpha || use ppc64 || use arm; then + echo "GhcWithInterpreter=NO" >> mk/build.mk + fi + + # we have to tell it to build unregisterised on some arches + # ppc64: EvilMangler currently does not understand some TOCs + # ia64: EvilMangler bitrot + if use alpha || use ia64 || use ppc64; then + echo "GhcUnregisterised=YES" >> mk/build.mk + echo "GhcWithNativeCodeGen=NO" >> mk/build.mk + echo "SplitObjs=NO" >> mk/build.mk + echo "GhcRTSWays := debug" >> mk/build.mk + echo "GhcNotThreaded=YES" >> mk/build.mk + fi + + # arm: no EvilMangler support, no NCG support + if use arm; then + echo "GhcUnregisterised=YES" >> mk/build.mk + echo "GhcWithNativeCodeGen=NO" >> mk/build.mk + fi + + # Have "ld -r --relax" problem with split-objs on sparc: + if use sparc; then + echo "SplitObjs=NO" >> mk/build.mk + fi + + if ! use llvm; then + echo "GhcWithLlvmCodeGen=NO" >> mk/build.mk + fi + + # allows overriding build flavours for libraries: + # v - vanilla (static libs) + # p - profiled + # dyn - shared libraries + # example: GHC_LIBRARY_WAYS="v dyn" + if [[ -n ${GHC_LIBRARY_WAYS} ]]; then + echo "GhcLibWays=${GHC_LIBRARY_WAYS}" >> mk/build.mk + fi + + # Get ghc from the unpacked binary .tbz2 + # except when bootstrapping we just pick ghc up off the path + if ! use ghcbootstrap; then + export PATH="${WORKDIR}/usr/bin:${PATH}" + fi + + if use gmp; then + echo "INTEGER_LIBRARY=integer-gmp" >> mk/build.mk + else + echo "INTEGER_LIBRARY=integer-simple" >> mk/build.mk + fi + + # Since GHC 6.12.2 the GHC wrappers store which GCC version GHC was + # compiled with, by saving the path to it. The purpose is to make sure + # that GHC will use the very same gcc version when it compiles haskell + # sources, as the extra-gcc-opts files contains extra gcc options which + # match only this GCC version. + # However, this is not required in Gentoo, as only modern GCCs are used + # (>4). + # Instead, this causes trouble when for example ccache is used during + # compilation, but we don't want the wrappers to point to ccache. + # Due to the above, we simply set GCC to be "gcc". When compiling ghc it + # might point to ccache, once installed it will point to the users + # regular gcc. + + econf --with-gcc=gcc || die "econf failed" + fi # ! use binary +} + +src_compile() { + if ! use binary; then + limit_jobs() { + if [[ -n ${I_DEMAND_MY_CORES_LOADED} ]]; then + ewarn "You have requested parallel build which is known to break." + ewarn "Please report all breakages upstream." + return + fi + echo $@ + } + # ghc massively parallel make: #409631, #409873 + # but let users screw it by setting 'I_DEMAND_MY_CORES_LOADED' + emake $(limit_jobs -j1) all + fi # ! use binary +} + +src_install() { + if use binary; then + use prefix && mkdir -p "${ED}" + mv "${S}/usr" "${ED}" + + # Remove the docs if not requested + if ! use doc; then + rm -rf "${ED}/usr/share/doc/${P}/*/" \ + "${ED}/usr/share/doc/${P}/*.html" \ + || die "could not remove docs (P vs PF revision mismatch?)" + fi + else + local insttarget="install" + + # We only built docs if we were bootstrapping, otherwise + # we copy them out of the unpacked binary .tbz2 + if use doc && ! use ghcbootstrap; then + mkdir -p "${ED}/usr/share/doc" + mv "${WORKDIR}/usr/share/doc/${P}" "${ED}/usr/share/doc" \ + || die "failed to copy docs" + else + dodoc "${S}/README" "${S}/ANNOUNCE" "${S}/LICENSE" "${S}/VERSION" + fi + + emake -j1 ${insttarget} \ + DESTDIR="${D}" \ + || die "make ${insttarget} failed" + + # remove wrapper and linker + rm -f "${ED}"/usr/bin/haddock* + + # ghci uses mmap with rwx protection at it implements dynamic + # linking on it's own (bug #299709) + # so mark resulting binary + pax-mark -m "${ED}/usr/$(get_libdir)/${P}/ghc" + + dobashcomp "${FILESDIR}/ghc-bash-completion" + + fi + + # path to the package.cache + local package_confdir="${ED}/usr/$(get_libdir)/${P}/package.conf.d" + PKGCACHE="${package_confdir}"/package.cache + + cp -pR "${package_confdir}"{,.initial} || die "failed to backup intial package.conf.d" + + # copy the package.conf, including timestamp, save it so we later can put it + # back before uninstalling, or when upgrading. + cp -p "${PKGCACHE}"{,.shipped} \ + || die "failed to copy package.conf.d/package.cache" +} + +pkg_preinst() { + # have we got an earlier version of ghc installed? + if has_version "<${CATEGORY}/${PF}"; then + haskell_updater_warn="1" + fi +} + +pkg_postinst() { + ghc-reregister + + # path to the package.cache + PKGCACHE="${EROOT}/usr/$(get_libdir)/${P}/package.conf.d/package.cache" + + # give the cache a new timestamp, it must be as recent as + # the package.conf.d directory. + touch "${PKGCACHE}" + + if [[ "${haskell_updater_warn}" == "1" ]]; then + ewarn + ewarn "\e[1;31m************************************************************************\e[0m" + ewarn + ewarn "You have just upgraded from an older version of GHC." + ewarn "You may have to run" + ewarn " 'haskell-updater --upgrade'" + ewarn "to rebuild all ghc-based Haskell libraries." + ewarn + ewarn "\e[1;31m************************************************************************\e[0m" + ewarn + fi +} + +pkg_prerm() { + # Be very careful here... Call order when upgrading is (according to PMS): + # * src_install for new package + # * pkg_preinst for new package + # * pkg_postinst for new package + # * pkg_prerm for the package being replaced + # * pkg_postrm for the package being replaced + # so you'll actually be touching the new packages files, not the one you + # uninstall, due to that or installation directory ${P} will be the same for + # both packages. + + # Call order for reinstalling is (according to PMS): + # * src_install + # * pkg_preinst + # * pkg_prerm for the package being replaced + # * pkg_postrm for the package being replaced + # * pkg_postinst + + # Overwrite the modified package.cache with a copy of the + # original one, so that it will be removed during uninstall. + + PKGCACHE="${EROOT}/usr/$(get_libdir)/${P}/package.conf.d/package.cache" + rm -rf "${PKGCACHE}" + + cp -p "${PKGCACHE}"{.shipped,} +} + +pkg_postrm() { + ghc-package_pkg_postrm +} diff --git a/dev-lang/ghc/ghc-7.6.3-r1.ebuild b/dev-lang/ghc/ghc-7.6.3-r1.ebuild new file mode 100644 index 000000000000..5292d7ce2a38 --- /dev/null +++ b/dev-lang/ghc/ghc-7.6.3-r1.ebuild @@ -0,0 +1,828 @@ +# Copyright 1999-2015 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id$ + +# Brief explanation of the bootstrap logic: +# +# Previous ghc ebuilds have been split into two: ghc and ghc-bin, +# where ghc-bin was primarily used for bootstrapping purposes. +# From now on, these two ebuilds have been combined, with the +# binary USE flag used to determine whether or not the pre-built +# binary package should be emerged or whether ghc should be compiled +# from source. If the latter, then the relevant ghc-bin for the +# arch in question will be used in the working directory to compile +# ghc from source. +# +# This solution has the advantage of allowing us to retain the one +# ebuild for both packages, and thus phase out virtual/ghc. + +# Note to users of hardened gcc-3.x: +# +# If you emerge ghc with hardened gcc it should work fine (because we +# turn off the hardened features that would otherwise break ghc). +# However, emerging ghc while using a vanilla gcc and then switching to +# hardened gcc (using gcc-config) will leave you with a broken ghc. To +# fix it you would need to either switch back to vanilla gcc or re-emerge +# ghc (or ghc-bin). Note that also if you are using hardened gcc-3.x and +# you switch to gcc-4.x that this will also break ghc and you'll need to +# re-emerge ghc (or ghc-bin). People using vanilla gcc can switch between +# gcc-3.x and 4.x with no problems. + +EAPI="5" + +# to make make a crosscompiler use crossdev and symlink ghc tree into +# cross overlay. result would look like 'cross-sparc-unknown-linux-gnu/ghc' +# +# 'CTARGET' definition and 'is_crosscompile' are taken from 'toolchain.eclass' +export CTARGET=${CTARGET:-${CHOST}} +if [[ ${CTARGET} = ${CHOST} ]] ; then + if [[ ${CATEGORY/cross-} != ${CATEGORY} ]] ; then + export CTARGET=${CATEGORY/cross-} + fi +fi + +inherit autotools bash-completion-r1 eutils flag-o-matic ghc-package +inherit multilib multiprocessing pax-utils toolchain-funcs versionator + +DESCRIPTION="The Glasgow Haskell Compiler" +HOMEPAGE="http://www.haskell.org/ghc/" + +# we don't have any binaries yet +arch_binaries="" + +# sorted! +arch_binaries="$arch_binaries alpha? ( http://code.haskell.org/~slyfox/ghc-alpha/ghc-bin-${PV}-r1-alpha.tbz2 )" +#arch_binaries="$arch_binaries arm? ( http://code.haskell.org/~slyfox/ghc-arm/ghc-bin-${PV}-arm.tbz2 )" +arch_binaries="$arch_binaries amd64? ( http://code.haskell.org/~slyfox/ghc-amd64/ghc-bin-${PV}-amd64.tbz2 )" +arch_binaries="$arch_binaries ia64? ( http://code.haskell.org/~slyfox/ghc-ia64/ghc-bin-${PV}-r1-ia64.tbz2 )" +arch_binaries="$arch_binaries ppc? ( http://code.haskell.org/~slyfox/ghc-ppc/ghc-bin-${PV}-r1-ppc.tbz2 )" +arch_binaries="$arch_binaries ppc64? ( http://code.haskell.org/~slyfox/ghc-ppc64/ghc-bin-${PV}-r1-ppc64.tbz2 )" +arch_binaries="$arch_binaries sparc? ( http://code.haskell.org/~slyfox/ghc-sparc/ghc-bin-${PV}-r1-sparc.tbz2 )" +arch_binaries="$arch_binaries x86? ( http://code.haskell.org/~slyfox/ghc-x86/ghc-bin-${PV}-x86.tbz2 )" + +# various ports: +#arch_binaries="$arch_binaries x86-fbsd? ( http://code.haskell.org/~slyfox/ghc-x86-fbsd/ghc-bin-${PV}-x86-fbsd.tbz2 )" + +# 0 - yet +yet_binary() { + case "${ARCH}" in + alpha) return 0 ;; + #arm) + # ewarn "ARM binary is built on armv5tel-eabi toolchain. Use with caution." + # return 0 + #;; + amd64) return 0 ;; + ia64) return 0 ;; + ppc) return 0 ;; + ppc64) return 0 ;; + sparc) return 0 ;; + x86) return 0 ;; + *) return 1 ;; + esac +} + +SRC_URI="!binary? ( http://www.haskell.org/ghc/dist/${PV}/${P}-src.tar.bz2 )" +[[ -n $arch_binaries ]] && SRC_URI+=" !ghcbootstrap? ( $arch_binaries )" +LICENSE="BSD" +SLOT="0/${PV}" +KEYWORDS="~alpha amd64 ~ia64 ppc ~ppc64 ~sparc x86 ~amd64-linux ~x86-linux ~ppc-macos ~x86-macos ~sparc-solaris ~x86-solaris" +IUSE="doc ghcbootstrap ghcmakebinary +gmp llvm" +IUSE+=" binary" # don't forget about me later! +IUSE+=" elibc_glibc" # system stuff + +RDEPEND=" + !kernel_Darwin? ( >=sys-devel/gcc-2.95.3 ) + kernel_linux? ( >=sys-devel/binutils-2.17 ) + kernel_SunOS? ( >=sys-devel/binutils-2.17 ) + >=dev-lang/perl-5.6.1 + >=dev-libs/gmp-5 + virtual/libffi + !<dev-haskell/haddock-2.4.2 + sys-libs/ncurses[unicode]" +# earlier versions than 2.4.2 of haddock only works with older ghc releases + +# force dependency on >=gmp-5, even if >=gmp-4.1 would be enough. this is due to +# that we want the binaries to use the latest versioun available, and not to be +# built against gmp-4 + +# similar for glibc. we have bootstrapped binaries against glibc-2.14 +DEPEND="${RDEPEND} + ghcbootstrap? ( + doc? ( app-text/docbook-xml-dtd:4.2 + app-text/docbook-xml-dtd:4.5 + app-text/docbook-xsl-stylesheets + >=dev-libs/libxslt-1.1.2 ) ) + !ghcbootstrap? ( !prefix? ( elibc_glibc? ( >=sys-libs/glibc-2.15 ) ) )" + +PDEPEND="!ghcbootstrap? ( =app-admin/haskell-updater-1.2* )" +PDEPEND=" + ${PDEPEND} + llvm? ( sys-devel/llvm )" + +# ia64 fails to return from STG GMP primitives (stage2 always SIGSEGVs) +REQUIRED_USE="ia64? ( !gmp )" + +use binary && QA_PREBUILT="*" + +# haskell libraries built with cabal in configure mode, #515354 +QA_CONFIGURE_OPTIONS+=" --with-compiler --with-gcc" + +is_crosscompile() { + [[ ${CHOST} != ${CTARGET} ]] +} + +append-ghc-cflags() { + local flag compile assemble link + for flag in $*; do + case ${flag} in + compile) compile="yes";; + assemble) assemble="yes";; + link) link="yes";; + *) + [[ ${compile} ]] && GHC_FLAGS="${GHC_FLAGS} -optc${flag}" CFLAGS="${CFLAGS} ${flag}" + [[ ${assemble} ]] && GHC_FLAGS="${GHC_FLAGS} -opta${flag}" CFLAGS="${CFLAGS} ${flag}" + [[ ${link} ]] && GHC_FLAGS="${GHC_FLAGS} -optl${flag}" FILTERED_LDFLAGS="${FILTERED_LDFLAGS} ${flag}";; + esac + done +} + +ghc_setup_cflags() { + if is_crosscompile; then + export CFLAGS=${GHC_CFLAGS-"-O2 -pipe"} + export LDFLAGS=${GHC_LDFLAGS-"-Wl,-O1"} + einfo "Crosscompiling mode:" + einfo " CHOST: ${CHOST}" + einfo " CTARGET: ${CTARGET}" + einfo " CFLAGS: ${CFLAGS}" + einfo " LDFLAGS: ${LDFLAGS}" + return + fi + # We need to be very careful with the CFLAGS we ask ghc to pass through to + # gcc. There are plenty of flags which will make gcc produce output that + # breaks ghc in various ways. The main ones we want to pass through are + # -mcpu / -march flags. These are important for arches like alpha & sparc. + # We also use these CFLAGS for building the C parts of ghc, ie the rts. + strip-flags + strip-unsupported-flags + + # Cmm can't parse line numbers #482086 + replace-flags -ggdb[3-9] -ggdb2 + + GHC_FLAGS="" + for flag in ${CFLAGS}; do + case ${flag} in + + # Ignore extra optimisation (ghc passes -O to gcc anyway) + # -O2 and above break on too many systems + -O*) ;; + + # Arch and ABI flags are what we're really after + -m*) append-ghc-cflags compile assemble ${flag};; + + # Sometimes it's handy to see backtrace of RTS + # to get an idea what happens there + -g*) append-ghc-cflags compile ${flag};; + + # Ignore all other flags, including all -f* flags + esac + done + + FILTERED_LDFLAGS="" + for flag in ${LDFLAGS}; do + case ${flag} in + # Pass the canary. we don't quite respect LDFLAGS, but we have an excuse! + "-Wl,--hash-style="*) append-ghc-cflags link ${flag};; + + # Ignore all other flags + esac + done + + # hardened-gcc needs to be disabled, because the mangler doesn't accept + # its output. + gcc-specs-pie && append-ghc-cflags compile link -nopie + gcc-specs-ssp && append-ghc-cflags compile -fno-stack-protector + + # prevent from failind building unregisterised ghc: + # http://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg171602.html + use ppc64 && append-ghc-cflags compile -mminimal-toc + # fix the similar issue as ppc64 TOC on ia64. ia64 has limited size of small data + # currently ghc fails to build haddock + # http://osdir.com/ml/gnu.binutils.bugs/2004-10/msg00050.html + use ia64 && append-ghc-cflags compile -G0 -Os + + # Unfortunately driver/split/ghc-split.lprl is dumb + # enough to preserve stack marking for each split object + # and it flags stack marking violation: + # * !WX --- --- usr/lib64/ghc-7.4.1/base-4.5.0.0/libHSbase-4.5.0.0.a:Fingerprint__1.o + # * !WX --- --- usr/lib64/ghc-7.4.1/base-4.5.0.0/libHSbase-4.5.0.0.a:Fingerprint__2.o + # * !WX --- --- usr/lib64/ghc-7.4.1/base-4.5.0.0/libHSbase-4.5.0.0.a:Fingerprint__3.o + case $($(tc-getAS) -v 2>&1 </dev/null) in + *"GNU Binutils"*) # GNU ld + append-ghc-cflags compile assemble -Wa,--noexecstack + ;; + esac +} + +# substitutes string $1 to $2 in files $3 $4 ... +relocate_path() { + local from=$1 + local to=$2 + shift 2 + local file= + for file in "$@" + do + sed -i -e "s|$from|$to|g" \ + "$file" || die "path relocation failed for '$file'" + done +} + +# changes hardcoded ghc paths and updates package index +# $1 - new absolute root path +relocate_ghc() { + local to=$1 + + # libdir for prebuilt binary and for current system may mismatch + # It does for prefix installation for example: bug #476998 + local bin_ghc_prefix=${WORKDIR}/usr + local bin_libpath=$(echo "${bin_ghc_prefix}"/lib*) + local bin_libdir=${bin_libpath#${bin_ghc_prefix}/} + + # backup original script to use it later after relocation + local gp_back="${T}/ghc-pkg-${PV}-orig" + cp "${WORKDIR}/usr/bin/ghc-pkg-${PV}" "$gp_back" || die "unable to backup ghc-pkg wrapper" + + if [[ ${bin_libdir} != $(get_libdir) ]]; then + einfo "Relocating '${bin_libdir}' to '$(get_libdir)' (bug #476998)" + # moving the dir itself is not strictly needed + # but then USE=binary would result in installing + # in '${bin_libdir}' + mv "${bin_ghc_prefix}/${bin_libdir}" "${bin_ghc_prefix}/$(get_libdir)" || die + + relocate_path "/usr/${bin_libdir}" "/usr/$(get_libdir)" \ + "${WORKDIR}/usr/bin/ghc-${PV}" \ + "${WORKDIR}/usr/bin/ghci-${PV}" \ + "${WORKDIR}/usr/bin/ghc-pkg-${PV}" \ + "${WORKDIR}/usr/bin/hsc2hs" \ + "${WORKDIR}/usr/bin/runghc-${PV}" \ + "$gp_back" \ + "${WORKDIR}/usr/$(get_libdir)/${P}/package.conf.d/"* + fi + + # Relocate from /usr to ${EPREFIX}/usr + relocate_path "/usr" "${to}/usr" \ + "${WORKDIR}/usr/bin/ghc-${PV}" \ + "${WORKDIR}/usr/bin/ghci-${PV}" \ + "${WORKDIR}/usr/bin/ghc-pkg-${PV}" \ + "${WORKDIR}/usr/bin/hsc2hs" \ + "${WORKDIR}/usr/bin/runghc-${PV}" \ + "${WORKDIR}/usr/$(get_libdir)/${P}/package.conf.d/"* + + # this one we will use to regenerate cache + # so it should point to current tree location + relocate_path "/usr" "${WORKDIR}/usr" "$gp_back" + + if use prefix; then + # and insert LD_LIBRARY_PATH entry to EPREFIX dir tree + # TODO: add the same for darwin's CHOST and it's DYLD_ + local new_ldpath='LD_LIBRARY_PATH="'${EPREFIX}/$(get_libdir):${EPREFIX}/usr/$(get_libdir)'${LD_LIBRARY_PATH:+:}${LD_LIBRARY_PATH}"\nexport LD_LIBRARY_PATH' + sed -i -e '2i'"$new_ldpath" \ + "${WORKDIR}/usr/bin/ghc-${PV}" \ + "${WORKDIR}/usr/bin/ghci-${PV}" \ + "${WORKDIR}/usr/bin/ghc-pkg-${PV}" \ + "${WORKDIR}/usr/bin/hsc2hs" \ + "${WORKDIR}/usr/bin/runghc-${PV}" \ + "$gp_back" \ + || die "Adding LD_LIBRARY_PATH for wrappers failed" + fi + + # regenerate the binary package cache + "$gp_back" recache || die "failed to update cache after relocation" + rm "$gp_back" +} + +pkg_setup() { + if use ghcbootstrap; then + ewarn "You requested ghc bootstrapping, this is usually only used" + ewarn "by Gentoo developers to make binary .tbz2 packages for" + ewarn "use with the ghc ebuild's USE=\"binary\" feature." + use binary && \ + die "USE=\"ghcbootstrap binary\" is not a valid combination." + [[ -z $(type -P ghc) ]] && \ + die "Could not find a ghc to bootstrap with." + else + if ! yet_binary; then + eerror "Please try emerging with USE=ghcbootstrap and report build" + eerror "sucess or failure to the haskell team (haskell@gentoo.org)" + die "No binary available for '${ARCH}' arch yet, USE=ghcbootstrap" + fi + fi +} + +src_unpack() { + # Create the ${S} dir if we're using the binary version + use binary && mkdir "${S}" + + # the Solaris and Darwin binaries from ghc (maeder) need to be + # unpacked separately, so prevent them from being unpacked + local ONLYA=${A} + case ${CHOST} in + *-darwin* | *-solaris*) ONLYA=${P}-src.tar.bz2 ;; + esac + unpack ${ONLYA} +} + +src_prepare() { + ghc_setup_cflags + + if ! use ghcbootstrap && [[ ${CHOST} != *-darwin* && ${CHOST} != *-solaris* ]]; then + # Modify the wrapper script from the binary tarball to use GHC_FLAGS. + # See bug #313635. + sed -i -e "s|\"\$topdir\"|\"\$topdir\" ${GHC_FLAGS}|" \ + "${WORKDIR}/usr/bin/ghc-${PV}" + + # allow hardened users use vanilla binary to bootstrap ghc + # ghci uses mmap with rwx protection at it implements dynamic + # linking on it's own (bug #299709) + pax-mark -m "${WORKDIR}/usr/$(get_libdir)/${P}/ghc" + fi + + if use binary; then + if use prefix; then + relocate_ghc "${EPREFIX}" + fi + + # Move unpacked files to the expected place + mv "${WORKDIR}/usr" "${S}" + else + if ! use ghcbootstrap; then + case ${CHOST} in + *-darwin* | *-solaris*) + # UPDATE ME for ghc-7 + mkdir "${WORKDIR}"/ghc-bin-installer || die + pushd "${WORKDIR}"/ghc-bin-installer > /dev/null || die + use sparc-solaris && unpack ghc-6.10.4-sparc-sun-solaris2.tar.bz2 + use x86-solaris && unpack ghc-7.0.3-i386-unknown-solaris2.tar.bz2 + use x86-macos && unpack ghc-7.4.1-i386-apple-darwin.tar.bz2 + use x64-macos && unpack ghc-7.4.1-x86_64-apple-darwin.tar.bz2 + popd > /dev/null + + pushd "${WORKDIR}"/ghc-bin-installer/ghc-[67].?*.? > /dev/null || die + # fix the binaries so they run, on Solaris we need an + # LD_LIBRARY_PATH which has our prefix libdirs, on + # Darwin we need to replace the frameworks with our libs + # from the prefix fix before installation, because some + # of the tools are actually used during configure/make + if [[ ${CHOST} == *-solaris* ]] ; then + export LD_LIBRARY_PATH="${EPREFIX}/$(get_libdir):${EPREFIX}/usr/$(get_libdir):${LD_LIBRARY_PATH}" + elif [[ ${CHOST} == *-darwin* ]] ; then + local readline_framework=GNUreadline.framework/GNUreadline + local gmp_framework=/opt/local/lib/libgmp.10.dylib + local ncurses_file=/opt/local/lib/libncurses.5.dylib + for binary in $(scanmacho -BRE MH_EXECUTE -F '%F' .) ; do + install_name_tool -change \ + ${readline_framework} \ + "${EPREFIX}"/lib/libreadline.dylib \ + ${binary} || die + install_name_tool -change \ + ${gmp_framework} \ + "${EPREFIX}"/usr/lib/libgmp.dylib \ + ${binary} || die + install_name_tool -change \ + ${ncurses_file} \ + "${EPREFIX}"/usr/lib/libncurses.dylib \ + ${binary} || die + done + # we don't do frameworks! + sed -i \ + -e 's/\(frameworks = \)\["GMP"\]/\1[]/g' \ + -e 's/\(extraLibraries = \)\["m"\]/\1["m","gmp"]/g' \ + rts/package.conf.in || die + fi + + # it is autoconf, but we really don't want to give it too + # much arguments, in fact we do the make in-place anyway + ./configure --prefix="${WORKDIR}"/usr || die + make install || die + popd > /dev/null + ;; + *) + relocate_ghc "${WORKDIR}" + ;; + esac + fi + + sed -i -e "s|\"\$topdir\"|\"\$topdir\" ${GHC_FLAGS}|" \ + "${S}/ghc/ghc.wrapper" + + cd "${S}" # otherwise epatch will break + + epatch "${FILESDIR}"/${PN}-7.0.4-CHOST-prefix.patch + + # epatch "${FILESDIR}"/${PN}-7.0.4-darwin8.patch + # failed to apply. FIXME + #epatch "${FILESDIR}"/${PN}-6.12.3-mach-o-relocation-limit.patch + + # epatch "${FILESDIR}"/${PN}-7.4-rc2-macos-prefix-respect-gcc.patch + # epatch "${FILESDIR}"/${PN}-7.2.1-freebsd-CHOST.patch + + we_want_libffi_workaround() { + use ghcmakebinary && return 1 + + # pick only registerised arches + # http://bugs.gentoo.org/463814 + use amd64 && return 0 + use x86 && return 0 + return 1 + } + # one mode external depend with unstable ABI be careful to stash it + # avoid external libffi runtime when we build binaries + we_want_libffi_workaround && epatch "${FILESDIR}"/${PN}-7.5.20120505-system-libffi.patch + + epatch "${FILESDIR}"/${PN}-7.4.1-ticket-7339-fix-unaligned-unreg.patch + epatch "${FILESDIR}"/${PN}-7.6.2-integer-simple-div-mod.patch + # ghc-7.8 changed linker code and likely fixed it + epatch "${FILESDIR}"/${PN}-7.6.3-trac-3333-weak-syms.patch + # bug 518734 + epatch "${FILESDIR}"/${PN}-7.6.3-preserve-inplace-xattr.patch + + if use prefix; then + # Make configure find docbook-xsl-stylesheets from Prefix + sed -e '/^FP_DIR_DOCBOOK_XSL/s:\[.*\]:['"${EPREFIX}"'/usr/share/sgml/docbook/xsl-stylesheets/]:' \ + -i utils/haddock/doc/configure.ac || die + fi + + # as we have changed the build system + eautoreconf + fi +} + +src_configure() { + GHC_PV=${PV} # overrided in live ebuilds + + if ! use binary; then + # initialize build.mk + echo '# Gentoo changes' > mk/build.mk + + # Put docs into the right place, ie /usr/share/doc/ghc-${PV} + echo "docdir = ${EPREFIX}/usr/share/doc/${P}" >> mk/build.mk + echo "htmldir = ${EPREFIX}/usr/share/doc/${P}" >> mk/build.mk + + # We also need to use the GHC_FLAGS flags when building ghc itself + echo "SRC_HC_OPTS+=${GHC_FLAGS}" >> mk/build.mk + echo "SRC_CC_OPTS+=${CFLAGS}" >> mk/build.mk + echo "SRC_LD_OPTS+=${FILTERED_LDFLAGS}" >> mk/build.mk + + # We can't depend on haddock except when bootstrapping when we + # must build docs and include them into the binary .tbz2 package + # app-text/dblatex is not in portage, can not build PDF or PS + if use ghcbootstrap && use doc; then + echo "BUILD_DOCBOOK_PDF = NO" >> mk/build.mk + echo "BUILD_DOCBOOK_PS = NO" >> mk/build.mk + echo "BUILD_DOCBOOK_HTML = YES" >> mk/build.mk + if is_crosscompile; then + # TODO this is a workaround for this build error with the live ebuild with haddock: + # make[1]: *** No rule to make target `compiler/stage2/build/Module.hi', + # needed by `utils/haddock/dist/build/Main.o'. Stop. + echo "HADDOCK_DOCS = NO" >> mk/build.mk + else + echo "HADDOCK_DOCS = YES" >> mk/build.mk + fi + else + echo "BUILD_DOCBOOK_PDF = NO" >> mk/build.mk + echo "BUILD_DOCBOOK_PS = NO" >> mk/build.mk + echo "BUILD_DOCBOOK_HTML = NO" >> mk/build.mk + echo "HADDOCK_DOCS = NO" >> mk/build.mk + fi + + # circumvent a very strange bug that seems related with ghc producing + # too much output while being filtered through tee (e.g. due to + # portage logging) reported as bug #111183 + echo "SRC_HC_OPTS+=-w" >> mk/build.mk + + # some arches do not support ELF parsing for ghci module loading + # PPC64: never worked (should be easy to implement) + # alpha: never worked + # arm: http://hackage.haskell.org/trac/ghc/changeset/27302c9094909e04eb73f200d52d5e9370c34a8a + if use alpha || use ppc64; then + echo "GhcWithInterpreter=NO" >> mk/build.mk + fi + + # we have to tell it to build unregisterised on some arches + # ppc64: EvilMangler currently does not understand some TOCs + # ia64: EvilMangler bitrot + # set GHC_IS_UNREG if you like to build slow unregisterised + # host compiler. Handy if you plan to user resulting + # host compiler as a booting compiler for crosscompiler + # which can work only in unregisterised mode. + if use alpha || use ia64 || use ppc64 || [[ -n ${GHC_IS_UNREG} ]]; then + echo "GhcUnregisterised=YES" >> mk/build.mk + echo "GhcWithNativeCodeGen=NO" >> mk/build.mk + echo "SplitObjs=NO" >> mk/build.mk + echo "GhcRTSWays := debug" >> mk/build.mk + echo "GhcNotThreaded=YES" >> mk/build.mk + fi + + # arm: no EvilMangler support, no NCG support + if use arm; then + echo "GhcUnregisterised=YES" >> mk/build.mk + echo "GhcWithNativeCodeGen=NO" >> mk/build.mk + fi + + # Have "ld -r --relax" problem with split-objs on sparc: + if use sparc; then + echo "SplitObjs=NO" >> mk/build.mk + fi + + if ! use llvm; then + echo "GhcWithLlvmCodeGen=NO" >> mk/build.mk + fi + + # allows overriding build flavours for libraries: + # v - vanilla (static libs) + # p - profiled + # dyn - shared libraries + # example: GHC_LIBRARY_WAYS="v dyn" + if [[ -n ${GHC_LIBRARY_WAYS} ]]; then + echo "GhcLibWays=${GHC_LIBRARY_WAYS}" >> mk/build.mk + fi + + # Get ghc from the unpacked binary .tbz2 + # except when bootstrapping we just pick ghc up off the path + if ! use ghcbootstrap; then + export PATH="${WORKDIR}/usr/bin:${PATH}" + fi + + if use gmp; then + echo "INTEGER_LIBRARY=integer-gmp" >> mk/build.mk + else + echo "INTEGER_LIBRARY=integer-simple" >> mk/build.mk + fi + + # Since GHC 6.12.2 the GHC wrappers store which GCC version GHC was + # compiled with, by saving the path to it. The purpose is to make sure + # that GHC will use the very same gcc version when it compiles haskell + # sources, as the extra-gcc-opts files contains extra gcc options which + # match only this GCC version. + # However, this is not required in Gentoo, as only modern GCCs are used + # (>4). + # Instead, this causes trouble when for example ccache is used during + # compilation, but we don't want the wrappers to point to ccache. + # Due to the above, we simply set GCC to be "gcc". When compiling ghc it + # might point to ccache, once installed it will point to the users + # regular gcc. + + local econf_args=() + + is_crosscompile || econf_args+=--with-gcc=${CHOST}-gcc + + econf ${econf_args[@]} --enable-bootstrap-with-devel-snapshot \ + || die "econf failed" + + [[ ${PV} == *9999* ]] && GHC_PV="$(grep 'S\[\"PACKAGE_VERSION\"\]' config.status | sed -e 's@^.*=\"\(.*\)\"@\1@')" + GHC_TPF="$(grep 'S\[\"TargetPlatformFull\"\]' config.status | sed -e 's@^.*=\"\(.*\)\"@\1@')" + fi # ! use binary +} + +src_compile() { + if ! use binary; then + limit_jobs() { + local user_jobs=$(makeopts_jobs) + local max_nonbreaking_jobs=$1 + + [[ ${user_jobs} -le ${max_nonbreaking_jobs} ]] && return + + if [[ -n ${I_DEMAND_MY_CORES_LOADED} ]]; then + ewarn "You have requested parallel build which is known to break." + ewarn "Please report all breakages upstream." + return + else + ewarn "Limiting MAKEOPTS -j${user_jobs} -> -j${max_nonbreaking_jobs} (bug #456386)" + user_jobs=${max_nonbreaking_jobs} + fi + echo -j${user_jobs} + } + # ghc massively parallel make: #409631, #409873 + # but let users screw it by setting 'I_DEMAND_MY_CORES_LOADED' + # 4 parallel jobs usually does not break + + # 1. build compiler binary first + emake $(limit_jobs 4) ghc/stage2/build/tmp/ghc-stage2 V=1 + # 2. pax-mark (bug #516430) + pax-mark -m ghc/stage2/build/tmp/ghc-stage2 + # 3. and then all the rest + emake $(limit_jobs 4) all V=1 + + if is_crosscompile; then + # runghc does not work for a stage1 compiler, we can build it anyway + # so it will print the error message: not built for interactive use + pushd "${S}/utils/runghc" || die "Could not cd to utils/runghc" + if [ ! -f Setup.hs ]; then + echo 'import Distribution.Simple; main = defaultMainWithHooks defaultUserHooks' \ + > Setup.hs || die "failed to create default Setup.hs" + fi + ghc -o setup --make Setup.hs || die "setup build failed" + ./setup configure || die "runghc configure failed" + sed -e "s@VERSION@\"${GHC_PV}\"@" -i runghc.hs + ./setup build || die "runghc build failed" + popd + fi + fi # ! use binary +} + +add-c_nonshared-to-ghci-libs() { + local ghci_lib + local nonshared_dir=${T}/libc_nonshared_objects + + is_crosscompile && return + use elibc_glibc || return + use prefix && return + + # we expect 'libc.a' bits be self-sufficient + if gcc-specs-pie; then + use x86 && return # but on x86 pie means linker support: #486140 + fi + + get-nonshared-objects() { + # ns - 'nonshared' + local ns_objects=" " + local ns_sym + local ns_srco + local ns_dsto + + # extract + mkdir "${nonshared_dir}" || die + pushd "${nonshared_dir}" >/dev/null || die + $(tc-getAR) x "${ROOT}"/usr/$(get_libdir)/libc.a + popd >/dev/null || die + + # they are mostly contents of /usr/$(get_libdir)/libc_nonstahed.a + # but 'c_nonstahed' contains PIC variants of symbols. + # ghci uses non-PIC ones + for ns_sym in \ + stat fstat lstat mknod \ + stat64 fstat64 lstat64 \ + fstatat fstatat64 mknodat + do + ns_srco=${nonshared_dir}/${ns_sym}.o + ns_dsto=${nonshared_dir}/${ns_sym}_weakened.o + [[ -f ${ns_srco} ]] || continue + # here we do The Magic: + # 1. --keep-global-symbol= hides everything to adoid double definition + # of stuff like __stat, __fstat and + # 2. --weaken converts exported symbols to weak symbols to be available + # for redefinition + $(tc-getOBJCOPY) \ + --weaken --keep-global-symbol=${ns_sym} \ + "${ns_srco}" "${ns_dsto}" || die + + ns_objects+=" ${ns_dsto}" + done + + echo "${ns_objects}" + } + # bug #452442: when building libraries for ghci + # ghc basically glues them together: + # $ ld -r -o result foo.o bar.o ... + # that way some symbols defined in libc_nonshared.a + # do not get included into final HS*.o files + # We piggyback on one of early loaded wired-in library + # loaded before 'base'. + while read ghci_lib + do + einfo "relinking '${ghci_lib}' with c_includes" + mv "${ghci_lib}" "${ghci_lib}".unrelinked.o || die + $(tc-getLD) -r -o "${ghci_lib}" \ + "${ghci_lib}".unrelinked.o \ + $(get-nonshared-objects) || die + rm -r "${nonshared_dir}" || die + rm "${ghci_lib}".unrelinked.o || die + done < <(find "${ED}"/usr/$(get_libdir)/${P}/ -name 'HSghc-prim*.o') +} + +src_install() { + if use binary; then + use prefix && mkdir -p "${ED}" + mv "${S}/usr" "${ED}" + + # Remove the docs if not requested + if ! use doc; then + rm -rf "${ED}/usr/share/doc/${P}/*/" \ + "${ED}/usr/share/doc/${P}/*.html" \ + || die "could not remove docs (P vs PF revision mismatch?)" + fi + else + local insttarget="install" + + # We only built docs if we were bootstrapping, otherwise + # we copy them out of the unpacked binary .tbz2 + if use doc && ! use ghcbootstrap; then + mkdir -p "${ED}/usr/share/doc" + mv "${WORKDIR}/usr/share/doc/${P}" "${ED}/usr/share/doc" \ + || die "failed to copy docs" + else + dodoc "${S}/README" "${S}/ANNOUNCE" "${S}/LICENSE" "${S}/VERSION" + fi + + emake -j1 ${insttarget} \ + DESTDIR="${D}" \ + || die "make ${insttarget} failed" + + # remove wrapper and link + rm -f "${ED}"/usr/bin/haddock* + + add-c_nonshared-to-ghci-libs + + if [[ ! -f "${S}/VERSION" ]]; then + echo "${GHC_PV}" > "${S}/VERSION" \ + || die "Could not create file ${S}/VERSION" + fi + dobashcomp "${FILESDIR}/ghc-bash-completion" + + fi + + # path to the package.cache + local package_confdir="${ED}/usr/$(get_libdir)/${PN}-${GHC_PV}/package.conf.d" + PKGCACHE="${package_confdir}"/package.cache + # copy the package.conf.d, including timestamp, save it so we can help + # users that have a broken package.conf.d + cp -pR "${package_confdir}"{,.initial} || die "failed to backup intial package.conf.d" + + # copy the package.conf, including timestamp, save it so we later can put it + # back before uninstalling, or when upgrading. + cp -p "${PKGCACHE}"{,.shipped} \ + || die "failed to copy package.conf.d/package.cache" +} + +pkg_preinst() { + # have we got an earlier version of ghc installed? + if has_version "<${CATEGORY}/${PF}"; then + haskell_updater_warn="1" + fi +} + +pkg_postinst() { + ghc-reregister + + # path to the package.cache + PKGCACHE="${EROOT}/usr/$(get_libdir)/${P}/package.conf.d/package.cache" + + # give the cache a new timestamp, it must be as recent as + # the package.conf.d directory. + touch "${PKGCACHE}" + + if [[ "${haskell_updater_warn}" == "1" ]]; then + ewarn + ewarn "\e[1;31m************************************************************************\e[0m" + ewarn + ewarn "You have just upgraded from an older version of GHC." + ewarn "You may have to run" + ewarn " 'haskell-updater --upgrade'" + ewarn "to rebuild all ghc-based Haskell libraries." + ewarn + ewarn "\e[1;31m************************************************************************\e[0m" + ewarn + fi + if is_crosscompile; then + ewarn + ewarn "\e[1;31m************************************************************************\e[0m" + ewarn + ewarn "GHC built as a cross compiler. The interpreter, ghci and runghc, do" + ewarn "not work for a cross compiler." + ewarn "For the ghci error: \"<command line>: not built for interactive use\" see:" + ewarn "http://www.haskell.org/haskellwiki/GHC:FAQ#When_I_try_to_start_ghci_.28probably_one_I_compiled_myself.29_it_says_ghc-5.02:_not_built_for_interactive_use" + ewarn + ewarn "\e[1;31m************************************************************************\e[0m" + ewarn + fi +} + +pkg_prerm() { + # Be very careful here... Call order when upgrading is (according to PMS): + # * src_install for new package + # * pkg_preinst for new package + # * pkg_postinst for new package + # * pkg_prerm for the package being replaced + # * pkg_postrm for the package being replaced + # so you'll actually be touching the new packages files, not the one you + # uninstall, due to that or installation directory ${P} will be the same for + # both packages. + + # Call order for reinstalling is (according to PMS): + # * src_install + # * pkg_preinst + # * pkg_prerm for the package being replaced + # * pkg_postrm for the package being replaced + # * pkg_postinst + + # Overwrite the modified package.cache with a copy of the + # original one, so that it will be removed during uninstall. + + PKGCACHE="${EROOT}/usr/$(get_libdir)/${P}/package.conf.d/package.cache" + rm -rf "${PKGCACHE}" + + cp -p "${PKGCACHE}"{.shipped,} +} + +pkg_postrm() { + ghc-package_pkg_postrm +} diff --git a/dev-lang/ghc/ghc-7.8.3.ebuild b/dev-lang/ghc/ghc-7.8.3.ebuild new file mode 100644 index 000000000000..2831f4df44c4 --- /dev/null +++ b/dev-lang/ghc/ghc-7.8.3.ebuild @@ -0,0 +1,615 @@ +# Copyright 1999-2015 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id$ + +EAPI=5 + +# to make make a crosscompiler use crossdev and symlink ghc tree into +# cross overlay. result would look like 'cross-sparc-unknown-linux-gnu/ghc' +# +# 'CTARGET' definition and 'is_crosscompile' are taken from 'toolchain.eclass' +export CTARGET=${CTARGET:-${CHOST}} +if [[ ${CTARGET} = ${CHOST} ]] ; then + if [[ ${CATEGORY/cross-} != ${CATEGORY} ]] ; then + export CTARGET=${CATEGORY/cross-} + fi +fi + +inherit autotools bash-completion-r1 eutils flag-o-matic ghc-package +inherit multilib pax-utils toolchain-funcs versionator + +DESCRIPTION="The Glasgow Haskell Compiler" +HOMEPAGE="http://www.haskell.org/ghc/" + +# we don't have any binaries yet +arch_binaries="" + +# sorted! +#arch_binaries="$arch_binaries alpha? ( http://code.haskell.org/~slyfox/ghc-alpha/ghc-bin-${PV}-alpha.tbz2 )" +#arch_binaries="$arch_binaries arm? ( http://code.haskell.org/~slyfox/ghc-arm/ghc-bin-${PV}-arm.tbz2 )" +arch_binaries="$arch_binaries amd64? ( http://code.haskell.org/~slyfox/ghc-amd64/ghc-bin-${PV}-amd64.tbz2 )" +#arch_binaries="$arch_binaries ia64? ( http://code.haskell.org/~slyfox/ghc-ia64/ghc-bin-${PV}-ia64-fixed-fiw.tbz2 )" +#arch_binaries="$arch_binaries ppc? ( http://code.haskell.org/~slyfox/ghc-ppc/ghc-bin-${PV}-ppc.tbz2 )" +#arch_binaries="$arch_binaries ppc64? ( http://code.haskell.org/~slyfox/ghc-ppc64/ghc-bin-${PV}-ppc64.tbz2 )" +#arch_binaries="$arch_binaries sparc? ( http://code.haskell.org/~slyfox/ghc-sparc/ghc-bin-${PV}-sparc.tbz2 )" +arch_binaries="$arch_binaries x86? ( http://code.haskell.org/~slyfox/ghc-x86/ghc-bin-${PV}-x86.tbz2 )" + +# various ports: +#arch_binaries="$arch_binaries x86-fbsd? ( http://code.haskell.org/~slyfox/ghc-x86-fbsd/ghc-bin-${PV}-x86-fbsd.tbz2 )" + +# 0 - yet +yet_binary() { + case "${ARCH}" in + #alpha) return 0 ;; + #arm) + # ewarn "ARM binary is built on armv5tel-eabi toolchain. Use with caution." + # return 0 + #;; + amd64) return 0 ;; + #ia64) return 0 ;; + #ppc) return 0 ;; + #ppc64) return 0 ;; + #sparc) return 0 ;; + x86) return 0 ;; + *) return 1 ;; + esac +} + +GHC_PV=${PV} +#GHC_PV=7.8.0.20140228 # uncomment only for -rc ebuilds +GHC_P=${PN}-${GHC_PV} # using ${P} is almost never correct + +SRC_URI="!binary? ( http://www.haskell.org/ghc/dist/${PV/_rc/-rc}/${GHC_P}-src.tar.xz )" +S="${WORKDIR}"/${GHC_P} + +[[ -n $arch_binaries ]] && SRC_URI+=" !ghcbootstrap? ( $arch_binaries )" +LICENSE="BSD" +SLOT="0/${PV}" +KEYWORDS="~amd64 ~x86 ~amd64-linux ~x86-linux" +IUSE="doc ghcbootstrap ghcmakebinary +gmp" +IUSE+=" binary" +IUSE+=" elibc_glibc" # system stuff + +RDEPEND=" + >=dev-lang/perl-5.6.1 + >=dev-libs/gmp-5:= + sys-libs/ncurses:=[unicode] + !ghcmakebinary? ( virtual/libffi:= ) + !kernel_Darwin? ( >=sys-devel/gcc-2.95.3 ) + kernel_linux? ( >=sys-devel/binutils-2.17 ) + kernel_SunOS? ( >=sys-devel/binutils-2.17 ) +" + +# force dependency on >=gmp-5, even if >=gmp-4.1 would be enough. this is due to +# that we want the binaries to use the latest versioun available, and not to be +# built against gmp-4 + +# similar for glibc. we have bootstrapped binaries against glibc-2.17 +DEPEND="${RDEPEND} + ghcbootstrap? ( + doc? ( app-text/docbook-xml-dtd:4.2 + app-text/docbook-xml-dtd:4.5 + app-text/docbook-xsl-stylesheets + >=dev-libs/libxslt-1.1.2 ) ) + !ghcbootstrap? ( !prefix? ( elibc_glibc? ( >=sys-libs/glibc-2.17 ) ) )" + +PDEPEND="!ghcbootstrap? ( =app-admin/haskell-updater-1.2* )" + +REQUIRED_USE="?? ( ghcbootstrap binary )" + +# yeah, top-level 'use' sucks. I'd like to have it in 'src_install()' +use binary && QA_PREBUILT="*" + +# haskell libraries built with cabal in configure mode, #515354 +QA_CONFIGURE_OPTIONS+=" --with-compiler --with-gcc" + +is_crosscompile() { + [[ ${CHOST} != ${CTARGET} ]] +} + +append-ghc-cflags() { + local persistent compile assemble link + local flag ghcflag + + for flag in $*; do + case ${flag} in + persistent) persistent="yes";; + compile) compile="yes";; + assemble) assemble="yes";; + link) link="yes";; + *) + [[ ${compile} ]] && ghcflag="-optc${flag}" CFLAGS+=" ${flag}" && GHC_FLAGS+=" ${ghcflag}" && + [[ ${persistent} ]] && GHC_PERSISTENT_FLAGS+=" ${ghcflag}" + [[ ${assemble} ]] && ghcflag="-opta${flag}" CFLAGS+=" ${flag}" && GHC_FLAGS+=" ${ghcflag}" && + [[ ${persistent} ]] && GHC_PERSISTENT_FLAGS+=" ${ghcflag}" + [[ ${link} ]] && ghcflag="-optl${flag}" LDFLAGS+=" ${flag}" && GHC_FLAGS+=" ${ghcflag}" && + [[ ${persistent} ]] && GHC_PERSISTENT_FLAGS+=" ${ghcflag}" + ;; + esac + done +} + +ghc_setup_cflags() { + if is_crosscompile; then + export CFLAGS=${GHC_CFLAGS-"-O2 -pipe"} + export LDFLAGS=${GHC_LDFLAGS-"-Wl,-O1"} + einfo "Crosscompiling mode:" + einfo " CHOST: ${CHOST}" + einfo " CTARGET: ${CTARGET}" + einfo " CFLAGS: ${CFLAGS}" + einfo " LDFLAGS: ${LDFLAGS}" + return + fi + # We need to be very careful with the CFLAGS we ask ghc to pass through to + # gcc. There are plenty of flags which will make gcc produce output that + # breaks ghc in various ways. The main ones we want to pass through are + # -mcpu / -march flags. These are important for arches like alpha & sparc. + # We also use these CFLAGS for building the C parts of ghc, ie the rts. + strip-flags + strip-unsupported-flags + + # Cmm can't parse line numbers #482086 + replace-flags -ggdb[3-9] -ggdb2 + + GHC_FLAGS="" + GHC_PERSISTENT_FLAGS="" + for flag in ${CFLAGS}; do + case ${flag} in + + # Ignore extra optimisation (ghc passes -O to gcc anyway) + # -O2 and above break on too many systems + -O*) ;; + + # Arch and ABI flags are what we're really after + -m*) append-ghc-cflags compile assemble ${flag};; + + # Sometimes it's handy to see backtrace of RTS + # to get an idea what happens there + -g*) append-ghc-cflags compile ${flag};; + + # Ignore all other flags, including all -f* flags + esac + done + + for flag in ${LDFLAGS}; do + append-ghc-cflags link ${flag} + done + + # hardened-gcc needs to be disabled, because the mangler doesn't accept + # its output. + gcc-specs-pie && append-ghc-cflags persistent compile link -nopie + gcc-specs-ssp && append-ghc-cflags persistent compile -fno-stack-protector + + # prevent from failind building unregisterised ghc: + # http://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg171602.html + use ppc64 && append-ghc-cflags persistent compile -mminimal-toc + # fix the similar issue as ppc64 TOC on ia64. ia64 has limited size of small data + # currently ghc fails to build haddock + # http://osdir.com/ml/gnu.binutils.bugs/2004-10/msg00050.html + use ia64 && append-ghc-cflags persistent compile -G0 -Os +} + +# substitutes string $1 to $2 in files $3 $4 ... +relocate_path() { + local from=$1 + local to=$2 + shift 2 + local file= + for file in "$@" + do + sed -i -e "s|$from|$to|g" \ + "$file" || die "path relocation failed for '$file'" + done +} + +# changes hardcoded ghc paths and updates package index +# $1 - new absolute root path +relocate_ghc() { + local to=$1 + + # libdir for prebuilt binary and for current system may mismatch + # It does for prefix installation for example: bug #476998 + local bin_ghc_prefix=${WORKDIR}/usr + local bin_libpath=$(echo "${bin_ghc_prefix}"/lib*) + local bin_libdir=${bin_libpath#${bin_ghc_prefix}/} + + # backup original script to use it later after relocation + local gp_back="${T}/ghc-pkg-${GHC_PV}-orig" + cp "${WORKDIR}/usr/bin/ghc-pkg-${GHC_PV}" "$gp_back" || die "unable to backup ghc-pkg wrapper" + + if [[ ${bin_libdir} != $(get_libdir) ]]; then + einfo "Relocating '${bin_libdir}' to '$(get_libdir)' (bug #476998)" + # moving the dir itself is not strictly needed + # but then USE=binary would result in installing + # in '${bin_libdir}' + mv "${bin_ghc_prefix}/${bin_libdir}" "${bin_ghc_prefix}/$(get_libdir)" || die + + relocate_path "/usr/${bin_libdir}" "/usr/$(get_libdir)" \ + "${WORKDIR}/usr/bin/ghc-${GHC_PV}" \ + "${WORKDIR}/usr/bin/ghci-${GHC_PV}" \ + "${WORKDIR}/usr/bin/ghc-pkg-${GHC_PV}" \ + "${WORKDIR}/usr/bin/hsc2hs" \ + "${WORKDIR}/usr/bin/runghc-${GHC_PV}" \ + "$gp_back" \ + "${WORKDIR}/usr/$(get_libdir)/${GHC_P}/package.conf.d/"* + fi + + # Relocate from /usr to ${EPREFIX}/usr + relocate_path "/usr" "${to}/usr" \ + "${WORKDIR}/usr/bin/ghc-${GHC_PV}" \ + "${WORKDIR}/usr/bin/ghci-${GHC_PV}" \ + "${WORKDIR}/usr/bin/ghc-pkg-${GHC_PV}" \ + "${WORKDIR}/usr/bin/hsc2hs" \ + "${WORKDIR}/usr/bin/runghc-${GHC_PV}" \ + "${WORKDIR}/usr/$(get_libdir)/${GHC_P}/package.conf.d/"* + + # this one we will use to regenerate cache + # so it should point to current tree location + relocate_path "/usr" "${WORKDIR}/usr" "$gp_back" + + if use prefix; then + # and insert LD_LIBRARY_PATH entry to EPREFIX dir tree + # TODO: add the same for darwin's CHOST and it's DYLD_ + local new_ldpath='LD_LIBRARY_PATH="'${EPREFIX}/$(get_libdir):${EPREFIX}/usr/$(get_libdir)'${LD_LIBRARY_PATH:+:}${LD_LIBRARY_PATH}"\nexport LD_LIBRARY_PATH' + sed -i -e '2i'"$new_ldpath" \ + "${WORKDIR}/usr/bin/ghc-${GHC_PV}" \ + "${WORKDIR}/usr/bin/ghci-${GHC_PV}" \ + "${WORKDIR}/usr/bin/ghc-pkg-${GHC_PV}" \ + "${WORKDIR}/usr/bin/hsc2hs" \ + "${WORKDIR}/usr/bin/runghc-${GHC_PV}" \ + "$gp_back" \ + "${WORKDIR}/usr/bin/hsc2hs" \ + || die "Adding LD_LIBRARY_PATH for wrappers failed" + fi + + # regenerate the binary package cache + "$gp_back" recache || die "failed to update cache after relocation" + rm "$gp_back" +} + +pkg_setup() { + if use ghcbootstrap; then + ewarn "You requested ghc bootstrapping, this is usually only used" + ewarn "by Gentoo developers to make binary .tbz2 packages." + + [[ -z $(type -P ghc) ]] && \ + die "Could not find a ghc to bootstrap with." + else + if ! yet_binary; then + eerror "Please try emerging with USE=ghcbootstrap and report build" + eerror "sucess or failure to the haskell team (haskell@gentoo.org)" + die "No binary available for '${ARCH}' arch yet, USE=ghcbootstrap" + fi + fi +} + +src_unpack() { + # Create the ${S} dir if we're using the binary version + use binary && mkdir "${S}" + + # the Solaris and Darwin binaries from ghc (maeder) need to be + # unpacked separately, so prevent them from being unpacked + local ONLYA=${A} + case ${CHOST} in + *-darwin* | *-solaris*) ONLYA=${GHC_P}-src.tar.bz2 ;; + esac + unpack ${ONLYA} + + if [[ -d "${S}"/libraries/dph ]]; then + # Sometimes dph libs get accidentally shipped with ghc + # but they are not installed unless user requests it. + # We never install them. + elog "Removing 'libraries/dph'" + rm -rf "${S}"/libraries/dph + fi +} + +src_prepare() { + ghc_setup_cflags + + if ! use ghcbootstrap && [[ ${CHOST} != *-darwin* && ${CHOST} != *-solaris* ]]; then + # Modify the wrapper script from the binary tarball to use GHC_PERSISTENT_FLAGS. + # See bug #313635. + sed -i -e "s|\"\$topdir\"|\"\$topdir\" ${GHC_PERSISTENT_FLAGS}|" \ + "${WORKDIR}/usr/bin/ghc-${GHC_PV}" + + # allow hardened users use vanilla binary to bootstrap ghc + # ghci uses mmap with rwx protection at it implements dynamic + # linking on it's own (bug #299709) + pax-mark -m "${WORKDIR}/usr/$(get_libdir)/${GHC_P}/bin/ghc" + fi + + if use binary; then + if use prefix; then + relocate_ghc "${EPREFIX}" + fi + + # Move unpacked files to the expected place + mv "${WORKDIR}/usr" "${S}" + else + if ! use ghcbootstrap; then + case ${CHOST} in + *-darwin* | *-solaris*) + # UPDATE ME for ghc-7 + mkdir "${WORKDIR}"/ghc-bin-installer || die + pushd "${WORKDIR}"/ghc-bin-installer > /dev/null || die + use sparc-solaris && unpack ghc-6.10.4-sparc-sun-solaris2.tar.bz2 + use x86-solaris && unpack ghc-7.0.3-i386-unknown-solaris2.tar.bz2 + use x86-macos && unpack ghc-7.4.1-i386-apple-darwin.tar.bz2 + use x64-macos && unpack ghc-7.4.1-x86_64-apple-darwin.tar.bz2 + popd > /dev/null + + pushd "${WORKDIR}"/ghc-bin-installer/ghc-[67].?*.? > /dev/null || die + # fix the binaries so they run, on Solaris we need an + # LD_LIBRARY_PATH which has our prefix libdirs, on + # Darwin we need to replace the frameworks with our libs + # from the prefix fix before installation, because some + # of the tools are actually used during configure/make + if [[ ${CHOST} == *-solaris* ]] ; then + export LD_LIBRARY_PATH="${EPREFIX}/$(get_libdir):${EPREFIX}/usr/$(get_libdir):${LD_LIBRARY_PATH}" + elif [[ ${CHOST} == *-darwin* ]] ; then + local readline_framework=GNUreadline.framework/GNUreadline + local gmp_framework=/opt/local/lib/libgmp.10.dylib + local ncurses_file=/opt/local/lib/libncurses.5.dylib + for binary in $(scanmacho -BRE MH_EXECUTE -F '%F' .) ; do + install_name_tool -change \ + ${readline_framework} \ + "${EPREFIX}"/lib/libreadline.dylib \ + ${binary} || die + install_name_tool -change \ + ${gmp_framework} \ + "${EPREFIX}"/usr/lib/libgmp.dylib \ + ${binary} || die + install_name_tool -change \ + ${ncurses_file} \ + "${EPREFIX}"/usr/lib/libncurses.dylib \ + ${binary} || die + done + # we don't do frameworks! + sed -i \ + -e 's/\(frameworks = \)\["GMP"\]/\1[]/g' \ + -e 's/\(extraLibraries = \)\["m"\]/\1["m","gmp"]/g' \ + rts/package.conf.in || die + fi + + # it is autoconf, but we really don't want to give it too + # much arguments, in fact we do the make in-place anyway + ./configure --prefix="${WORKDIR}"/usr || die + make install || die + popd > /dev/null + ;; + *) + relocate_ghc "${WORKDIR}" + ;; + esac + fi + + sed -i -e "s|\"\$topdir\"|\"\$topdir\" ${GHC_PERSISTENT_FLAGS}|" \ + "${S}/ghc/ghc.wrapper" + + cd "${S}" # otherwise epatch will break + + epatch "${FILESDIR}"/${PN}-7.0.4-CHOST-prefix.patch + + epatch "${FILESDIR}"/${PN}-7.8.1_rc1-libbfd.patch + + epatch "${FILESDIR}"/${PN}-7.8.2-cgen-constify.patch + epatch "${FILESDIR}"/${PN}-7.8.3-prim-lm.patch + # bug 518734 + epatch "${FILESDIR}"/${PN}-7.6.3-preserve-inplace-xattr.patch + epatch "${FILESDIR}"/${PN}-7.8.3-unreg-lit.patch + + # upstream backports + epatch "${FILESDIR}"/${PN}-7.8.3-linker-warn.patch + epatch "${FILESDIR}"/${PN}-7.8.3-deRefStablePtr.patch + epatch "${FILESDIR}"/${PN}-7.8.3-pic-asm.patch + epatch "${FILESDIR}"/${PN}-7.8.3-pic-sparc.patch + epatch "${FILESDIR}"/${PN}-7.8.3-cc-lang.patch + epatch "${FILESDIR}"/${PN}-7.8.3-ia64-prim.patch + + if use prefix; then + # Make configure find docbook-xsl-stylesheets from Prefix + sed -e '/^FP_DIR_DOCBOOK_XSL/s:\[.*\]:['"${EPREFIX}"'/usr/share/sgml/docbook/xsl-stylesheets/]:' \ + -i utils/haddock/doc/configure.ac || die + fi + + # as we have changed the build system + eautoreconf + fi +} + +src_configure() { + if ! use binary; then + # initialize build.mk + echo '# Gentoo changes' > mk/build.mk + + # Put docs into the right place, ie /usr/share/doc/ghc-${GHC_PV} + echo "docdir = ${EPREFIX}/usr/share/doc/${P}" >> mk/build.mk + echo "htmldir = ${EPREFIX}/usr/share/doc/${P}" >> mk/build.mk + + # We also need to use the GHC_FLAGS flags when building ghc itself + echo "SRC_HC_OPTS+=${GHC_FLAGS}" >> mk/build.mk + echo "SRC_CC_OPTS+=${CFLAGS}" >> mk/build.mk + echo "SRC_LD_OPTS+=${LDFLAGS}" >> mk/build.mk + + # We can't depend on haddock except when bootstrapping when we + # must build docs and include them into the binary .tbz2 package + # app-text/dblatex is not in portage, can not build PDF or PS + if use ghcbootstrap && use doc; then + echo "BUILD_DOCBOOK_PDF = NO" >> mk/build.mk + echo "BUILD_DOCBOOK_PS = NO" >> mk/build.mk + echo "BUILD_DOCBOOK_HTML = YES" >> mk/build.mk + echo "HADDOCK_DOCS = YES" >> mk/build.mk + else + echo "BUILD_DOCBOOK_PDF = NO" >> mk/build.mk + echo "BUILD_DOCBOOK_PS = NO" >> mk/build.mk + echo "BUILD_DOCBOOK_HTML = NO" >> mk/build.mk + echo "HADDOCK_DOCS = NO" >> mk/build.mk + fi + + # allows overriding build flavours for libraries: + # v - vanilla (static libs) + # p - profiled + # dyn - shared libraries + # example: GHC_LIBRARY_WAYS="v dyn" + if [[ -n ${GHC_LIBRARY_WAYS} ]]; then + echo "GhcLibWays=${GHC_LIBRARY_WAYS}" >> mk/build.mk + fi + + # Get ghc from the unpacked binary .tbz2 + # except when bootstrapping we just pick ghc up off the path + if ! use ghcbootstrap; then + export PATH="${WORKDIR}/usr/bin:${PATH}" + fi + + if use gmp; then + echo "INTEGER_LIBRARY=integer-gmp" >> mk/build.mk + else + echo "INTEGER_LIBRARY=integer-simple" >> mk/build.mk + fi + + # don't strip anything. Very useful when stage2 SIGSEGVs on you + echo "STRIP_CMD = :" >> mk/build.mk + + local econf_args=() + + # GHC embeds 'gcc' it was built by and uses it later. + # Don't allow things like ccache or versioned binary slip. + # We use stable thing across gcc upgrades. + is_crosscompile || econf_args+=(--with-gcc=${CHOST}-gcc) + + if ! use ghcmakebinary; then + econf_args+=(--with-system-libffi) + econf_args+=(--with-ffi-includes=$(pkg-config libffi --cflags-only-I | sed -e 's@^-I@@')) + fi + + econf ${econf_args[@]} --enable-bootstrap-with-devel-snapshot + + if [[ ${PV} == *9999* ]]; then + GHC_PV="$(grep 'S\[\"PACKAGE_VERSION\"\]' config.status | sed -e 's@^.*=\"\(.*\)\"@\1@')" + GHC_P=${PN}-${GHC_PV} + fi + GHC_TPF="$(grep 'S\[\"TargetPlatformFull\"\]' config.status | sed -e 's@^.*=\"\(.*\)\"@\1@')" + fi # ! use binary +} + +src_compile() { + if ! use binary; then + # 1. build compiler binary first + emake ghc/stage2/build/tmp/ghc-stage2 + # 2. pax-mark (bug #516430) + pax-mark -m ghc/stage2/build/tmp/ghc-stage2 + # 3. and then all the rest + emake all + fi # ! use binary +} + +src_install() { + if use binary; then + use prefix && mkdir -p "${ED}" + mv "${S}/usr" "${ED}" + + # Remove the docs if not requested + if ! use doc; then + rm -rf "${ED}/usr/share/doc/${P}/*/" \ + "${ED}/usr/share/doc/${P}/*.html" \ + || die "could not remove docs (P vs PF revision mismatch?)" + fi + else + # We only build docs if we were bootstrapping, otherwise + # we copy them out of the unpacked binary .tbz2 + if use doc && ! use ghcbootstrap; then + mkdir -p "${ED}/usr/share/doc" + mv "${WORKDIR}/usr/share/doc/${P}" "${ED}/usr/share/doc" \ + || die "failed to copy docs" + else + dodoc "${S}/distrib/README" "${S}/ANNOUNCE" "${S}/LICENSE" "${S}/VERSION" + fi + + emake -j1 install DESTDIR="${D}" + + # remove link, but leave 'haddock-${GHC_P}' + rm -f "${ED}"/usr/bin/haddock + + if [[ ! -f "${S}/VERSION" ]]; then + echo "${GHC_PV}" > "${S}/VERSION" \ + || die "Could not create file ${S}/VERSION" + fi + dobashcomp "${FILESDIR}/ghc-bash-completion" + + fi + + # path to the package.cache + local package_confdir="${ED}/usr/$(get_libdir)/${GHC_P}/package.conf.d" + PKGCACHE="${package_confdir}"/package.cache + # copy the package.conf.d, including timestamp, save it so we can help + # users that have a broken package.conf.d + cp -pR "${package_confdir}"{,.initial} || die "failed to backup intial package.conf.d" + + # copy the package.conf, including timestamp, save it so we later can put it + # back before uninstalling, or when upgrading. + cp -p "${PKGCACHE}"{,.shipped} \ + || die "failed to copy package.conf.d/package.cache" +} + +pkg_preinst() { + # have we got an earlier version of ghc installed? + if has_version "<${CATEGORY}/${PF}"; then + haskell_updater_warn="1" + fi +} + +pkg_postinst() { + ghc-reregister + + # path to the package.cache + PKGCACHE="${EROOT}/usr/$(get_libdir)/${GHC_P}/package.conf.d/package.cache" + + # give the cache a new timestamp, it must be as recent as + # the package.conf.d directory. + touch "${PKGCACHE}" + + if [[ "${haskell_updater_warn}" == "1" ]]; then + ewarn + ewarn "\e[1;31m************************************************************************\e[0m" + ewarn + ewarn "You have just upgraded from an older version of GHC." + ewarn "You may have to run" + ewarn " 'haskell-updater --upgrade'" + ewarn "to rebuild all ghc-based Haskell libraries." + ewarn + ewarn "\e[1;31m************************************************************************\e[0m" + ewarn + fi +} + +pkg_prerm() { + # Be very careful here... Call order when upgrading is (according to PMS): + # * src_install for new package + # * pkg_preinst for new package + # * pkg_postinst for new package + # * pkg_prerm for the package being replaced + # * pkg_postrm for the package being replaced + # so you'll actually be touching the new packages files, not the one you + # uninstall, due to that or installation directory ${GHC_P} will be the same for + # both packages. + + # Call order for reinstalling is (according to PMS): + # * src_install + # * pkg_preinst + # * pkg_prerm for the package being replaced + # * pkg_postrm for the package being replaced + # * pkg_postinst + + # Overwrite the modified package.cache with a copy of the + # original one, so that it will be removed during uninstall. + + PKGCACHE="${EROOT}/usr/$(get_libdir)/${GHC_P}/package.conf.d/package.cache" + rm -rf "${PKGCACHE}" + + cp -p "${PKGCACHE}"{.shipped,} +} + +pkg_postrm() { + ghc-package_pkg_postrm +} diff --git a/dev-lang/ghc/ghc-7.8.4.ebuild b/dev-lang/ghc/ghc-7.8.4.ebuild new file mode 100644 index 000000000000..729fafe44fc2 --- /dev/null +++ b/dev-lang/ghc/ghc-7.8.4.ebuild @@ -0,0 +1,618 @@ +# Copyright 1999-2015 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id$ + +EAPI=5 + +# to make make a crosscompiler use crossdev and symlink ghc tree into +# cross overlay. result would look like 'cross-sparc-unknown-linux-gnu/ghc' +# +# 'CTARGET' definition and 'is_crosscompile' are taken from 'toolchain.eclass' +export CTARGET=${CTARGET:-${CHOST}} +if [[ ${CTARGET} = ${CHOST} ]] ; then + if [[ ${CATEGORY/cross-} != ${CATEGORY} ]] ; then + export CTARGET=${CATEGORY/cross-} + fi +fi + +inherit autotools bash-completion-r1 eutils flag-o-matic ghc-package +inherit multilib pax-utils toolchain-funcs versionator + +DESCRIPTION="The Glasgow Haskell Compiler" +HOMEPAGE="http://www.haskell.org/ghc/" + +# we don't have any binaries yet +arch_binaries="" + +# sorted! +arch_binaries="$arch_binaries alpha? ( http://code.haskell.org/~slyfox/ghc-alpha/ghc-bin-${PV}-alpha.tbz2 )" +#arch_binaries="$arch_binaries arm? ( http://code.haskell.org/~slyfox/ghc-arm/ghc-bin-${PV}-arm.tbz2 )" +arch_binaries="$arch_binaries amd64? ( http://code.haskell.org/~slyfox/ghc-amd64/ghc-bin-${PV}-amd64.tbz2 )" +arch_binaries="$arch_binaries ia64? ( http://code.haskell.org/~slyfox/ghc-ia64/ghc-bin-${PV}-ia64.tbz2 )" +arch_binaries="$arch_binaries ppc? ( http://code.haskell.org/~slyfox/ghc-ppc/ghc-bin-${PV}-ppc.tbz2 )" +arch_binaries="$arch_binaries ppc64? ( http://code.haskell.org/~slyfox/ghc-ppc64/ghc-bin-${PV}-ppc64.tbz2 )" +arch_binaries="$arch_binaries sparc? ( http://code.haskell.org/~slyfox/ghc-sparc/ghc-bin-${PV}-sparc.tbz2 )" +arch_binaries="$arch_binaries x86? ( http://code.haskell.org/~slyfox/ghc-x86/ghc-bin-${PV}-x86.tbz2 )" + +# various ports: +#arch_binaries="$arch_binaries x86-fbsd? ( http://code.haskell.org/~slyfox/ghc-x86-fbsd/ghc-bin-${PV}-x86-fbsd.tbz2 )" + +# 0 - yet +yet_binary() { + case "${ARCH}" in + alpha) return 0 ;; + #arm) + # ewarn "ARM binary is built on armv5tel-eabi toolchain. Use with caution." + # return 0 + #;; + amd64) return 0 ;; + ia64) return 0 ;; + ppc) return 0 ;; + ppc64) return 0 ;; + sparc) return 0 ;; + x86) return 0 ;; + *) return 1 ;; + esac +} + +GHC_PV=${PV} +#GHC_PV=7.8.3.20141119 # uncomment only for -rc ebuilds +GHC_P=${PN}-${GHC_PV} # using ${P} is almost never correct + +SRC_URI="!binary? ( http://downloads.haskell.org/~ghc/${PV/_rc/-rc}/${GHC_P}-src.tar.bz2 )" +S="${WORKDIR}"/${GHC_P} + +[[ -n $arch_binaries ]] && SRC_URI+=" !ghcbootstrap? ( $arch_binaries )" +SRC_URI+=" http://dev.gentoo.org/~slyfox/distfiles/${P}-ia64-CLOSUREs-regenerated.patch.gz" +LICENSE="BSD" +SLOT="0/${PV}" +KEYWORDS="~alpha ~amd64 ~ia64 ~ppc ~ppc64 ~sparc ~x86 ~amd64-linux ~x86-linux" +IUSE="doc ghcbootstrap ghcmakebinary +gmp" +IUSE+=" binary" +IUSE+=" elibc_glibc" # system stuff + +RDEPEND=" + >=dev-lang/perl-5.6.1 + >=dev-libs/gmp-5:= + sys-libs/ncurses:=[unicode] + !ghcmakebinary? ( virtual/libffi:= ) + !kernel_Darwin? ( >=sys-devel/gcc-2.95.3 ) + kernel_linux? ( >=sys-devel/binutils-2.17 ) + kernel_SunOS? ( >=sys-devel/binutils-2.17 ) +" + +# force dependency on >=gmp-5, even if >=gmp-4.1 would be enough. this is due to +# that we want the binaries to use the latest versioun available, and not to be +# built against gmp-4 + +# similar for glibc. we have bootstrapped binaries against glibc-2.17 +DEPEND="${RDEPEND} + ghcbootstrap? ( + doc? ( app-text/docbook-xml-dtd:4.2 + app-text/docbook-xml-dtd:4.5 + app-text/docbook-xsl-stylesheets + >=dev-libs/libxslt-1.1.2 ) ) + !ghcbootstrap? ( !prefix? ( elibc_glibc? ( >=sys-libs/glibc-2.17 ) ) )" + +PDEPEND="!ghcbootstrap? ( =app-admin/haskell-updater-1.2* )" + +REQUIRED_USE="?? ( ghcbootstrap binary )" + +# yeah, top-level 'use' sucks. I'd like to have it in 'src_install()' +use binary && QA_PREBUILT="*" + +# haskell libraries built with cabal in configure mode, #515354 +QA_CONFIGURE_OPTIONS+=" --with-compiler --with-gcc" + +is_crosscompile() { + [[ ${CHOST} != ${CTARGET} ]] +} + +append-ghc-cflags() { + local persistent compile assemble link + local flag ghcflag + + for flag in $*; do + case ${flag} in + persistent) persistent="yes";; + compile) compile="yes";; + assemble) assemble="yes";; + link) link="yes";; + *) + [[ ${compile} ]] && ghcflag="-optc${flag}" CFLAGS+=" ${flag}" && GHC_FLAGS+=" ${ghcflag}" && + [[ ${persistent} ]] && GHC_PERSISTENT_FLAGS+=" ${ghcflag}" + [[ ${assemble} ]] && ghcflag="-opta${flag}" CFLAGS+=" ${flag}" && GHC_FLAGS+=" ${ghcflag}" && + [[ ${persistent} ]] && GHC_PERSISTENT_FLAGS+=" ${ghcflag}" + [[ ${link} ]] && ghcflag="-optl${flag}" LDFLAGS+=" ${flag}" && GHC_FLAGS+=" ${ghcflag}" && + [[ ${persistent} ]] && GHC_PERSISTENT_FLAGS+=" ${ghcflag}" + ;; + esac + done +} + +ghc_setup_cflags() { + if is_crosscompile; then + export CFLAGS=${GHC_CFLAGS-"-O2 -pipe"} + export LDFLAGS=${GHC_LDFLAGS-"-Wl,-O1"} + einfo "Crosscompiling mode:" + einfo " CHOST: ${CHOST}" + einfo " CTARGET: ${CTARGET}" + einfo " CFLAGS: ${CFLAGS}" + einfo " LDFLAGS: ${LDFLAGS}" + return + fi + # We need to be very careful with the CFLAGS we ask ghc to pass through to + # gcc. There are plenty of flags which will make gcc produce output that + # breaks ghc in various ways. The main ones we want to pass through are + # -mcpu / -march flags. These are important for arches like alpha & sparc. + # We also use these CFLAGS for building the C parts of ghc, ie the rts. + strip-flags + strip-unsupported-flags + + # Cmm can't parse line numbers #482086 + replace-flags -ggdb[3-9] -ggdb2 + + GHC_FLAGS="" + GHC_PERSISTENT_FLAGS="" + for flag in ${CFLAGS}; do + case ${flag} in + + # Ignore extra optimisation (ghc passes -O to gcc anyway) + # -O2 and above break on too many systems + -O*) ;; + + # Arch and ABI flags are what we're really after + -m*) append-ghc-cflags compile assemble ${flag};; + + # Sometimes it's handy to see backtrace of RTS + # to get an idea what happens there + -g*) append-ghc-cflags compile ${flag};; + + # Ignore all other flags, including all -f* flags + esac + done + + for flag in ${LDFLAGS}; do + append-ghc-cflags link ${flag} + done + + # hardened-gcc needs to be disabled, because the mangler doesn't accept + # its output. + gcc-specs-pie && append-ghc-cflags persistent compile link -nopie + gcc-specs-ssp && append-ghc-cflags persistent compile -fno-stack-protector + + # prevent from failind building unregisterised ghc: + # http://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg171602.html + use ppc64 && append-ghc-cflags persistent compile -mminimal-toc + # fix the similar issue as ppc64 TOC on ia64. ia64 has limited size of small data + # currently ghc fails to build haddock + # http://osdir.com/ml/gnu.binutils.bugs/2004-10/msg00050.html + use ia64 && append-ghc-cflags persistent compile -G0 +} + +# substitutes string $1 to $2 in files $3 $4 ... +relocate_path() { + local from=$1 + local to=$2 + shift 2 + local file= + for file in "$@" + do + sed -i -e "s|$from|$to|g" \ + "$file" || die "path relocation failed for '$file'" + done +} + +# changes hardcoded ghc paths and updates package index +# $1 - new absolute root path +relocate_ghc() { + local to=$1 + + # libdir for prebuilt binary and for current system may mismatch + # It does for prefix installation for example: bug #476998 + local bin_ghc_prefix=${WORKDIR}/usr + local bin_libpath=$(echo "${bin_ghc_prefix}"/lib*) + local bin_libdir=${bin_libpath#${bin_ghc_prefix}/} + + # backup original script to use it later after relocation + local gp_back="${T}/ghc-pkg-${GHC_PV}-orig" + cp "${WORKDIR}/usr/bin/ghc-pkg-${GHC_PV}" "$gp_back" || die "unable to backup ghc-pkg wrapper" + + if [[ ${bin_libdir} != $(get_libdir) ]]; then + einfo "Relocating '${bin_libdir}' to '$(get_libdir)' (bug #476998)" + # moving the dir itself is not strictly needed + # but then USE=binary would result in installing + # in '${bin_libdir}' + mv "${bin_ghc_prefix}/${bin_libdir}" "${bin_ghc_prefix}/$(get_libdir)" || die + + relocate_path "/usr/${bin_libdir}" "/usr/$(get_libdir)" \ + "${WORKDIR}/usr/bin/ghc-${GHC_PV}" \ + "${WORKDIR}/usr/bin/ghci-${GHC_PV}" \ + "${WORKDIR}/usr/bin/ghc-pkg-${GHC_PV}" \ + "${WORKDIR}/usr/bin/hsc2hs" \ + "${WORKDIR}/usr/bin/runghc-${GHC_PV}" \ + "$gp_back" \ + "${WORKDIR}/usr/$(get_libdir)/${GHC_P}/package.conf.d/"* + fi + + # Relocate from /usr to ${EPREFIX}/usr + relocate_path "/usr" "${to}/usr" \ + "${WORKDIR}/usr/bin/ghc-${GHC_PV}" \ + "${WORKDIR}/usr/bin/ghci-${GHC_PV}" \ + "${WORKDIR}/usr/bin/ghc-pkg-${GHC_PV}" \ + "${WORKDIR}/usr/bin/hsc2hs" \ + "${WORKDIR}/usr/bin/runghc-${GHC_PV}" \ + "${WORKDIR}/usr/$(get_libdir)/${GHC_P}/package.conf.d/"* + + # this one we will use to regenerate cache + # so it should point to current tree location + relocate_path "/usr" "${WORKDIR}/usr" "$gp_back" + + if use prefix; then + # and insert LD_LIBRARY_PATH entry to EPREFIX dir tree + # TODO: add the same for darwin's CHOST and it's DYLD_ + local new_ldpath='LD_LIBRARY_PATH="'${EPREFIX}/$(get_libdir):${EPREFIX}/usr/$(get_libdir)'${LD_LIBRARY_PATH:+:}${LD_LIBRARY_PATH}"\nexport LD_LIBRARY_PATH' + sed -i -e '2i'"$new_ldpath" \ + "${WORKDIR}/usr/bin/ghc-${GHC_PV}" \ + "${WORKDIR}/usr/bin/ghci-${GHC_PV}" \ + "${WORKDIR}/usr/bin/ghc-pkg-${GHC_PV}" \ + "${WORKDIR}/usr/bin/hsc2hs" \ + "${WORKDIR}/usr/bin/runghc-${GHC_PV}" \ + "$gp_back" \ + "${WORKDIR}/usr/bin/hsc2hs" \ + || die "Adding LD_LIBRARY_PATH for wrappers failed" + fi + + # regenerate the binary package cache + "$gp_back" recache || die "failed to update cache after relocation" + rm "$gp_back" +} + +pkg_setup() { + [[ ${MERGE_TYPE} == binary ]] && return + + if use ghcbootstrap; then + ewarn "You requested ghc bootstrapping, this is usually only used" + ewarn "by Gentoo developers to make binary .tbz2 packages." + + [[ -z $(type -P ghc) ]] && \ + die "Could not find a ghc to bootstrap with." + else + if ! yet_binary; then + eerror "Please try emerging with USE=ghcbootstrap and report build" + eerror "sucess or failure to the haskell team (haskell@gentoo.org)" + die "No binary available for '${ARCH}' arch yet, USE=ghcbootstrap" + fi + fi +} + +src_unpack() { + # Create the ${S} dir if we're using the binary version + use binary && mkdir "${S}" + + # the Solaris and Darwin binaries from ghc (maeder) need to be + # unpacked separately, so prevent them from being unpacked + local ONLYA=${A} + case ${CHOST} in + *-darwin* | *-solaris*) ONLYA=${GHC_P}-src.tar.bz2 ;; + esac + unpack ${ONLYA} + + if [[ -d "${S}"/libraries/dph ]]; then + # Sometimes dph libs get accidentally shipped with ghc + # but they are not installed unless user requests it. + # We never install them. + elog "Removing 'libraries/dph'" + rm -rf "${S}"/libraries/dph + fi +} + +src_prepare() { + ghc_setup_cflags + + if ! use ghcbootstrap && [[ ${CHOST} != *-darwin* && ${CHOST} != *-solaris* ]]; then + # Modify the wrapper script from the binary tarball to use GHC_PERSISTENT_FLAGS. + # See bug #313635. + sed -i -e "s|\"\$topdir\"|\"\$topdir\" ${GHC_PERSISTENT_FLAGS}|" \ + "${WORKDIR}/usr/bin/ghc-${GHC_PV}" + + # allow hardened users use vanilla binary to bootstrap ghc + # ghci uses mmap with rwx protection at it implements dynamic + # linking on it's own (bug #299709) + pax-mark -m "${WORKDIR}/usr/$(get_libdir)/${GHC_P}/bin/ghc" + fi + + if use binary; then + if use prefix; then + relocate_ghc "${EPREFIX}" + fi + + # Move unpacked files to the expected place + mv "${WORKDIR}/usr" "${S}" + else + if ! use ghcbootstrap; then + case ${CHOST} in + *-darwin* | *-solaris*) + # UPDATE ME for ghc-7 + mkdir "${WORKDIR}"/ghc-bin-installer || die + pushd "${WORKDIR}"/ghc-bin-installer > /dev/null || die + use sparc-solaris && unpack ghc-6.10.4-sparc-sun-solaris2.tar.bz2 + use x86-solaris && unpack ghc-7.0.3-i386-unknown-solaris2.tar.bz2 + use x86-macos && unpack ghc-7.4.1-i386-apple-darwin.tar.bz2 + use x64-macos && unpack ghc-7.4.1-x86_64-apple-darwin.tar.bz2 + popd > /dev/null + + pushd "${WORKDIR}"/ghc-bin-installer/ghc-[67].?*.? > /dev/null || die + # fix the binaries so they run, on Solaris we need an + # LD_LIBRARY_PATH which has our prefix libdirs, on + # Darwin we need to replace the frameworks with our libs + # from the prefix fix before installation, because some + # of the tools are actually used during configure/make + if [[ ${CHOST} == *-solaris* ]] ; then + export LD_LIBRARY_PATH="${EPREFIX}/$(get_libdir):${EPREFIX}/usr/$(get_libdir):${LD_LIBRARY_PATH}" + elif [[ ${CHOST} == *-darwin* ]] ; then + local readline_framework=GNUreadline.framework/GNUreadline + local gmp_framework=/opt/local/lib/libgmp.10.dylib + local ncurses_file=/opt/local/lib/libncurses.5.dylib + for binary in $(scanmacho -BRE MH_EXECUTE -F '%F' .) ; do + install_name_tool -change \ + ${readline_framework} \ + "${EPREFIX}"/lib/libreadline.dylib \ + ${binary} || die + install_name_tool -change \ + ${gmp_framework} \ + "${EPREFIX}"/usr/lib/libgmp.dylib \ + ${binary} || die + install_name_tool -change \ + ${ncurses_file} \ + "${EPREFIX}"/usr/lib/libncurses.dylib \ + ${binary} || die + done + # we don't do frameworks! + sed -i \ + -e 's/\(frameworks = \)\["GMP"\]/\1[]/g' \ + -e 's/\(extraLibraries = \)\["m"\]/\1["m","gmp"]/g' \ + rts/package.conf.in || die + fi + + # it is autoconf, but we really don't want to give it too + # much arguments, in fact we do the make in-place anyway + ./configure --prefix="${WORKDIR}"/usr || die + make install || die + popd > /dev/null + ;; + *) + relocate_ghc "${WORKDIR}" + ;; + esac + fi + + sed -i -e "s|\"\$topdir\"|\"\$topdir\" ${GHC_PERSISTENT_FLAGS}|" \ + "${S}/ghc/ghc.wrapper" + + cd "${S}" # otherwise epatch will break + + epatch "${FILESDIR}"/${PN}-7.0.4-CHOST-prefix.patch + + epatch "${FILESDIR}"/${PN}-7.8.1_rc1-libbfd.patch + + epatch "${FILESDIR}"/${PN}-7.8.2-cgen-constify.patch + epatch "${FILESDIR}"/${PN}-7.8.3-prim-lm.patch + # bug 518734 + epatch "${FILESDIR}"/${PN}-7.6.3-preserve-inplace-xattr.patch + # fix threaded runtime on ia64 + epatch "${FILESDIR}"/${PN}-7.8.4-ia64-CLOSUREs.patch + epatch "${WORKDIR}"/${PN}-7.8.4-ia64-CLOSUREs-regenerated.patch + + # upstream backports + epatch "${FILESDIR}"/${PN}-7.8.3-linker-warn.patch + epatch "${FILESDIR}"/${PN}-7.8.3-pic-sparc.patch + epatch "${FILESDIR}"/${PN}-7.8.3-ppc32-fPIC.patch + epatch "${FILESDIR}"/${PN}-7.8.4-gold.patch + + if use prefix; then + # Make configure find docbook-xsl-stylesheets from Prefix + sed -e '/^FP_DIR_DOCBOOK_XSL/s:\[.*\]:['"${EPREFIX}"'/usr/share/sgml/docbook/xsl-stylesheets/]:' \ + -i utils/haddock/doc/configure.ac || die + fi + + # as we have changed the build system + eautoreconf + fi +} + +src_configure() { + if ! use binary; then + # initialize build.mk + echo '# Gentoo changes' > mk/build.mk + + # Put docs into the right place, ie /usr/share/doc/ghc-${GHC_PV} + echo "docdir = ${EPREFIX}/usr/share/doc/${P}" >> mk/build.mk + echo "htmldir = ${EPREFIX}/usr/share/doc/${P}" >> mk/build.mk + + # We also need to use the GHC_FLAGS flags when building ghc itself + echo "SRC_HC_OPTS+=${GHC_FLAGS}" >> mk/build.mk + echo "SRC_CC_OPTS+=${CFLAGS}" >> mk/build.mk + echo "SRC_LD_OPTS+=${LDFLAGS}" >> mk/build.mk + + # We can't depend on haddock except when bootstrapping when we + # must build docs and include them into the binary .tbz2 package + # app-text/dblatex is not in portage, can not build PDF or PS + if use ghcbootstrap && use doc; then + echo "BUILD_DOCBOOK_PDF = NO" >> mk/build.mk + echo "BUILD_DOCBOOK_PS = NO" >> mk/build.mk + echo "BUILD_DOCBOOK_HTML = YES" >> mk/build.mk + echo "HADDOCK_DOCS = YES" >> mk/build.mk + else + echo "BUILD_DOCBOOK_PDF = NO" >> mk/build.mk + echo "BUILD_DOCBOOK_PS = NO" >> mk/build.mk + echo "BUILD_DOCBOOK_HTML = NO" >> mk/build.mk + echo "HADDOCK_DOCS = NO" >> mk/build.mk + fi + + # allows overriding build flavours for libraries: + # v - vanilla (static libs) + # p - profiled + # dyn - shared libraries + # example: GHC_LIBRARY_WAYS="v dyn" + if [[ -n ${GHC_LIBRARY_WAYS} ]]; then + echo "GhcLibWays=${GHC_LIBRARY_WAYS}" >> mk/build.mk + fi + + # Get ghc from the unpacked binary .tbz2 + # except when bootstrapping we just pick ghc up off the path + if ! use ghcbootstrap; then + export PATH="${WORKDIR}/usr/bin:${PATH}" + fi + + if use gmp; then + echo "INTEGER_LIBRARY=integer-gmp" >> mk/build.mk + else + echo "INTEGER_LIBRARY=integer-simple" >> mk/build.mk + fi + + # don't strip anything. Very useful when stage2 SIGSEGVs on you + echo "STRIP_CMD = :" >> mk/build.mk + + local econf_args=() + + # GHC embeds 'gcc' it was built by and uses it later. + # Don't allow things like ccache or versioned binary slip. + # We use stable thing across gcc upgrades. + is_crosscompile || econf_args+=(--with-gcc=${CHOST}-gcc) + + if ! use ghcmakebinary; then + econf_args+=(--with-system-libffi) + econf_args+=(--with-ffi-includes=$(pkg-config libffi --cflags-only-I | sed -e 's@^-I@@')) + fi + + econf ${econf_args[@]} --enable-bootstrap-with-devel-snapshot + + if [[ ${PV} == *9999* ]]; then + GHC_PV="$(grep 'S\[\"PACKAGE_VERSION\"\]' config.status | sed -e 's@^.*=\"\(.*\)\"@\1@')" + GHC_P=${PN}-${GHC_PV} + fi + GHC_TPF="$(grep 'S\[\"TargetPlatformFull\"\]' config.status | sed -e 's@^.*=\"\(.*\)\"@\1@')" + fi # ! use binary +} + +src_compile() { + if ! use binary; then + # 1. build compiler binary first + emake ghc/stage2/build/tmp/ghc-stage2 + # 2. pax-mark (bug #516430) + pax-mark -m ghc/stage2/build/tmp/ghc-stage2 + # 3. and then all the rest + emake all + fi # ! use binary +} + +src_install() { + if use binary; then + use prefix && mkdir -p "${ED}" + mv "${S}/usr" "${ED}" + + # Remove the docs if not requested + if ! use doc; then + rm -rf "${ED}/usr/share/doc/${P}/*/" \ + "${ED}/usr/share/doc/${P}/*.html" \ + || die "could not remove docs (P vs PF revision mismatch?)" + fi + else + # We only build docs if we were bootstrapping, otherwise + # we copy them out of the unpacked binary .tbz2 + if use doc && ! use ghcbootstrap; then + mkdir -p "${ED}/usr/share/doc" + mv "${WORKDIR}/usr/share/doc/${P}" "${ED}/usr/share/doc" \ + || die "failed to copy docs" + else + dodoc "${S}/distrib/README" "${S}/ANNOUNCE" "${S}/LICENSE" "${S}/VERSION" + fi + + emake -j1 install DESTDIR="${D}" + + # remove link, but leave 'haddock-${GHC_P}' + rm -f "${ED}"/usr/bin/haddock + + if [[ ! -f "${S}/VERSION" ]]; then + echo "${GHC_PV}" > "${S}/VERSION" \ + || die "Could not create file ${S}/VERSION" + fi + newbashcomp "${FILESDIR}/ghc-bash-completion" ghc-pkg + + fi + + # path to the package.cache + local package_confdir="${ED}/usr/$(get_libdir)/${GHC_P}/package.conf.d" + PKGCACHE="${package_confdir}"/package.cache + # copy the package.conf.d, including timestamp, save it so we can help + # users that have a broken package.conf.d + cp -pR "${package_confdir}"{,.initial} || die "failed to backup intial package.conf.d" + + # copy the package.conf, including timestamp, save it so we later can put it + # back before uninstalling, or when upgrading. + cp -p "${PKGCACHE}"{,.shipped} \ + || die "failed to copy package.conf.d/package.cache" +} + +pkg_preinst() { + # have we got an earlier version of ghc installed? + if has_version "<${CATEGORY}/${PF}"; then + haskell_updater_warn="1" + fi +} + +pkg_postinst() { + ghc-reregister + + # path to the package.cache + PKGCACHE="${EROOT}/usr/$(get_libdir)/${GHC_P}/package.conf.d/package.cache" + + # give the cache a new timestamp, it must be as recent as + # the package.conf.d directory. + touch "${PKGCACHE}" + + if [[ "${haskell_updater_warn}" == "1" ]]; then + ewarn + ewarn "\e[1;31m************************************************************************\e[0m" + ewarn + ewarn "You have just upgraded from an older version of GHC." + ewarn "You may have to run" + ewarn " 'haskell-updater --upgrade'" + ewarn "to rebuild all ghc-based Haskell libraries." + ewarn + ewarn "\e[1;31m************************************************************************\e[0m" + ewarn + fi +} + +pkg_prerm() { + # Be very careful here... Call order when upgrading is (according to PMS): + # * src_install for new package + # * pkg_preinst for new package + # * pkg_postinst for new package + # * pkg_prerm for the package being replaced + # * pkg_postrm for the package being replaced + # so you'll actually be touching the new packages files, not the one you + # uninstall, due to that or installation directory ${GHC_P} will be the same for + # both packages. + + # Call order for reinstalling is (according to PMS): + # * src_install + # * pkg_preinst + # * pkg_prerm for the package being replaced + # * pkg_postrm for the package being replaced + # * pkg_postinst + + # Overwrite the modified package.cache with a copy of the + # original one, so that it will be removed during uninstall. + + PKGCACHE="${EROOT}/usr/$(get_libdir)/${GHC_P}/package.conf.d/package.cache" + rm -rf "${PKGCACHE}" + + cp -p "${PKGCACHE}"{.shipped,} +} + +pkg_postrm() { + ghc-package_pkg_postrm +} diff --git a/dev-lang/ghc/metadata.xml b/dev-lang/ghc/metadata.xml new file mode 100644 index 000000000000..873a999955e8 --- /dev/null +++ b/dev-lang/ghc/metadata.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd"> +<pkgmetadata> + <herd>haskell</herd> + <use> + <flag name='binary'>Install the binary version directly, rather than using it to build the source version.</flag> + <flag name='ghcbootstrap'>Bootstrap from an existing GHC installation.</flag> + <flag name='ghcmakebinary'>Build with less runtime depends (bundle libffi for building bootstrap binaries).</flag> + <flag name='llvm'>Enable llvm code generator for ghc (-fllvm).</flag> + </use> +</pkgmetadata> |