Makefile,模式规则和目录

时间:2009-12-26 16:59:39

标签: makefile

我想为编译器编写一个(gmake)makefile - 与gcc不同 - 将所有输出文件放入特定目录。不幸的是,这种行为无法改变。

我的来源位于多个目录中。如何编写允许我编译源代码的模式规则。

好的,这有点不清楚。这是一个例子。我的消息来源看起来可能是这样的:

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

并且输出文件最终会像这样结束:

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

我的规则如何编译我的源代码?

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

不起作用。

有什么想法吗?我想避免每个源文件的隐式规则......

1 个答案:

答案 0 :(得分:24)

从我的一些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))))

请参阅the $(eval) function