Gnu make 如何在GNUmakefile中循环对象
我对GNUmakefile是新手,我想做的事情非常简单。如下所示,OBJS包含MYDir下的所有*.c文件。接下来我要做的是在OBJS中存储的每个.c文件上运行一个名为MyProgram的程序。但我不知道如何将每个.c从OBJS传递到“runThis” 谢谢Gnu make 如何在GNUmakefile中循环对象,gnu-make,Gnu Make,我对GNUmakefile是新手,我想做的事情非常简单。如下所示,OBJS包含MYDir下的所有*.c文件。接下来我要做的是在OBJS中存储的每个.c文件上运行一个名为MyProgram的程序。但我不知道如何将每个.c从OBJS传递到“runThis” 谢谢 DIR := MyDir OBJS := $(wildcard $(DIR:=/*.c)) .PHONY: all all : $(OBJS) runThis runThis: MyProgram some.c
DIR := MyDir
OBJS := $(wildcard $(DIR:=/*.c))
.PHONY: all
all : $(OBJS) runThis
runThis:
MyProgram some.c
最简单的是,您可以直接在规则中传递
$(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进行循环的“艰苦工作”:
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)
中的每个文件$(c)
,我们创建一个规则过程-$(c)
,并使所有
规则依赖于该规则。还有另一个途径:
DIR := MyDir
OBJS := $(wildcard $(DIR:=/*.c))
DUMMY_TGTS := $(addsuffix ., $(OBJS))
.PHONY: all $(DUMMY_TGTS)
all : $(DUMMY_TGTS)
$(DUMMY_TGTS) : %. : %
MyProgram $<
DIR:=MyDir
OBJS:=$(通配符$(DIR:=/*.c))
DUMMY_TGTS:=$(addsuffix.,$(OBJS))
.PHONY:all$(虚拟的)
全部:$(虚拟\u TGTS)
$(虚拟变量):%。:%
我的计划$<
与stackoverflow make answers一样,您需要将缩进从空格切换到制表符
它使用一个单独调用每个
.c
文件上的MyProgram
。DUMMY\u TGTS
是用设置的。PHONY
确保即使存在同名文件,它们仍会触发规则。您的问题中没有足够的信息来回答它。Make用于将一种类型的文件转换为另一种类型的文件。这里,您说您正在每个源文件上运行MyProgram
,但没有说MyProgram
的输出是什么。在您指定之前,您无法编写makefile(我们也无法帮助您)。Make允许您编写关于如何基于依赖项创建内容的规则。您的all
规则取决于$(OBJS)
(OBJ
可能应命名为CFILES
或类似名称,以免引起混淆)。没有规则使$(OBJS)
。由于使用基于目录中现有文件的$(通配符)
创建了$(OBJS)
,因此它没有任何功能(如果您的文件不存在,甚至不会给您一个错误)。