使用Makefile进行同构构建目录结构

时间:2016-12-09 19:52:09

标签: c++ makefile directory gnu

合并automatic dependency approach with a non-flat src directory structure的问题过于宽泛,所以我要先解决第一个问题。

如何使用src目录结构最佳生成构建目录结构 isomorphic (请参阅下面的 Q1 )?

我的Makefile暂时(现在根本没有依赖处理,这将是关于如何添加组合/甚至独立的独立依赖的下一个问题 - 同构目录结构 - 步骤/目标):

第一部分(从编辑模式复制/粘贴,从这里开始试用)

各种目录(src目录结构可能嵌套)

base = .
incdir = $(base)/include
srcdir = $(base)/src
builddir = $(base)/build/debug # To open the possibility for a release build

includes = -I$(incdir)

二进制目标

binary = my_bin

我的编译器的标志

STD = -std=c++14
WARN = -Wall -Wextra
CXXFLAGS = -g $(strip $(includes)) # Most variables stripped before calling the compiler for better readability, but not strictly needed.
ALL_CXXFLAGS = $(STD) $(WARN) $(CXXFLAGS)

COMPILE.cpp = $(CXX) $(strip $(ALL_CXXFLAGS)) $(strip $(CPPFLAGS)) -c

我尝试实际构建同构目录结构

我的源文件

ext = cpp
src = $(wildcard $(srcdir)/*.$(ext))

Q1。我是这样做的,但它是最强大和最有效的方式吗?

obj = $(subst $(srcdir),$(builddir),$(src:.$(ext)=.o))

.PHONY: all clean distclean
.SUFFIXES:
.SUFFIXES: .$(ext) .o


all: $(ALL)

$(TARGET): $(obj)
    $(CXX) $(OUTPUT_OPTION) $^ $(LDFLAGS) $(LDLIBS)

$(obj): | $(builddir)

Q2。我应该如何实际创建构建目录结构?

$(builddir):
    mkdir -p $@

$(builddir)/%.o: $(srcdir)/%.$(ext) $(incdir)/%.h
    $(COMPILE.cpp) $(OUTPUT_OPTION) $<

$(builddir)/%.o: $(srcdir)/%.$(ext)
    $(COMPILE.cpp) $(OUTPUT_OPTION) $<

结束复制粘贴

我目前需要使用builddir,srcdir和incdir变量的显式目标/先决条件。在我使用自动依赖生成器方式之前,

Q3。如果可能,我怎么能只使用普通的%。o:%。c规则?

当前问题:实际上,如果头文件全部填充在include下,并且源文件全部填充在src下,则前一个Makefile可以工作(尽管依赖生成部分)。但是,如果我有,例如,include / src /中的util /子目录(include / util中的头文件将被引用为#include&#34; util / tool1.h&#34;等等,现在在其他地方)这个Makefile会悲惨地失败。

0 个答案:

没有答案