c – makefile编译所有子目录中的所有cpp文件
作者:互联网
我的存储库看起来像这样:
./src/ModuleA/ModuleA.cpp
./src/ModuleA/ModuleA.h
./src/foo/ModuleB.cpp
./src/foo/ModuleB.h
./src/bar/ModuleC.cpp
./src/bar/ModuleC.h
<A few more modules>
./obj
./dep
./makefile
我想创建一个makefile,它将为./dep中的每个.cpp文件创建一个depndency文件(.d),然后将这些.cpp文件中的每一个编译成./obj中的obj
我不想明确说明模块的名称和路径 – 只需要获取./src中的所有目录并在每个目录中找到cpp文件并为其创建目标规则.
编辑:我正在使用Windows.
解决方法:
在Windows下使用极简主义Makefile:
SRC := $(patsubst $(shell CHDIR )\\%.cpp,%.cpp,$(shell DIR *.cpp /S /B))
OBJ := $(addprefix obj\, $(SRC:.cpp=.o))
DEP := $(addprefix dep\, $(SRC:.cpp=.d))
CPPFLAGS = -MMD -MP -MF dep\$(<:.cpp=.d)
all: $(OBJ)
obj\\%.o: %.cpp
@IF NOT EXIST obj\$(<D) MKDIR obj\$(<D)
@IF NOT EXIST dep\$(<D) MKDIR dep\$(<D)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<
-include $(DEP)
如果两个文件共享相同的文件名但位于不同的子目录中,则将子目录创建到obj和dep中以避免冲突.它还避免在每次调用make时重新编译子目录中的源文件.
更新:更强大的版本
WINDOWS SHELL(由于FORFILE
命令,Vista和更新)
SRCDIR := .
OBJDIR := obj
DEPDIR := dep
SRCS := $(shell FORFILES /P $(SRCDIR) /S /M *.cpp /C "CMD /C ECHO @relpath")
SRCS := $(patsubst ".\\%",$(SRCDIR)\\%,$(SRCS))
OBJS := $(SRCS:$(SRCDIR)\\%.cpp=$(OBJDIR)\\%.o)
DEPS := $(SRCS:$(SRCDIR)\\%.cpp=$(DEPDIR)\\%.d)
TREE := $(patsubst %\,%,$(dir $(OBJS)))
CPPFLAGS = -MMD -MP -MF $(<:$(SRCDIR)\\%.cpp=$(DEPDIR)\\%.d)
.PHONY: all clean
all: $(OBJS)
.SECONDEXPANSION:
$(OBJDIR)\\%.o: $(SRCDIR)\%.cpp | $$(@D)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<
$(TREE): %:
MKDIR $@
MKDIR $(@:$(OBJDIR)%=$(DEPDIR)%)
clean:
IF EXIST $(OBJDIR) RMDIR /S /Q $(OBJDIR)
IF EXIST $(DEPDIR) RMDIR /S /Q $(DEPDIR)
ifeq "$(MAKECMDGOALS)" ""
-include $(DEPS)
endif
UNIX SHELL
SRCDIR := .
OBJDIR := obj
DEPDIR := dep
SRCS := $(shell find $(SRCDIR) -name "*.cpp")
OBJS := $(SRCS:$(SRCDIR)/%.cpp=$(OBJDIR)/%.o)
DEPS := $(SRCS:$(SRCDIR)/%.cpp=$(DEPDIR)/%.d)
TREE := $(patsubst %/,%,$(dir $(OBJS)))
CPPFLAGS = -MMD -MP -MF $(@:$(OBJDIR)/%.o=$(DEPDIR)/%.d)
.PHONY: all clean
all: $(OBJS)
.SECONDEXPANSION:
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp | $$(@D)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<
$(TREE): %:
mkdir -p $@
mkdir -p $(@:$(OBJDIR)%=$(DEPDIR)%)
clean:
$(RM) -r $(OBJDIR) $(DEPDIR)
ifeq "$(MAKECMDGOALS)" ""
-include $(DEPS)
endif
标签:subdirectory,c,makefile 来源: https://codeday.me/bug/20190830/1767321.html