Определить версию MSVC в GYP

Я пытаюсь определить версию MSVC во время node-gyp configure в моем файле binding.gyp.
По сути, я хочу иметь возможность ссылаться на определенную библиотеку третьего лица на основе версии Visual C ++:

['OS=="win"' and 'toolset="vc12"' , {
'libraries': [
"opencv/lib/vc12/opencv_world300.lib"],
}],

['OS=="win"' and 'toolset="vc11"' , {
'libraries': [
"opencv/lib/vc11/opencv_world300.lib"],
}],

['OS=="win"' and 'toolset="vc10"' , {
'libraries': [
"opencv/lib/vc10/opencv_world300.lib"],
}]

К сожалению, ни toolsetни _toolset или даже $(TOOLSET) переменные определены в GYP.
Я не смог найти такую ​​переменную в документации GYP. Это вообще возможно?

4

Решение

Я не мог понять из документации, как проверить версию набора инструментов, но нашел только настройки верхнего уровня: https://chromium.googlesource.com/external/gyp/+/master/docs/UserDocumentation.md#Skeleton-of-a-typical-executable-target-in-a-gyp-file.

Тем не менее, @saper на GitHub догадаться с помощью MSVS_VERSION вместо:

['OS=="win"' and 'MSVS_VERSION=="2013"' , {
'libraries': [
"opencv/lib/vc12/opencv_world300.lib"],
}],

['OS=="win"' and 'MSVS_VERSION=="2012"' , {
'libraries': [
"opencv/lib/vc11/opencv_world300.lib"],
}],

['OS=="win"' and 'MSVS_VERSION=="2010"' , {
'libraries': [
"opencv/lib/vc10/opencv_world300.lib"],
}]

(nit: в вашем примере, хотя toolset токен не идентифицируется с помощью GYP, = следует заменить на ==)

Пример: https://github.com/saper/node-sass/blob/c7e9cf0f0e0098e8316bd41722fc2edf4a835d9f/src/libsass.gyp#L91-L94.

Ограничение 1:

К сожалению, эти условия не выделяются в .targets или же .vcxproj файлы (такие как этот), но он будет излучать .vcxproj после постобработки условия отделяются для данной версии MSVS и, следовательно, .vcxproj файл несовместим с новыми / более старыми версиями видеомагнитофона.

Однако версия MSVS может быть переопределена для gyp несколькими способами, например, с помощью переменной среды:

В CMD:

SET GYP_MSVS_VERSION=2012

Или в PowerShell:

$env:GYP_MSVS_VERSION=2015

Он также может быть передан в качестве аргумента командной строки:

node_modules/.bin/node-gyp build --msvs_version=2012

Если присутствуют как env-var, так и аргумент командной строки, CLI arg будет иметь приоритет.

Этот аргумент CLI может быть передан в задачу npm, например, чтобы обеспечить ограничение для всех потребителей Windows вашего пакета на использование определенной версии MSVCR, иначе ошибка.

и так далее ..

Ограничение 2:

Из CLI arg нет способа указать минимальную версию MSVS, нет такого флага как: --min-msvs-version,

Ограничение 3:

В случае установки нескольких версий MSBUILD обнаружение MSBUILD узла-gyp (в настоящий момент) будет игнорировать предпочтительным / требуется версия набора инструментов .vcxproj, но будет отдавать приоритет тому, что в PATH. В этом случае вы можете получить ошибки, например, если вы используете функции C99 / C ++ 1 [1/4/7], предлагаемые только VS2015. Чтобы исправить эту ситуацию:

  • либо сбросьте PATH в нужную версию каталога MSBuild bin.
  • вместо node-gyp build или же rebuildиспользовать node-gyp configure с последующим "%ProgramFiles(x86)%\MSBuild\14.0\Bin\MSBuild" build/binding.sln /p:Configuration=Release (или от шикарного, это станет: &"${env:ProgramFiles(x86)}\MSBuild\14.0\Bin\MSBuild" build\binding.sln /p:Configuration=Release)
  • отправив запрос на извлечение для node-gyp и pangyp, чтобы исправить обнаружение MSBUILD с учетом версии набора инструментов, если ваши навыки работы с реестром Windows не такие ржавые, как у меня. 🙂
5

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


По вопросам рекламы [email protected]