Как динамически переименовать объектный файл в make-файле - PullRequest
0 голосов
/ 25 апреля 2011

Я очень, очень плохо знаком с 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 ]

2 голосов
/ 25 апреля 2011

Прежде всего, мы выражаем глубокое сочувствие.

На самом деле, 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 $@
1 голос
/ 27 апреля 2011

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

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

Так что 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 на их настоящие эквиваленты, поскольку я забыл тогда ...

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

...