2014-10-01 2 views
1

В моем проекте все .cpp файлы хранятся вMakefile - заменить в групповой символ

Classes/ 
Classes/Something/ 
Classes/Something/Else 
... 

Я хочу, чтобы собрать все файлы .cpp separetly Бин/каталог, заменив/с _, так что:

Classes/First.cpp -> Bin/Classes_First.o 
Classes/Foo/Bar.cpp -> Bin/Classes_Foo_Bar.o 

Теперь я хотел создать правила для компиляции:

Bin/%.o: $(subst _,/,%.cpp) 
    $(COMPILER)g++ $(COMPILE_FLAGS) -c -o [email protected] $^ 

Я пробовал:

make Bin/Classes_Test.o

Но компиляция не удалась.

Так что я создал отладку шаблона:

%.cpp: 
    @echo CPP: [email protected] 

Теперь распечатанный:

CPP: Classes_Test.cpp 

Почему ?!

Так что я изменил мой рисунок на:

Bin/%.o: $(subst _,/,Test1_Test2.cpp) 

и я увидел:

CPP: Test1/Test2.cpp 

Я немного смущен, почему Подст не работает, если я использую подстановочные в качестве источника ...

ответ

0

Это вопрос об оценке.

Когда сделай разбор Makefile он оценивает $(subst) вызова, но аргумент в $(subst) в этой точке является символьной строкой %.cpp, которая не имеет ничего заменить в нем и так ничего не делает.

При достижении цели/времени выполнения % в целевом шаблоне и шаблоне предварительного кода заполняются, но $(subst) уже давно ушел.

Для этого вам необходимо вручную (так или иначе) отобразить выходные файлы во входные файлы. Вы можете сделать это и сохранить цель шаблона шаблона %.o для фактического запуска рецепта (так что вам просто нужно создать связку из Bin/Test1_Test2.o: Test1/Test2.cpp строк).

Кроме того, я полагаю, вы можете может быть в состоянии использовать secondary expansion, чтобы сделать это:

.SECONDEXPANSION: 
Bin/%.o: $$(subst _,/,%.cpp) 
Смежные вопросы