(Pythonスクリプトを介して)作成foo.hdb
および作成することになっている次のMakefile.amがあります。foo.cdb
foo.h
TESTS = check_foo
check_PROGRAMS = check_foo
check_foo_SOURCES = check_foo.c $(top_builddir)/src/isti.h \
foo.cdb foo.h foo.hdb
check_foo_CFLAGS = @CHECK_CFLAGS@ $(all_includes) -I../../clib/src/
check_foo_LDADD = $(top_builddir)/src/libcorm.la @CHECK_LIBS@ -lsqlite3
%.hdb %.cdb: %.h
PYTHONPATH=$(top_builddir)/cgen/src python $(top_builddir)/cgen/src/isti/cgen/run.py $<
clean-local:
rm -f *.hdb *.cdb
ただし、make foo.hdb
andmake foo.cdb
は機能しますが(Pythonコードを呼び出してfoo.hdb
とfoo.cdb
ファイルをから生成しますfoo.h
)、make clean check
(または2つを別々に)機能しません(欠落しているfoo.hdb
-そのようなファイルはありません)-から生成するためにパターンルールは呼び出されませfoo.hdb
んfoo.h
。
つまり、check_foo_SOURCESにリストされているファイルに対してパターンルールが呼び出されていません。
どうすればこれを機能させることができますか?残りのautotoolsインフラストラクチャは正常に機能しています。Makefileを見ると、autotoolsがチェックソースを拡張する方法に問題があるのではないかと思います。
これはすべてLinuxでGnumakeを使用しています。これがMakefileです。
[MadScientistの助けを反映するために少し更新されました]。
後で更新
次のMakefile(autotoolsではなくmakeだけ)は正常に機能するため、この問題はautotoolsとchecksupportに関連しているようです。
all: check_foo
CFLAGS=-I../../clib/src
LDFLAGS=-L../../clib/src/.libs
check_foo: check_foo.c foo.h corm_foo.h corm_foo.c
gcc $(CFLAGS) $(LDFLAGS) $^ -o $@ -lcorm -lsqlite3
corm_%.h corm_%.c: %.h
PYTHONPATH=../../cgen/src python ../../cgen/src/isti/cgen/run.py $<
clean:
rm -f corm_*.h corm_*.c
rm -f *.o
(ファイル拡張子がOKのままになるように、xxx.hdbからcorm_xxx.hなどに切り替えたことに注意してください)。
詳細
CHECKマクロに関連しているように見えるので、これはconfigure.acです。
AC_INIT([corm], [0.1], [a.cooke@isti.com])
AC_CONFIG_MACRO_DIR([m4])
PKG_CHECK_MODULES([CHECK], [check >= 0.9.4])
AM_INIT_AUTOMAKE([-Wall foreign -Werror])
AC_PROG_CC_C99
AM_PROG_CC_C_O
LT_INIT
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile clib/Makefile clib/src/Makefile clib/tests/Makefile clib/docs/Makefile cgen/Makefile cgen/docs/Makefile example/Makefile example/src/Makefile])
AC_CHECK_PROGS([DOXYGEN], [doxygen], AC_MSG_WARN([Doxygen not found - continuing without Doxygen support]))
AM_CONDITIONAL([HAVE_DOXYGEN], [test -n "$DOXYGEN"])
AM_COND_IF([HAVE_DOXYGEN], [AC_CONFIG_FILES([clib/docs/Doxyfile cgen/docs/Doxyfile])])
解決
さて、以下のさまざまなことを要約すると、2つの重要な問題がありました(ファイル拡張子を修正したら、「プレーンな」makefileとfcellerの回答を参照してください)。どちらも機能させるのに十分でした。
(処理)ヘッダーファイルは複雑です。自動依存関係のため、プログラムで生成されたヘッダーファイルは問題を解決します。解決策は、 BUILT_SOURCESを使用することです
ただし、.cファイル(の処理)は複雑ではありません。したがって、corm_foo.cをcheck_foo.cの前に置くと、そのファイルの生成がトリガーされます。これもcorm_foo.hを生成するため、すべてが機能します(check_foo.cにcorm_foo.hを含めることができるようになったため)。
また、fcellerには、整頓されたmakefileに関するいくつかの優れた一般的なポイントがあり、「プレーンな」makefileが機能する理由を説明しています。