1. ホーム
  2. makefile

[解決済み] makeファイルによるディレクトリの作成

2022-08-11 22:04:31

質問

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)

どのように解決するのですか?

Unixのような環境を想定して、このようにします。

MKDIR_P = mkdir -p

.PHONY: directories

all: directories program

directories: ${OUT_DIR}

${OUT_DIR}:
        ${MKDIR_P} ${OUT_DIR}

これはトップレベルのディレクトリで実行されなければなりません - あるいは、${OUT_DIR}の定義が実行される場所に対して正しくなければならないでしょう。 もちろん、Peter Miller の " の教義に従うのであれば。 再帰的な作成は有害であると考えられている という論文に従うのであれば、とにかくトップレベルのディレクトリで make を実行することになるでしょう。

私は今、これ (RMCH) で遊んでいるところです。 私が試験場として使用しているソフトウェアのスイートに少し適応させる必要がありました。 このスイートには、15 のディレクトリに広がるソースで構築された 12 の別々のプログラムがあり、そのうちのいくつかは共有されています。 しかし、少し気をつければ、それは可能です。 OTOH は、初心者には適切ではないかもしれません。


コメントで指摘されているように、「ディレクトリ」に対するアクションとして「mkdir」コマンドをリストアップすることは間違っています。 コメントで指摘されているように、結果として生じる '出力/デバッグを行う方法がわからない' エラーを修正する他の方法があります。 ひとつは 'directories' 行への依存を取り除くことです。 mkdir -p' は、作成するように要求されたすべてのディレクトリがすでに存在していれば、エラーを発生させないので、これはうまくいきます。 もう一つは、表示されているメカニズムで、ディレクトリが存在しない場合にのみ作成を試みるものです。 修正された」バージョンは、私が昨夜考えていたものです。しかし、両方のテクニックが機能します (そして、両方とも output/debug が存在するがディレクトリではなくファイルである場合に問題が発生します)。