如何使用WAF来构建一个共享库?(How do I use waf to build a share

2019-08-22 00:18发布

我想建立使用共享库WAF ,因为它看起来要容易得多,比GNU自动减少混乱。

其实,我有几个问题,到目前为止涉及到我已经开始写的WScript:

VERSION='0.0.1'
APPNAME='libmylib'

srcdir = '.'
blddir = 'build'

def set_options(opt):
 opt.tool_options('compiler_cc')
 pass

def configure(conf):
 conf.check_tool('compiler_cc')
 conf.env.append_value('CCFLAGS', '-std=gnu99 -Wall -pedantic -ggdb')

def build(bld):
 bld.new_task_gen(
  features = 'cc cshlib',
  source = '*.c',
  target='libmylib')

包含线路source = '*.c'不起作用。 我必须指定每个.c文件,而不是使用通配符?

我怎样才能使一个调试版本,例如(目前的WScript使用调试版本CFLAGS,但我想使这个可选的最终用户)。

它计划在库源是一个子目录中,并用lib各自在自己的子目录方案。

Answer 1:

假设你使用的是最新版本的WAF(1.5.9在写作的时候),通配符可通过指定glob()在构建上下文方法。 所以,你可以写:

bld.new_task_gen(
    features = 'cc cshlib',
    source = bld.glob('*.c'),
    target='mylib')

如果你使用的是没有水珠WAF的旧版本,那么还有一个方法find_sources_in_dirs ,您可以使用:

lib = bld.new_task_gen(
    features = 'cc cshlib',
    target = 'mylib')
lib.find_sources_in_dirs('.')

这种方法仍存在WAF但预计弃用,并可能最终消失。

srcdirblddir变量是可选的,现在,所以你不需要他们-他们默认为“” 与“建”反正。 你不应该使用“lib”为目标名称,这是自动在特定于平台的方式来完成(在Windows上没有lib添加和共享库的.dll使用)。 调试VS发布版本是一个令人惊讶的棘手问题。 本来WAF包含此功能,但它在某一点下降永不重新添加。 这是邮件列表上的共同要求,可能会在未来重新出现。 同时,你可以做得比使用差很多GJC的CFLAGS模块 。 只需将其添加到您的项目目录。 那么最终的WScript是:

VERSION='0.0.1'
APPNAME='mylib'

def set_options(opt):
    opt.tool_options('compiler_cc')
    opt.tool_options('cflags', tooldir='.')

def configure(conf):
    conf.check_tool('compiler_cc')
    conf.check_tool('cflags', tooldir='.')

def build(bld):
    bld.new_task_gen(
        features = 'cc cshlib',
        source = bld.glob('*.c'),
        target=APPNAME)

并建立一个调试版本,你会运行以下命令:

./waf configure -d debug

如果你是在自己的子目录使用库,那么你或许应该有一个顶层的WScript和使用bld.add_subdirs()的技术来添加库/程序的目录。 每个子目录将有自己的wscript_build文件。 然后,您可以使用export_incdirsuselib_local属性来指定正确包括图书馆和程序“模块”之间的目录。



Answer 2:

WAF多年来改变了很多,所以无论是在问题的代码,也没有答案与目前WAF的作品了。 现在,你只写:

def options(ctx):
    ctx.load('compiler_c')
def configure(ctx):
    ctx.load('compiler_c')
def build(ctx):
    ctx.shlib(source = ctx.path.ant_glob('src/*.c'),
              target = 'name')

需要注意的是WAF会自动添加lib前缀,这样你就不会写target = 'libname' 。 在Windows上,你也必须添加defs关键字参数到shlib函数调用。

我个人建议对涉及递归构建脚本wscript_build文件。 不,这是行不通的(如递归makefile文件 ),它只是简单得多,以保持所有的逻辑在一个中等大小的构建脚本。



文章来源: How do I use waf to build a shared library?