2017-08-11 5 views
0

ソースファイル名のリストがsources.txtというテキストファイルにあります。 Makefileので、私はsources.txtからnameとして、すべてのファイル名を読み、次の行を含め、Makefileのループ付きメイクファイル

name.o: name.c name.h Makefile 
    $(CC) $(CFLAGS) -c name.c 

したいと思います。私はMakefileの作成を試みました。 source/sources.txt

CFLAGS = -Wall -std=c99 
CC = gcc 

sourcesfile="source/sources.txt" 
# Read every source file name. 
# Produce the corresponding .c, .h and .o extension versions. 
# Then add a file in the makefile as: 
# name.o: name.c name.h Makefile 
# $(CC) $(CFLAGS) -c name.c 
# If the line has main, handle that case separately -- there is no mention of main.h 

while IFS= read -r line; do 
    cfile=$(echo source/${line}.c) 
    hfile=$(echo source/${line}.h) 
    ofile=$(echo source/${line}.o) 
    ofiles=ofiles+$(ofile) 
    if [[ $line == main ]] ; then 
     $(ofile): $(cfile) Makefile 
      $(CC) $(CFLAGS) -c $(cfile) 
    else 
     $(ofile): $(cfile) $(hfile) Makefile 
      $(CC) $(CFLAGS) -c $(cfile) 
    fi 
done < "$sourcesfile" 

genetics:$(ofiles) 
    $(CC) $(CFLAGS) -o genetics $(ofiles) 

clean: 
    $(RM) $(ofiles) 

は、Cソースファイルのが、.c拡張子なしの名前が含まれているテキストファイルです。私はmakeを使用して上記のMakefileを実行すると例えば、

main 
file1 
file2 
file3 
file4 
file5 

は、それが次のエラーを生成します。

Makefile:19: *** commands commence before first target. Stop.

誰もが、このようなMakefileを構築するために私を助けていただけますか?実際の例があれば、これは非常に高く評価されます。

+0

あなたがメイクファイルでシェルスクリプトを混合していますか?メイクファイルには非常に特殊な構文があります。依存関係を 'sources.txt'に追加したいと思うようですが、それを簡単にする他の解決法があります。 – Zeta

+0

どちらの 'make 'を使っていますか?これは従来のUNIX makeでは不可能でしたが、GNU makeでは可能です。 –

+0

ファイル名ごとに別々のルールを設定してもよろしいですか?静的なパターンルールでは十分ではないでしょうか? – Beta

答えて

1

おそらく、これはGNU makeを使用していると仮定して、あなたのために働くでしょう。

names=$(shell cat sources.txt) 
ofiles=$(patsubst %,%.o,$(names)) 

genetics:$(ofiles) 
     $(CC) $(CFLAGS) -o genetics $(ofiles) 

%.o: %.c %.h Makefile 
     $(CC) $(CFLAGS) -c $< 

clean: 
     $(RM) $(ofiles) 

参照:Create a variable in a makefile by reading contents of another file