如何为Meson中CMake子项目VTK的target_list添加VTK::前缀?
解决Meson整合VTK时目标名称缺少VTK::前缀的问题
问题背景
通过Meson的CMake模块导入VTK子项目时,使用以下配置:
cmake = import('cmake') opt_var = cmake.subproject_options() opt_var.add_cmake_defines({'VTK_ENABLE_WRAPPING': 'OFF'}) opt_var.add_cmake_defines({'VTK_MODULE_ENABLE_VTK_sqlite': 'NO'}) opt_var.add_cmake_defines({'VTK_MODULE_ENABLE_VTK_hdf5': 'NO'}) vtk_proj = cmake.subproject('vtk', options: opt_var) message('CMake targets:\n - ' + '\n - '.join(vtk_proj.target_list()))
执行后发现,target_list返回的目标(如ChartsCore、CommonCore)缺少VTK::前缀,但依赖的子项目期望使用带VTK::前缀的目标名称,导致依赖查找失败:
Executing subproject VtkViewer ... VtkViewer| WARNING: Subproject 'vtk' did not override 'VTK (modules: VTK::CommonCore, VTK::CommonColor, VTK::CommonExecutionModel, VTK::FiltersCore, VTK::RenderingCore, VTK::InteractionStyle, VTK::RenderingUI)' dependency and no variable name specified VtkViewer| Dependency VTK (modules: VTK::CommonCore, VTK::CommonColor, VTK::CommonExecutionModel, VTK::FiltersCore, VTK::RenderingCore, VTK::InteractionStyle, VTK::RenderingUI) from subproject subprojects/vtk found: NO
解决方案
方法一:在Meson中为目标创建别名
无需修改VTK的CMake架构,只需在导入VTK的meson.build中,为每个无前缀的目标创建带VTK::前缀的别名:
cmake = import('cmake') opt_var = cmake.subproject_options() opt_var.add_cmake_defines({'VTK_ENABLE_WRAPPING': 'OFF'}) opt_var.add_cmake_defines({'VTK_MODULE_ENABLE_VTK_sqlite': 'NO'}) opt_var.add_cmake_defines({'VTK_MODULE_ENABLE_VTK_hdf5': 'NO'}) vtk_proj = cmake.subproject('vtk', options: opt_var) # 为每个VTK目标创建带VTK::前缀的别名 foreach target_name : vtk_proj.target_list() vtk_target = vtk_proj.get_target(target_name) alias_target('VTK::' + target_name, vtk_target) endforeach
这样依赖的子项目就能通过VTK::CommonCore等名称找到对应目标。
方法二:通过Wrap文件配置(无需额外编写meson.build)
在VTK的wrap文件(如subprojects/vtk.wrap)中,利用[provide]部分指定带前缀的公开目标别名,同时通过[cmake_args]添加所需的CMake定义:
[wrap-git] url = https://gitlab.kitware.com/vtk/vtk.git revision = v9.3.0 [provide] VTK::CommonCore = vtk:CommonCore VTK::CommonColor = vtk:CommonColor VTK::CommonExecutionModel = vtk:CommonExecutionModel VTK::FiltersCore = vtk:FiltersCore VTK::RenderingCore = vtk:RenderingCore VTK::InteractionStyle = vtk:InteractionStyle VTK::RenderingUI = vtk:RenderingUI [cmake_args] -DVTK_ENABLE_WRAPPING=OFF -DVTK_MODULE_ENABLE_VTK_sqlite=NO -DVTK_MODULE_ENABLE_VTK_hdf5=NO
这种方式完全不需要编写额外的meson.build代码,直接通过Wrap文件完成配置,适配依赖子项目对VTK::前缀目标的需求。
内容的提问来源于stack exchange,提问作者mrtasktat
相关产品推荐
相关产品推荐

