「Go パッケージガイドライン」の版間の差分
(無駄な改行を削除) |
(→デバッグパッケージのサポート: 翻訳を修正) |
||
| 79行目: | 79行目: | ||
* {{ic|1=GOPATH="${srcdir}"}} を含めると、''makepkg'' にすべてのモジュールのソースコードを含めることができます。 |
* {{ic|1=GOPATH="${srcdir}"}} を含めると、''makepkg'' にすべてのモジュールのソースコードを含めることができます。 |
||
| − | 上記のオプションは |
+ | 上記のオプションは、適切に分離されたシンボルとソースリストを持つデバッグパッケージを生成し、デバッガがそれをピックアップできるようにします。 |
{{bc|1= |
{{bc|1= |
||
2023年6月30日 (金) 03:54時点における最新版
32ビット – CLR – クロス – Eclipse – Electron – Free Pascal – GNOME – Go – Haskell – Java – KDE – カーネル – Lisp – MinGW – Node.js – ノンフリー – OCaml – Perl – PHP – Python – R – Ruby – Rust – VCS – ウェブ – Wine
このドキュメントでは、Go の PKGBUILD の作成に関する標準とガイドラインについて説明します。
目次
一般的なガイドライン
パッケージの命名
パッケージが Go エコシステムと強く結合したプログラムを提供する場合は、go-modulename を使用します。他のアプリケーションの場合は、プログラム名のみを使用します。
ビルド
依存関係
Go 1.11 では、go modules の初期サポートが導入されました。これにより、Go のアップストリームコードで依存関係を宣言し、特定のプロジェクトバージョンに固定できるようになります。現在、私たちのパッケージ化作業では、これをベンダー依存関係に利用しています。
Go モジュールを使用しないアップストリームプロジェクト
Go モジュールを使用しないアップストリームコードの場合は、次の回避策があります。アップストリームで問題を提出することを検討してください。
PKGBUILD
url=https://github.com/upstream_user/upstream_project
prepare() {
cd "$pkgname-$pkgver"
go mod init "${url#https://}" # strip https:// from canonical URL
go mod tidy
}
フラグとビルドオプション
go アプリケーション用に書かれたほとんどの Makefile は、GOFLAGS を上書きしたり、ビルドシステムが提供するビルドフラグを尊重していません。このため、コンパイラのために CGO_CFLAGS と CGO_LDFLAGS が設定されている必要があるので、Go バイナリが RELRO でコンパイルされません。これを Makefile にパッチするか、Makefile を省略する必要があります。
export CGO_CPPFLAGS="${CPPFLAGS}"
export CGO_CFLAGS="${CFLAGS}"
export CGO_CXXFLAGS="${CXXFLAGS}"
export CGO_LDFLAGS="${LDFLAGS}"
export GOFLAGS="-buildmode=pie -trimpath -ldflags=-linkmode=external -mod=readonly -modcacherw"
# or alternatively you can define some of these flags from the CLI options
go build \
-trimpath \
-buildmode=pie \
-mod=readonly \
-modcacherw \
-ldflags "-linkmode external -extldflags \"${LDFLAGS}\"" \
.
フラグの意味
-buildmode=pieバイナリ強化のために PIE コンパイル を有効にします。-trimpath再現性のあるビルド にとって重要であるため、完全なビルドパスとモジュールパスは埋め込まれません。-mod=readonlyどの go アクションでもモジュールファイルが更新されていないことを確認してください。-modcacherwは重要ではありませんが、これにより go モジュールが書き込み可能なパスを作成することが保証されます。デフォルトは読み取り専用です。
デバッグパッケージのサポート
ソースリストと適切なシンボルルックアップを使用してデバッグパッケージを有効にするには、デフォルトのビルドフラグをいくつか変更する必要があります。
- ソースパスがバイナリで確実に書き換えられるようにするため、
-trimpathを削除 - 現在のツールは圧縮ヘッダーをサポートしていないため、DWARF ヘッダーを確実に解析できるように、
-compressdwarf=falseを-ldflagsに含めます。 - Go が使用する内部リンカーとして
-linkmode=externalがバイナリにビルド ID を埋め込まないようにしてください。 GOPATH="${srcdir}"を含めると、makepkg にすべてのモジュールのソースコードを含めることができます。
上記のオプションは、適切に分離されたシンボルとソースリストを持つデバッグパッケージを生成し、デバッガがそれをピックアップできるようにします。
export CGO_CPPFLAGS="${CPPFLAGS}"
export CGO_CFLAGS="${CFLAGS}"
export CGO_CXXFLAGS="${CXXFLAGS}"
export CGO_LDFLAGS="${LDFLAGS}"
export GOPATH="${srcdir}"
export GOFLAGS="-buildmode=pie -mod=readonly -modcacherw"
go build -ldflags "-compressdwarf=false -linkmode external" .
出力ディレクトリ
現在、プロジェクト内のすべての Go バイナリをビルドする方法はいくつかあります。
build(){
cd "$pkgname-$pkgver"
go build -o output-binary .
}
... は、コンパイラがディレクトリに再帰的に降りてすべてのバイナリを検索するための省略表現です。出力ディレクトリと組み合わせて使用し、すべてをビルドできます。
prepare(){
cd "$pkgname-$pkgver"
mkdir -p build
}
build(){
cd "$pkgname-$pkgver"
go build -o build ./cmd/...
}
サンプル PKGBUILD
pkgname=foo
pkgver=0.0.1
pkgrel=1
pkgdesc='Go PKGBUILD Example'
arch=('x86_64')
url="https://example.org/$pkgname"
license=('GPL')
makedepends=('go')
source=("$url/$pkgname-$pkgver.tar.gz")
sha256sums=('1337deadbeef')
prepare(){
cd "$pkgname-$pkgver"
mkdir -p build/
}
build() {
cd "$pkgname-$pkgver"
export CGO_CPPFLAGS="${CPPFLAGS}"
export CGO_CFLAGS="${CFLAGS}"
export CGO_CXXFLAGS="${CXXFLAGS}"
export CGO_LDFLAGS="${LDFLAGS}"
export GOFLAGS="-buildmode=pie -trimpath -ldflags=-linkmode=external -mod=readonly -modcacherw"
go build -o build ./cmd/...
}
check() {
cd "$pkgname-$pkgver"
go test ./...
}
package() {
cd "$pkgname-$pkgver"
install -Dm755 build/$pkgname "$pkgdir"/usr/bin/$pkgname
}