我想使用makefile创建目录。我的项目目录如下所示
+--Project
+--output
+--source
+Testfile.cpp
+Makefile
我想把所有的对象和输出放到各自的输出文件夹中。我想创建文件夹结构,这将像这样编译后。
+--Project
+--output
+--debug (or release)
+--objs
+Testfile.o
+Testfile (my executable file)
+--source
+Testfile.cpp
+Makefile
我尝试了几种方法,但都不能成功。请帮我用make file制作目录。我把我的Makefile张贴出来,供你参考。
#---------------------------------------------------------------------
# Input dirs, names, files
#---------------------------------------------------------------------
OUTPUT_ROOT := output/
TITLE_NAME := TestProj
ifdef DEBUG
TITLE_NAME += _DEBUG
else
ifdef RELEASE
TITLE_NAME += _RELEASE
endif
endif
# Include all the source files here with the directory tree
SOURCES := \
source/TestFile.cpp \
#---------------------------------------------------------------------
# configs
#---------------------------------------------------------------------
ifdef DEBUG
OUT_DIR := $(OUTPUT_ROOT)debug
CC_FLAGS := -c -Wall
else
ifdef RELEASE
OUT_DIR := $(OUTPUT_ROOT)release
CC_FLAGS := -c -Wall
else
$(error no build type defined)
endif
endif
# Put objects in the output directory.
OUT_O_DIR := $(OUT_DIR)/objs
#---------------------------------------------------------------------
# settings
#---------------------------------------------------------------------
OBJS = $(SOURCES:.cpp=.o)
DIRS = $(subst /,/,$(sort $(dir $(OBJS))))
DIR_TARGET = $(OUT_DIR)
OUTPUT_TARGET = $(OUT_DIR)/$(TITLE_NAME)
CC_FLAGS +=
LCF_FLAGS :=
LD_FLAGS :=
#---------------------------------------------------------------------
# executables
#---------------------------------------------------------------------
MD := mkdir
RM := rm
CC := g++
#---------------------------------------------------------------------
# rules
#---------------------------------------------------------------------
.PHONY: all clean title
all: title
clean:
$(RM) -rf $(OUT_DIR)
$(DIR_TARGET):
$(MD) -p $(DIRS)
.cpp.o:
@$(CC) -c $< -o $@
$(OBJS): $(OUT_O_DIR)/%.o: %.cpp
@$(CC) -c $< -o $@
title: $(DIR_TARGET) $(OBJS)
发布于 2017-07-12 13:15:34
或者接吻。
DIRS=build build/bins
...
$(shell mkdir -p $(DIRS))
这将在Makefile解析后创建所有目录。
发布于 2016-12-14 19:56:13
所有的解决方案,包括被接受的解决方案,都有一些问题,如他们各自的评论所述。accepted answer by @jonathan-leffler已经很好了,但并不能保证前提条件不一定是按顺序构建的(比如在make -j
期间)。然而,简单地将directories
先决条件从all
转移到program
,就会在每次运行AFAICT时引发重建。以下解决方案没有该问题,AFAICS按预期工作。
MKDIR_P := mkdir -p
OUT_DIR := build
.PHONY: directories all clean
all: $(OUT_DIR)/program
directories: $(OUT_DIR)
$(OUT_DIR):
${MKDIR_P} $(OUT_DIR)
$(OUT_DIR)/program: | directories
touch $(OUT_DIR)/program
clean:
rm -rf $(OUT_DIR)
发布于 2010-10-22 05:12:14
我刚刚提出了一个相当合理的解决方案,它允许您定义要构建的文件并自动创建目录。首先,定义一个变量ALL_TARGET_FILES
,该变量保存将要构建的makefile的每个文件的文件名。然后使用以下代码:
define depend_on_dir
$(1): | $(dir $(1))
ifndef $(dir $(1))_DIRECTORY_RULE_IS_DEFINED
$(dir $(1)):
mkdir -p $$@
$(dir $(1))_DIRECTORY_RULE_IS_DEFINED := 1
endif
endef
$(foreach file,$(ALL_TARGET_FILES),$(eval $(call depend_on_dir,$(file))))
下面是它的工作原理。我定义了一个函数depend_on_dir
,它接受一个文件名并生成一个规则,使该文件依赖于包含它的目录,然后定义一个规则来创建该目录(如果需要)。然后,我使用foreach
在每个文件名上对此函数执行call
操作并对结果执行eval
操作。
请注意,您需要一个支持eval
的GNU make版本,我认为它是3.81或更高版本。
https://stackoverflow.com/questions/1950926
复制相似问题