Ccache не работает с флагом gcc -M?

Я пытаюсь использовать ccache для ускорения перестроений, и я заметил это в журнале:

[2015-04-17T10:41:45.845545 27682] Compiler option -M is unsupported
[2015-04-17T10:41:45.845584 27682] Failed; falling back to running the real compiler

По моему опыту, вам нужно что-то вроде флага -M, чтобы правильно сделать make или его эквивалентный триггер. Кажется странным, что ccache будет отключен опцией, которая должна присутствовать почти в каждой сборке проекта. Я что-то пропустил? Есть ли более предпочтительный вариант?

Это w/ ccache-3.2.1.

Изменить: я пытался с -MM, но не повезло.

1 ответ

Решение

Это верно, что в настоящее время ccache не поддерживает параметры компилятора -M а также -MM (и он никогда не поддерживал их).

Некоторые причины, по которым указанные параметры не поддерживаются:

  1. Эти опции сообщают компилятору, чтобы выходной сигнал препроцессора создавал правила вместо предварительно обработанного исходного кода. Это не очень подходит для работы ccache; он должен получить "реальный" предварительно обработанный вывод для каждого вызова компилятора (см. https://ccache.samba.org/manual.html).
  2. Проще говоря, никто не реализовал поддержку упомянутых опций.

Скорее всего, было бы возможно реализовать поддержку, позволив ccache запустить команду компилятора дважды: один без -M/-MM получить предварительно обработанный исходный код (с которым должен быть связан результат) и один с -M/-MM получить результат (составить правила).

Однако я (выступая в качестве сопровождающего ccache в течение последних шести лет) не слышал, чтобы кто-то не поддерживал -M/-MM до сих пор, так что мое впечатление таково, что -M/-MM на самом деле не используются много.

Я что-то пропустил? Есть ли более предпочтительный вариант?

Да, я бы сказал, что стандартным способом является использование -MD/-MMD (которые поддерживаются ccache) вместо -M/-MM, -MD/-MMD превосходят, потому что они производят как .o и .d файл за один раз, тогда как -M/-MM только производить .d файл, поэтому в этом случае Makefile должен дважды вызывать компилятор для каждого файла исходного кода. Смотрите, например, http://www.microhowto.info/howto/automatically_generate_makefile_dependencies.html чтобы узнать, как использовать -MD/-MMD,

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