2014-09-07 1 views
4

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

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, который я могу использовать? Может ли кто-нибудь помочь?

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

+0

Я не знаю, CMake на всех, но это палка компилятор, выбранный с помощью 'CMAKE_C_COMPILER' в Makefile переменную и использовать ее в самом файле makefile? Или он вставляет фактическое имя компилятора во все сгенерированные make-файлы? –

+0

Я считаю, что он вставляет фиксированную строку внутри Makefile в нескольких местах. Поэтому это не просто переопределить. – oferlivny

+0

Чем больше я узнаю о cmake, тем меньше мне это нравится. Вы можете написать свой собственный скрипт и использовать его в качестве компилятора и реагировать на присутствие LOCAL_BUILD или любой другой переменной, чтобы выбрать, какой компилятор использовать. –

ответ

2

Проще всего сделать (ИМО), это написать небольшой скрипт в проекте, который вызывает компилятор, и изменить Cmake файлы для запуска этого сценария вместо того, чтобы содержать имя компилятора непосредственно:

SET(CMAKE_C_COMPILER "my-gcc-script") 

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

+0

Я думал, что должно быть более элегантное решение. Возможно, используя переменную оболочки в качестве префикса для компилятора cmd. В любом случае, поскольку я использую CMake для нескольких платформ, с разными компиляторами, можете ли вы предложить, как реализовать сценарий? Это может быть хорошо, если он может быть сгенерирован CMake ... – oferlivny

+0

Скорее всего, скрипт формы: $ MYDISTCC $ @, а затем просто установите переменную $ MYDISTCC перед запуском make ... – oferlivny

+0

'' $ MYDISTCC "" $ @ "' для правильности, но да, это основная идея, и было бы очень приятно, если бы cmake не заставлял вас делать это таким образом. И вы могли бы просто использовать '$ CC', так как это то, что делает использование обычным явлением, и, как я полагаю, такие вещи, как autotools, используются в их поддержке кросс-компиляции. –

4

Мы используем это, чтобы время и время (а не cmake) включали и выключали флаг -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 исходить от переменного макияжа. Как это

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

, а затем запустить либо

make USE_DISTCC=distcc 

или просто

make 
Смежные вопросы