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
(и он никогда не поддерживал их).
Некоторые причины, по которым указанные параметры не поддерживаются:
- Эти опции сообщают компилятору, чтобы выходной сигнал препроцессора создавал правила вместо предварительно обработанного исходного кода. Это не очень подходит для работы ccache; он должен получить "реальный" предварительно обработанный вывод для каждого вызова компилятора (см. https://ccache.samba.org/manual.html).
- Проще говоря, никто не реализовал поддержку упомянутых опций.
Скорее всего, было бы возможно реализовать поддержку, позволив 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
,