「Go パッケージガイドライン」の版間の差分
(情報を更新) |
(→Flag meaning: 翻訳) |
||
58行目: | 58行目: | ||
}} |
}} |
||
− | ==== |
+ | ==== フラグの意味 ==== |
− | * {{ic|1=-buildmode=pie}} |
+ | * {{ic|1=-buildmode=pie}} バイナリ強化のために [[Wikipedia:ja:位置独立コード|PIE コンパイル]] を有効にします。 |
+ | * {{ic|-trimpath}} [[再現性のあるビルド]] にとって重要であるため、完全なビルドパスとモジュールパスは埋め込まれません。 |
||
− | * {{ic|-trimpath}} important for [[reproducible builds]] so full build paths and module paths are not embedded. |
||
+ | * {{ic|1=-mod=readonly}} どの go アクションでもモジュールファイルが更新されていないことを確認してください。 |
||
− | * {{ic|1=-mod=readonly}} ensure the module files are not updated in any go actions. |
||
+ | * {{ic|-modcacherw}} は重要ではありませんが、これにより go モジュールが書き込み可能なパスを作成することが保証されます。デフォルトは読み取り専用です。 |
||
− | * {{ic|-modcacherw}} is not important, but it ensures that go modules creates a write-able path. Default is read-only. |
||
− | {{Tip| |
+ | {{Tip|パッケージソースに {{ic|modules.txt}} を含む {{ic|vendor}} ディレクトリが含まれている場合、{{ic|-mod}} フラグを次のように安全に変更できます。{{ic|1=-mod=vendor}}.}} |
+ | {{Warning|ビルドフラグがコンパイラに正しく渡されたことを確認するのはパッケージャーの責任です。{{ic|Makefile}} がある場合はそれを読みます。}} |
||
− | {{Warning|It is up to the packager to verify the build flags are passed correctly to the compiler. Read the {{ic|Makefile}} if there is one.}} |
||
==== Supporting debug packages ==== |
==== Supporting debug packages ==== |
2023年6月26日 (月) 21:57時点における版
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 モジュールが書き込み可能なパスを作成することが保証されます。デフォルトは読み取り専用です。
Supporting debug packages
Enabling debug packages with source listing and proper symbol look ups require a few modifications to the default buildflags.
- Removal of
-trimpath
to ensure source paths are rewritten in the binary - Include
-compressdwarf=false
in-ldflags
to ensure we can parse the DWARF headers as current tooling does not support compressed headers. - Ensure
-linkmode=external
as the internal linker go uses does not embed a build-id into the binary. - Include
GOPATH="${srcdir}"
so makepkg can include the source code for all modules.
The above options should produce a debug package with proper detached symbols and source listings which can then be picked up by the debugger.
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" .
Output directory
There are currently a few ways to build all go binaries in a project.
build(){ cd "$pkgname-$pkgver" go build -o output-binary . }
...
is a shorthand for the compiler to recursively descend into the directory and find all binaries. It can be used in conjunction with a output directory to build everything.
prepare(){ cd "$pkgname-$pkgver" mkdir -p build } build(){ cd "$pkgname-$pkgver" go build -o build ./cmd/... }
Sample 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 }