2017-04-06 10 views
0

私は* .sファイルを入力として、拡張子が出力ファイルとして取り除かれたファイルを作成しようとしています。私は($basename ...)で即時バインディングを使うことができると思ったが、これはうまくいかなかった。私の最小限の例:Makefile:immedateの割り当てが遅く評価されましたか?

INPUT := *.s 
OUTPUT := $(basename $(INPUT)) 

all: 
    echo 'input:' $(INPUT) 
    echo 'output:' $(OUTPUT) 

実行し、

echo 'input:' *.s 
input: hello.s int3.s 
echo 'output:' * 
output: Makefile int3 hello hello.o hello.s int3.s 

私は:=が即時評価を強制するだろうと思ったが、実際に遅延結合を行うようだ、とベース名は「.S」のストリップを生産しますから "*"。これにより、ディレクトリ内のすべてのファイルが生成されます。どのように私はこの拡張子を削除した.sファイルを私に与えるだけですか?

INPUT := *.s 

で:

INPUT := $(wildcard *.s) 

*.sの最初の原因即時割り当てINPUTに、あなたは がたくない

答えて

1

あなたが交換する必要があります。 2つ目は、 のファイル名リストの即時割り当てを$(wildcard *.s)の拡張から行います。

4.4.1 Wildcard Examples と注意を参照してください:

変数を定義するとき

ワイルドカード展開は起こりません。このように、あなたはこれを書いた場合:

objects = *.o 

は、変数オブジェクトの値は、実際の文字列「* .oの」です。 [...] 使う代わりに、拡張にオブジェクトを設定するには:

objects := $(wildcard *.o) 
+0

だから、 '場合:='「*を評価する」意味するものではありません、どのように '='オペレータから、それは異なっています? – Ant6n

+0

@ Ant6nこんにちは。更新を参照してください。 –

関連する問題