DistCC и CMake — выбирайте между локальной и распределенной сборкой при запуске make

Мой проект построен с использованием CMake и скомпилирован с DistCC + GCC.
Я настраиваю компилятор следующим образом:

SET(CMAKE_C_COMPILER "distcc variation-of-gcc")

Чтобы построить проект, я просто запускаюCMake‘ а потом ‘сделать -jXX».

Хотя distcc действительно ускоряет процесс, я иногда хочу собирать его без распространения — я хочу, чтобы он создавался локально на машине.

Я знаю, что могу изменить DISTCC_HOSTS, чтобы включить только localhost — но это по-прежнему накладывает издержки на сетевые подключения distcc, хотя и быстрее, чем накладные расходы для других машин …
Я также могу сделать это, повторно запустив cmake и изменив CMAKE_C_COMPILER, используя флаги настройки.

Но я ищу способ сделать это, просто добавив флаг непосредственно в «make».

i.e.
# this will use distcc:
make -jXX ...
# this will run locally:
make LOCAL_BUILD=1 -jX ...

Могу ли я использовать трюк с CMake?
Кто-нибудь может помочь?

Спасибо!
Офер

6

Решение

Самое простое, что нужно сделать (IMO) — написать небольшой скрипт в вашем проекте, который вызывает компилятор, и изменить ваши файлы cmake для запуска этого скрипта вместо того, чтобы содержать имя компилятора напрямую:

SET(CMAKE_C_COMPILER "my-gcc-script")

Теперь вы можете сделать так, чтобы этот скрипт обычно запускал distcc, но (на основе переменной окружения или чего-то ещё) также запускался без distcc. Не нужно ничего менять в ваших файлах cmake.

3

Другие решения

Мы используем это, чтобы разрешить make-time (а не cmake time) включать и выключать флаг -Werror.

if(CMAKE_GENERATOR STREQUAL "Unix Makefiles")
# TODO: this approach for the WERROR only works with makefiles not Ninja
set(CMAKE_CXX_COMPILE_OBJECT "<CMAKE_CXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS> $(WERROR) -o <OBJECT> -c <SOURCE>")
endif()

Тогда мы бежим

make WERROR=-Werror

включить предупреждения как ошибку

Я ожидаю, что вы могли бы сделать что-то подобное, чтобы использовать distcc из переменной make. Как это

set(CMAKE_CXX_COMPILE_OBJECT "$(USE_DISTCC) <CMAKE_CXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")

А потом беги либо

make USE_DISTCC=distcc

или просто

make
6

По вопросам рекламы [email protected]