5

这是我的项目结构:

.
├── include
├── src
│   ├── abc
│   │   ├── include
│   │   └── src
│   ├── def
│   │   ├── include
│   │   └── src
│   └── ghi
│       ├── include
│       └── src
└── vendor
    ├── bar
    │   ├── include
    │   └── src
    └── foo

16 directories

我想将我的构建移植到 Meson。但是,我不确定如何链接兄弟文件夹中定义的目标。

我的依赖图如下所示:

  • src/abc/meson.build定义一个静态库abc
  • src/def/meson.build定义了一个静态库def,它依赖于abcfoo
  • src/ghi/meson.buildghi定义一个依赖于的静态库bar
  • vendor/bar/meson.build定义一个静态库bar
  • vendor/foo/meson.build定义一个静态库foo
  • 顶层定义了一个依赖于meson.build的可执行文件,并且appabcdefghi

在文档中,似乎有两种机制:

  • subdir
  • subproject

我不清楚这里哪个最好。我的源代码之外没有任何依赖项。

我应该在我的meson.build文件中写什么来将这些目标链接在一起?

4

2 回答 2

5

您可以subdir从顶级meson.build文件向下使用。您在子目录文件中声明的所有变量meson.build都可用于以后的meson.build文件。只要你得到subdir正确的调用顺序,它就会起作用。

于 2019-03-11T18:09:03.063 回答
3

除了@sdgfsdh 的(正确)答案之外,我喜欢的另一种方法是仅在顶级介子文件中定义库和可执行文件,并使用 subdir 调用来定义一组源文件和“本地”包含路径。通过这种方式,子目录文件不会隐式地相互依赖;整个依赖树存在于顶层介子文件中。

这种方法的优点是:

  • 子目录不需要知道自己的路径(files() 和 include_directories() 会为你跟踪)
  • 顶层文件只需要知道子目录路径即可调用子目录介子文件。之后,您可以根据在子目录中创建的变量来定义所有内容
  • subdir 文件不直接依赖于任何其他介子文件

缺点:

  • 顶层文件更杂乱
  • 子目录文件中的变量名需要是全局唯一的,因为一切最终都在顶级范围内定义

您的案例的示例:

# Top-level meson.build
subdir('src/abc')
subdir('src/def')
subdir('src/ghi')
subdir('vendor/foo')
subdir('vendor/bar')

libabc = static_library('abc', abc_files, include_directories: abc_includes)

libabc_dep = declare_dependency(include_directories: abc_includes, link_with : libabc)

libfoo = static_library('foo', foo_files, include_directories: foo_includes)

libfoo_dep = declare_dependency(include_directories: foo_includes, link_with : libfoo)

libdef = library('def', def_files, include_directories: def_includes, dependencies : [ libabc_dep, libfoo_dep])
# src/abc/meson.build (others would be similar)
abc_files = files(['1.c','2.c',...])
abc_includes = include_directories('include')
于 2019-04-15T14:21:07.227 回答