首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用make file创建目录

使用make file创建目录
EN

Stack Overflow用户
提问于 2009-12-23 13:58:12
回答 6查看 154.4K关注 0票数 118

我想使用makefile创建目录。我的项目目录如下所示

代码语言:javascript
复制
+--Project  
   +--output  
   +--source  
     +Testfile.cpp  
   +Makefile  

我想把所有的对象和输出放到各自的输出文件夹中。我想创建文件夹结构,这将像这样编译后。

代码语言:javascript
复制
+--Project
   +--output
     +--debug (or release)
       +--objs
         +Testfile.o
       +Testfile (my executable file)
   +--source
     +Testfile.cpp
   +Makefile

我尝试了几种方法,但都不能成功。请帮我用make file制作目录。我把我的Makefile张贴出来,供你参考。

代码语言:javascript
复制
#---------------------------------------------------------------------
# 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)
EN

回答 6

Stack Overflow用户

发布于 2017-07-12 13:15:34

或者接吻。

代码语言:javascript
复制
DIRS=build build/bins

... 

$(shell mkdir -p $(DIRS))

这将在Makefile解析后创建所有目录。

票数 32
EN

Stack Overflow用户

发布于 2016-12-14 19:56:13

所有的解决方案,包括被接受的解决方案,都有一些问题,如他们各自的评论所述。accepted answer by @jonathan-leffler已经很好了,但并不能保证前提条件不一定是按顺序构建的(比如在make -j期间)。然而,简单地将directories先决条件从all转移到program,就会在每次运行AFAICT时引发重建。以下解决方案没有该问题,AFAICS按预期工作。

代码语言:javascript
复制
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)
票数 6
EN

Stack Overflow用户

发布于 2010-10-22 05:12:14

我刚刚提出了一个相当合理的解决方案,它允许您定义要构建的文件并自动创建目录。首先,定义一个变量ALL_TARGET_FILES,该变量保存将要构建的makefile的每个文件的文件名。然后使用以下代码:

代码语言:javascript
复制
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或更高版本。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1950926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档