【问题标题】:Makefile with a loop带循环的 Makefile
【发布时间】:2017-08-11 19:10:55
【问题描述】:

我在一个名为 sources.txt 的文本文件中有一个源文件名列表。在 Makefile 中,我想从 sources.txt 中读取每个文件名 name 并包含以下行,

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 时,会产生以下错误。

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

谁能帮我构建这样一个Makefile?如果您有一个工作示例,我们将不胜感激。

【问题讨论】:

  • 您是否正在将 shell 脚本与 makefile 混合使用? makefile 具有非常特定的语法。您似乎想在 sources.txt 中添加依赖项,顺便说一下,还有其他解决方案可以让这更容易。
  • 您使用的是哪个make?这在传统的 UNIX make 中是不可能的,但在 GNU make 中是可能的。
  • 您确定要为每个文件名设置单独的规则吗?静态模式规则是否不够好?

标签: c bash makefile


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多