Makefile、模式规则和目录
我想为编译器编写一个(gmake)makefile,与gcc不同,它将所有输出文件放在一个特定的目录中。不幸的是,这种行为无法改变 我的资源在多个目录中。如何编写模式规则来编译源代码 好吧,这有点不清楚。这里有一个例子。我的资料来源可能如下:Makefile、模式规则和目录,makefile,Makefile,我想为编译器编写一个(gmake)makefile,与gcc不同,它将所有输出文件放在一个特定的目录中。不幸的是,这种行为无法改变 我的资源在多个目录中。如何编写模式规则来编译源代码 好吧,这有点不清楚。这里有一个例子。我的资料来源可能如下: ./folder1/foo.c ./folder2/bar.c ./obj/foo.obj ./obj/bar.obj 输出文件将以如下方式结束: ./folder1/foo.c ./folder2/bar.c ./obj/foo.obj ./obj
./folder1/foo.c
./folder2/bar.c
./obj/foo.obj
./obj/bar.obj
输出文件将以如下方式结束:
./folder1/foo.c
./folder2/bar.c
./obj/foo.obj
./obj/bar.obj
我编译源代码的规则应该是什么样的
%.obj : %.c
$(COMPILER) -c $<
%.obj:%.c
$(编译器)-c$<
这是行不通的
有什么想法吗?我希望避免对每个源文件使用隐式规则…从我的某个Makefile中提取:
OBJS:=$(sort$(patsubst%.cpp,$(OBJECT\u目录)/%.o,$(patsubst%.c,$(OBJECT\u目录)/%.o,$(notdir$(SRCS '))
其中,OBJECT\u DIRECTORY
指向对象目录,SRCS
是源文件列表(您甚至可以使用$(通配符)
填充源文件)
然后在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))))
define\u compile\u规则
$(对象目录)/%.o:$(1)%.c
@回音“+编译'$$eval和foreach函数是gmake的一个严重不足的功能。可能是因为GNU Make 3.81之前的bug?太棒了。这有点可怕,但仍然非常有用。你可以使用VPATH
来实现它=或者=你可以创建folder1/Makefile
和obj/Makefile
,它将包括../Makefile.inc
,其中应该包含通用规则(例如,你给出的规则)。