The Meson Build System
http://mesonbuild.com/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
4.8 KiB
117 lines
4.8 KiB
6 years ago
|
# External Project module
|
||
|
|
||
|
**Note**: the functionality of this module is governed by [Meson's
|
||
|
rules on mixing build systems](Mixing-build-systems.md).
|
||
|
|
||
|
*This is an experimental module, API could change.*
|
||
|
|
||
|
This module allows building code that uses build systems other than Meson. This
|
||
|
module is intended to be used to build Autotools subprojects as fallback if the
|
||
|
dependency couldn't be found on the system (e.g. too old distro version).
|
||
|
|
||
|
The project will be compiled out-of-tree inside Meson's build directory. The
|
||
|
project will also be installed inside Meson's build directory using make's
|
||
|
[`DESTDIR`](https://www.gnu.org/prep/standards/html_node/DESTDIR.html)
|
||
|
feature. During project installation step, that DESTDIR will be copied verbatim
|
||
|
into the desired location.
|
||
|
|
||
|
External subprojects can use libraries built by Meson (main project, or other
|
||
|
subprojects) using pkg-config, thanks to `*-uninstalled.pc` files generated by
|
||
|
[`pkg.generate()`](Pkgconfig-module.md).
|
||
|
|
||
|
External build system requirements:
|
||
|
- Must support out-of-tree build. The configure script will be invoked with the
|
||
|
current workdir inside Meson's build directory and not subproject's top source
|
||
|
directory.
|
||
|
- Configure script must generate a `Makefile` in the current workdir.
|
||
|
- Configure script must take common directories like prefix, libdir, etc, as
|
||
|
command line arguments.
|
||
|
- Configure script must support common environment variable like CFLAGS, CC, etc.
|
||
|
- Compilation step must detect when a reconfigure is needed, and do it
|
||
|
transparently.
|
||
|
|
||
|
Known limitations:
|
||
|
- Executables from external projects cannot be used uninstalled, because they
|
||
|
would need its libraries to be installed in the final location. This is why
|
||
|
there is no `find_program()` method.
|
||
|
- The configure script must generate a `Makefile`, other build systems are not
|
||
|
yet supported.
|
||
|
- When cross compiling, if `PKG_CONFIG_SYSROOT_DIR` is set in environment or
|
||
|
`sys_root` in the cross file properties, the external subproject will not be
|
||
|
able to find dependencies built by meson using pkg-config. The reason is
|
||
|
pkg-config and pkgconf both prepend the sysroot path to `-I` and `-L` arguments
|
||
|
from `-uninstalled.pc` files. This is arguably a bug that could be fixed in
|
||
|
future version of pkg-config/pkgconf.
|
||
|
|
||
|
*Added 0.56.0*
|
||
|
|
||
|
## Functions
|
||
|
|
||
|
### `add_project()`
|
||
|
|
||
|
This function should be called at the root directory of a project using another
|
||
|
build system. Usually in a `meson.build` file placed in the top directory of a
|
||
|
subproject, but could be also in any subdir.
|
||
|
|
||
|
Its first positional argument is the name of the configure script to be
|
||
|
executed (e.g. `configure` or `autogen.sh`), that file must be in the current
|
||
|
directory and executable.
|
||
|
|
||
|
Keyword arguments:
|
||
|
- `configure_options`: An array of strings to be passed as arguments to the
|
||
|
configure script. Some special tags will be replaced by Meson before passing
|
||
|
them to the configure script: `@PREFIX@`, `@LIBDIR@` and `@INCLUDEDIR@`.
|
||
|
Note that `libdir` and `includedir` paths are relative to `prefix` in Meson
|
||
|
but some configure scripts requires absolute path, in that case they can be
|
||
|
passed as `'--libdir=@PREFIX@/@LIBDIR@'`.
|
||
|
- `cross_configure_options`: Extra options appended to `configure_options` only
|
||
|
when cross compiling. special tag `@HOST@` will be replaced by
|
||
|
`'{}-{}-{}'.format(host_machine.cpu_family(), build_machine.system(), host_machine.system()`.
|
||
|
If omitted it defaults to `['--host=@HOST@']`.
|
||
|
- `verbose`: If set to `true` the output of sub-commands ran to configure, build
|
||
|
and install the project will be printed onto Meson's stdout.
|
||
|
- `env` : environment variables to set, such as `['NAME1=value1', 'NAME2=value2']`,
|
||
|
a dictionary, or an [`environment()` object](Reference-manual.md#environment-object).
|
||
|
|
||
|
Returns an [`ExternalProject`](#ExternalProject_object) object
|
||
|
|
||
|
## `ExternalProject` object
|
||
|
|
||
|
### Methods
|
||
|
|
||
|
#### `dependency(libname)`
|
||
|
|
||
|
Return a dependency object that can be used to build targets against a library
|
||
|
from the external project.
|
||
|
|
||
|
Keyword arguments:
|
||
|
- `subdir` path relative to `includedir` to be added to the header search path.
|
||
|
|
||
|
## Example `meson.build` file for a subproject
|
||
|
|
||
|
```meson
|
||
|
project('My Autotools Project', 'c',
|
||
|
meson_version : '>=0.56.0',
|
||
|
)
|
||
|
|
||
|
mod = import('unstable_external_project')
|
||
|
|
||
|
p = mod.add_project('configure',
|
||
|
configure_options : ['--prefix=@PREFIX@',
|
||
|
'--libdir=@LIBDIR@',
|
||
|
'--incdir=@INCLUDEDIR@',
|
||
|
'--enable-foo',
|
||
|
],
|
||
|
)
|
||
|
|
||
|
mylib_dep = p.dependency('mylib')
|
||
|
```
|
||
|
|
||
|
## Using wrap file
|
||
|
|
||
|
Most of the time the project will be built as a subproject, and fetched using
|
||
|
a `.wrap` file. In that case the simple `meson.build` file needed to build the
|
||
|
subproject can be provided by adding `patch_directory=mysubproject` line
|
||
|
in the wrap file, and place the build definition file at
|
||
|
`subprojects/packagefiles/mysubproject/meson.build`.
|