Makefile,模式规则和目录

14

我想为一个编译器编写一个(gmake) makefile,这个编译器和gcc不同,它将所有的输出文件都放在一个特定的目录中,而这种行为是无法改变的。

我的源码分布在多个目录中。我应该如何编写模式规则来编译这些源码呢?

好的,这有点不清楚。这里有一个例子。我的源码可能长这样:

./folder1/foo.c
./folder2/bar.c

输出文件将会像这样:

./obj/foo.obj
./obj/bar.obj

我的源代码编译规则应该长成什么样子?

%.obj : %.c 
   $(COMPILER) -c $< 

不起作用。

有什么想法吗?我希望避免为每个源文件设置一个隐式规则...


你可以使用VPATH,或者创建folder1/Makefileobj/Makefile,它们将包含公共规则(例如你提供的规则)的../Makefile.inc - dma_k
1个回答

25

以下摘自我的某个Makefile:

OBJS := $(sort $(patsubst %.cpp,$(OBJECT_DIRECTORY)/%.o,$(patsubst %.c,$(OBJECT_DIRECTORY)/%.o,$(notdir $(SRCS)))))

其中OBJECT_DIRECTORY指向对象目录,SRCS是源文件列表(你甚至可以使用$(wildcard)来填充它)。

在Makefile中,我还有以下内容:

define define_compile_rules
$(OBJECT_DIRECTORY)/%.o: $(1)%.c
  @echo " + Compiling '$$<'"
  @mkdir -p $$(@D)
  $(CC) $$(CFLAGS) -o $$@ -c $$<
endef

$(foreach directory,$(sort $(dir $(SRCS))),$(eval $(call define_compile_rules,$(directory))))

请查看$(eval)函数


1
eval和foreach函数是gmake的一个严重被低估的特性。 - JesperE
1
可能是由于GNU Make 3.81之前的错误导致的吗? - Gregory Pakosz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接