読者です 読者をやめる 読者になる 読者になる

go1.5のbuildmodeについて

概要

前回、go1.5のshared library機能を使ってみました。今回は、他のビルドモードについても調べてみました。

Mac OS X Yosemite(10.10.4)上で実行しています。goはgithubのソースをビルドしています。

$ go version
go version devel +a7e81c3 Tue Jul 28 09:36:32 2015 +0000 darwin/amd64

archiveとsharedはうまくいきませんでした。sharedオプションは、Mac OS Xは未サポートかもしれません。archiveは.aファイルができなかったのですが、エラーメッセージは出力されていません。使い方が間違っているだけかもしれません。

$ go build -buildmode=shared -linkshared libgofib.go
-buildmode=shared not supported on darwin/amd64

buildmode

go help buildmode
の結果を超訳しました。

build mode対象package説明
archivemain以外mainパッケージ以外を.aファイルにビルドする。mainパッケージは無視。
c-archivemainのみmainパッケージをビルドする。加えて、mainパッケージでimportされている全パッケージをCアーカイブにビルドする。exportとしてマークされている関数のみ呼び出すことができる。mainパッケージファイルは一つだけ。
c-sharedmainのみmainパッケージをビルドする。加えて、mainパッケージでimportされている全パッケージをC共有ライブラリにビルドする。exportとしてマークされている関数のみ呼び出すことができる。mainパッケージ以外は無視される。
defaultすべてmainパッケージが実行ファイルにビルドさえる。非mainパッケージは、.aファイルにビルドされる。デフォルト。
sharedmain以外すべての非mainパッケージを単一の共有ライブラリに結合する。-linksharedオプション付きでビルドする時に用いられる。mainパッケージは無視される。
exemainのみ全mainパッケージとそれらがimportしているファイルを実行ファイルにビルドする。非mainパッケージは無視される。
$ go help buildmode
The 'go build' and 'go install' commands take a -buildmode argument which
indicates which kind of object file is to be built. Currently supported values
are:

	-buildmode=archive
		Build the listed non-main packages into .a files. Packages named
		main are ignored.

	-buildmode=c-archive
		Build the listed main package, plus all packages it imports,
		into a C archive file. The only callable symbols will be those
		functions marked as exported. Requires exactly one main package
		to be listed.

	-buildmode=c-shared
		Build the listed main packages, plus all packages that they
		import, into C shared libraries. The only callable symbols will
		be those functions marked as exported. Non-main packages are
		ignored.

	-buildmode=default
		Listed main packages are built into executables and listed
		non-main packages are built into .a files (the default
		behavior).

	-buildmode=shared
		Combine all the listed non-main packages into a single shared
		library that will be used when building with the -linkshared
		option. Packages named main are ignored.

	-buildmode=exe
		Build the listed main packages and everything they import into
		executables. Packages not named main are ignored.