2017-07-18 5 views
0

は私のメイクです:GNU makeの暗黙のルールを使って `foo`を` foo.s`から作る方法は?ここで

AS=nasm 
ASFLAGS=-f elf64 

%: %.o 
     ${LD} -o [email protected] $< 

は、私は、ソースファイルfoo.sがあると、私は実行可能fooを作るために、その後make foo.omake fooを実行することができます。

$ make foo.o 
nasm -f elf64 -o foo.o foo.s 
$ make foo 
ld -o foo foo.o 

しかし、私は直接make fooを実行する場合、ccが代わりに使用されています。

$ rm foo foo.o 
$ make foo 
cc -f elf64 foo.s -o foo 
cc: error: elf64: No such file or directory 
cc: error: unrecognized command line option ‘-f’ 
make: *** [<builtin>: foo] Error 1 

これは、「単一のオブジェクトファイルのリンク」のセクションの末尾に、the documentationに説明します。私は自動的にfoo.oからfoo.sからfoo.oを作るためにmake fooを実行してから、fooことができるように私は私のMakefileを書く必要がありますどのように

答えて

0

あなたは置き換えることができます:

%: %.o 
    ${LD} -o [email protected] $< 

によって:

ASEXES := $(patsubst %.s,%,$(wildcard *.s)) 

$(ASEXES): %: %.o 
    ${LD} -o [email protected] $< 

これはStatic Pattern Ruleです。 $(ASEXES)の各単語について、パターンルールではなく明示的なルールをインスタンス化します。だから、あなたが明示的に書かれていたかのように正確に処理されます。

foo: foo.o 
    ${LD} -o [email protected] $< 

$(ASEXES)の各fooのために、のようなパターンルールながら:

%: %.o 
     ${LD} -o [email protected] $< 

が異なる扱いをされているが(セクションでは、GNUのStatic Pattern Rules versus Implicit Rules題し見ますマニュアルを作る)。あなたがして、デフォルト暗黙のルールをクリアすることができます

+0

うまくいきます。理由を説明してもらえますか? – TheoYou

+0

GNU makeマニュアルへのリンクを追加しました。 –

関連する問題