2016-04-27 6 views
0

誰かがこのコードの仕組みを明確にすることができますか?メイクファイルの構文を明確に

PRE_PROC_EXE  := $(shell which pre_proc.pl) 
PRE_PROC2_EXE  := $(shell which pre_proc2.pl) 

$(filter $(TMP_DIR)/%.c,$(FILES)):$(TMP_DIR)/%.c: $(SRC_DIR)/%.c 
    $(PRE_PROC_EXE) < $< > [email protected] 

私は、ステップ1(PRE_PROC2_EXEを使用)によって生成されたファイルに前処理の一歩を追加しようとしていました。それ、どうやったら出来るの?

+0

同じレシピまたはそれ自身のレシピで 'PRE_PROC2_EXE'を使用しようとしていますか?ストリーミングされた入力またはファイルを直接取るか?中間ファイルの2番目のセットが必要ですか? –

+0

中間ファイルの第2セットが必要です。 './pre_proc2.pl in_file> out_file' – Jean

+0

2番目のmakeルールは必要ですか? '$(FILES)'や別のmake変数などに別のエントリが必要なのでしょうか?その1つのルールで両方のコマンドを実行したいだけですか? –

答えて

1

どのように機能しますか?それは魔法によって動作します! - 私の意見では、それはひどいビットのMakefileです(最後に実用的な発言)。

makeはシンプルな構文で、シンプルなシステムですが、これはうまくいきます。しかし、何年も前から、それは圧縮された構文と広範なマニュアルを持っていて、いくつかのMakefileを一緒にしてラインノイズのように見せている(そして私はあなたに、GNU Makeを見ています)。ここなど。

時にはあなたは、ない多かれ少なかれソフトウェアのビットを構築するための巧妙な事をしなければならないが、(私の意見と経験で)これらははるかに自然と分かりルールに洗練さを追加することによって処理されますメークファイル構文自体。そうすれば、Makefileの構造を合理的に分かりやすくすることができます。これは、ソフトウェアの構築方法を理解し調整する必要がある場合に重要です。

私は非常に複雑なMakefileを書きますが、たまにはpatsubstのような複雑なフィルタを使用します(しかし、私は一般的にGNU Make-BSD/POSIX Makeを使用しています。

また、重い持ち上げの特定の部分を行うために補助ツールを使用することもできます。たとえば、あなたは、ツールの検索を行うにはautoconfを使用する場合がありますMakefile.in

[email protected][email protected] 
[email protected][email protected] 

を書き、そして含まconfigure.ac

dnl Process this file with autoconf 
AC_INIT(fooprog, 0.1-SNAPSHOT, [email protected]) 

AC_PATH_PROG(PRE_PROC_EXE, pre_proc.pl, NOT_FOUND) 
AC_PATH_PROG(PRE_PROC_EXE2, pre_proc2.pl, NOT_FOUND) 

AC_CONFIG_FILES([Makefile]) 
AC_OUTPUT 

その後 autoconf; ./configure pre_proc{,2}.plを見つけるだろう書いて、新しいに代入します Makefileautoconfは少しは慣れていますが、初めて慣れると自然になります。

あなたの特定の例に戻って、私はそのターゲットが何をするか少し考えを(二つのコロンは?私は...知られたくない)持っている、しかし、あなたは

$(PRE_PROC_EXE) < $< | $(PRE_PROC_EXE2) > [email protected] 
にルールを調整することができるかもしれません

は、両方のプリプロセッサを通じて入力ファイル*.cを渡します。

+0

Lol ..'いくつかのMakefileをラインノイズのように見せてください。 – Jean

1

$(shell)は、シェルコマンドを実行してその出力を返すmake関数です。

したがって、PRE_PROC_EXEにはwhich pre_proc.plの出力が含まれ、PRE_PROC2_EXEにはwhich pre_proc2.plの出力が含まれます。 (whichは移植性がなく、存在することが保証されておらず、動作の仕様がないため、出力に頼ることができないので、このように使うのは良い考えではないことを指摘します。)

残りは$(filter $(TMP_DIR)/%.c,$(FILES))から$(TMP_DIR)/%.cパターン()と一致$(FILES)のエントリに動作し、前提条件($<)と一致するよう$(TMP_DIR)/%.cファイルとして一致$(SRC_DIR)/%.cファイルを使用して、それらにレシピを適用Static Pattern Ruleありますターゲット([email protected])。

PRE_PROC2_EXEをこの方法に適用する方法については、スクリプトの仕組みや適用方法について説明していないため、簡単に回答できません。

関連する問題