能否在meson.build中使用Python Lambda函数?报错咨询
问题解决与说明
编译报错的修复
你写的map(lambda f: f.replace('.cxx', '.hxx'), sources)报错,核心原因是Meson的DSL不支持Python式的lambda匿名函数,它的map函数仅接受已定义的命名函数作为参数。
改用foreach循环生成头文件列表即可解决:
# meson.build sources = [ 'foo.cxx', ... ] headers = [] foreach f : sources headers += f.replace('.cxx', '.hxx') endforeach library('mylib', sources, install: true) install_headers(headers, preserve_path: true)
meson.build是否属于Python脚本?
不属于。meson.build使用的是Meson自定义的领域特定语言(DSL),虽然语法风格和Python接近,但有独立的规则、内置函数集和语法限制,不能直接兼容Python的所有特性(比如lambda、部分标准库函数)。
更简洁的实现方案(避免重复罗列)
如果不想硬编码所有文件,又拒绝shell脚本临时方案,推荐两种符合Meson官方规范的方式:
方案一:Meson原生通配匹配(0.55版本以上支持)
用files()函数直接匹配源文件,再通过字符串替换生成对应头文件,这是官方推荐的安全通配方式,比shell通配更可靠:
sources = files('*.cxx') headers = [] foreach f : sources headers += f.path().replace('.cxx', '.hxx') endforeach library('mylib', sources, install: true) install_headers(headers, preserve_path: true)
方案二:按模块拆分目录管理
将不同功能模块的源文件和头文件放在独立子目录,在子目录的meson.build中定义各自的sources和headers,再通过subdir()引入主构建文件,彻底避免在主文件中批量罗列:
# src/module/meson.build module_sources = files('foo.cxx') module_headers = files('foo.hxx') # 主meson.build subdir('src/module') sources = module_sources headers = module_headers library('mylib', sources, install: true) install_headers(headers, preserve_path: true)
内容的提问来源于stack exchange,提问作者Lenik
相关产品推荐
相关产品推荐

