使用node-gyp链接arch特定位置

时间:2017-12-11 14:59:53

标签: node.js node-gyp gyp

我正在尝试构建一个链接第三方共享库的本机Node.js模块。该库作为包的一部分提供,包括不同操作系统和不同目录中的体系结构的预构建版本。

e.g。

/opt/Foo/linux/x86/lib/libfoo.so
/opt/Foo/linux/x86/include/foo.h
/opt/Foo/linux/x86_64/lib/libfoo.so
/opt/Foo/linux/x86_64/include/foo.h
/opt/Foo/linux/arm/lib/libfoo.so
/opt/Foo/linux/arm/include/foo.h
/opt/Foo/mac/x86_64/lib/libfoo.so
/opt/Foo/mac/x86_64/include/foo.h

我的binding.gyp目前看起来像这样:

{
  'targets': [
    {
      'target_name': 'foo',
      'sources': ['foo.cpp', 'foo.h'],
      'include_dirs': ["<!(node -e \"require('nan')\")"],
      'conditions': [
        ['OS=="mac"', {
            'include_dirs': ['/opt/Foo/mac/x86_64/include'],
            'libraries': ['-L/opt/Foo/mac/x86_64/lib', '-lfoo']
          }
        ],
        ['OS=="linux"', {
            'include_dirs': ['/opt/Foo/linux/x86_64/include'],
            'libraries': ['-L/opt/Foo/linux/x86_64/lib', '-lfoo']
          }
        ]
      ]
    }
  ]
}

我似乎无法找到conditions的语法来区分当前的平台架构。

1 个答案:

答案 0 :(得分:0)

在没有找到任何其他解决方案后,我想出了以下内容:

...
['OS=="linux"', {
    'include_dirs': ["<!(node -e \"console.log('/opt/Foo/linux/%s/include',require('process').arch);\")"],
    'libraries': ["<!(node -e \"console.log('-L/opt/Foo/linux/%s/lib',require('process').arch);\")", '-lfoo']
  }
]
...

我必须将/opt/Foo/Linux/x86_64目录重命名为/opt/Foo/Linux/x64以匹配process.arch的输出。