检测GYP中的MSVC版本
我正在尝试在我的binding.gyp文件中的node-gyp configure
期间检测msvc版本。 基本上,我想能够链接到特定的基于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
甚至$(TOOLSET)
variables。 在GYP文档中我找不到这样的variables。 有没有可能?
我无法从文档中找出如何检查工具集版本,但只能find顶级设置: https : //chromium.googlesource.com/external/gyp/+/master/docs/UserDocumentation.md#一个典型的可执行目标在gyp文件中的骨架 。
不过,GitHub上的MSVS_VERSION
使用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" ], }]
(尼特:在你的例子中,虽然toolset
令牌不是由gyp标识的, =
应该用==
replace)
例如: https : //github.com/saper/node-sass/blob/c7e9cf0f0e0098e8316bd41722fc2edf4a835d9f/src/libsass.gyp#L91-L94 。
限制1:
不幸的是,这些条件不会在.targets
或.vcxproj
文件(例如this )中发出,但是它会在后续处理给定版本的MSVS的单独条件后发出.vcxproj
,从而导致.vcxproj
文件不兼容更新/旧版本的VCR。
但是,MSVS版本可以通过多种方式覆盖gyp,例如使用环境variables:
在CMD中:
SET GYP_MSVS_VERSION=2012
或者在PowerShell中:
$env:GYP_MSVS_VERSION=2015
它也可以作为命令行parameter passing:
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,node-gyp的MSBUILD发现( 目前 )会忽略.vcxproj
工具集的首选/必需版本,但会优先于PATH中的工具集。 在这种情况下,您可能会遇到错误,例如,如果您使用的是仅由VS2015提供的C99 / C ++ 1 [1/4/7]function。 为了弥补这种情况:
- 将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
) - 如果您的Windowsregistry技能不像我的那样生锈,通过发送针对node-gyp和pangyp的Pull Request来修复工具集版本感知的MSBUILD发现。 🙂