How to use ccache with 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 компилирование.

3 ответа

Решение

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

Псевдонимы локальны для оболочки, в которой они созданы; в отличие от переменных окружения, они не передаются никаким программам, которые вызывает оболочка (включая make). 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'

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

Добавить упакованный 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.

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