Gtk+ 3 アプリケーションの Makefile.am

Ubuntu 14.04 LTS の libgkt-3-dev のバージョンは 3.10.8 で、 アプリケーションを GNU Automake と GNU make でビルドします。 Meson より前の古いビルド方式で、 過渡期だったためか、 ドキュメントが乏しいので、 自分用に事例をメモしておきます。

題材は Gtk+ 3.10.8 のサンプル・コードとします。 なお、 このサンプル・コード添付の Makefile.am を使わず、 自力で書き込むことにします。

examples/application9

ソースコードをダウンロードして、 次のように配置します。 プロジェクト・ディレクトリの exampleapp にファイルを置かず、 src ディレクトリにまとめます。

$ cd exampleapp
$ ls -CF
src/
$ ls -CF src
app-menu.ui               exampleappprefs.h  org.gtk.exampleapp.gschema.xml
exampleapp.c              exampleappwin.c    prefs.ui
exampleapp.gresource.xml  exampleappwin.h    window.ui
exampleapp.h              gears-menu.ui
exampleappprefs.c         main.c

exampleapp/ ディレクトリへ Makefile.am を書き込みます。 サブディレクトリ src でビルドし、 README ありを意味します。

$ cat Makefile.am
SUBDIRS=src
dist_doc_DATA=README

exampleapp/src/ ディレクトリへ Makefile.am を書き込みます。 exampleapp バイナリ・プログラムをビルドするという意味です。 インストールするためにバイナリ・プログラムを生成したいときは bin_PROGRAMS、 ビルドしたプログラムをインストールせずにその場で実行するだけのときは noinst_PROGRAMS を指定します。 今回は後者です。 ソースファイルのうち resouces.c は *.ui から作成します。 さらに、 gsettings スキーマコンパイルして、 gschemas.compiled を生成します。 生成規則は make の規則そのものなので、 タブで字下げしておかなければなりません。

$ cat src/Makefile.am
#bin_PROGRAMS=exampleapp
noinst_PROGRAMS=exampleapp
exampleapp_SOURCES=main.c exampleapp.c exampleappwin.c exampleappprefs.c resources.c
EXTRA_DIST=window.ui app-menu.ui prefs.ui gears-menu.ui \
	   exampleapp.gresource.xml org.gtk.exampleapp.gschema.xml
AM_CPPFLAGS=@GTK_CFLAGS@
LDADD=@GTK_LIBS@

BUILT_SOURCES=resources.c gschemas.compiled

resources.c : exampleapp.gresource.xml window.ui app-menu.ui prefs.ui gears-menu.ui
	$(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) $(srcdir)/exampleapp.gresource.xml \
	  --target=$@ --sourcedir=$(srcdir) --generate-source

gsettings_SCHEMAS=org.gtk.exampleapp.gschema.xml

@GSETTINGS_RULES@

gschemas.compiled : org.gtk.exampleapp.gschema.xml
	$(GLIB_COMPILE_SCHEMAS) .

MOSTLYCLEANFILES=resources.c gschemas.compiled

これらの Makefile.am を使うように exampleapp/ ディレクトリへ configure.ac を書き込みます。 Gtk+ 3 では、 glib2.0 と gsettings の m4 マクロが gtk-3 とは別に分かれており、 それぞれを指定しておきます。 なお、 AM_PATH_GLIB_2_0 マクロが、 GLIB_COMPILE_RESOURCES 変数等を設定します。 GLIB_GSETTINGS マクロが、 GSETTINGS_RULES 変数と GLIB_COMPILE_SCHEMAS 変数を設定します。 どのような変数が利用できるかは、 /usr/share/aclocal ディレクトリの m4 マクロから読み取るのが早道です。

$ cat configure.ac
AC_INIT([exampleapp], [1.0], [bugs@example.net])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AM_PATH_GLIB_2_0([2.40.2],[],AC_MSG_ERROR([apt-get install libglib2.0-dev]))
AM_PATH_GTK_3_0([3.10.8],[],AC_MSG_ERROR([apt-get install libgtk-3-dev]))
GLIB_GSETTINGS
AC_CONFIG_FILES([Makefile src/Makefile])
AC_OUTPUT

README ファイルをダミーで追加して、 configure スクリプトを生成します。

$ touch README
$ autoreconf --install

configure で Makefile を生成し、 make でバイナリを作ります。 このアプリケーションは、 gsettings のスキーマをカレントディレクトリから読み込むようハードコードしてあるので、 src ディレクトリへ入ってから、 exampleapp を実行します。

$ ./configure
$ make
$ cd src
$ ./exampleapp main.c exampleapp.c