我是GNUmakefile的新手,我想做的事情非常简单。如下所示,OBJS包含MYDir下的所有* .c文件。我接下来要做的是让一个名为MyProgram的程序在OBJS中存储的EACH .c文件上运行。但我不知道如何将每个.c从OBJS传递给“runThis”。
由于
DIR := MyDir
OBJS := $(wildcard $(DIR:=/*.c))
.PHONY: all
all : $(OBJS) runThis
runThis:
MyProgram some.c
答案 0 :(得分:1)
最简单的说,你可以直接在规则中传递$(OBJS)
(我可以自由重命名为CFILES):
DIR := MyDir
CFILES := $(wildcard $(DIR:=/*.c))
.PHONY: all
all:
for f in $(CFILES); do MyProg $$f; done
这是假设Bourne样式shell(如bash
,dash
,ash
等),并且您的文件名不包含空格。
你也可以让GNU make做循环的“艰苦工作”:
DIR := MyDir
CFILES := $(wildcard $(DIR:=/*.c))
.PHONY: all
define gen-rule
all: process-$1
process-$1:
MyProg $1
endef
$(eval $(foreach c,$(CFILES),$(call gen-rule,$(c))))
对于$(c)
中的每个文件$(CFILES)
,我们会创建一个规则process-$(c)
并诱导all
规则依赖该规则。
答案 1 :(得分:0)
听到另一条路线:
DIR := MyDir
OBJS := $(wildcard $(DIR:=/*.c))
DUMMY_TGTS := $(addsuffix ., $(OBJS))
.PHONY: all $(DUMMY_TGTS)
all : $(DUMMY_TGTS)
$(DUMMY_TGTS) : %. : %
MyProgram $<
与stackoverflow一样,您需要将缩进从空格切换到制表符。
它使用Static Pattern rule分别在每个MyProgram
文件上调用.c
。 DUMMY_TGTS
设置为.PHONY
,即使存在具有该名称的文件,也会确保它们仍会触发规则。