2015-02-09 85 views
1

我有以下情況:如何替換父目錄的Makefile中

SOURCES=home/main.cpp modelChecking/Configuracao.cpp modelChecking/Estado.cpp modelChecking/Formula.cpp modelChecking/ModelChecking.cpp lib/VisitTree.cpp 
SUFIX=$(SOURCES:.cpp=.o) 
OBJECTS=$(SUFIX) 

all: refiner 
refiner: $(OBJECTS) 
    $(CC) $^ -o refiner 

home/main.o: home/main.cpp 
    $(CC) $(CFLAGS) $< -o [email protected] 

modelChecking/Configuracao.o: modelChecking/Configuracao.cpp 
    $(CC) $(CFLAGS) $< -o [email protected] 

modelChecking/Estado.o: modelChecking/Estado.cpp 
    $(CC) $(CFLAGS) $< -o [email protected] 
... 

...等等。

正如你所看到的,我有不同的目錄來編譯我的可執行文件。 現在,我希望把每個文件的.o在bin /文件夾和可變對象必須更換所有的父目錄,我嘗試了不同的方式:

OBJECTS=$(SUFIX:%/ = bin/) 
OBJECTS=$(subst %/,bin/,$(SUFIX)) 
OBJECTS=$(patsubst %/,bin/,$(SUFIX)) 

當我使用這樣$(subst home/,bin/,$(SUFIX))它的工作原理,因爲我鍵入子字符串「home /」,但我需要一個正則表達式來替換所有目錄。 我會需要改變目標太大,也許下面將代碼工作:

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

...但我喜歡每一個目標單獨

+0

只是不。 'make'幾乎假定輸入和輸出文件將在同一個目錄中,除了單獨的'install'步驟將文件複製到其最終目的地。是的,你可以解決這個問題,但你爲什麼要這樣做?順其自然。 – reinierpost 2015-02-09 22:28:39

回答

2

您正在尋找SUFIX=$(addprefix bin/,$(notdir $(SOURCES:.cpp=.o)))

Makefile看起來像:

SOURCES=home/main.cpp modelChecking/Configuracao.cpp 
SUFIX=$(addprefix bin/,$(notdir $(SOURCES:.cpp=.o))) 
OBJECTS=$(SUFIX) 

all: refiner 
refiner: $(OBJECTS) 
    $(CC) $^ -o refiner 

bin/main.o: home/main.cpp 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

bin/Configuracao.o: modelChecking/Configuracao.cpp 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

但是,我建議使用SUBDIRS來代替。創建於Makefile文件

Makefile

SUBDIRS = bin 
.PHONY: subdirs $(SUBDIRS) 
subdirs: $(SUBDIRS) 
$(SUBDIRS): 
    $(MAKE) -C [email protected] 

bin/Makefile

SOURCES=../home/main.cpp ../modelChecking/Configuracao.cpp 
SUFIX=$(addprefix bin/,$(notdir $(SOURCES:.cpp=.o))) 
OBJECTS=$(SUFIX) 

all: refiner 
refiner: $(OBJECTS) 
    $(CC) $^ -o refiner 

main.o: ../home/main.cpp 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

Configuracao.o: ../modelChecking/Configuracao.cpp 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

這樣你就不必擔心對象前綴。