介子项目中的依赖和选项

dependency and option in meson project

我有一个包含类似文件夹树的项目:

├── meson.build (1)
├── meson_options.txt
├── README.md
└── src
    └── mysub
        ├── meson.build (2)
        └── mesonTest.c

meson.options.txt 包含

option('avx_opt', type : 'combo', choices : ['avx2', 'avx512'], value : 'avx512')

mysub 项目是主项目的依赖项 所以 meson.build (1) :

project(
  'my_proj',
  'c',
  version : '1.1.0',
  default_options : ['buildtype=plain','warning_level=3'],
  subproject_dir : 'src'
)

project_source_files = [
  ''
]


message('## source root : ' +   meson.project_source_root() + ' ##')

project_dependencies = [
  dependency('mysub', fallback : ['mysub', 'mysub_dep']),
]

build_args = [
]


# ===================================================================

# ======
# Target
# ======

build_args += [
  '-DPROJECT_NAME=' + meson.project_name(),
  '-DPROJECT_VERSION=' + meson.project_version(),
]

mysub 项目的 meson.build (2) 是:

project(
  'mysub',
  'c',
  version : '1.1.0',
  default_options : ['warning_level=3']
)

project_description = 'mysub binary'


project_source_files = [
  'mesonTest.c'
]


project_headers = [

]

avx_type = get_option('avx_opt')

if (avx_type == 'avx512')
   build_args_avx512 = [
     '-mavx512f',
     '-mavx512cd',
     '-mavx512vl',
     '-mavx512bw',
     '-mavx512dq',
     '-DNEWLDPC=1'
  ]
else
   build_args_avx512 = [
     '-DNEWLDPC=0'
  ]
endif

project_target = executable(
  meson.project_name(),
  project_source_files,
  install : true,
  c_args : build_args,
  link_args : '-Wl,--allow-shlib-undefined',
)


# =======
# Project
# =======

# Make this library usable as a Meson subproject.
project_dep = declare_dependency(
  include_directories: public_headers,
  link_with : project_target
)
set_variable(meson.project_name() + '_dep', project_dep)

# Make this library usable from the system's
# package manager.
install_headers(project_headers, subdir : meson.project_name())

pkg_mod = import('pkgconfig')
pkg_mod.generate(
  name : meson.project_name(),
  filebase : meson.project_name(),
  description : project_description,
  subdirs : meson.project_name(),
 # libraries : project_target,
)

我尝试过如下配置:

meson builddir -Davx_opt=avx512
or 
meson builddir -Davx_opt:mysub=avx512

但在这两种情况下我都得到了:

The Meson build system
Version: 0.59.1
Source dir: /home/roccasal/wsEclipse/Intel/mesonTest/proj
Build dir: /home/roccasal/wsEclipse/Intel/mesonTest/proj/builddir
Build type: native build
Project name: my_proj
Project version: 1.1.0
C compiler for the host machine: cc (gcc 8.5.0 "cc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-4)")
C linker for the host machine: cc ld.bfd 2.30-108
Host machine cpu family: x86_64
Host machine cpu: x86_64
Message: ## source root : /home/roccasal/wsEclipse/Intel/mesonTest/proj ##
Found pkg-config: /usr/bin/pkg-config (1.4.2)
Found CMake: /usr/bin/cmake (3.20.2)
Run-time dependency mysub found: NO (tried pkgconfig and cmake)
Looking for a fallback subproject for the dependency mysub

Executing subproject mysub 

mysub| Project name: mysub
mysub| Project version: 1.1.0
mysub| C compiler for the host machine: cc (gcc 8.5.0 "cc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-4)")
mysub| C linker for the host machine: cc ld.bfd 2.30-108

src/mysub/meson.build:32:0: ERROR: Tried to access unknown option "avx_opt".

介子构建配置有什么问题?

使用的介子版本是0.59.1

//谢谢

勾选Build-options page in reference manual:

To change values in subprojects prepend the name of the subproject and a colon:

$ meson configure -Dsubproject:option=newvalue

因此,尝试创建新的构建目录:

meson builddir -Dmysub:avx_opt=avx512

或配置现有的:

meson configure builddir -Dmysub:avx_opt=avx512 

要使其正常工作,您还需要在每个使用它的子项目中的 meson_options.txt 中定义此选项,但为了简化配置,您可以按照@dcbaker 建议使用 yielding,即更新选项定义主要项目:

option('avx_opt', ...., yield : true)

这将使您有可能以相同的方式为主项目和子项目配置它,只需:

meson configure builddir -Davx_opt=avx512

此外,(我想这只是有问题的拼写错误)带有选项的文件名称应为 meson_options.txt(带下划线)。