Как заставить cmake использовать cl.exe без полного пути?

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

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

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

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

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

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

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 тестирует компилятор, он не может сказать, что не может найти компилятор. (Я также пробовал это без аргументов FORCED = 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

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

3

Решение

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

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

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

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

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

cl %*

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

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

3

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector