2016-10-11 3 views
0

У меня есть следующие строки в моем файле CMakeLists.txt. Я запускаю CMake 3.5.2 в Windows 7 и использую Visual Studio 12 2013, когда генератор с «Использовать стандартные компиляторы по умолчанию» проверен в gui.Как выполняются команды CMake execute_process?

find_path(FORTRAN_DIR NAMES cdll.cpp fdll.f90 Makefile PATHS ../source) 
execute_process(COMMAND make 
       WORKING_DIRECTORY ${FORTRAN_DIR}) 

Это нормально.

Но как это работает? Это в Windows!

Я уже скомпилировал Makefile через MSYS2 (MinGW) в Windows, но если это то, что использует CMake, то я не уверен, как он это знает.

Редактировать: Я положил execute_process(COMMAND uname -a) в файл CMakeLists.txt и получил MSYS_NT-6.1 MYCOMPUTERNAMEHERE 2.5.2(0.297/5/3) 2016-07-15 08:31 x86_64 Msys. Поэтому я предполагаю, что ответы на них передаются через MSYS ... но как CMake знает, как это сделать?

The documentation говорит:

«CMake выполняет дочерний процесс с использованием операционной системы API, непосредственно Все аргументы передаются VERBATIM в дочернем процессе не используется промежуточная оболочка, поэтому оболочки операторы, такие как> рассматриваются как нормальные.. аргументы «.

Но я не понимаю, что это значит, особенно с учетом того, что, если я использую следующую строку, я получаю /usr/bin/make как выход:

execute_process(COMMAND which make) 

Что происходит, и/или, как я могу понять, какая среда/оболочка/все эти команды запущены?

+1

Похоже, вы запускаете CMake под MinGW или аналогичный. – Tsyvarev

+0

Это имело бы смысл, так как я получил часть этого, чтобы скомпилировать ранее (с MSYS2, на самом деле), но как CMake знает, чтобы использовать его? –

+0

Возможно, вы запускаете cmake под MSYS2 или устанавливаете его в этой среде. – Tsyvarev

ответ

2

CMake поставляется с операционной системой библиотеки абстракции/обнаружений Kitware в kwsys:

KWSys обеспечивает независимую от платформы API для многих общей системы функции, которые реализуются по-разному на каждой платформе.

execute_process() магия происходит в ProcessWin32.c с помощью CreateProcessW() или ProcessUNIX.c использованием execvp() в зависимости от версии CMake вы используете.

Так что - в качестве @Tsyvarev прокомментировал - ваше поведение может быть либо версии Win32/64 из CMake с MinGW/MSYS в PATH среде (найти конкретные команды Unix дал) или версию Mingw32/64 из CMake запуска из MSYS.

Также вы можете использовать что-то вроде FindUnixCommands, чтобы получить абсолютные пути к рассматриваемым инструментам Unix.

Ссылка

+0

Замечательно, спасибо! –

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