aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/markdown/External-Project-module.md12
-rw-r--r--mesonbuild/modules/unstable_external_project.py24
2 files changed, 21 insertions, 15 deletions
diff --git a/docs/markdown/External-Project-module.md b/docs/markdown/External-Project-module.md
index 54b248f..e469024 100644
--- a/docs/markdown/External-Project-module.md
+++ b/docs/markdown/External-Project-module.md
@@ -54,8 +54,10 @@ 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.
+executed (e.g. `configure`), that file must be in the current directory and
+executable. Note that if a bootstrap script is required (e.g. `autogen.sh` when
+building from git instead of tarball), it can be done using `run_command()`
+before calling `add_project()` method.
Keyword arguments:
- `configure_options`: An array of strings to be passed as arguments to the
@@ -63,7 +65,11 @@ Keyword arguments:
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@'`.
+ passed as `'--libdir=@PREFIX@/@LIBDIR@'`. *Since 0.57.0* default arguments are
+ added in case some tags are not found in `configure_options`:
+ `'--prefix=@PREFIX@'`, `'--libdir=@PREFIX@/@LIBDIR@'`, and
+ `'--includedir=@PREFIX@/@INCLUDEDIR@'`. It was previously considered a fatal
+ error to not specify them.
- `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()`.
diff --git a/mesonbuild/modules/unstable_external_project.py b/mesonbuild/modules/unstable_external_project.py
index 933b064..20c1671 100644
--- a/mesonbuild/modules/unstable_external_project.py
+++ b/mesonbuild/modules/unstable_external_project.py
@@ -90,11 +90,11 @@ class ExternalProject(InterpreterObject):
configure_prog = self.interpreter.find_program_impl(configure_path.as_posix())
configure_cmd = configure_prog.get_command()
- d = {'PREFIX': self.prefix.as_posix(),
- 'LIBDIR': self.libdir.as_posix(),
- 'INCLUDEDIR': self.includedir.as_posix(),
- }
- self._validate_configure_options(d.keys())
+ d = [('PREFIX', '--prefix=@PREFIX@', self.prefix.as_posix()),
+ ('LIBDIR', '--libdir=@PREFIX@/@LIBDIR@', self.libdir.as_posix()),
+ ('INCLUDEDIR', '--includedir=@PREFIX@/@INCLUDEDIR@', self.includedir.as_posix()),
+ ]
+ self._validate_configure_options(d)
configure_cmd += self._format_options(self.configure_options, d)
@@ -102,7 +102,7 @@ class ExternalProject(InterpreterObject):
host = '{}-{}-{}'.format(self.host_machine.cpu_family,
self.build_machine.system,
self.host_machine.system)
- d = {'HOST': host}
+ d = [('HOST', None, host)]
configure_cmd += self._format_options(self.cross_configure_options, d)
# Set common env variables like CFLAGS, CC, etc.
@@ -136,23 +136,23 @@ class ExternalProject(InterpreterObject):
def _quote_and_join(self, array: T.List[str]) -> str:
return ' '.join([shlex.quote(i) for i in array])
- def _validate_configure_options(self, required_keys: T.List[str]):
+ def _validate_configure_options(self, variables: T.List[T.Tuple[str, str, str]]):
# Ensure the user at least try to pass basic info to the build system,
# like the prefix, libdir, etc.
- for key in required_keys:
+ for key, default, val in variables:
key_format = '@{}@'.format(key)
for option in self.configure_options:
if key_format in option:
break
else:
- m = 'At least one configure option must contain "{}" key'
- raise InterpreterException(m.format(key_format))
+ FeatureNew('Default configure_option', '0.57.0').use(self.subproject)
+ self.configure_options.append(default)
- def _format_options(self, options: T.List[str], variables: T.Dict[str, str]) -> T.List[str]:
+ def _format_options(self, options: T.List[str], variables: T.List[T.Tuple[str, str, str]]) -> T.List[str]:
out = []
missing = set()
regex = get_variable_regex('meson')
- confdata = {k: (v, None) for k, v in variables.items()}
+ confdata = {k: (v, None) for k, d, v in variables}
for o in options:
arg, missing_vars = do_replacement(regex, o, 'meson', confdata)
missing.update(missing_vars)