2016-11-17 7 views
2

今、私はmakefileの使い方を学んでおり、ルール内の変数に問題があります。私の目標は、他のファイルの名前を含むファイルを解析し、それを変数に保存し、その変数を「ターゲットパターン」として使用して各ファイルに対してルールを実行することです。ここに私の問題の簡単な例があります(私はそれを簡単にするためにファイル名を書いています)。ルール外のmakefile変数の使い方

私は実行すると、この:

variable = file1.txt file2.txt file3.txt 

run : $(variable) 

$(variable): %.txt: 
    echo File is [email protected] 

私は私が欲しいものであるとして、次を得る:

$ make run 
echo File is file1.txt 
File is file1.txt 
echo File is file2.txt 
File is file2.txt 
echo File is file3.txt 
File is file3.txt 

問題、私はファイルを解析してvariableを定義したい、と私はしたいですそのファイルが存在しない場合は、makefile内の別のルールを使用して作成するため、そのファイルは依存関係になります。私は(私は私の反響からあります知っている)、このようなルールで変数を定義するときに:

$ make target1 
echo file1.txt file2.txt file3.txt 
file1.txt file2.txt file3.txt 

そして、この:

$ make run 
make: Nothing to be done for `run'. 

target1 : 
    $(eval variable = file1.txt file2.txt file3.txt) 
    echo $(variable) 

run : $(variable) 

$(variable): %.txt: 
    echo File is [email protected] 

私は次の取得します

私の質問はどのようにルール内の変数を定義し、これを何かの行に使用することです:

$(variable): %.txt: 
    echo File is [email protected] 

私はマニュアルとグーグルで読んでみましたが、これを理解できません。私はまた、私は行方不明の簡単な答えがいくつかあると思います。あなたの助けをありがとう! :)

+0

makeの仕組みのためにうまくいきません:FIRST makeは、必要に応じて、全メイクファイルを解析し、変数を展開します。その後、makeは古いルールのレシピを実行し始めます。したがって、makeが 'eval'を含む' target1'のレシピを実行するまでに、残りのmakefileはすでに解析されており、 'variable'はすでに(空の文字列に)展開されています。 – MadScientist

答えて

2

にあなたが、これは簡単ですtarget1作成されたファイルの内容を制御することができた場合:

run: 

include target1 

run: $(variable) 

$(variable): %.txt: 
     echo File is [email protected] 

target1: 
     echo 'variable = file1.txt file2.txt file3.txt' > [email protected] 

:ちょうどこのように、includeコマンドを使用して、変数の代入を行うことが、そのファイルのフォーマットを作りますautomatically generated makefilesの魔法によって、makeはそのターゲットファイルを再作成し、自動的に自動的に再起動します。

+0

これは大変感謝しています!魅力のように動作し、あなたはそれをとてもうまく説明しました! :) –

関連する問題