Изменение make-файла для компиляции файлов .cc и .cpp

Я пытаюсь изменить свой make-файл для поддержки .cpp и .cc, однако постоянно получаю сообщение об ошибке, например

target `source/systemFuncs.cpp' doesn't match the target pattern

Я изменяю существующий make-файл, поддерживающий .cc, и хочу, чтобы он также компилировал .cpp, но не знаю, как это сделать. Первоначально это был make-файл для проекта nacl.

Как я могу скомпилировать как .cpp, так и .cc?

Содержимое, связанное с make-файлом:

x86_32_OBJS:=$(patsubst %.cc,%_32.o,$(CXX_SOURCES))
$(x86_32_OBJS) : %_32.o : %.cc $(THIS_MAKE)
    $(CXX) ${INCDIRS} -o $@ -c $< -m32 -O0 -g $(CXXFLAGS)

$(PROJECT)_x86_32.nexe : $(x86_32_OBJS)
    $(CXX) -o $@ $^ -m32 -O0 -g $(CXXFLAGS) $(LDFLAGS)

CXX_SOURCES содержит как файлы .cc, так и файлы .cpp, поэтому он должен иметь возможность компилировать оба


person chadb    schedule 20.03.2012    source источник


Ответы (2)


Вы не дали нам много информации, но я сделаю предположение. Я думаю, вы добавили source/systemFuncs.cpp к CXX_SOURCES. Затем нажмите эту строку:

x86_32_OBJS:=$(patsubst %.cc,%_32.o,$(CXX_SOURCES))

который заменил ".cc" на "_32.o", и оставил source/systemFuncs.cpp нетронутым. Затем Make попытался ввести это имя в правило, которое ожидало "_32.o", и потерпело крах.

Попробуй это:

CPP_SOURCES += source/systemFuncs.cpp

x86_32_CPP_OBJS:=$(patsubst %.cpp,%_32.o,$(CPP_SOURCES))

$(x86_32_CPP_OBJS) : %_32.o : %.cpp $(THIS_MAKE)
    $(CXX) ${INCDIRS} -o $@ -c $< -m32 -O0 -g $(CXXFLAGS)

Если повезет, это окажется грубым, но эффективным. Дальнейшие улучшения будут возможны позже.

EDIT:
Если оба набора имен файлов должны быть в одной переменной (CXX_SOURCES), вы можете разделить их следующим образом:

CC_SOURCES :=  $(filter %.cc, $(CXX_SOURCES))
CPP_SOURCES := $(filter %.cpp, $(CXX_SOURCES))

Этого достаточно?

person Beta    schedule 20.03.2012
comment
Прошу прощения, что CXX_SOURCES не был ясен. Я обновил свой вопрос. Мне нужно иметь возможность компилировать как .cc, так и .cpp. Ваш ответ поддерживает только .cpp и игнорирует файлы .cc. - person chadb; 20.03.2012
comment
@ Джонатан Леффлер: К сожалению, я не могу этого сделать, проект (устаревший проект, который традиционно использует VS) имеет как .cc, так и .cpp. Изменение типов файлов не вариант. - person chadb; 20.03.2012
comment
Почему бы и нет? Легко переименовывать файлы. Даже файлы с историей в СКВ можно переименовывать (если только СКВ не на 100% совсем бесполезна). И даже тогда вы можете сделать копию текущего файла .cc и назвать его файлом .cpp и работать исключительно с файлом .cpp в будущем, или вы можете поменять роли расширений. Возможно; вы можете быть не в состоянии принять это решение. Но, может быть, проще всего организовать так, чтобы вы «скомпилировали» .cc файлов в .cpp файлов с помощью cp file.cc file.cpp, а затем ваш make-файл работал только с .cpp файлами. Единообразие (согласованность) очень разумно. - person Jonathan Leffler; 20.03.2012
comment
@chadb: я не игнорировал файлы .cc, я показал вам, как обращаться с файлами cpp. Я постараюсь изложить это больше. - person Beta; 20.03.2012

Вы можете создать отдельные, но (для исполнения) одинаковые правила:

(Я пропустил THIS_MAKE, так как в коде выше он пустой, но вы можете его добавить)

# catch both
x86_32_OBJS:=$(addsuffix _32.o,$(basename $(CXX_SOURCES)))

# rule for .cc
$(patsubst %.cc,%_32.o,$(filter %.cc,$(CXX_SOURCES))):%_32.o: %.cc
     $(CXX) ${INCDIRS} -o $@ -c $< -m32 -O0 -g $(CXXFLAGS)

# rule for .cpp
$(patsubst %.cpp,%_32.o,$(filter %.cpp,$(CXX_SOURCES))):%_32.o: %.cpp
    $(CXX) ${INCDIRS} -o $@ -c $< -m32 -O0 -g $(CXXFLAGS)

$(PROJECT)_x86_32.nexe : $(x86_32_OBJS)
    $(CXX) -o $@ $^ -m32 -O0 -g $(CXXFLAGS) $(LDFLAGS)
person Matthias    schedule 20.03.2012