0
我有一个名为sources.txt的文本文件中的源文件名列表。在Makefile中,我想读每一个文件名作为name
从sources.txt并包括以下行,带循环的Makefile
name.o: name.c name.h Makefile
$(CC) $(CFLAGS) -c name.c
在Makefile中
。我尝试创建Makefile。
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)
的source/sources.txt
是包含C-源文件,但没有.c
扩展名的文本文件。例如,
main
file1
file2
file3
file4
file5
当运行使用make
上述生成文件时,它产生下面的错误。
Makefile:19: *** commands commence before first target. Stop.
任何人都可以请帮我构建这样一个Makefile?如果你有一个工作的例子,这将非常感激。
你是混合的shell脚本生成文件?一个makefile有一个非常特定的语法。看起来你想在'sources.txt'中添加依赖关系,顺便说一下,还有其他解决方案可以让它更容易。 – Zeta
你正在使用哪个'make'?这在传统的UNIX make中是不可能的,但在GNU make中是可能的。 –
你确定你想为每个文件名分开一个单独的规则吗?静态模式规则不够好吗? – Beta