如何在GNUmakefile中循环一个Object

时间:2014-03-18 22:48:03

标签: gnu-make

我是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

2 个答案:

答案 0 :(得分:1)

最简单的说,你可以直接在规则中传递$(OBJS)(我可以自由重命名为CFILES):

DIR := MyDir
CFILES := $(wildcard $(DIR:=/*.c))

.PHONY: all

all:
        for f in $(CFILES); do MyProg $$f; done

这是假设Bourne样式shell(如bashdashash等),并且您的文件名不包含空格。

你也可以让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文件上调用.cDUMMY_TGTS设置为.PHONY,即使存在具有该名称的文件,也会确保它们仍会触发规则。