| # 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`. |