概要
独自のMakefileを用意している独自のソフトウェアに対して、AutotoolsによるMakefileの生成手順を確認した。
はじめに
Autotoolsはソフトウェアパッケージ開発ツールの一つである。
開発者は、configure.ac
やMakefile.am
に必要な情報を記載することで、configure
と呼ばれるビルドに必要なライブラリのチェックやビルドに必要なファイルを自動生成するスクリプトファイルを生成することができる。
しかし、記述方式や生成方法が少々トリッキーなところもあり、一からautotools
に必要なファイルを用意するとなると手間がかかる。
*1
幸いにも、Autotoolsを採用しているパッケージは多く存在するので、それらを参考にすることでとりあえず動作させることはできる。
本記事では、備忘録としてAutotoolsを使用するにあたって参考となるサイトの紹介と必要最低限度の手順を紹介する。
準備
今回は小規模ソフトウェアパッケージを想定として、Autotools の使い方をおさらいする。 説明を簡単にするために、対象を下記のようなディレクトリ構成から成るソフトウェアを対象とする。
上記のソフトウェアはGitHub上に公開してあるのでそちらを参照すると理解しやすいと思う。 (Autotoolsを導入するまでの手順とコミットを対応させて説明しているため)
このソフトウェアは、プログラムソースコードとマニュアルページと多言語翻訳リソースの三つから構成される。
- プログラムソースコード:
include
とsrc
の配下にCプログラムファイルとヘッダファイルを管理する。main.c
がプログラムのメイン部分となっており、ここからsub.c
にある関数を呼び出す。 - マニュアルページ:
man
の配下にマニュアルページを管理する。 - 多言語翻訳リソース:
po
の配下に翻訳可能な文字列と日本語の対応関係を管理する。 gettextを利用してローカライズする。
本記事では、このソフトウェアが下記の3つの要件を達成することを目標とする。
- ソースコードがビルドするための
Makefile
を生成できること - マニュアルページをインストールできる
Makefile
を生成できること - gettextでローカライズが可能な
Makefile
を生成できること
また、今回は下記ツールのバージョンで確認している。
手順
CプログラムのソースコードをビルドできるMakefile
の生成
パッケージのトップディレクトリに
Makefile.am
を作成する。bin_PROGRAMS = test test_SOURCES = src/main.c src/sub.c AM_CPPFLAGS = -I$(top_srcdir)/include -DLOCALEDIR='"$(localedir)"' -DPACKAGE='"test"'
bin_PROGRAMS = ターゲット
: コンパイルによって生成されるバイナリファイルを指定する。
ターゲット_SOURCE = ソースファイル
: ターゲットを生成するために必要なファイルを指定する。AM_CPPFLAGS = オプション
: コンパイラに渡すオプションを指定する。autoscan
コマンドを実行して、configure.scan
ファイルを生成する。$ autoscan
configure.scan
ファイルをconfigure.ac
にリネームする。$ mv configure.scan configure.ac
configure.ac
ファイルを必要最低限の修正する。(末尾に「★」を付けた行が対象)# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) AC_INIT([test], [1.0], [starbow.duster@gmail.com]) ★ パッケージ名, バージョン, バグレポート用アドレスを記入 AM_INIT_AUTOMAKE([foreign subdir-objects]) ★ 不要ファイルの自動生成を防ぐforeignとサブディレクトリに対応するためのsubdir-objectsを追加 AC_CONFIG_SRCDIR([config.h.in]) ★ ソースコードのディレクトリをconfig.h.inに変更しておくとrenameされた場合にも対応できる AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. AC_CHECK_HEADERS([libintl.h locale.h]) # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_CHECK_FUNCS([setlocale]) AC_CONFIG_FILES([Makefile]) AC_OUTPUT
プリプロセッサ用のヘッダファイルの生成する。
$ autoheader
automake用のm4ファイルを生成する。
$ aclocal
Makefile.inを生成する。
$ automake --add-missing
configureスクリプトを生成する。
$ autoconf
Makefileの生成・ソフトウェアのビルド・パッケージのインストールできることを確認する。
$ ./configure $ make $ make install
マニュアルページをインストールできるMakefile
を生成
「CプログラムのソースコードをビルドできるMakefile
の生成」との差分のみ説明する。
Makefile.am
ファイルに以下を追記する。man_MANS = man/test.1
man_MANS = ターゲット
: マニュアルページのパスを指定する。
gettextでローカライズが可能なMakefile
を生成
「CプログラムのソースコードをビルドできるMakefile
の生成」との差分のみ説明する。
configure.ac
ファイルを修正する。(末尾に「★」を付けた行が対象)# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) AC_INIT([test], [1.0], [starbow.duster@gmail.com]) AM_INIT_AUTOMAKE([foreign subdir-objects]) AC_CONFIG_SRCDIR([config.h.in]) AC_CONFIG_HEADERS([config.h]) AM_GNU_GETTEXT([external]) ★ 出力ファイルを自動生成する AM_GNU_GETTEXT_VERSION(0.19) ★ gettextのバージョンを指定する # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. AC_CHECK_HEADERS([libintl.h locale.h]) # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_CHECK_FUNCS([setlocale]) AC_CONFIG_FILES([po/Makefile.in Makefile]) ★ po/Makefile.inも生成する AC_OUTPUT
gettextの基礎となるファイルを生成する。
$ autopoint
Makevars.template
をコピーしてMakevars
を作成する。$ cp po/Makevars.template po/Makevars
利用可能な言語を記述するファイル
po/LINGUAS
を作成する。# Set of available languages ja
翻訳が必要なファイルを記述するファイル
po/POTFILES.in
を作成する。# List of source files which contain translatable strings. src/main.c
翻訳が必要なファイルを記述するファイル
Makefile.am
を作成する。SUBDIRS = po ★ 対象としてpo以下も適応する bin_PROGRAMS = test man_MANS = man/test.1 test_SOURCES = src/main.c src/sub.c include/func.h AM_CPPFLAGS = -I$(top_srcdir)/include
下記のコマンドを実行して、
Makefile
ファイルを生成する。$ autoheader $ aclocal $ automake --add-missing $ autoconf $ ./configure
多言語翻訳用テンプレートの
po/test.pot
を生成する。(test
の部分はバイナリ名と一致する)$ make
多言語翻訳用テンプレートの
po/test.pot
から日本語翻訳ファイルja.po
を新規作成する。$ cp po/test.pot po/ja.po
日本語翻訳ファイル
ja.po
を修正する。(末尾に「★」を付けた行が対象)# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the test package. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: test 1.0\n" "Report-Msgid-Bugs-To: starbow.duster@gmail.com\n" "POT-Creation-Date: 2020-06-27 01:09+0900\n" "PO-Revision-Date: 2020-06-27 01:10+0900\n" ★ このファイルの更新日時を記入する "Last-Translator: LeavaTail <starbow.duster@gmail.com>\n" ★ このファイルを編集した人を記入する "Language-Team: ja\n" ★ 翻訳後の言語担当チームを指定する "Language: ja\n" ★ 翻訳後の言語を指定する "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" ★ 文字コード(UTF-8が妥当)を指定する "Content-Transfer-Encoding: 8bit\n" #: src/main.c:14 msgid "Hello,World!\n" msgstr "こんにちは、世界!\n" ★ 日本語翻訳を記述する
多言語翻訳リソースの更新とコンパイル
$ make -C po/ update-po
注意: make install
でパッケージのインストールまでしないと、ローカライズされない。
補足
手順の効率化
autoreconfを使う
ここまで手順を紹介してきたが、その中でたくさんのコマンドが登場してきた。
configure.ac
とMakefile.am
からconfigure
を生成するのに下記の4つのコマンドが必要になる。
autoheader
:configure.ac
からプリプロセッサ用のヘッダファイルの生成する。aclocal
:configure.ac
からautomake用のm4を生成する。automake
:Makefile.am
などからMakefile.in
を生成する。autoconf
:configure.ac
などからconfigure
を生成する。
autoreconf
はこれらの処理を自動的に実行してくれるコマンドである。
OSSライセンスについて
OSS利用者にとって一番気を付けなければいけないことがOSSライセンスである。
調べてみると、このあたりを言及している記事はいくつか見つけることができた。
それらによると、GNU automakeとGNU Autoconfを利用することに関しては、強制的にGPLライセンスにされることはないらしい。
どういうことかというと、autotoolsによって生成されるのは全てテキスト(スクリプト)ファイルであり、そこにはライセンス条項がきちんと記載されている。そう、例のGPL文が載っている…のに続いて、As a special exception...というパラグラフがある。
As a special exception to the GNU General Public License, if you distribute this file as part of a program that contains a configuration script generated by Autoconf, you may include it under the same distribution terms that you use for the rest of that program.
趣旨としては、autoconfで自動生成された*1ものであり、かつ、配布物の一部として含まれる場合は、ライセンスはGPLにしなくてもいいよということみたいだ。これなら、会社とかプロプラな組織でも安心してautotoolsが使えるね! https://kuenishi.hatenadiary.jp/entry/20080303/1204474761
一方でgettext-toolsを利用することに関しては、強制的にGPLライセンスにされると思われる。
以下のようなGPL違反の問題があげられている。
各国語対応のため,gettextパッケージ(GPL-2ライセンス)のソースコードの一部(libintl)を利用したにもかかわらず,該当の配布物(ライセンスを明確にしていないソースコード・非GPLのソースコード,およびバイナリのみ公開のライブラリを含む)がGPLでの配布ではなかった https://gihyo.jp/news/report/2019/03/0401
注意: あくまでどちらも私の理解を記述しているだけなので、利用時にはライセンス表記やライセンサーに問い合わせることを推奨する。
おわりに
本記事では、小規模ソフトウェアパッケージを想定として、Autotoolsの手順を紹介した。
今回は、「ソースコードがビルドできる」「マニュアルページをインストールできる」「gettextでローカライズが可能」を目的としたため、最小限のconfigure.ac
やMakefile.am
のパラメータを変更した。
しかし、これらのファイルには多数のパラメータが存在しており、さまざまな状況下でも対応することができる。
実際に中/大規模のプロジェクトでAutotoolsを利用するときには、automakeの公式ページや他プロジェクトを確認しておくとよいだろう。
変更履歴
- 2020/06/27: 記事公開
参考
Automake関連
- automake: automakeの公式ページ
- Autotools - Wikipedia: Autotoolsによる作業の流れなど確認しておくとよい
- Autotoolsを使ってプロジェクトのMakefileを生成する - Qiita: 本記事と同じくautomakeの手順とbootstrap.shなど
- autotoolsメモ - Qiita: 本記事と同じくautomakeの手順とライブラリの生成手順など
- Autotoolsについてのメモ: 本記事と同じくautomakeの手順とautoreconfの説明など
- makeとconfigureと、もっとナウいやつ - Qiita: automakeとそのほかの同機能ツール(CMakeなど)
- Automakeでライブラリを作ることにチャレンジ1年生 - Qiita: automakeでライブラリを生成する手順
- autoconf & automake: 本記事と同じくautomakeの手順とライブラリの生成手順、各ファイルの設定など
- configureの作り方(autotoolsの使い方) - のぴぴのメモ: autotoolsのコマンドと生成されるファイルの説明など
- autotools CapmNetwork: autotoolsオープンソースのライブラリ構成サンプルや各設定ファイルのパラメータなど
Gettext関連
- C言語系/memos/gettext - Glamenv-Septzen.net: gettextの使い方とautotoolsとの組み合わせ方
- gettext with Autotools Tutorial – Guy Rutenberg: AutomakeとGettextのチュートリアル.
OSSライセンス関連
- autoconfのライセンス考察 - なんとな~くしあわせ?の日記: 各ファイルとOSSライセンスの対応関係
- autotoolsを使って作成したソフトウェアパッケージはGPLにしなければならないのか? - kuenishi's blog: 公式ページからautomakeのGPLライセンスについて見解
- OSSライセンスMeetup Vol.2「実録:GPL違反とその対応を振り返る」参加レポート:レポート|gihyo.jp … 技術評論社: gettextでライセンス違反が起きた例
- https://www.gnu.org/software/automake/manual/automake.pdf: 公式ドキュメント
*1:cmakeやMesonなど別のツールに乗り換えるのも手ではあるが