karubabuの日記

タイトルに解決と書いているものがあるけれど、別に付いていない物は解決していないというわけではないです。つまるところ記事を書いた後に解決してちょっと嬉しかったので付けました。

go製のプロジェクトのebulidを書く

emakeやれば終わるものとは別ゲーすぎません???
次も大変な思いをしない様に困ったところは書いておくね
今回ebulidを書いたやつ
GitHub - m13253/dns-over-https: High performance DNS over HTTPS client & server
今回のebuild
gentoo-overlay/dns-over-https-2.2.1.ebuild at master · karubabu/gentoo-overlay · GitHub

モジュールはEGO_VENDORに列挙する必要がある

今になって考えてみると当たり前なのだけれども、モジュールをgo.modにある通りに適当にgo getしてくると、
portage側でその真正性が確認出来無い問題が出るので、ebuild内ではgo get自体が出来無くなっている
そのため、必要なモジュールをSRC_URIと同じ様にハッシュか何かをmanifestに保存しつつ同タイミングでダウンロードすることになる
というわけで以下の部分がそれ
gentoo-overlay/dns-over-https-2.2.1.ebuild at master · karubabu/gentoo-overlay · GitHub
EGO_PNはビルドするプロジェクトの名前、EGO_VENDORはモジュールの名前とハッシュかバージョンそしてgolang-vcs-snapshotを継承する
golang-vcs-snapshotを継承するタイミングはEGO_VENDORを列挙した後でないと、この変数は読み取り専用ですよ!と文句が出るので気を付けよう(1敗)
詳しくはgolang-vcs-snapshotのソースコードにある解説を読むと全部わかるのでえらい
golang-vcs-snapshot.eclass\eclass - repo/gentoo.git - Official Gentoo ebuild repository

ビルド時に-mod=vendor引数を入れる

☝️に付随する事柄だけれど、☝️の方法で入ったモジュールはGOPATH以下ではなくプロジェクトのrootディレクトリ/vendorに置かれるので、それを認識させる必要がある
以下の部分がそれ
gentoo-overlay/dns-over-https-2.2.1.ebuild at master · karubabu/gentoo-overlay · GitHub

あとは手慣りでsrc_installすれば良いと思う

おわりに

やたら大変だったのでゆるしていないよ
そもそもgoでプログラムを書いたことが無いので何が何処にあるのかさっぱり分からなくてはちゃめちゃに辛かった
まあ別に他の言語のプロジェクトも全然わからんしmakeを叩けばよしなにやってくれるやつ以外は全部辛いのだけれども
あとgoはgo help moduleとかやるとlessもなしに英語ドバー!!!してくるのが精神を抉ってくるのでやめなさーい!!
二つ目の問題もgo help moduleをしっかり読めば一瞬で分かることなのだけれど、しっかり読みたくなくてこれに気が付くまで時間がかかりました…

後はgo系のebuild classがやたら一杯あるのが謎だったね
結局golang-vcs-snapshotのみを使ったけれど、これでよかったのか、もっと相性の良いものがあったのか、全然わからん!