Как динамически переименовать объектный файл в make-файле

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

Мне нужно перенести процесс компиляции проекта из Visual Studio в gcc, и для этого уже есть решение, написанное коллегой, но он использовал 4 сценария bash и make-файл для компиляции решения.

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

В цели ниже:

$(OBJECTS): %.o: %.cpp 
    $(CC) $(CPPFLAGS) -c $< -o $@

Я хотел бы проверить, существует ли уже создаваемый.o, и переименовать его в другое. Это необходимо, потому что в проекте есть несколько исходных файлов с одинаковыми именами, но разные по содержанию.

Например, если текущий компилируемый.cpp называется file.cpp, а генерируемый объект - file.o, правило должно проверить, существует ли file.o, и переименовать текущий file.o во что-то другое.

Если вы знаете хороший урок, объясняющий это, пожалуйста, дайте мне знать. Я нашел много примеров, показывающих, как создавать тесты для текущего файла, скомпилированного по этому правилу, но ни одного, который бы переименовал объект.o.

Заранее спасибо и прошу прощения за любую "тупость", написанную здесь.:-)

2 ответа

Решение

Прежде всего, у вас есть наше глубокое сочувствие.

Make на самом деле не предназначен для такой неоднозначности, поэтому нам придется использовать kludge. Вы не сказали, во что хотите переименовать файл, поэтому сейчас давайте скажем, что мы переходим file.o в file_save.o,

# This tells Make that these are not real targets, so that it will
# proceed even if file.o already exists.
.PHONY: $(OBJECTS)

$(OBJECTS): %.o: %.cpp 
    # If file.o exists, move it to file_save.o
    @if [ -f $@ ]; then mv $@ $*_save.o; fi
    $(CC) $(CPPFLAGS) -c $< -o $@

Расширение моего комментария к вопросу:

Возможно, вам следует рассмотреть возможность размещения объектных файлов в той же иерархии каталогов, что и исходные файлы, чтобы избежать конфликтов имен.

Так что src/network/client.cpp скомпилирован для сборки /obj/network/client.o.

Я чрезвычайно ржавый, когда дело доходит до make-файлов, но я думаю, что решил это, сделав что-то вроде:

$SRC= src/network/client.cpp src/main.cpp .....
$OBJ= makefile_replace_function($SRC, .o)

$(OBJ) : $(SRC)
   compile_instructions

Где вам придется заменить makefile_replace_function а также compile_instructions к их реальным эквивалентам, так как я забыл тогда...

Я понимаю, что это может быть не очень полезно, но, по крайней мере, это идея для рассмотрения.

Другие вопросы по тегам