У нас есть проект, который сейчас медленно мигрирует с C на C ++. Он использует GNU Make
в качестве системы сборки. Мы используем GCC
-M флаги для генерации зависимостей от заголовков.
При генерации зависимостей GCC
добавляет исходные файлы и все необходимые заголовки в список зависимостей. Для обхода удаления заголовка есть флаг -MP. Но это не исправляет ошибку, когда исходный файл перемещается из расширения .c в расширение .cpp (или назад при переключении между ветвями), потому что все еще существует автоматически генерируемая зависимость от .c, которой больше нет.
Есть несколько способов исправить это, я придумал, но все швы немного хакерские:
- Всегда меняйте имя файла при переносе
- Создать другое имя файла с зависимостями на основе языка
- Переписать сгенерированные зависимости собственным скриптом.
- Добавить цели, чтобы игнорировать все отсутствующие .c / .cpp в зависимостях
Я пропустил какое-то простое исправление?
Маленький пример:
-include a.d
%.o: %.c
gcc -MP -MMD -MF $*.d -MQ $@ -c -o $@ $<
%.o: %.cpp
g++ -MP -MMD -MF $*.d -MQ $@ -c -o $@ $<
a: a.o
g++ a.o -o a
В случае выше, если компилировать a из a.c и затем перемещать a.c -> a.cpp
make: *** Нет правила для создания цели 'a.c', необходимой для 'a.o'. Стоп.
ошибка будет возникать. Но после чистой сборки пройдет нормально.