makefileを使用してディレクトリを作成する 質問する

makefileを使用してディレクトリを作成する 質問する

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)

ベストアンサー1

私の意見では、技術的にも設計的にも、ディレクトリはmakefileのターゲットとして考えるべきではありません。ファイルファイルの作成に新しいディレクトリが必要な場合は静かに関連するファイルのルール内にディレクトリを作成します。

通常のファイルや「パターン化された」ファイルをターゲットにする場合は、make'sを使用します。内部変数 $(@D)は、「現在のターゲットが存在するディレクトリ」を意味します($@ターゲットの場合は を使用します)。たとえば、

$(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)

おすすめ記事