GDCのebuild書いたよ

id:Akiva:20101219#1292793625 [火星の月に魅せられて1]
でD言語について書きかけてますが、まだ本格採用は決まってません。
とにかく色々試してみないと何も決められない訳ですが、
うちの環境では64bit版のGentoo Linuxをメインに開発してて、
どうにもD言語はまだ64bitへの正式対応をしていない訳ですよ。
というかこれが最近D言語に触れる人が減った理由かなぁ。


本家の公式コンパイラであるdmdはバージョン1でもバージョン2でも64bitのコードを吐いたりリンクできなくて、
バージョン2の仕様が決まり次第、一気に対応するんじゃないかと噂されてますが、いつになることやら。


本家コンパイラの他にも処理系が幾つか存在していて、

  • GDC : GCCを利用したフロントエンドで、開発スナップショットはD2.0に対応。
  • LDC : LLVMを利用したフロントエンドで、D1.0の対応途中。
  • .NET版D言語コンパイラ : 名前のとおり.NET上で動かすらしいけど本家ページで公式リリース無し。

うーん、ぶっちゃけどれも不完全なまま一年以上開発止まってて、使っていくには幸先不安です。
GDCが内部でオープンDMD使って完成度も高く、C言語との連携もしやすく64bitにも対応してたみたいですが、
公式ページを見ると2007年でリリース止まってて、
公式Portageでもgcc-4.1.2を最後にして、GCCのD言語対応が終了しています。


今使ってるGCCのバージョンが4.4.4で、かなり古いけど試しに4.1.2のD対応版をインストールしてみようとしたけど、
どうにもビルドに失敗する。
もしインストールに成功したとしても、4.1以前と4.2以降ではABI仕様が大幅に変わってて、
共存させるのは色々と面倒くさい。
素直にdmdバージョン2の開発が終わるのを待つしか無いのか…と思いながらも色々調べたら、
GDCの後継プロジェクトがちゃんと存在するようです。


https://bitbucket.org/goshawk/gdc/wiki/Home


今までDavid Friedman氏がSF.net上で開発したまま居なくなってしまったのを、
最後の開発スナップショットをベースにVincenzo Ampolo氏が手を加えて、
最新のGCCでも動作するように修正され、D2.0でもちゃんと動作するようになってるみたいです。
まだ公式のリリースが無くてmercurialレポジトリからGCCにパッチを当てて動かすしか無いんですが、
公式のD言語セットアップパッチがリリースされれば、大手のパッケージ管理システムでも捕捉されると思います。


とりあえず、64bitでまともに動かせる現状で唯一の選択肢である為、
いち早く動作を検証すべくebuildファイルを作ってみました。Gentooの中の人にしか役に立ちませんけど。
/usr/portage/sys-devel/gcc/gcc-4.4.4-r2.ebuildに手を加えたので、差分だけ公開します。

※ (修正と追記)
 記事の掲載初期のコードではsys-devel/gdcというパッケージ名で公開していましたが、
 同バージョン系列(4.4どうし等)のgccと共存させようとするとファイルの衝突エラーが出る為、
 そのままsys-devel/gccというパッケージ名で既存のパッケージを置き換える仕様に変更しました。
 本来は最新レポジトリを取り込んで安定版扱いはしないのが習わしですが、利便性重視でこうしました。
--- /usr/portage/sys-devel/gcc/gcc-4.4.4-r2.ebuild	2010-11-29 23:07:34.000000000 +0200
+++ /var/lib/layman/myport/sys-devel/gcc/gcc-4.4.4-r2.ebuild	2010-12-24 21:31:55.019000100 +0200
@@ -19,14 +19,14 @@
 SSP_UCLIBC_STABLE=""
 #end Hardened stuff
 
-inherit toolchain
+inherit toolchain mercurial
 
 DESCRIPTION="The GNU Compiler Collection"
 
 LICENSE="GPL-3 LGPL-3 || ( GPL-3 libgcc libstdc++ gcc-runtime-library-exception-3.1 ) FDL-1.2"
 KEYWORDS="alpha amd64 arm hppa ia64 ~mips ppc ppc64 s390 sh sparc x86 ~x86-fbsd"
 
-IUSE=""
+IUSE="d d2"
 
 RDEPEND=">=sys-libs/zlib-1.1.4
 	>=sys-devel/gcc-config-1.4
@@ -56,6 +56,7 @@
 		nls? ( sys-devel/gettext )
 	)"
 DEPEND="${RDEPEND}
+	dev-vcs/mercurial
 	test? ( >=dev-util/dejagnu-1.4.4 >=sys-devel/autogen-5.5.4 )
 	>=sys-apps/texinfo-4.8
 	>=sys-devel/bison-1.875
@@ -70,6 +71,8 @@
 fi
 
 src_unpack() {
+	use d && mercurial_fetch https://goshawk@bitbucket.org/goshawk/gdc gdc
+
 	gcc_src_unpack
 
 	use vanilla && return 0
@@ -79,6 +82,15 @@
 	[[ ${CHOST} == ${CTARGET} ]] && epatch "${FILESDIR}"/gcc-spec-env.patch
 
 	[[ ${CTARGET} == *-softfloat-* ]] && epatch "${FILESDIR}"/4.4.0/gcc-4.4.0-softfloat.patch
+
+	if use d
+	then
+		cd ${S}
+		ln -s ../d gcc/d
+		setupconf="-v1"
+		use d2 && setupconf="-v2"
+		gcc/d/setup-gcc.sh ${setupconf} || die "failed in D setup"
+	fi
 }
 
 pkg_setup() {
@@ -89,3 +101,4 @@
 		ewarn "Any bugs resulting from the use of Graphite will not be fixed."
 	fi
 }
+


僕の場合は、Overlayのディレクトリの中に更に個人的なmyportというポートを作って、
公式に取り込まれていないしOverlaysのページにも無いようなデータを入れるスクリプトを作って放りこんでます。
公式Portageと同バージョンのパッケージが追加ポートに入ってる場合は、後者が優先されるようです。
USE環境変数の中にdが入ってなければ(d2が入っていたとしても)通常のgccと全く同じで、
dとd2が入っていればDバージョン2.0、dだけが入っている場合はバージョン1.0が入ります。
推奨されるのはバージョン1.0の方です(USE="d -d2")。
現状ではD1.0とD2.0は共存できないようです。


……結局備忘録に終わった。ほとんど需要は無さそうですね。