是否可以使用 make install 用 waf 编译库?
Is it possible to compile library with waf using make install?
我在配置和构建我的项目时试图用 waf 编译一个库。
更准确地说,图书馆是 Cryptopp。问题是我已经添加了源代码,如 git-submodule,当一些用户从 GitHub.
下载它时,我想编译并安装它
这里的问题:
- 是否可以在 "python waf configure" 期间使用 waf 执行 "make" 和 "make install"?
我将不胜感激,谢谢大家。
我为systemc
做过一次,代码如下。你将不得不为 cryptopp 采用它。重要的部分是:
- 构建在源文件夹中执行(无法解决)
- 构建库作为任务输出复制到构建文件夹
- "autotools_make" 功能有一个 link_task,因此您可以在其他目标中使用它(使用="systemc")
我还建议在构建步骤中实际构建库。
import sys, os
from waflib.Task import Task
from waflib.TaskGen import feature
class run_make(Task):
def run(self):
ret = self.exec_command(
'%s; %s; %s' % (self.env.ACLOCAL, self.env.AUTOCONF, self.env.AUTOMAKE),
cwd = self.cwd, stdout=sys.stdout)
if ret != 0:
return ret
ret = self.exec_command('./configure', cwd = self.cwd, stdout=sys.stdout)
if ret != 0:
return ret
ret = self.exec_command('make install -i', cwd=self.cwd, stdout=sys.stdout)
self.exec_command('cp src/libsystemc.a %s' % self.outputs[0].abspath(), cwd=self.cwd)
print "COPY"
return ret
@feature("autotools_make")
def autotools_make(self):
self.link_task = self.create_task('run_make',
self.path.get_src().ant_glob('src/**/*.(cpp|h)'),
[ self.path.get_bld().find_or_declare('libsystemc.a') ])
self.link_task.cwd = self.path.get_src().abspath()
self.target = self.name
def options(opt):
opt.load('compiler_cxx')
def configure(cfg):
cfg.load('compiler_cxx')
cfg.find_program('aclocal', mandatory=True)
cfg.find_program('autoconf', mandatory=True)
cfg.find_program('automake', mandatory=True)
def spring_cleaning(bld):
cwd = bld.path.get_src().abspath()
bld.exec_command('make clean', cwd=cwd)
bld.exec_command('make uninstall', cwd=cwd)
bld.exec_command('find . -name "*.a" -exec rm -f {} \;', cwd=cwd)
bld.exec_command('rm -rf aclocal.m4 Makefile Makefile.in configure *.log', cwd=cwd)
def build(bld):
bld(name='systemc',
features='autotools_make')
if bld.cmd == 'clean':
spring_cleaning(bld)
我在配置和构建我的项目时试图用 waf 编译一个库。
更准确地说,图书馆是 Cryptopp。问题是我已经添加了源代码,如 git-submodule,当一些用户从 GitHub.
下载它时,我想编译并安装它这里的问题: - 是否可以在 "python waf configure" 期间使用 waf 执行 "make" 和 "make install"?
我将不胜感激,谢谢大家。
我为systemc
做过一次,代码如下。你将不得不为 cryptopp 采用它。重要的部分是:
- 构建在源文件夹中执行(无法解决)
- 构建库作为任务输出复制到构建文件夹
- "autotools_make" 功能有一个 link_task,因此您可以在其他目标中使用它(使用="systemc")
我还建议在构建步骤中实际构建库。
import sys, os
from waflib.Task import Task
from waflib.TaskGen import feature
class run_make(Task):
def run(self):
ret = self.exec_command(
'%s; %s; %s' % (self.env.ACLOCAL, self.env.AUTOCONF, self.env.AUTOMAKE),
cwd = self.cwd, stdout=sys.stdout)
if ret != 0:
return ret
ret = self.exec_command('./configure', cwd = self.cwd, stdout=sys.stdout)
if ret != 0:
return ret
ret = self.exec_command('make install -i', cwd=self.cwd, stdout=sys.stdout)
self.exec_command('cp src/libsystemc.a %s' % self.outputs[0].abspath(), cwd=self.cwd)
print "COPY"
return ret
@feature("autotools_make")
def autotools_make(self):
self.link_task = self.create_task('run_make',
self.path.get_src().ant_glob('src/**/*.(cpp|h)'),
[ self.path.get_bld().find_or_declare('libsystemc.a') ])
self.link_task.cwd = self.path.get_src().abspath()
self.target = self.name
def options(opt):
opt.load('compiler_cxx')
def configure(cfg):
cfg.load('compiler_cxx')
cfg.find_program('aclocal', mandatory=True)
cfg.find_program('autoconf', mandatory=True)
cfg.find_program('automake', mandatory=True)
def spring_cleaning(bld):
cwd = bld.path.get_src().abspath()
bld.exec_command('make clean', cwd=cwd)
bld.exec_command('make uninstall', cwd=cwd)
bld.exec_command('find . -name "*.a" -exec rm -f {} \;', cwd=cwd)
bld.exec_command('rm -rf aclocal.m4 Makefile Makefile.in configure *.log', cwd=cwd)
def build(bld):
bld(name='systemc',
features='autotools_make')
if bld.cmd == 'clean':
spring_cleaning(bld)