2012-07-22 5 views
5

私は、この構造のautotoolsの管理のプロジェクト(sscceのtar.gzパッケージhere)があります。autotoolsのMakefileは自動的にインクルードされたヘッダファイルを依存関係と見なしますか?

./main.c
./foo.c
./foo/foo.h

マイconfigure.acは次のとおりです。Makefile.amだった私の

AC_INIT([foo], [1.0], [[email protected]]) 
AM_INIT_AUTOMAKE([foreign -Wall -Werror]) 
AC_PROG_CC 
AC_CONFIG_HEADERS([config.h]) 
AC_CONFIG_FILES([Makefile]) 

AC_OUTPUT 

bin_PROGRAMS = main 
main_SOURCES = main.c foo.c foo.h 

これは完全にコンパイルされて実行されましたが、その後私はMakefile.amが正しくないことに注意します。私のメインコードはfoo.hに依存していましたが、実際のファイルはfoo/foo.hでした。

bin_PROGRAMS = main 
main_SOURCES = main.c foo.c foo/foo.h 

しかし、それは私の不思議製:それは前にあったように、私はそれを変更し、コンパイルが期待通りに働いていた依存関係が間違っていたとき、どのように機能するのですか?うまくいき、foo/foo.hmakeを編集しても、依存ファイルを再コンパイルできます。実は、私も...依存関係から

bin_PROGRAMS = main 
main_SOURCES = main.c foo.c 

をヘッダファイルを削除することもできます...そしてまだ依存ファイルの再コンパイルをトリガーするスキャンされます。

だから、私の質問は以下のとおりです。

  • 方法autotoolsの-生成Makefilefoo/foo.hmake呼び出し中に分析するための依存関係であることを知っていますか?
  • 変数main_SOURCESにヘッダファイルを追加する必要がありますか?
  • 存在しないファイルが依存関係であると宣言しているため、makeが最初のケースで失敗しないようにしてください。
+0

好奇心ではなく、いくつかの詳細を省略していますか? '-I $(srcdir)/ foo'は' CPPFLAGS'にどのように入っていますか? –

+0

@WilliamPursellまあ、私は実際のシナリオのいくつかの詳細を省略していますが、以下の例は期待通りにコンパイルされています。この場合、 '-I $(srcdir)/ foo'は' foo.c'と 'main.c'の両方にファイル名が含まれているので、' #include "foo/foo.h" 'ここに見られるように(http://pastebin.com/p9d1XNcU)。 – brandizzi

答えて

5

automake manualをご覧ください。依存関係の計算は、コンパイル時の副作用として、ビルド時に行われます。 history of dependency trackingもおもしろいかもしれません。ここでは、マニュアルに誤りがあることに注意してください:それは無条件にあなたのコンパイラはそれなしで行うことができればケース(configure時のチェックでテストされていない、呼び出されることがdepcompのように聞こえる:Makefile.in@[email protected]ラインを参照してください

これは、各オブジェクトの依存関係をリストアップしたファイルが、.depsという隠れサブディレクトリに格納されていることを意味しています(gccの場合、これは-MDと関連フラグ)

main_SOURCES変数にヘッダーを絶対に記載する必要があります。 は、make dist(または、さらによく、make distcheck)を実行するときにそれらをパッケージ化します。

は、実際にはmain_SOURCES行の依存関係を一覧表示していないため、存在しないヘッダーを指定しても失敗しません。 automakeはその割り当てを処理して、main(オブジェクトファイルのみに依存する)とさまざまなオブジェクトファイル(接尾辞ルールを使用)に基づいてルールを作成します。ヘッダーは、の入力ファイルではなく、ビルドプロセスで使用されます。サンプルプロジェクトにmake distを実行すると、エラーが表示されます。

make: *** No rule to make target `foo.h', needed by `distdir'. Stop. 
関連する問題