如何使用node-gyp根据节点版本有条件地编译node.js的本地代码?

我为node.js模块编写了一些C ++代码,这个模块是为节点0.8和增强的libuv编写的。 具体来说,我使用的是uv_mutex_ *函数,它不包含在节点0.6中包含的libuv中。 我想有条件地embedded这些函数的pthreads等价物,但是只有在旧版本的基础上构build。

如果节点版本为0.6,这应该使我在build立在节点0.8上的跨平台构build(Windows和Linux)和正常运行的Linux版本。

是否有节点版本的预处理器#define? 我找不到一个。 我能想到的最好的办法是在binding.gyp中做一些kludgy的东西来尝试猜测基于<@(node_root)的版本,并以某种方式将其按到“定义”值中。 一定会有更好的办法!

Memwatch模块的binding.gyp文件可以完成你正在寻找的任务。

它定义了一个variables来捕获节点版本:

'variables': { 'node_ver': '<!(node --version | sed -e "s/^v\([0-9]*\\.[0-9]*\).*$/\\1/")' }, 

然后在一个条件下使用它:

 'target_conditions': [ ['node_ver=="0.8"', { 'defines': ['NEW_COMPACTION_BEHAVIOR'] } ] ] 

不是最优雅的解决scheme,但显然,现在没有比这更好的了。