我想建立使用共享库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各自在自己的子目录方案。
假设你使用的是最新版本的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但预计弃用,并可能最终消失。
该srcdir
和blddir
变量是可选的,现在,所以你不需要他们-他们默认为“” 与“建”反正。 你不应该使用“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_incdirs
和uselib_local
属性来指定正确包括图书馆和程序“模块”之间的目录。
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文件 ),它只是简单得多,以保持所有的逻辑在一个中等大小的构建脚本。