Как обрабатывать перемещение источников из C в C ++ в автоматически генерируемых зависимостях заголовка gcc? - PullRequest
0 голосов
/ 04 января 2019

У нас есть проект, который сейчас медленно мигрирует с C на C ++. Он использует GNU Make в качестве системы сборки. Мы используем GCC -M флаги для генерации зависимостей от заголовков.

При генерации зависимостей GCC добавляет исходные файлы и все необходимые заголовки в список зависимостей. Для обхода удаления заголовка есть флаг -MP. Но это не исправляет ошибку, когда исходный файл перемещается из расширения .c в расширение .cpp (или назад при переключении между ветвями), потому что все еще существует автоматически генерируемая зависимость от .c, которой больше нет.

Есть несколько способов исправить это, я придумал, но все швы немного хакерские:

  1. Всегда меняйте имя файла при переносе
  2. Создать другое имя файла с зависимостями на основе языка
  3. Переписать сгенерированные зависимости собственным скриптом.
  4. Добавить цели, чтобы игнорировать все отсутствующие .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'. Стоп.

ошибка будет возникать. Но после чистой сборки пройдет нормально.

1 Ответ

0 голосов
/ 06 января 2019

Второй вариант (базовые .d имена файлов в имени входного файла, а не в имени выходного файла) кажется наиболее часто используемым. То есть используйте -MF $@.d вместо -MF $*.d.

Если вы в настоящее время перечисляете объектные файлы как зависимости, вы можете переключить их на список исходных файлов, из которых вы генерируете список объектных файлов, используя $(patsubst …). (Это предполагает, что исходные файлы имеют обычные имена или местоположения, которые указывают, где будут использоваться объектные файлы.) Или вы можете использовать $(wildcard …) для автоматического получения списка из исходного дерева или использовать файл манифеста, сгенерированный из список проверенных файлов из системы контроля версий.

...