Difference between revisions of "Makepkg (日本語)"

From ArchWiki
Jump to: navigation, search
m
m (使用方法)
Line 168: Line 168:
 
{{Note|Before complaining about missing (make) dependencies, remember that the {{Grp|base}} group is assumed to be installed on all Arch Linux systems. The group "base-devel" is assumed to be installed when building with '''makepkg'''.}}
 
{{Note|Before complaining about missing (make) dependencies, remember that the {{Grp|base}} group is assumed to be installed on all Arch Linux systems. The group "base-devel" is assumed to be installed when building with '''makepkg'''.}}
  
To build a package, one must first create a [[PKGBUILD]], or build script, as described in [[Creating Packages]], or obtain one from the [[Arch Build System|ABS tree]], [[Arch User Repository]], or some other source.
+
パッケージを作成するには、まず [[Creating Packages (日本語)]] に記述されているようにして [[PKGBUILD (日本語)|PKGBUILD]] を作成するか [[Arch Build System (日本語)|ABS ツリー]][[Arch User Repository (日本語)|Arch User Repository]] などから取得してくる必要があります。
  
 
{{Warning|Only build and/or install packages from trusted sources.}}
 
{{Warning|Only build and/or install packages from trusted sources.}}
  
Once in possession of a {{ic|PKGBUILD}}, change to the directory where it is saved and issue the following command to build the package described by said {{ic|PKGBUILD}}:
+
{{ic|PKGBUILD}} を入手したら、PKGBUILD が保存されているディレクトリに移動してから次のコマンドを実行して {{ic|PKGBUILD}} に記述されたパッケージを作成します:
  
 
  $ makepkg
 
  $ makepkg
  
To have makepkg clean out leftover files and folders, such as files extracted to the $srcdir, add the following option. This is useful for multiple builds of the same package or updating the package version, while using the same build folder. It prevents obsolete and remnant files from carrying over to the new builds.
+
パッケージ作成後、要らなくなったファイル ($srcdir に展開されたファイルなど) を makepkg によって削除するには、以下のオプションを加えて下さい。同じパッケージをビルドしたりパッケージのバージョンを更新するときに、同じビルドフォルダを使う場合、このオプションは有益です。残ったファイルを新しいビルドに持ち越す危険がなくなります。
  
 
  $ makepkg -c
 
  $ makepkg -c
  
If required dependencies are missing, makepkg will issue a warning before failing. To build the package and install needed dependencies automatically, simply use the command:
+
必要な依存パッケージが欠けている場合、makepkg は警告を表示します。必要な依存パッケージを自動的にインストールするには、次のコマンドを使って下さい:
  
 
  $ makepkg -s
 
  $ makepkg -s
  
Note that these dependencies must be available in the configured repositories; see [[pacman#Repositories]] for details. Alternatively, one can manually install dependencies prior to building ({{ic|pacman -S --asdeps dep1 dep2}}).
+
依存パッケージが取ってこれるのは設定されたリポジトリからだけということに注意してください; 詳しくは [[pacman (日本語)#Repositories]] を見て下さい。また、ビルドの前に手動で依存パッケージをインストールすることもできます ({{ic|pacman -S --asdeps dep1 dep2}})
  
Once all dependencies are satisfied and the package builds successfully, a package file ({{ic|pkgname-pkgver.pkg.tar.xz}}) will be created in the working directory. To install, run (as root):
+
全ての依存関係が解決されパッケージのビルドが成功すれば、パッケージファイル ({{ic|pkgname-pkgver.pkg.tar.xz}}) が作業ディレクトリの中に作成されます。インストールするには、(root ) 次を実行してください:
  
 
  # pacman -U pkgname-pkgver.pkg.tar.xz
 
  # pacman -U pkgname-pkgver.pkg.tar.xz
  
Alternatively, to install, using the {{ic|-i}} flag is an easier way of running {{ic|pacman -U pkgname-pkgver.pkg.tar.xz}}, as in:
+
もしくは、{{ic|pacman -U pkgname-pkgver.pkg.tar.xz} を実行する代わりに {{ic|-i}} フラグを使ってインストールすることもできます:
  
 
  $ makepkg -i
 
  $ makepkg -i

Revision as of 05:15, 28 June 2013

Template:Article summary start Template:Article summary text Template:Article summary heading Template:Article summary text Template:Article summary heading Template:Article summary wiki Template:Article summary heading Template:Article summary link Template:Article summary link Template:Article summary end

makepkg は pacman (Arch Linux のパッケージマネージャ) でのインストールに適したパッケージをコンパイル・ビルドするために使われます。makepkg はパッケージのビルドを自動化するスクリプトです; ソースファイルのダウンロード・検証、依存関係の確認、ビルド時の設定、ソースのコンパイル、一時 root へのインストール、カスタマイズ、メタ情報の生成、そして全てをまとめたパッケージの作成。

makepkg は pacman パッケージの中に入っています。

設定

/etc/makepkg.conf が makepkg のメインの設定ファイルです。ほとんどのユーザーはパッケージをビルドする前に makepkg の設定オプションを微調整するとよいでしょう。

アーキテクチャ、コンパイルフラグ

makepkg でソフトウェアをコンパイルする時 MAKEFLAGS, CFLAGS, CXXFLAGS オプションが make, gcc, g++ によって使われます。デフォルトでは、様々なマシンでインストールできるような一般的なパッケージを生成するようにオプションが設定されています。ホストマシン用にコンパイルをチューニングすることでパフォーマンスを改善することが可能です。コンパイルするホストのプロセッサに合わせてパッケージをコンパイルするデメリットは、他のマシンでは動作しなくなるかもしれないということです。

Note: Do keep in mind that not all package build systems will use your exported variables. Some override them in the original Makefiles or the PKGBUILD.
/etc/makepkg.conf
[...]

#########################################################################
# ARCHITECTURE, COMPILE FLAGS
#########################################################################
#
CARCH="x86_64"
CHOST="x86_64-unknown-linux-gnu"

#-- Exclusive: will only run on x86_64
# -march (or -mcpu) builds exclusively for an architecture
# -mtune optimizes for an architecture, but builds for whole processor family
CPPFLAGS="-D_FORTIFY_SOURCE=2"
CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4"
CXXFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4"
LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro"
#-- Make Flags: change this for DistCC/SMP systems
#MAKEFLAGS="-j2"

[...]

デフォルトの makepkg.conf の CFLAGSCXXFLAGS はそれぞれのアーキテクチャを持つ全てのマシンと互換性があります。

x86_64 のマシンでは、時間を投資して公式のパッケージをリビルドすることでそれに見合うだけのパフォーマンスの向上を得られることは稀です。

GCC バージョン 4.3.0 から、マシンの CPU の自動検知とサポートされている最適化の自動セレクトを有効にする -march=native スイッチが使えるようになっています。これを使うには、以下のように CFLAGSCXXFLAGS を変更してください:

# -march=native also sets the correct -mtune=
CFLAGS="-march=native -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2"
CXXFLAGS="${CFLAGS}"
Tip: march=native フラグがどうなるか見るには、次を実行してください:
$ gcc -march=native -E -v - </dev/null 2>&1 | sed -n 's/.* -v - //p'

Further optimizing for CPU type can theoretically enhance performance because -march=native enables all available instruction sets and improves scheduling for a particular CPU. This is especially noticeable when rebuilding applications (for example: audio/video encoding tools, scientific applications, math-heavy programs, etc.) that can take heavy advantage of newer instructions sets not enabled when using the default options (or packages) provided by Arch Linux.

It is very easy to reduce performance by using "non-standard" CFLAGS because compilers tend to heavily blow up the code size with loop unrolling, bad vectorization, crazy inlining, etc. depending on compiler switches. Unless you can verify/benchmark that something is faster, there is a very good chance it is not!

See the GCC man page for a complete list of available options. The Gentoo Compilation Optimization Guide and Safe CFLAGS wiki article provide more in-depth information.

MAKEFLAGS

MAKEFLAGS オプションを使って make に追加するオプションを指定することができます。マルチコア・マルチプロセッサのシステムを使っているユーザーは同時に実行するジョブの数を指定できます、例: -j4nproc を使うことで利用可能なプロセッサの数がわかります。PKGBUILD によっては、特定のバージョンで競合状態になったり、もしくはサポートされていないために、この値を -j1 で上書きします。これによってビルドが失敗するパッケージがある場合は、エラーがあなたの MAKEFLAGS によって引き起こされていることを確認してから、バグトラッカーに報告してください。

利用可能なオプションの全ては man make を見て下さい。

パッケージの出力

次に、ソースファイルやパッケージが置かれる場所、パッケージ作成者としての名前を設定することができます。このステップは任意です; デフォルトでは、パッケージは makepkg が実行された作業ディレクトリに作成されます。

/etc/makepkg.conf
[...]

#########################################################################
# PACKAGE OUTPUT
#########################################################################
#
# Default: put built package and cached source in build directory
#
#-- Destination: specify a fixed directory where all packages will be placed
#PKGDEST=/home/packages
#-- Source cache: specify a fixed directory where source files will be cached
#SRCDEST=/home/sources
#-- Source packages: specify a fixed directory where all src packages will be placed
#SRCPKGDEST=/home/srcpackages
#-- Packager: name/email of the person or organization building packages
#PACKAGER="John Doe <john@doe.com>"

[...]

For example, create the directory:

$ mkdir /home/$USER/packages

Then modify the PKGDEST variable in /etc/makepkg.conf accordingly.

The PACKAGER variable will set the packager value within compiled packages' .PKGINFO metadata file. By default, user-compiled packages will display:

pacman -Qi package
[...]
Packager       : Unknown Packager
[...]

Afterwards:

pacman -Qi package
[...]
Packager       : John Doe <john@doe.com>
[...]

This is useful if multiple users will be compiling packages on a system, or you are otherwise distributing your packages to other users.

署名チェック

The following procedure is not necessary for compiling with makepkg, for your initial configuration proceed to #Usage. To temporarily disable signature checking call the makepkg command with the --skippgpcheck option. If a signature file in the form of .sig is part of the PKGBUILD source array, makepkg validates the authenticity of source files. For example, the signature pkgname-pkgver.tar.gz.sig is used to check the integrity of the file pkgname-pkgver.tar.gz with the gpg program. If desired, signatures by other developers can be manually added to the gpg keyring. Look into the GnuPG article for further information.

Note: The signature checking implemented in makepkg does not use pacman's keyring. Configure gpg as explained below to allow makepkg reading pacman's keyring.

The gpg keys are expected to be stored in the user's ~/.gnupg/pubring.gpg file. In case it does not contain the given signature, makepkg shows a warning.

makepkg
[...]
==> Verifying source file signatures with gpg...
pkgname-pkgver.tar.gz ... FAILED (unknown public key 1234567890)
==> WARNING: Warnings have occurred while verifying the signatures.
    Please make sure you really trust them.
[...]

To show the current list of gpg keys use the gpg command.

gpg --list-keys

If the pubring.gpg file does not exist it will be created for you immediatly. You can now proceed with configuring gpg to allow compiling AUR packages submitted by Arch Linux developers with successful signature checking. Add the following line to the end of your gpg configuration file to include the pacman keyring in your user's personal keyring.

~/.gnupg/gpg.conf
[...]
keyring /etc/pacman.d/gnupg/pubring.gpg

When configured as before, the output of gpg --list-keys contains a list of keyrings and developers. Now makepkg can compile AUR packages submitted by Arch Linux developers with successful signature checking.

使用方法

次に進む前に、base-devel グループがインストールされているか確認してください。このグループに属しているパッケージは PKGBUILD の中に依存パッケージとして載せる必要はないことになっています。以下を (root で) 実行して "base-devel" グループをインストールしてください:

# pacman -S base-devel
Note: Before complaining about missing (make) dependencies, remember that the base group is assumed to be installed on all Arch Linux systems. The group "base-devel" is assumed to be installed when building with makepkg.

パッケージを作成するには、まず Creating Packages (日本語) に記述されているようにして PKGBUILD を作成するか ABS ツリーArch User Repository などから取得してくる必要があります。

Warning: Only build and/or install packages from trusted sources.

PKGBUILD を入手したら、PKGBUILD が保存されているディレクトリに移動してから次のコマンドを実行して PKGBUILD に記述されたパッケージを作成します:

$ makepkg

パッケージ作成後、要らなくなったファイル ($srcdir に展開されたファイルなど) を makepkg によって削除するには、以下のオプションを加えて下さい。同じパッケージをビルドしたりパッケージのバージョンを更新するときに、同じビルドフォルダを使う場合、このオプションは有益です。残ったファイルを新しいビルドに持ち越す危険がなくなります。

$ makepkg -c

必要な依存パッケージが欠けている場合、makepkg は警告を表示します。必要な依存パッケージを自動的にインストールするには、次のコマンドを使って下さい:

$ makepkg -s

依存パッケージが取ってこれるのは設定されたリポジトリからだけということに注意してください; 詳しくは pacman (日本語)#Repositories を見て下さい。また、ビルドの前に手動で依存パッケージをインストールすることもできます (pacman -S --asdeps dep1 dep2)。

全ての依存関係が解決されパッケージのビルドが成功すれば、パッケージファイル (pkgname-pkgver.pkg.tar.xz) が作業ディレクトリの中に作成されます。インストールするには、(root で) 次を実行してください:

# pacman -U pkgname-pkgver.pkg.tar.xz

もしくは、{{ic|pacman -U pkgname-pkgver.pkg.tar.xz} を実行する代わりに -i フラグを使ってインストールすることもできます:

$ makepkg -i

Tips and Tricks

Generate new md5sums

Since pacman 4.1 makepkg -g >> PKGBUILD is no longer required as pacman-contrib was merged along with the updpkgsums script that will generate new checksums and replace them in the PKGBUILD:

$ updpkgsums

Makepkg source PKGBUILD twice

Makepkg sources the PKGBUILD twice (once when initially run, and the second time under fakeroot). Any non-standard functions placed in the PKGBUILD will be run twice as well.

WARNING: Package contains reference to $srcdir

Somehow, the literal strings $srcdir or $pkgdir ended up in one of the installed files in your package.

To identify which files, run the following from the makepkg build directory:

$ grep -R "$(pwd)/src" pkg/

Link to discussion thread.

参照

  • gcccpuopt: A script to print the gcc cpu specific options tailored for the current CPU