基于RTEMS项目学习waf build system
https://waf.io/book
https://blog.csdn.net/u010312436/article/details/81093847
安装
curl -o waf https://waf.io/waf-2.0.27
chmod 755 waf
使用
- 函数命令
在 wscript 文件中定义函数命令
def hello(ctx):
print('hello world')
通过命令行调用函数
$ waf hello
hello world
'hello' finished successfully (0.001s)
ctx对象允许跨脚本共享数据。
命令函数在调用时会传递一个新的上下文对象;该对象的类是特定于命令的:ConfigureContext 用于配置,BuildContext 用于构建,OptionContext 用于选项,Context 用于任何其他命令。
- 项目结构
$ tree
|-- src
| `-- wscript
`-- wscript
顶级wscript中的命令将通过调用名为recurse的上下文方法来调用子项目wscript文件中的相同命令:
def ping(ctx):
print('→ ping from ' + ctx.path.abspath())
ctx.recurse('src')
这是src/wscript的内容
def ping(ctx):
print('→ ping from ' + ctx.path.abspath())
- 经常使用的函数命令
-
configure
配置项目,找到依赖项的位置,收集 和 储存文件夹(项目目录、构建目录、系统文件)信息。
configure
命令用于检查是否满足项目工作的要求并存储信息。然后存储参数以供其他命令(例如构建命令)使用。 -
options
用于定义命令行选项
def options(ctx):
ctx.add_option('--foo', action='store', default=False, help='Silly test')
访问--prefix
命令行选项:
print('→ prefix is ' + ctx.options.prefix)
- build
构建目标
直接./waf
等同于./waf build
def options(opt):
opt.load('compiler_c')
def configure(conf):
conf.load('compiler_c')
def build(bld):
#program: 目标是生成应用程序 app
bld.program(source='main.c', target='app', use='myshlib mystlib')
#stlib: 目标是生成静态库 mystlib.a
bld.stlib(source='a.c', target='mystlib', use='myobjects')
#shlib: 目标是生成动态库 myshlib.so
bld.shlib(source='b.c', target='myshlib')
#objects:目标是生成c.o
bld.objects(source='c.c', target='myobjects')
或者用 features
bld(features = 'c cprogram',
target = 'test.exe',
cflags = '-g -O2',
# libpath = '/home/yangn0/RTEMS_devel/rtems/6/aarch64-rtems6/raspberrypi4b/lib/',
# stlib = ['z'],
linkflags = '-lz',
source = [
# './udp_echo_server/rtems_config.c','./udp_echo_server/udp_echo_server.c'
# 'test_uart.c'
'test_shell.c'
# 'test_fdt.c'
])
RTEMS WAF
RTEMS Waf 是一个支持 Waf 构建系统和 RTEMS 的模块。该模块集成到项目或库中,提供 Waf 构建支持以创建 RTEMS 库或可执行文件。