書かれた質問
Makefile.amでは、次のようなことができます。
foo.c: foo.in
FOOPLACE=`./thescript`; $(FOOPLACE) -c -o $@ $<
これには、移植可能なMakefileコードであることが意図されているものにGNU-ismを必要としないという利点があります。
正しくて難しい方法
というツールを使ったダミーパッケージを用意しましたmkfoo
。内部コピーまたはホストのシステム上のコピーを使用できます。
最初に見てみましょうconfigure.ac
:
AC_PREREQ([2.67])
AC_INIT([parent], [0], [jack@jackkelly.name])
AM_INIT_AUTOMAKE([foreign])
AC_ARG_WITH([mkfoo],
[AS_HELP_STRING([--with-mkfoo],
[Path to mkfoo, "external", "internal", or "check" @<:@check@:>@])],
[MKFOO=$withval],
[with_mkfoo=check])
AS_IF([test "$with_mkfoo" = check -o "$with_mkfoo" = external],
[AC_PATH_PROG([MKFOO], [mkfoo], [no])])
AS_IF([test "$with_mkfoo" = external -a "$MKFOO" = no],
[AC_MSG_ERROR([External mkfoo demanded, but not found.])])
dnl We conditionally set MKFOO in Makefile.am
AM_SUBST_NOTMAKE([MKFOO])
AM_CONDITIONAL([USE_INTERNAL_MKFOO],
[test "$with_mkfoo" = internal -o "$MKFOO" = no])
AM_COND_IF([USE_INTERNAL_MKFOO], [AC_CONFIG_SUBDIRS([mkfoo])])
AC_CONFIG_FILES([Makefile src/Makefile])
AC_OUTPUT
ここで起こっていることがいくつかあります:
- デフォルトの動作は、「mkfooをチェックし、存在しない場合は、バンドルされたコピーをビルドして使用する」です。
--with-mkfoo=PATH
また、 (ユーザーが奇妙な場所にコピーをインストールしている可能性があります)、--with-mkfoo=internal
(すべてをテストしたいdistcheckに必要)、(--with-mkfoo=external
バンドルされたサブプロジェクトが好きではないパッケージメンテナへの親切)をサポートしていることにも注意してください。
AM_SUBST_NOTMAKE([MKFOO])
automake
でフォームの行を生成するのを停止MKFOO = @MKFOO@
しMakefile.in
ます。その割り当てを条件付きで行う必要があります。
mkfoo
内部/外部の内部で異なることを行う必要があるため、automake条件付きを設定しましたMakefile.am
mkfoo
条件付きでディレクトリを設定します。
さて、トップレベルMakefile.am
:
if USE_INTERNAL_MKFOO
SUBDIRS = mkfoo
DIST_SUBDIRS = mkfoo
else
SUBDIRS =
DIST_SUBDIRS =
endif
SUBDIRS += src
DIST_SUBDIRS += src
## Need to make sure the internal tools work during distcheck.
DISTCHECK_CONFIGURE_FLAGS = --with-mkfoo=internal
dist-hook:
if ! USE_INTERNAL_MKFOO
cp -fpR $(srcdir)/mkfoo $(distdir)
endif
何が起きてる:
- 条件付きでに再帰し
mkfoo
、の前src
に実行します。これには。が必要$MKFOO
です。
- 設定されていない場合もあるため、
mkfoo
がない場合があります。それは私たちが壊れたことを意味します(そしてひいては)。したがって、条件付きで設定する必要があります。設定していない場合は、確実に配布されるようにすることが私たちの責任になります。Makefile
make dist
make distcheck
DIST_SUBDIRS
mkfoo
make distcheck
ソースtarballですべてを実行する方がよいため、内部コピーを使用する場合。
さて、src/Makefile.am
:
if USE_INTERNAL_MKFOO
MKFOO = $(abs_top_builddir)/mkfoo/mkfoo
else
MKFOO = @MKFOO@
endif
bin_SCRIPTS = foo
CLEANFILES = foo
EXTRA_DIST = foo.in
foo: foo.in
$(MKFOO) < $< > $@
の条件付き割り当てを除いて、ここで衝撃的なことは何もありませんMKFOO
。
src/foo.in
:
I am foo.in!
次に、サブパッケージについて説明します。mkfoo/configure.ac
:
AC_PREREQ([2.67])
AC_INIT([mkfoo], [0], [jack@jackkelly.name])
AM_INIT_AUTOMAKE([foreign])
AC_PROG_CC
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
ご覧のとおり、特別なことは何もありません。どうmkfoo/Makefile.am
ですか?
bin_PROGRAMS = mkfoo
mkfoo/mkfoo.c
:
#include <stdio.h>
int main(int argc, char *argv[]) {
puts("Internal mkfoo.");
return 0;
}
単なるダミーのテストプログラム。