在GYP中检测MSVC版本

时间:2014-10-11 06:04:17

标签: c++ node.js opencv node-gyp

我试图在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"
    ],
}]

不幸的是,GYP中未定义toolset_toolset甚至$(TOOLSET)变量。 我无法在GYP文档中找到这样的变量。它有可能吗?

1 个答案:

答案 0 :(得分:5)

我无法从文档中了解如何检查工具集版本,但只找到了顶级设置:https://chromium.googlesource.com/external/gyp/+/master/docs/UserDocumentation.md#Skeleton-of-a-typical-executable-target-in-a-gyp-file

然而,使用MSVS_VERSION代替GitHub figured it out上的@saper:

['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"
    ],
}]

(在您的示例中,虽然gyp未识别toolset令牌,但=应替换为==

示例:https://github.com/saper/node-sass/blob/c7e9cf0f0e0098e8316bd41722fc2edf4a835d9f/src/libsass.gyp#L91-L94

限制1:

很遗憾,这些条件不会在.targets.vcxproj文件中发出(例如this),但在对条件进行后处理后会发出.vcxproj对于给定版本的MSVS是分开的,因此使.vcxproj文件与较新/较旧版本的VCR不兼容。

但是,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,则node-gyp的MSBUILD发现(at present)将忽略.vcxproj首选/必需版本的工具集,但优先于PATH中的那个。在这种情况下,您可能会收到错误,例如,如果您使用的是仅由VS2015提供的C99 / C ++ 1 [1/4/7]功能。为了解决这种情况:

  • 将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
  • 通过发送node-gyp和pangyp的Pull请求来修复工具集版本感知的MSBUILD发现,如果您的Windows注册表技能不像我的那样生疏。 :)