2015-03-24 5 views
0

Я пытаюсь скомпилировать библиотеку с waf, когда я настраиваю и создаю свой проект.Возможно ли скомпилировать библиотеку с помощью waf, используя make install?

Чтобы быть более точным, библиотека Cryptopp. Дело в том, что я добавил исходный код как git-подмодуль, и я хотел бы его компилировать и устанавливать, когда какой-либо пользователь загрузил его из GitHub.

Здесь вопрос: - Возможно ли выполнить «make» и «make install» с waf во время «настройки python waf»?

Буду признателен за любой ответ, спасибо всем.

ответ

1

Я сделал это один раз для systemc, код ниже. Вам придется принять его немного для криптоппа. Важные детали:

  • Сборка выполняется в исходной папке (не может работать около того)
  • Библиотека сборки копируется в папку сборки в качестве вывода задачи
  • функция «autotools_make» имеет link_task, так что вы можете использовать его в других целях (use = "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) 
Смежные вопросы