如何使用waf来构build共享库?

我想用waf来构build一个共享库,因为它看起来比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文件而不是使用通配符吗?

例如,我怎样才能启用一个debugging版本(目前wscript正在使用debugging版本的CFLAGS,但我想使最终用户可选)。

计划将图书馆的资源放在一个子目录中,并且在自己的子目录中使用这些图书馆的程序。

Solutions Collecting From Web of "如何使用waf来构build共享库?"

假设你正在使用waf的最新版本(在编写本文时为1.5.9),可以通过构建上下文的glob()方法指定glob() 。 所以你可以写下面的内容:

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

如果您使用的是没有glob的旧版本的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)。 调试与发布版本是一个令人惊讶的棘手的问题。 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属性在库和程序“模块”之间指定正确的include目录。