makefile和项目目录结构中的自动依赖项

时间:2013-03-10 16:47:57

标签: makefile dependencies directory-structure

我一直在尝试在makefile中使用自动依赖项,但我努力工作,因为我为项目使用了更复杂的结构而不是将每个文件放在根文件夹中。 / p>

我尝试在makefile中使用这段代码:

OBJECTS_DIR = obj/
SRCS_DIR = src/
#source files list, i.e : src/foo.cpp src/bar/foo2.cpp
SOURCES = $(shell find $(SRCS_DIR) -name \*.cpp | xargs -d '\n')
#object files list, i.e : obj/foo.o obj/foo2.o
OBJECTS = $(addprefix $(OBJECTS_DIR), $(notdir $(SOURCES:.cpp=.o)))
DEPS = $(OBJECTS_DIR)make.dep

myproject : $(OBJECTS)
    $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^

$(OBJECTS) : $(SOURCES)
    $(CC) $(CFLAGS) $(LDFLAGS) -o $@ -c $(filter %/$(notdir $(@:.o=.cpp)), $(SOURCES))

$(DEPS): $(SOURCES)
    $(CC) -MM  $(SOURCES) > $(DEPS)

-include $(DEPS)

all : myproject

clean :
    @-rm -f $(RELEASE_DIR)* $(OBJECTS_DIR)*

我想将所有依赖项存储在obj / make.dep文件中。这给了我以下输出(这里foo包括foo2):

foo2.o: src/bar/foo2.cpp src/bar/headers/foo2.h
foo.o: src/foo.cpp src/bar/headers/foo2.h

我想重命名每个目标文件以获得以下输出:     obj / foo2.o:src / bar / foo2.cpp src / bar / headers / foo2.h     obj / foo.o:src / foo.cpp src / bar / headers / foo2.h

我尝试过-MT选项没有结果...... 此外,-include $(DEPS)是否足以包含我创建的依赖项?我不应该用make.dep文件中写的行替换OBJECT规则中的$(filter%/ $(notdir $(@:。o = .cpp)),$(SOURCES))吗?

提前感谢您的见解,请告诉我是否有其他方法可以增强我的makefile!

2 个答案:

答案 0 :(得分:1)

您将所有依赖项存储在1个文件中的原因是什么?通常,每个目标文件都有自己的.d文件,该文件在编译期间创建,这就是-include。在这种情况下,将-MT标志等添加到与初始编译相同的命令中以获得对象目录和名称是正确的更简单。

我会按照这个问题的答案做更多的事情:

make include directive and dependency generation with -MM

好处是所有依赖项生成都将在编译步骤中发生,因此您无需再对gcc进行额外调用。将所有依赖项放在一个文件中对于一个小文件来说可能没问题,但是如果你想让你的makefile扩展它可能最好做上面那样的事情。

答案 1 :(得分:1)

您应该使用模式规则来生成.o个文件。

$(OBJECTS_DIR)/%.o : %.c 
        $(CC) $(CFLAGS) -c -o $@ $^ 

您必须处理依赖项文件以将OBJECTS_DIR添加到目标路径。 sed使这很简单。您可能还希望它依赖于.h文件。

$(DEPS): $(SOURCES) $(shell find . -name '*.h')
        $(CC) -MM  $(SOURCES) | sed 's#^\(.*:\)#$(OBJECTS_DIR)\1#' > $(DEPS)