Jam*_*ris 10 c linux shared-libraries waf
我想使用waf构建一个共享库,因为它看起来比GNU autotools更容易,更简洁.
到目前为止,我实际上有几个与我开始写的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')
Run Code Online (Sandbox Code Playgroud)
包含的行source = '*.c'
不起作用.我必须指定每个.c文件而不是使用通配符吗?
我怎样才能启用调试版本(目前wscript正在使用调试版本CFLAGS,但我想让最终用户选择它).
计划将库源放在子目录中,以及在每个子目录中使用lib的程序.
假设您使用的是最新版本的waf(编写本文时为1.5.9),可以通过glob()
构建上下文中的方法指定通配符.所以你可以写下面的内容:
bld.new_task_gen(
features = 'cc cshlib',
source = bld.glob('*.c'),
target='mylib')
Run Code Online (Sandbox Code Playgroud)
如果您使用的是没有glob的旧版waf,那么find_sources_in_dirs
可以使用一种方法:
lib = bld.new_task_gen(
features = 'cc cshlib',
target = 'mylib')
lib.find_sources_in_dirs('.')
Run Code Online (Sandbox Code Playgroud)
这种方法仍然在Waf中,但是可能会被弃用,最终可能会消失.
在srcdir
和blddir
变量是可选的,现在,所以你不需要他们-他们默认为"" 无论如何,"建立".您不应该在目标名称前加上"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)
Run Code Online (Sandbox Code Playgroud)
要设置调试版本,您将运行以下命令:
./waf configure -d debug
Run Code Online (Sandbox Code Playgroud)
如果您在自己的子目录中使用库,那么您应该拥有顶级wscript并使用该bld.add_subdirs()
技术添加库/程序目录.每个子目录都有自己的wscript_build文件.然后,您可以使用export_incdirs
和uselib_local
属性指定库和程序"模块"之间的正确包含目录.
归档时间: |
|
查看次数: |
6788 次 |
最近记录: |