我做一些Makefile的重构,并试图找出最简洁的方式来实现一个Makefile执行以下操作:简明的Makefile
- 有具有列出的所有源文件中的一个变量(既可以是C和C++文件)
- 所有对象文件都在OBJ_DIR
- 如果不存在
这对象目录中创建生成是我到目前为止有:
...
OBJ_DIR = obj/
BIN_DIR = bin/
PROGRAM = program
SRCS = test1.cpp test2.c
OBJS = $(addprefix $(OBJ_DIR), \
$(patsubst %.cpp, %.o, \
$(patsubst %.c, %.o, $(SRCS))))
$(BIN_DIR)$(PROGRAM) : $(OBJS)
$(CREATE_OUT_DIR)
$(LINK)
$(OBJ_DIR)%.o : %.c
$(CREATE_OBJ_DIR)
$(CCOMPILE)
$(OBJ_DIR)%.o : %.cpp
$(CREATE_OBJ_DIR)
$(CPPCOMPILE)
...
我想消除每个.o编译对$(CREATE_OBJ_DIR)的调用。有人知道怎么做吗?我尝试添加这一点,但那就不是建立目标文件:
$(OBJS): | $(OBJ_DIR)
$(OBJ_DIR):
$(CREATE_OBJ_DIR)
我看到这个设计的问题。你如何解释标题依赖关系?我通常使用'src = $(shell find ./ --name“* .cpp”)来编写makefile,并使用GCC'-M'开关为我处理依赖关系。这样,我为我的所有项目都有一个简短的可重用makefile。至于你的实际问题,为什么不事先创建'obj'目录? – 2011-03-16 13:29:04
不完全是答案,但您是否已经查看了'Makefile'的替代方案? 'SConstruct'出现在我的脑海里(很棒),但还有很多其他工具可以很好地处理这些问题。 – ereOn 2011-03-16 13:35:53
@Alexandre:我也正在研究头文件依赖关系。你有一个很好的例子来说明如何做到这一点? – waffleman 2011-03-17 13:50:04