2017-01-29 3 views
-1

フォルダ構造:Makefileの混乱偽ハック

  • のMakefile
  • rect_01.c
  • rect_02.c
  • square_01.c

のMakefile(関連部品):

%.c: 
    echo 'Building [email protected] for $(PLATFORM)...' 
    $(CC) $(CFLAGS) [email protected] -o '$(DESTDIR)/$*' 

コマンド:

make rect_01.c PLATFORM=FOO 

問題は - 私に出力を与えた:

'rect_01.c up already to date' 

だから私はハックを試してみましたが、%の.Cは、すべて実行する必要があるように私は.PHONY、 に追加の依存関係を追加しました時間。しかし今は、私の メイクファイルに拡張子.cがなくてもコンパイルしようとしています。

私は、次の更新されたメイクファイル(関連部分)を書いた:

.PHONY: phonyDummy 

%.c: phonyDummy 
    echo 'Building [email protected] for $(PLATFORM)...' 
    $(CC) $(CFLAGS) [email protected] -o '$(DESTDIR)/$*' 

私に次のような出力が得られます。

make rect_01.c PLATFORM=LINUX_X86 
echo 'Building Makefile.c for LINUX_X86...' 
Building Makefile.c for LINUX_X86... 
g++ -Wall -g Makefile.c -o '../Executables/Makefile' 
Makefile: file not recognized: File format not recognized 
Makefile:55: recipe for target 'Makefile.c' failed 
make: *** [Makefile.c] Error 1 

あなたはこの動作を説明できますか?

+0

メイクファイルの出力は入力ではなく左側になります。 – stark

答えて

0

Makefileについて詳しく知る必要があります。あなたは2つの重要なことを混在させます:目標と依存関係。

ターゲットは、ルールで作成する必要があるファイル(ほとんどの場合)です。依存関係は「ソース」です。

あなたが書く場合:それは意味

%.c: 
    echo 'Building [email protected] for $(PLATFORM)...' 
    $(CC) $(CFLAGS) [email protected] -o '$(DESTDIR)/$*' 

: "私は.c拡張子を持つファイルを作成したいです"。多くの(3つの).cファイルがあるので、.cファイルを作成する必要はありません。 makerect_01.cをチェックします。それは依存関係がないため(存在しないため)、存在し、最新の状態です(:の後には何もありません)。

私はrect_01.so(またはこれに類するもの)をビルドしたいと思います - これはのターゲットです!だから、類似したい:この場合

%.o: %.c 
    echo 'Building [email protected] for $(PLATFORM)...' 
    $(CC) $(CFLAGS) -o [email protected] $< 

あなたがrect_01.oを構築したい場合は、make rect_01.oを実行する必要があります。 $(CC)は、rect_01.oが存在しないか、rect_01.cより古い場合に実行されます(したがって、ソースrect_01.cは新しいものであり、まだ再構築されません)。