2015-02-09 2 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 в бен/папке и объектной переменной необходим заменить каждый родительский каталог, и я пробовал разные способы:

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

ответ

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. Создание в Makefiles

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] 

Таким образом, вы не должны беспокоиться о приставке объекта.

Смежные вопросы