GNU Autotools を学ぶ

automake を翻訳しながらGNU Aototoolsについて学ぶ。

Part 1. The GNU Build System

2.1 GNUビルドシステムの紹介

(翻訳中)

今日、このプロセスはGNUプロジェクトで標準化されています。GNUコーディング標準は、GNUプロジェクトの各パッケージがどのようにconfigureスクリプトを持つべきか、そしてそれが持つべき最小限のインタフェースについて説明しています。 Makefileもいくつかの確立された規則に従うべきです。 結果は? すべてのパッケージをインストーラがほとんど区別できない統一ビルドシステム。 最も単純なシナリオで、すべてのインストーラーが行うべきことは、パッケージを解凍し、./configure && make && make install を実行し、次のパッケージをインストースするためにまた同じ操作をしていく。

このビルドシステムは、GNUプロジェクトの外に作られたため、GNUビルドシステムと呼ばれています。 これは他の膨大な数のパッケージで使用されています。

Autotools はあなたのパッケージのGNUビルドシステムを作成するためのツールです。 Autoconf は configure に焦点を置き、Automake は Makefile に焦点を置いている。

Autotools の助けを借りずにGNUビルドシステムを作ることは可能です。しかし、むしろ負担が大きくなり、エラーを起こしやすくなります。 実際にGNUビルドシステムを説明した後で、このことについて再度議論します。

2.3 なぜ Autotools を使うか

Autotools Tutorial 「Why We Need Tools」参考

GNUビルドシステムを手作業でやろうとすると、以下のことに気がつく。

  • GNUビルドシステムは膨大な機能がある。あなたが使わない機能を、他のユーザーは期待しているかもしれない。

  • 移植可能なものにすることが難しく、疲れ果ててしまうだろう。

  • 複数のシステム上の移植可能なシェルスクリプト、移植可能なMakefileは便利ではないと考えてください)

  • GNUコーディング標準の変更に合わせて設定をアップグレードする必要があります。

GNU Autotools は:

  • 簡単な設定からGNUビルドシステムを生成するツールを提供します。

  • 修正と改善が行われる中心的な場所を提供する。(移植性の問題のバグフィックスは、すべてのパッケージに役立ちます。)(…各パッケージの問題を修正するのではなく、Autotoolsを修正することですべてのパッケージに対して反映されるということか。)

2.4 A Small Hello World

2.4.1 Creating amhello-1.0.tar.gz

amhello-1.0.tar.gzを最初から再作成する方法は次のとおりです。 パッケージは単純なので、5つのファイルを書くだけで済みます。 空のディレクトリに次のファイルを作成します。

  • src / main.cはhelloプログラムのソースファイルです。 後でパッケージが展開されると、マニュアルページ用のman /ディレクトリ、データファイル用のdata/ディレクトリなどの追加が容易になるため、src /サブディレクトリに格納します。
~/amhello % cat src/main.c
#include <config.h>
#include <stdio.h>

int
main (void)
{
  puts ("Hello World!");
  puts ("This is " PACKAGE_STRING ".");
  return 0;
}
  • READMEには、私たちの小さなパッケージに関する非常に限定されたドキュメントが含まれています。
~/amhello % cat README
This is a demonstration package for GNU Automake.
Type 'info Automake' to read the Automake manual.
~/amhello % cat src/Makefile.am
bin_PROGRAMS = hello
hello_SOURCES = main.c
~/amhello % cat Makefile.am
SUBDIRS = src
dist_doc_DATA = README
  • 最後に、configure.acには、configureスクリプトを作成するためのAutoconfの指示が含まれています。
~/amhello % cat configure.ac
AC_INIT([amhello], [1.0], [bug-automake@gnu.org])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([
 Makefile
 src/Makefile
])
AC_OUTPUT

これらの5つのファイルを取得したら、Autotoolsを実行してビルドシステムをインスタンス化します。 これを行うには、autoreconfコマンドを次のように使用します。

~/amhello % autoreconf --install
configure.ac: installing './install-sh'
configure.ac: installing './missing'
configure.ac: installing './compile'
src/Makefile.am: installing './depcomp'

この時点で、ビルドシステムは完了です。

出力に記載されている3つのスクリプトに加えて、autoreconfがconfigure、config.h.in、Makefile.in、src / Makefile.inの4つのファイルを作成したことがわかります。 後者の3つのファイルはconfig.h、Makefile、src / Makefileという名前でconfigureによってシステムに適応されるテンプレートです。 やってみましょう:

~/amhello % ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... no
[snip]
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating config.h
config.status: executing depfiles commands

configureがシステムを調査した後、Makefile、src / Makefile、およびconfig.hが最後に作成されているのがわかります。 すべてのmakeターゲットを実行することができる状態です。 例えば:

~/amhello % make
…
~/amhello % src/hello
Hello World!
This is amhello 1.0.
~/amhello % make distcheck
…
=============================================
amhello-1.0 archives ready for distribution:
amhello-1.0.tar.gz
=============================================

autoreconfを実行することは、GNUビルドシステムが存在しない場合に初めて必要になることに注意してください。 後でMakefile.amまたはconfigure.acでいくつかの命令を変更すると、makeを実行するとビルドシステムの関連部分が自動的に再生成されます。

autoreconfは、autoconf、automake、および他のコマンドを正しい順序で呼び出すスクリプトです。 これらのツールを使用して作業を開始する場合は、これらのツールをすべて起動する順序と理由を把握することは重要ではありません。 しかし、AutoconfとAutomakeは別々のマニュアルを持っているので、autoconfはconfigure.acからconfigureを作成することになり、automakeはMakefile.amとconfigure.acからMakefile.inを作成することになります。 これは、答えを探すときには、少なくとも正しいマニュアルに導かなければなりません。