我想創建一個Makefile文件,該文件可以在不同的文件夾中生成目標文件,具體取決於調用的目標是。與Makefile中的目標相關的輸出文件夾
比如我想與target2
調用時,一個名爲「obj/t1
」和「obj/t2
」文件夾中,當我調用make
與目標target1
它創建的對象。
我創造了這個小的Makefile:
.PHONY=target1 target2 clean setup
SOURCE_ROOT_FOLDER := src
SOURCES := $(shell find $(SOURCE_ROOT_FOLDER) -iname "*.cpp")
OBJ_ROOT_FOLDER := obj
target1:SUB_OBJ_FOLDER := t1
target2:SUB_OBJ_FOLDER := t2
OBJECTS = $(subst $(SOURCE_ROOT_FOLDER), $(OBJ_ROOT_FOLDER)/$(SUB_OBJ_FOLDER), \
$(SOURCES:.cpp=.o))
$(OBJ_ROOT_FOLDER)/$(SUB_OBJ_FOLDER)/%.o: $(SOURCE_ROOT_FOLDER)/%.cpp
@echo "Creating subfolder $(OBJ_ROOT_FOLDER)/$(SUB_OBJ_FOLDER)"
mkdir -p $(dir [email protected])
@echo "Compiling $< to obj file: [email protected]"
touch [email protected]
target1: $(OBJECTS)
@echo Files $(OBJECTS) have been compiled!
target2: $(OBJECTS)
clean:
rm -rf $(OBJ_ROOT_FOLDER)
setup:
@mkdir -p src
@mkdir -p src/classA
@mkdir -p src/classB
@touch src/file.cpp
@touch src/classA/fileA.cpp
@touch src/classB/fileB.cpp
可以調用setup
目標再現一個簡單的假項目的文件夾中,並通過自己執行。
的make target1
輸出是:
Creating subfolder obj/t1
mkdir -p obj//classB/
Compiling src/classB/fileB.cpp to obj file: obj//classB/fileB.o
touch obj//classB/fileB.o
Creating subfolder obj/t1
mkdir -p obj//classA/
Compiling src/classA/fileA.cpp to obj file: obj//classA/fileA.o
touch obj//classA/fileA.o
Creating subfolder obj/t1
mkdir -p obj//
Compiling src/file.cpp to obj file: obj//file.o
touch obj//file.o
Files obj/t1/classB/fileB.o obj/t1/classA/fileA.o obj/t1/file.o have been compiled!
因此,大家可以看到變量SUB_OBJ_FOLDER
在配方中以正確的方式設置,但似乎在目標是不確定的(因爲@
與擴大一個空字符串),即使OBJECTS
變量在target1
規則中正確擴展(因爲您可以檢查輸出中寫入的最終文本)。
所以我不明白爲什麼變量SUB_OBJ_FOLDER
似乎沒有使用調用此規則的父目標進行擴展。
謝謝!這是一個很好的竅門! ;-) –