web-dev-qa-db-ja.com

GNU srcとは異なるディレクトリに出力をビルドするパターンを作成します

.oファイルをソースファイルとは別のディレクトリに配置するMakefileを作成しようとしています。パターンルールを使用しようとしているので、ソースファイルとオブジェクトファイルごとに同じルールを作成する必要はありません。

私のプロジェクト構造は次のようになります。

project/
 + Makefile
 + src/
   + main.cpp
   + video.cpp
 + Debug/
   + src/       [contents built via Makefile:]
     + main.o
     + video.o

私のMakefileは次のようになります。

OBJDIR_DEBUG = Debug
OBJ_DEBUG = $(OBJDIR_DEBUG)/src/main.o $(OBJDIR_DEBUG)/src/video.o

all: $(OBJ_DEBUG)

$(OBJ_DEBUG): %.o: %.cpp
    $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c $< -o $@

Debug/src/*.cppでソースファイルを検索するため、これは機能しません。

私は以下を試しました:

# Broken: make: *** No rule to make target `Debug/src/main.cpp', needed by `Debug/src/main.o'.  Stop.
# As a test, works if I change "%.cpp" to "Debug/src/main.cpp", though it obv. builds the wrong thing

# Strip OBJDIR_DEBUG from the start of source files
$(OBJ_DEBUG): %.o: $(patsubst $(OBJDIR_DEBUG)/%,%,%.cpp)
    $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c $< -o $@
# Broken:
#   Makefile:70: target `src/main.o' doesn't match the target pattern
#   Makefile:70: target `src/video.o' doesn't match the target pattern

# Add OBJDIR_DEBUG in target rule
OBJ = src/main.o src/video.o

$(OBJ): $(OBJDIR_DEBUG)/%.o: %.cpp
    $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c $< -o $@
28
mrb

静的パターンルールに関するドキュメント を再度読んだ後、機能しているように見える次のパターンルールを導出しました。

$(OBJ_DEBUG): $(OBJDIR_DEBUG)/%.o: %.cpp
    $(CXX) $(CFLAGS_DEBUG) $(INC_DEBUG) -c $< -o $@

これが最善のアプローチであるかどうかはわかりませんが、私は提案を受け入れます。

26
mrb

別のディレクトリにオブジェクトを構築する代わりに、別のディレクトリのソースからオブジェクトを構築することもできます。オブジェクトが配置されるディレクトリにmakefileを置き、VPATHを使用して他の場所でソースを探すようmakeに指示します。これは、すべてのオブジェクトファイルが同じディレクトリに配置されることになっている場合に最適に機能します。

3
Bulletmagnet

各ソースでGCCを実行して、ソースツリーを個別のビルドディレクトリに「複製」するMakefile- https://stackoverflow.com/a/41924169/422416

0
Alexey Semenyuk