2013-10-25 5 views
3

Обычно я использую эту строку OBJECTS = $(SOURCES:.cpp=.o), чтобы заменить расширение .cpp файлов в SOURCES на .o расширение. У моего проекта теперь есть файлы с расширением .c вместе с .cpp. Как изменить эту строку, чтобы она заменила все расширения .c и .cpp на .o?Заменить имя файла в Makefile

Я бы не предпочел решения две строки, как показано ниже:

OBJECTS_TMP = $(SOURCES:.cpp=.o)

OBJECTS = $(OBJECT_TMP:.c=.o)

Я хотел бы что-то вроде

OBJECTS = $(SOURCES:(.cpp|.c)=.o)

или даже

OBJECTS = $(SOURCES:.*=.o)

Это возможно и как? Благодаря!

+0

шероховатой догадку , но не проверил его: '$ (SOURCES: .c = .o: .cpp = .o)'? –

+0

@NiklasR '$ (SOURCES: .c = .o: .cpp = .o)' дает мне '*** несколько целевых шаблонов. Stop.' и '$ (SOURCES: .cpp = .o: .c = .o)' дает '*** шаблон цели не содержит'% '. Стоп. ' –

ответ

2

Вы не можете сделать это только с сокращением. Вы должны будете использовать функцию patsubst:

OBJECTS = $(patsubst %.cpp,%.o,$(patsubst %.c,%.o,$(SOURCES))) 

Или вы можете использовать один из каждого:

OBJECTS = $(patsubst %.cpp,%.o,$(SOURCES:.c=.o)) 

Или, вы можете сделать это следующим образом:

OBJECTS = $(addsuffix .o,$(basename $(SOURCES))) 
+0

О, я забыл о вложенности. Это может также работать OBJECTS = $ ($ (SOURCES: .cpp = .o) :. c = .o) '. Благодаря! –

+0

Nope. В сокращенном методе элемент, который должен быть включен, должен быть _переменным именем_. Это не может быть какой-то случайный набор значений. Потребовалось бы всего несколько секунд, чтобы вы попытались это и поняли, что это не работает, прежде чем отправлять его, BTW. – MadScientist

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