Я пытаюсь определить версию 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. Это вообще возможно?
Я не мог понять из документации, как проверить версию набора инструментов, но нашел только настройки верхнего уровня: 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, =
следует заменить на ==
)
К сожалению, эти условия не выделяются в .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, иначе ошибка.
и так далее ..
Из CLI arg нет способа указать минимальную версию MSVS, нет такого флага как: --min-msvs-version
,
В случае установки нескольких версий MSBUILD обнаружение MSBUILD узла-gyp (в настоящий момент) будет игнорировать предпочтительным / требуется версия набора инструментов .vcxproj
, но будет отдавать приоритет тому, что в PATH. В этом случае вы можете получить ошибки, например, если вы используете функции C99 / C ++ 1 [1/4/7], предлагаемые только VS2015. Чтобы исправить эту ситуацию:
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
)