依赖子目录兄弟姐妹的介子目标
Meson targets that depend on subdir siblings
这是我的项目结构:
.
├── include
├── src
│ ├── abc
│ │ ├── include
│ │ └── src
│ ├── def
│ │ ├── include
│ │ └── src
│ └── ghi
│ ├── include
│ └── src
└── vendor
├── bar
│ ├── include
│ └── src
└── foo
16 directories
我想将我的构建移植到 Meson。但是,我不确定如何 link 在同级文件夹中定义目标。
我的依赖图如下所示:
src/abc/meson.build
定义静态库abc
src/def/meson.build
定义了一个依赖于abc
和foo
的静态库def
src/ghi/meson.build
定义了一个依赖于bar
的静态库ghi
vendor/bar/meson.build
定义静态库bar
vendor/foo/meson.build
定义静态库foo
- 顶层
meson.build
定义了一个依赖于abc
、def
和ghi
的可执行文件app
在文档中,似乎有两种机制:
subdir
subproject
我不清楚这里哪个最好。我的源代码之外没有任何依赖项。
我应该在 meson.build
文件中将这些目标一起写入 link 什么?
您可以从顶级 meson.build
文件向下使用 subdir
。您在子目录 meson.build
文件中声明的所有变量都可用于以后的 meson.build
文件。只要您获得 subdir
调用的顺序正确,它就会起作用。
除了@sdgfsdh 的(正确)答案,我喜欢的另一种方法是仅在顶级介子文件中定义库和可执行文件,并使用 subdir 调用来定义一组源文件和 "local" 包含路径。这样做,子目录文件不会隐式地相互依赖;整个依赖树位于顶层介子文件中。
这种方法的优点是:
- 子目录不需要知道它们自己的路径(files() 和 include_directories() 会为您跟踪)
- 顶层文件只需要知道子目录路径即可调用子目录介子文件。之后,您可以根据在子目录中创建的变量定义所有内容
- 子目录文件不直接依赖于任何其他介子文件
缺点:
- 顶级文件比较杂乱
- 子目录文件中的变量名称需要全局唯一,因为所有内容最终都在顶级范围内定义
您的案例示例:
# 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')
这是我的项目结构:
.
├── include
├── src
│ ├── abc
│ │ ├── include
│ │ └── src
│ ├── def
│ │ ├── include
│ │ └── src
│ └── ghi
│ ├── include
│ └── src
└── vendor
├── bar
│ ├── include
│ └── src
└── foo
16 directories
我想将我的构建移植到 Meson。但是,我不确定如何 link 在同级文件夹中定义目标。
我的依赖图如下所示:
src/abc/meson.build
定义静态库abc
src/def/meson.build
定义了一个依赖于abc
和foo
的静态库src/ghi/meson.build
定义了一个依赖于bar
的静态库vendor/bar/meson.build
定义静态库bar
vendor/foo/meson.build
定义静态库foo
- 顶层
meson.build
定义了一个依赖于abc
、def
和ghi
的可执行文件
def
ghi
app
在文档中,似乎有两种机制:
subdir
subproject
我不清楚这里哪个最好。我的源代码之外没有任何依赖项。
我应该在 meson.build
文件中将这些目标一起写入 link 什么?
您可以从顶级 meson.build
文件向下使用 subdir
。您在子目录 meson.build
文件中声明的所有变量都可用于以后的 meson.build
文件。只要您获得 subdir
调用的顺序正确,它就会起作用。
除了@sdgfsdh 的(正确)答案,我喜欢的另一种方法是仅在顶级介子文件中定义库和可执行文件,并使用 subdir 调用来定义一组源文件和 "local" 包含路径。这样做,子目录文件不会隐式地相互依赖;整个依赖树位于顶层介子文件中。
这种方法的优点是:
- 子目录不需要知道它们自己的路径(files() 和 include_directories() 会为您跟踪)
- 顶层文件只需要知道子目录路径即可调用子目录介子文件。之后,您可以根据在子目录中创建的变量定义所有内容
- 子目录文件不直接依赖于任何其他介子文件
缺点:
- 顶级文件比较杂乱
- 子目录文件中的变量名称需要全局唯一,因为所有内容最终都在顶级范围内定义
您的案例示例:
# 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')