試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

PulseAudioのWAVE保存ツールをパッケージ化した際のメモ

PulseAudio上のオーディオをWAVE保存するツールをGTK+のGUIアプリケーションに」でGTK+アプリケーションとして作成したものをautoconf/automakeなどによるビルドシステムでC言語アプリケーションとしてビルド/インストールできるようにパッケージ化した。
(2014/10/23)2014年時点では特にこのようなツールを使用しなくてもPulseAudio使用アプリケーションで出ている音は録音アプリケーションで保存できるようになっており、公開は終了している。

  1. メモ
    1. ビルドシステム関係
    2. アイコン

メモ

ビルドシステム関係
Vala言語で書かれたソースファイル群をそれぞれ対応するC言語のコードに変換してビルドシステム上でうまく処理するための要領はValaの本体のパッケージに含まれる幾つかのMakefile.amが特に参考になった。

  • Vala言語のコードにgettextによるメッセージの国際化*1を使用する場合「#error You must define GETTEXT_PACKAGE before including gi18n-lib.h. Did you forget to include config.h?」というメッセージによりC言語のコードがコンパイルできないが、GCCのオプションに--include=config.hを付けて下のようにすることで回避した*2・また、PACKAGE_LOCALE_DIRは別途src/Makefile.amなどで定義されるようにする必要がある

[引用]ファイル名: parecwave-0.1.0/vapi/config.vapi

[CCode (cprefix = "", lower_case_cprefix = "", cheader_filename = "config.h")]
namespace Config
{
  public const string GETTEXT_PACKAGE;
  public const string PACKAGE_LOCALE_DIR;
  public const string PACKAGE_NAME;
  public const string VERSION;
  public const string PACKAGE_URL;
  public const string PACKAGE_DATA_DIR;
  public const string PACKAGE;
}

[引用]ファイル名: parecwave-0.1.0/src/main.vala より

using Config;
using GLib.Intl;

(中略)

namespace PaRecWave
{
  class MainClass
  {
    public static int main (string[] args)
    {
      bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
      bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
      textdomain (GETTEXT_PACKAGE);
(中略)
    }
  }
}
  • 「.vala.stamp」という拡張子のファイルをビルドのルールに用いて下のような要領でsrc/Makefile.amを記述することにより、Vala言語のコードに変更があったとき、次のmake時にvalacを実行して対応するC言語のコードに変更を反映するようにできる*3

[引用]ファイル名: parecwave-0.1.0/src/Makefile.am より

NULL =

AM_CPPFLAGS = \
	-DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \
	-DPACKAGE_DATA_DIR=\""$(datadir)"\" \
	$(NULL)

AM_CFLAGS = \
(中略)
	--include=config.h \
	$(GTK_CFLAGS) $(GSTREAMER_CFLAGS) \
	$(NULL)

BUILT_SOURCES = parecwave.vala.stamp

bin_PROGRAMS = parecwave

parecwave_VALASOURCES = \
	main.vala \
	mainwindow.vala \
	pipeline.vala \
	header.vala \
	appinfo.vala \
	$(NULL)

parecwave_SOURCES = \
	parecwave.vala.stamp \
	$(parecwave_VALASOURCES:.vala=.c) \
	$(NULL)

parecwave_LDFLAGS = \
	-Wl,--export-dynamic \
	$(NULL)

parecwave_LDADD = $(GTK_LIBS) $(GSTREAMER_LIBS)

parecwave.vala.stamp: $(parecwave_VALASOURCES)
	$(VALAC) $(VALAFLAGS) -C --vapidir $(srcdir)/../vapi --pkg gstreamer-0.10 --pkg gtk+-2.0 --pkg config $^
	touch $@

EXTRA_DIST = $(parecwave_VALASOURCES) parecwave.vala.stamp

MAINTAINERCLEANFILES = \
	$(parecwave_VALASOURCES:.vala=.c) \
	$(NULL)

上の変数VALACはconfigure.ac

AC_PATH_PROG(VALAC, valac, valac)
AC_SUBST(VALAC)

のようにして設定しておくことになるが、configureスクリプトの実行時にvalacコマンドがなくてもエラーが出るわけではない。
なお、外部のパッケージから利用してもよいクラス(「public」を付けたクラス)がある場合、valacを実行するところで

	$(VALAC) $(VALAFLAGS) -C --vapidir $(srcdir)/../vapi --pkg gstreamer-0.10 --pkg gtk+-2.0 --pkg config -H parecwave.h --library parecwave $^

のようにすることでCヘッダファイルと.vapiファイルを作成できる。publicなクラスがなければ-H--libraryのオプションを付けてもほとんど空の内容で生成される。今回のPaRecWaveでは公開クラスはないため、これらのオプションはvalacには渡していないが、これらのヘッダと.vapiファイルを生成する場合はMakefile.amの変数MAINTAINERCLEANFILESに記述するようだ。
[引用]ファイル名: vala-0.7.3/vala/Makefile.am より

(中略)
vala.vapi vala.vala.stamp: $(libvalacore_la_VALASOURCES)
	$(VALAC) -C --vapidir $(srcdir)/../vapi --pkg gobject-2.0 --vapidir ../gee --pkg gee --vapidir ../ccode --pkg ccode --pkg config -H vala.h --library vala $^
	touch $@
(中略)
MAINTAINERCLEANFILES = \
	vala.vapi \
	vala.h \
	$(libvalacore_la_VALASOURCES:.vala=.c) \
	$(NULL)

アイコン
アイコンの作成において、「波」の部分で使用するためにInkscapeで正弦曲線(サインカーブ)を描く必要があった。これには
http://web.archive.org/web/20120430041044/http://www.catch.jp/wiki/index.php?Inkscape%20Function-Plot
の情報が役に立った。

関連URL:

*1:_()などの関数

*2:ただ、C言語のマクロENABLE_NLSが定義されたときにのみgettext関係の関数を呼ぶようにする方法は分からない

*3:公開したパッケージに含まれているCソースをそのままビルドする場合にはValaパッケージがインストールされている必要はない