makefile - 使用 make 文件创建目录

标签 makefile object directory

我想使用 makefile 创建目录。我的项目目录是这样的

+--Project  
   +--output  
   +--source  
     +Testfile.cpp  
   +Makefile  

我想将所有对象和输出放入相应的输出文件夹中。我想创建编译后的文件夹结构,如下所示。

+--Project
   +--output
     +--debug (or release)
       +--objs
         +Testfile.o
       +Testfile (my executable file)
   +--source
     +Testfile.cpp
   +Makefile

我尝试了多种选择,但都没有成功。请帮助我使用 make 文件创建目录。我正在发布我的 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)

最佳答案

在我看来,无论是在技术还是设计意义上,目录都不应该被视为 makefile 的目标。您应该创建文件,如果文件创建需要新目录,则悄悄在相关文件的规则内创建目录。

如果您的目标是普通文件或“模式化”文件,只需使用 makeinternal variable $(@D),表示“当前目标所在的目录”(cmp.,其中 $@ 表示目标)。例如,

$(OUT_O_DIR)/%.o: %.cpp
        @mkdir -p $(@D)
        @$(CC) -c $< -o $@

title: $(OBJS)

然后,您实际上正在执行相同的操作:为所有 $(OBJS) 创建目录,但您将以不太复杂的方式完成此操作。

在各种应用程序中使用相同的策略(文件是目标,目录从来不是)。例如,git 版本控制系统不存储目录。

<小时/>

注意:如果您要使用它,引入一个便利变量并利用 make 的扩展规则可能会很有用。

dir_guard=@mkdir -p $(@D)

$(OUT_O_DIR)/%.o: %.cpp
        $(dir_guard)
        @$(CC) -c $< -o $@

$(OUT_O_DIR_DEBUG)/%.o: %.cpp
        $(dir_guard)
        @$(CC) -g -c $< -o $@

title: $(OBJS)

关于makefile - 使用 make 文件创建目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47284365/

相关文章:

c++ - 为 Android 编译 C++ gRPC

javascript - 变量返回 [object HTMLParagraphElement]

ios - 如何知道哪个 SKSpriteNode 受到 Swift 中碰撞检测的影响?

css - CSS 是否接受带空格的文件夹名称?

ssh - 用于排除目录和文件的 Zip 命令

android - 从 GridView 中的特定 SDCard 文件夹加载图像

c - Makefile 不会在 header 修改时重建对象

linux - Makefile共享库错误

java - 如何以最佳方式将单击的按钮发送到另一个 Activity ?

c++ - make 查找 fortran 77 文件但不查找 fortran 90 文件