2016-01-20 13 views
3

Я создаю проект с открытым исходным кодом (kst, v2.0.8), который использует CMake. Я использую CMake v2.8.12.2 и MSVC 2008 в качестве компилятора, и я создаю make-файлы NMake для его создания в командной строке. Я могу получить его для успешного создания этой установки. Эти версии имеют мандат, поэтому я не могу использовать более позднюю версию CMake или MSVC.Как заставить cmake использовать cl.exe без полного пути?

мне нужно, чтобы иметь возможность провести анализ исходного кода KST с помощью компании HP Fortify и иметь возможность использовать его из командной строки, она работает в одном из двух способов:

  1. Бесконтактный режим, где он создает собственный «cl.exe», устанавливает путь к нему до пути к реальному cl.exe и поэтому запускается во время сборки.

  2. Установите компилятор в make-файле в командную строку Fortify, например. sourceanalyzer -b build_id cl вместо cl.

В любом случае мне нужно заставить компилятор, чтобы cmake генерировал в его make-файлы, что-то, что cmake не обнаруживает автоматически.

Я попытался установить компилятор при запуске cmake, следуя тому же методу в this question, но cmake по-прежнему настаивает на том, чтобы поместить полный путь в файл clv.exe MSVC в make-файлах.

cmake -DCMAKE_C_COMPILER=cl -DCMAKE_C_COMPILER_FORCED=ON -DCMAKE_CXX_COMPILER=cl -DCMAKE_CXX_COMPILER_FORCED=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=%CFITSIO_DIR% -G"NMake Makefiles" ..\cfit3250 

Я также попытался установить компилятор для вызова Fortify но когда CMake проверяет компилятор он не говорил, что он не может найти компилятор. (Кроме того, я попытался это без форсированного = ON аргументов и в этом случае он говорит, что компилятор не может.)

cmake -DCMAKE_C_COMPILER="sourceanalyzer -b %BUILDID% cl" -DCMAKE_C_COMPILER_FORCED=ON -DCMAKE_CXX_COMPILER="sourceanalyzer -b %BUILDID% cl" -DCMAKE_CXX_COMPILER_FORCED=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=%CFITSIO_DIR% -G"NMake Makefiles" ..\cfit3250 

Я мог бы найти и заменить все вызовы компилятора в Makefiles, но я должен был бы помнить, сделать это после каждого cmake, и было бы скучно видеть, что есть несколько проектов/make-файлов/вызовов cl (а не определение переменной CC в make-файле). Я бы предпочел бы, чтобы cmake использовал желаемый компилятор прямо со смещения.

+1

Насколько я знаю, CMake всегда стремится генерировать make-файлы с абсолютными путями к программам. Что касается вашего случая, вы можете создать ** wrapper ** script и сообщить CMake, чтобы использовать его в качестве компилятора. Внутри скрипта вы можете использовать относительный путь к компилятору (отправка по переменной PATH) или использовать другой механизм для выбора фактического компилятора. – Tsyvarev

ответ

2

ОБНОВЛЕНО: Тестирование показало, что первоначальный предлагаемый подход не работал должным образом на некоторых платформах. Похоже, что использование сценария-обертки - это путь к успеху.

Если вы действительно хотите принудительно выполнить компилятор определенного компилятора и байпаса, то CMakeForceCompiler module может быть тем, что вы ищете. Эта ссылка на документы CMake содержит тривиальный пример файла toolchain, в котором показано, как использовать конкретный компилятор, вызываемый как простая команда без пути. К сожалению, CMake по-прежнему преобразует это в абсолютный путь, поэтому сам по себе это не решит вашу проблему. Однако вы можете использовать файл toolchain для указания сценария оболочки и использовать CMakeForceCompiler для обхода проверок компилятора. Эта комбинация должна давать поведение, о котором вы просили.

Обратите внимание, что при использовании модуля CMakeForceCompiler вы берете на себя большую ответственность за сообщение информации CMake, в частности идентификатор компилятора конкретного компилятора, который вы хотите принудительно использовать, но из CMake docs кажется довольно понятным, что это будет просто MSVC в вашем случае.

Чтобы использовать файл инструментальной привязки, вызовите CMake с опцией -DCMAKE_TOOLCHAIN_FILE=path/to/file, указывая на свой собственный файл инструментальной привязки.В документах CMake есть specific section, охватывающих использование инструментальных цепей, хотя он и блещет некоторыми важными подробными деталями.

Как упоминалось в комментарии @ Цыварева, использование сценария обертки, вероятно, будет вашим лучшим способом справиться с этим. Этот скрипт-оболочка просто должен перенаправить вызов обычной команде компилятора без указания пути. Затем вы берете на себя ответственность за то, что команда будет на вашем PATH, когда вы выполните сборку. Что-то же просто, как следующий должно хватить как обертка пакетного файла на ОС Windows (непроверенных):

cl %* 

Теперь вы можете контролировать ли Визуальная компилятор студии или Fortify получает вызывается чисто по PATH сборки видит. Лично я думаю, что это немного хрупко, но это то, о чем вы просили. ;)

Как более надежная альтернатива, можно ли использовать две совершенно отдельные сборки? Если так, то я рекомендую это как лучшую альтернативу. Постройте один с компилятором Visual Studio по умолчанию, как обычно, и для другой сборки используйте файл инструментальной привязки, чтобы указать на компилятор Fortify, чтобы заставить CMake обойти свои проверки компилятора. Таким образом, вы не полагаетесь на среду сборки, настроенную определенным образом.

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

  • Нет связанных вопросов^_^