Как автоматически найти путь к компилятору в cmake? - PullRequest
0 голосов
/ 21 мая 2019

Я хочу установить путь компилятора (например: icc) автоматически в cmake, чтобы моя программа могла компилироваться на любом компьютере, если на нем установлен icc, и нам не нужно заботиться о том, где находится *Установлено 1003 *.

Сначала я использовал следующую команду для установки компилятора.Все в порядке.

set(Intel_C_COMPILER "/opt/intel/compilers_and_libraries_2019.0.117/linux/bin/intel64/icc")
set(Intel_CXX_COMPILER "/opt/intel/compilers_and_libraries_2019.0.117/linux/bin/intel64/icpc")

set(CMAKE_C_COMPILER   ${Intel_C_COMPILER}  )
set(CMAKE_CXX_COMPILER ${Intel_CXX_COMPILER})

project(MyProject)

....

Затем я хочу установить путь к компилятору автоматически, я знаю, что следующая команда может найти путь к компилятору

which icc

Поэтому я пишу следующую команду:установить компилятор автоматически с помощью cmake.

execute_process(COMMAND which icc  OUTPUT_VARIABLE Intel_C_COMPILER)
execute_process(COMMAND which icpc OUTPUT_VARIABLE Intel_CXX_COMPILER)

message(Intel_CXX_COMPILER: ${Intel_C_COMPILER})
message(Intel_CXX_COMPILER: ${Intel_CXX_COMPILER})

set(CMAKE_C_COMPILER   ${Intel_C_COMPILER}  )
set(CMAKE_CXX_COMPILER ${Intel_CXX_COMPILER})

project(MyProject)

....

В этом случае происходит нечто странное, cmake показывает, что:


 Intel_CXX_COMPILER:/opt/intel/compilers_and_libraries_2019.0.117/linux/bin/intel64/icpc

-- The C compiler identification is unknown
-- The CXX compiler identification is unknown

 CMake Error at CMakeLists.txt:27 (project):   The CMAKE_C_COMPILER:

    /opt/intel/compilers_and_libraries_2019.0.117/linux/bin/intel64/icc



  is not a full path to an existing compiler tool.

  Tell CMake where to find the compiler by setting either the
environment   variable "CC" or the CMake cache entry CMAKE_C_COMPILER
to the full path to   the compiler, or to the compiler name if it is
in the PATH.


CMake Error at CMakeLists.txt:27 (project):   The CMAKE_CXX_COMPILER:

    /opt/intel/compilers_and_libraries_2019.0.117/linux/bin/intel64/icpc



  is not a full path to an existing compiler tool.

  Tell CMake where to find the compiler by setting either the
environment   variable "CXX" or the CMake cache entry
CMAKE_CXX_COMPILER to the full path   to the compiler, or to the
compiler name if it is in the PATH.


 -- Configuring incomplete, errors occurred!

CMake сказал, что путь не является полным путем к существующему компилятору, но, как показано в message, именно там находится компилятор!

Я знаю, что есть другие методы, которые мы можем установить компилятором, например, экспортировать некоторые переменные окружения, чтобы помочь cmake найти путь, ноЯ хочу знать, почему мой метод дозы не работает?

Есть ли лучший способ справиться с этой проблемой?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Переменные Intel_C_COMPILER и Intel_CXX_COMPILER имеют завершающий символ новой строки .Способ удаления этой новой строки описан в этом вопросе и его ответах: Как убрать конечные пробелы в переменной CMake?

Например, вы можете запустить execute_process с OUTPUT_STRIP_TRAILING_WHITESPACE опция, поэтому она будет вести себя подобно оператору оболочки backtick (`which icc`).

Подробное описание

Большинство утилит оболочки выводят однострочную (или даже многострочную) информацию сзавершающий перевод строки.И утилита which не является исключением.С завершающим символом новой строки вывод выглядит хорошо, когда вы запускаете эти утилиты в терминале.

Но когда вы запускаете такую ​​утилиту в скрипте и захватываете ее вывод программно, нужно позаботиться о такой новой строке.

1 голос
/ 21 мая 2019

Вообще говоря, невозможно установить переменные CMAKE_C_COMPILER и CMAKE_CXX_COMPILER внутри проекта.

Так как обнаружение компилятора происходит с помощью вызова project(), компилятор должен быть включен заранее при настройке проекта.

Я предлагаю вам попробовать следующее:

export CC=/opt/intel/compilers_and_libraries_2019.0.117/linux/bin/intel64/icc
export CXX=/opt/intel/compilers_and_libraries_2019.0.117/linux/bin/intel64/icpc

cd /path/to/build
cmake /path/to/src

или вы также можете передать переменные CMAKE_C_COMPILER и CMAKE_CXX_COMPILER:

export CC=/opt/intel/compilers_and_libraries_2019.0.117/linux/bin/intel64/icc
export CXX=/opt/intel/compilers_and_libraries_2019.0.117/linux/bin/intel64/icpc

cd /path/to/build
cmake \
  -DCMAKE_C_COMPILER:FILEPATH=/opt/intel/compilers_and_libraries_2019.0.117/linux/bin/intel64/icc \
  -DCMAKE_CXX_COMPILER:FILEPATH=/opt/intel/compilers_and_libraries_2019.0.117/linux/bin/intel64/icpc \
  /path/to/src

Важное : при выполнении этих команд обязательно настройте проект в пустой директории сборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...