是否可以使用make install使用waf编译库?

时间:2015-03-24 12:06:09

标签: python shared-libraries waf

当我配置和构建项目时,我正在尝试使用waf编译库。

更确切地说,图书馆是Cryptopp。问题是我已经添加了像git-submodule这样的源代码,并且当一些用户从GitHub下载它时我想编译和安装它。

这里的问题是: - 在“python waf configure”中是否可以用waf执行“make”和“make install”?

我将感谢您的回答,谢谢大家。

1 个答案:

答案 0 :(得分:1)

我为systemc做过一次,代码如下。你必须为cryptopp采用它。重要的部分是:

  • 构建在源文件夹中执行(无法解决)
  • 构建库将作为任务输出
  • 复制到构建文件夹
  • " autotools_make" feature有一个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)