检测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 buildrebuild ,使用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发现。 🙂