2017-01-03 34 views
0

我想創建一個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似乎沒有使用調用此規則的父目標進行擴展。

回答

1

對於target1target2,您變量SUB_OBJ_FOLDER確實設置正確,但它並未設置在這些目標之外。這意味着生成文件目標$(OBJ_ROOT_FOLDER)/$(SUB_OBJ_FOLDER)/%.o始終擴展爲obj//%.o

假設你將永遠使用這個Makefile恰好與一個make目標(target1target2),該解決方案是使用MAKECMDGOALS變量設置SUB_OBJ_FOLDER。這將是你的makefile的變化:

#target1:SUB_OBJ_FOLDER := t1 
#target2:SUB_OBJ_FOLDER := t2 
SUB_OBJ_FOLDER := $(MAKECMDGOALS:target%=t%) 

如果你想支持target1target2同時在命令行上,這將是更復雜一點,需要輔助的makefile,你將包括對每個目標出於興趣。

+0

謝謝!這是一個很好的竅門! ;-) –

相關問題