【问题标题】:Run configure in gyp file在 gyp 文件中运行配置
【发布时间】:2014-12-03 15:21:12
【问题描述】:
假设我有一个节点模块,它本质上是使用自动工具对某些标准 C 库进行包装。因此,库本身将使用./configure 和make 安装,也许还有make install。包装器代码只是几个文件,可以由 gyp 处理。但是我该如何处理依赖关系?在编译代码之前,如何指示 gyp 我要构建自动工具库?或者这是不可能的,因为 autotools 不能在 Windows 上运行?如果我不能运行configure,是否有一些 gyp 方法可以做类似的事情,特别是检测哪些功能可用,哪些不可用?
【问题讨论】:
标签:
node.js
autotools
autoconf
node-gyp
gyp
【解决方案1】:
使用 gyp actions 和 'target_type': none 可能如下所示:
{
'target_name': 'FTGL',
'type': 'none',
'dependencies': ['FreeType'],
'actions': [
{
'action_name': 'build_ftgl',
'message': 'Building FTGL...',
'inputs': ['ftgl/src/FTGL/ftgl.h'],
'outputs': ['ftgl/src/.libs/libftgl.a'],
'action': ['eval', 'cd ftgl && ./configure --with-pic && make -C src'],
},
],
}
注意:在操作中使用eval 允许运行多个命令
【解决方案2】:
您可以使用command line expansion 在gyp 中执行任意命令。但是,正如您所指出的,如果您想跨平台,这并不可靠。
通常,如果您希望它是跨平台的,则需要“gyp-ify”您的依赖项。这意味着创建一个单独的 gyp 文件,该文件作为依赖项 gyp 包含在您的主 binding.gyp 中。这可能需要一些时间,因为您必须列出所有要编译的源文件,并且您还必须添加任何必要的特定于库的编译标志(例如,如果一个库使用像 -Dfoo 这样的编译时定义) .
您也可以考虑使依赖项动态化,而不是捆绑您要包装的库的源代码,而只是动态链接到该库。这要容易得多,因为您不必“gyp-ify”库,您只需将 libraries: ['-lfoo'] 之类的一些内容添加到您的 binding.gyp。