2012-02-07 59 views
14

我希望能夠將我的bin和我的代碼文件拆分到不同的目錄中,因爲它變得很難在當前狀態下管理。Makefile如何爲源代碼和二進制文件使用不同的目錄?

我非常想有

project_dir 
|-Makefile 
|-run_tests.sh 
| 
|__source 
| |-program1.cpp 
| |-program2.cpp 
| 
|__bin 
    |-program1 
    |-program2 

但是我不能得到這個我目前的系統工作,而無需手動編寫出來的規則,每個程序(請記住,每一個程序是單獨的程序,而不是一系列物體連接在一起)

#Current make system 
BIN=./bin/ 
SOURCE=./source/ 

LIST=program1 program2... 

all: $(LIST) 

%: $(SOURCE)%.cpp 
    $(CC) $(INC) $< $(CFLAGS) -o $(BIN)[email protected] $(LIBS) 

這個工程除了它我無法看到目標在當前路徑,因此認爲它總是重建的二進制文件,即使源文件沒有改變。

我現在唯一的想法是寫一個程序來生成一個makefile,但我不想這樣做。使用automake

+0

傳統的方法是調用源目錄'src',在那裏建立二進制文件,並有一個單獨的步驟'安裝',其中二進制文件被複制到'bin'目錄 - 甚至還有一個特殊的實用程序'安裝'來做到這一點。 – reinierpost 2012-02-07 19:23:12

回答

17

你幾乎沒有...

#Current make system 
BIN=./bin/ 
SOURCE=./source/ 

LIST=$(BIN)/program1 $(BIN)/program2... 

all: $(LIST) 

$(BIN)/%: $(SOURCE)%.cpp 
    $(CC) $(INC) $< $(CFLAGS) -o [email protected] $(LIBS) 

您也可以通過以下

PROG=program1 program2 
LIST=$(addprefix $(BIN)/, $(PROG)) 
+0

愚蠢的問題也許,但有沒有辦法在命令行上使用'%'變量(即名稱少目錄)。所以「gcc blah blah -D%」(所以程序知道它是自己的名字) – 111111 2012-02-07 15:17:02

+2

是的,你可以使用'$ *'來獲得詞幹。 – 2012-02-07 15:17:59

+0

非常好我認爲我的make文件已經完成了,謝謝你的幫助。 – 111111 2012-02-07 15:20:38

1

簡單的解決方案使LIST更容易。

如果您想手動執行此操作,則需要使用vpath指令或VPATH環境變量。 GNU make手冊有關於它們的a section。將Makefile直接放到bin目錄中,將VPATH設置爲源目錄,並且隱式規則將再次起作用。

+1

如果可以做一個製作精良的make文件,不是automake的粉絲。 – 111111 2012-02-07 15:11:22

1

這是一個完整的Makefile的準備發行版本。在/

CC   = g++ 
LD   = g++ 
CFLAG  = -Wall 
PROG_NAME = prog 

SRC_DIR  = ./src 
BUILD_DIR = ./build 
BIN_DIR  = ./bin 
SRC_LIST = $(wildcard $(SRC_DIR)/*.cpp) 
OBJ_LIST = $(BUILD_DIR)/$(notdir $(SRC_LIST:.cpp=.o)) 

.PHONY: all clean $(PROG_NAME) compile 

all: $(PROG_NAME) 

compile: 
    $(CC) -c $(CFLAG) $(SRC_LIST) -o $(OBJ_LIST) 

$(PROG_NAME): compile 
    $(LD) $(OBJ_LIST) -o $(BIN_DIR)/[email protected] 

clean: 
    rm -f $(BIN_DIR)/$(PROG_NAME) $(BUILD_DIR)/*.o 
/bin/

然後使用下面的Makefile:

與以下目錄

爲.o文件準備好您的文件夾:/build/ 爲.cpp文件:/src/ 二進制文件

您的最終計劃將被編爲/bin/的編,每次編譯代碼,二進制文件將在/build/之間分隔,這樣源代碼目錄將非常整潔。

相關問題