您好,我正在为我的项目使用通用的 makefile.inc。对于我的 src 文件夹,我定义了一个 makefile,它设置了一些变量并包含 makefile.inc。我还可以定义 DIRS= 变量(示例 #2),它将在此处指定的每个目录上调用 make -C。这一切都有效。但是,我无法让“clean”或“cleanall”正常工作。如果定义了 DIRS=,我需要一种方法来遍历列出的所有目录并调用“make -C xxx clean”。有什么想法吗?
示例 makefile #1
TYPE = exe
SOURCES = test.cpp
INCLUDES = -I. -I/usr/local/include -I../src
LIBS = -lpcre
OUT = test
include ../../makefile.inc
示例 makefile #2
DIRS = src test
include ../makefile.inc
生成文件.inc
OBJS = $(SOURCES:.cpp=.o)
ifeq ($(CFG),)
CFG=debug
endif
ifeq ($(CFG),debug)
CXXFLAGS += -g -Wall -DNDEBUG
else
CXXFLAGS += -O2 -Wall
endif
all: dirs cfgcheck $(OUT)
.PHONY: clean cleanall all
cfgcheck:
ifneq ($(CFG),release)
ifneq ($(CFG),debug)
@echo "Error: Invalid CFG '$(CFG)'' (options: debug,release)"
@exit 1
endif
endif
@echo "Making '$(CURDIR)' CFG="$(CFG)
$(OUT): $(OBJS)
ifeq ($(TYPE),lib)
$(AR) rcs $(OUT) $(OBJS)
endif
ifeq ($(TYPE),exe)
$(CXX) -o $@ $^ ${LDFLAGS} $(LIBS)
endif
-include $(OBJS:.o=.d)
%.o: %.cpp
$(CXX) -c $(INCLUDES) $(CXXFLAGS) $*.cpp -o $*.o
$(CXX) -MM $(CXXFLAGS) $*.cpp > $*.d
@cp -f $*.d $*.d.tmp
@sed -e 's/.*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $*.d
@rm -f $*.d.tmp
dirs: $(DIRS)
$(DIRS):
$(MAKE) -C $@
clean:
rm -f $(OUT) *.o *.d
最佳答案
我会做这样的事情:
DIRS = src test
clean: TARG:=clean
clean: $(DIRS)
.PHONY: $(DIRS)
$(DIRS):
@$(MAKE) -C $@ $(TARG)
如果您不喜欢使用目录名称作为虚假目标,可以使用稍微复杂一些的替代方法...
关于c++ - 使用普通make文件时如何实现cleanall,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24592500/