Как я могу программно настроить компилятор для CMake через Python в Windows?

У меня есть скрипт сборки Python, который я использую для создания ряда проектов, настроенных через CMake в Windows. Раньше мы использовали MSVC для сборки этих проектов, и все было нормально. Я хочу попытаться включить ICC в сборку сейчас с помощью этих скриптов Python. Я могу выбрать нативный компилятор прямо в UI, если это необходимо, но я предпочитаю делать все программно.

Проблема в том, что он терпит неудачу либо из-за синтаксических ошибок, либо просто не обращает внимания на параметры cmake.

Я могу установить:

"CMAKE_CXX_COMPILER:PATH":"C:/Program Files (x86)/Intel/Composer XE 2013/bin/intel64/icl.exe",
"CMAKE_C_COMPILER:PATH":"C:/Program Files (x86)/Intel/Composer XE 2013/bin/intel64/icl.exe"

И это часть массива cmakeItems, который затем передается в генерацию:

generate(x86Generator, cmakeItems, osName, buildTarget)

где другие параметры устанавливаются с помощью переключателей командной строки (для x86generator и buildTarget) или по умолчанию (т. е. osName определяется в самом скрипте).

Прежде чем что-либо пробовать, я запускаю это из командной строки, где я запускал

iclvars intel64

в каталоге icc bin, чтобы убедиться, что все переменные icc настроены правильно, и я могу ввести icl в командной строке и убедиться, что он указан в пути.

Выполнение вышеуказанного означает, что компилятор C остается компилятором msvc по умолчанию.

Я также пытался запустить:

set(CMAKE_C_COMPILER_INIT icl)
set(CMAKE_CXX_COMPILER_INIT icl)

но это дает мне синтаксическую ошибку в части icl. Я думал, что, возможно, это проблема пути, но делаю:

set(CMAKE_C_COMPILER_INIT "C:\Program Files (x86)\Intel\Composer XE 2013\bin\intel64\icl")
set(CMAKE_CXX_COMPILER_INIT "C:\Program Files (x86)\Intel\Composer XE 2013\bin\intel64\icl")

также дает мне синтаксическую ошибку.

Итак, как я могу программно установить компилятор C/CXX из скрипта Python, вызывающего cmake?


person mmr    schedule 04.04.2013    source источник


Ответы (2)


В командной строке вы указываете компилятор через переменные окружения CC и CXX. Я предполагаю, что вам нужно правильно подготовить окружение команды cmake, и вам не следует изменять внутренности CMakeLists.txt.

E.g.

import subprocess
subprocess.Popen('CC=%s CXX=%s cmake ../path/to/src' %('icc','icpc'))
person Bort    schedule 04.04.2013
comment
Это работает на окнах? Большинство решений через переменные среды, похоже, ориентированы на linux/unix. - person mmr; 04.04.2013
comment
в окнах должно быть "set CC=%s && set CXX=%s && cmake .." - person Bort; 04.04.2013
comment
Это не работает для меня; CMakeCache.txt не содержит параметр CMAKE_C_COMPILER при таком запуске, но он есть, если я явно устанавливаю компилятор через пользовательский интерфейс. Я использую os.system("set CC=\"C:/Program Files (x86)/Intel/Composer XE 2013/bin/intel64/icl.exe\" && set CXX=\"C:/Program Files (x86)/Intel/Composer XE 2013/bin/intel64/icl.exe\" && cmake -G " + cmakeGenerator + " ../../gdcm") - person mmr; 04.04.2013
comment
Это также не сработает, если я сделаю set CC=icl && set CXX=icl && build.py в надежде, что это установит переменные среды для выполнения Python. - person mmr; 04.04.2013

Ответ:

ICC не работает с CMake в Windows, так что не беспокойтесь.

http://www.cmake.org/Bug/view.php?id=6929

Гораздо лучше запустить его с помощью какого-либо компилятора Visual Studio, а затем возиться с icprojconverter:

http://software.intel.com/en-us/articles/ICProjConvert100

person mmr    schedule 04.04.2013