Скомпилируйте сразу несколько ** измененных ** исходных файлов в GNU make

Я знаю, что было несколько вопросов с похожими названиями, но ни один из них не дает ответа на то, что мне нужно (поправьте меня, если я ошибаюсь).

Рассмотрим этот make-файл:

SOURCES=file1.cpp file2.cpp file3.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=myprog

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(CXX) -o $@ $(OBJECTS)

file1.o: file1.cpp file1.h
file2.o: file2.cpp file2.h file1.h
file3.o: file3.cpp

.cpp.o:
    $(CXX) $(CXXFLAGS) -c -o $@ $<

Если я изменю file1.h, запустится следующее:

g++ -c -o file1.o file1.cpp
g++ -c -o file2.o file2.cpp
g++ -o myprog file1.o file2.o file3.o 

Я бы хотел иметь:

g++ -c file1.cpp file2.cpp
g++ -o myprog file1.o file2.o file3.o 

(Я знаю, что не могу указать выходной каталог объекта с помощью GCC, но это я может смириться; должно быть возможно обойти некоторые команды cd .)

В nmake это делается с помощью правила вывода с двумя двоеточиями (так называемого « batch- правило режима »). По сути, он группирует правила вывода (например, «.obj.cpp:») для нескольких целей и вызывает компилятор для всех зависимостей, а не один раз для каждого файла. $ получает список зависимостей, а не только первую.

Прямо сейчас мы используем параллельное построение (make -j), но у него есть свои проблемы, и компилятор VC ++ работает намного лучше в режиме одного вызова так что я бы предпочел использовать это.

8
задан Igor Skochinsky 18 May 2011 в 18:25
поделиться