Как использовать ccache с Make?

У меня есть исходный каталог, который использует makefile для компиляции кода. Этот файл makefile / configure не написан для совместимости с ccache. Поэтому я решил использовать ccache. Я создал псевдоним в .bashrc как alias gcc='ccache gcc', но Makefile все еще не учитывает это определение gcc. Могу ли я что-нибудь сделать, не касаясь Makefile/configure файла, чтобы он использовал ccache gcc вместо gcc. Также CC = 'ccache gcc' ./configure не является вариантом, поскольку он не запрашивает CC.

Если я напишу Makefile, я могу предоставить $ {gcc), но это не вариант, поскольку я не пишу Makefile. Есть ли способ, которым нам не нужно ничего менять в исходном файле, но все же включить компиляцию ccache.


person peeyush    schedule 18.03.2012    source источник
comment
Что ж, тогда что Makefile использует для компиляции? Это жестко запрограммировано на использование gcc, а не $(CC)?   -  person Oliver Charlesworth    schedule 18.03.2012
comment
Makefile создается configure, который, в свою очередь, создается autoconf, хотя makefile анализирует configure.in. Но изменение, которое создает другую проблему файла конфигурации, было изменено, поэтому я искал способ, с помощью которого можно было бы сделать это без внесения изменений в исходный файл (makefile / configure).   -  person peeyush    schedule 18.03.2012


Ответы (3)


Как описано в прекрасном руководстве: создайте символическую ссылку с именем "gcc" в каталоге, который указан в вашем PATH перед тем, который содержит настоящий gcc. Это приведет к прозрачному использованию ccache без каких-либо изменений в make-файле.

person slowdog    schedule 27.03.2012

Псевдонимы являются локальными для оболочки, в которой они созданы; в отличие от переменных среды, они не передаются никаким программам, вызываемым оболочкой (включая make). Сделайте вызовы / bin / sh, а не / bin / bash, и / bin / sh не читает ваш ~ / .bashrc и т. Д., Поэтому никакие определенные там псевдонимы вам не помогут.

Я не совсем уверен, почему вы наложили на себя некоторые из упомянутых вами ограничений: эти вещи работают нормально, и вы не дали причины избегать их, насколько я понимаю. Например, предоставление другой CC с configure будет работать, если версия autoconf не совсем старая. Ты можешь это сделать:

./configure CC='ccache gcc'

например, и это установит значение по умолчанию CC в вашем make-файле на ccache gcc. Я не понимаю, что вы имеете в виду, говоря «не запрашивает CC».

При желании вы также можете изменить значение CC в командной строке make, например:

make CC='ccache gcc'

который тоже отлично работает.

person MadScientist    schedule 18.03.2012
comment
об этом я уже упоминал, что опция CC не является конфигурацией. gcc там жестко запрограммирован. Другими словами, скрипт конфигурации не ищет переменную CC. - person peeyush; 19.03.2012

Добавить пакетный ccache в PATH

PATH="/usr/lib/ccache:${PATH}" make

Это универсальный метод, который:

  • работает сразу для всех компиляторов: C, C ++ и др.
  • меньше зависит от фактических Makefile настроек, как CC может
  • не нарушает сборку людей, если вы что-то автоматизируете, а у целевого пользователя не установлено ccache

Упоминается в man ccache:

Чтобы использовать второй метод в системе Debian, проще всего добавить / usr / lib / ccache к вашему PATH. / usr / lib / ccache содержит символические ссылки для всех компиляторов, установленных в настоящее время как пакеты Debian.

И вы можете подтвердить это с помощью:

ls -l /usr/lib/ccache

который содержит массу возможных имен GCC, в том числе для установленных кросс-компиляторов:

total 0
lrwxrwxrwx 1 root root 16 May  6 13:51 aarch64-linux-gnu-gcc -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 aarch64-linux-gnu-gcc-7 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 Jun 23 18:25 arm-linux-gnueabi-g++ -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 Jun 23 18:25 arm-linux-gnueabi-g++-7 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 arm-linux-gnueabi-gcc -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 arm-linux-gnueabi-gcc-7 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May 28 22:11 arm-linux-gnueabihf-gcc -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May 28 22:11 arm-linux-gnueabihf-gcc-7 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 arm-none-eabi-g++ -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 arm-none-eabi-gcc -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 arm-none-eabi-gcc-6.3.1 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 c++ -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 c89-gcc -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 c99-gcc -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 cc -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 clang -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 clang++ -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 g++ -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 g++-5 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 g++-6 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 g++-7 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 gcc -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 gcc-5 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 gcc-6 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 gcc-7 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 x86_64-linux-gnu-g++ -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 x86_64-linux-gnu-g++-5 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 x86_64-linux-gnu-g++-6 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 x86_64-linux-gnu-g++-7 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 x86_64-linux-gnu-gcc -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 x86_64-linux-gnu-gcc-5 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 x86_64-linux-gnu-gcc-6 -> ../../bin/ccache
lrwxrwxrwx 1 root root 16 May  6 13:51 x86_64-linux-gnu-gcc-7 -> ../../bin/ccache

Проверено на Ubuntu 16.04.

person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 14.09.2018