diff options
-rw-r--r-- | docs/markdown/Distributors.md | 85 | ||||
-rw-r--r-- | docs/markdown/Quick-guide.md | 24 | ||||
-rw-r--r-- | docs/markdown/Release-notes-for-0.45.0.md | 11 | ||||
-rw-r--r-- | mesonbuild/coredata.py | 28 | ||||
-rw-r--r-- | mesonbuild/dependencies/misc.py | 2 | ||||
-rw-r--r-- | mesonbuild/mesonlib.py | 38 |
6 files changed, 134 insertions, 54 deletions
diff --git a/docs/markdown/Distributors.md b/docs/markdown/Distributors.md new file mode 100644 index 0000000..2966abe --- /dev/null +++ b/docs/markdown/Distributors.md @@ -0,0 +1,85 @@ +--- +title: Distributors +short-description: Guide for distributors using meson +... + +# Using Meson + +Distro packagers usually want total control on the build flags +used. Meson supports this use case natively. The commands needed to +build and install Meson projects are the following. + +```console +$ cd /path/to/source/root +$ CFLAGS=... CXXFLAGS=... LDFLAGS=.. meson --prefix /usr --buildtype=plain builddir +$ ninja -v -C builddir +$ ninja -C builddir test +$ DESTDIR=/path/to/staging/root ninja -C builddir install +``` + +The command line switch `--buildtype=plain` tells Meson not to add its +own flags to the command line. This gives the packager total control +on used flags. + +This is very similar to other build systems. The only difference is +that the `DESTDIR` variable is passed as an environment variable +rather than as an argument to `ninja install`. + +As distro builds happen always from scratch, we recommend you to +enable [unity builds](Unity-builds.md) whenever possible on your +packages because they are faster and produce better code. + +## Overriding Default Directories + +Many distributions differ in their directory layout so as of Meson 0.45.0 we expose +an easy method of overriding the default behavior. The reason you would want to +override these is *not* for packages it is for users building software on the distro +as they expect `meson` without any specified arguments to go into the right location. +In build scripts for packages it should explicitly set any directories especially `prefix`. + +Inside the `mesonbuild` python module you can create a `distro_directories.py` file +and `meson` will import the `default_directories` dictionary from that and +override the internal defaults. As such it can do any arbitrary task such as +checking the architecture at runtime. + +The list of these directories as well as their descriptions and defaults can be found +in `meson --help` or alternatively in `default_directories` in `mesonlib.py`. + +Some simple examples: + +```python +default_directories = { + 'libdir': 'lib', # Avoid the lib64 heuristics in meson + 'libexecdir': 'lib', # Some distros don't have a dedicated libexec +} +``` + +```python +import platform + +if platform.machine() in ('x86_64', 'aarch64'): + libdir = 'lib64' +else: + libdir = 'lib' + + +default_directories = { + 'libdir': libdir, +} +``` + +```python +import subprocess + +pc = subprocess.Popen(['dpkg-architecture', '-qDEB_HOST_MULTIARCH'], + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL) +(stdo, _) = pc.communicate() +assert pc.returncode == 0 +archpath = stdo.decode().strip() +libdir = 'lib/' + archpath + +default_directories = { + 'libdir': libdir, +} +```
\ No newline at end of file diff --git a/docs/markdown/Quick-guide.md b/docs/markdown/Quick-guide.md index 938c3ed..0d46dc0 100644 --- a/docs/markdown/Quick-guide.md +++ b/docs/markdown/Quick-guide.md @@ -76,26 +76,4 @@ coding. Using Meson as a distro packager -- -Distro packagers usually want total control on the build flags -used. Meson supports this use case natively. The commands needed to -build and install Meson projects are the following. - -```console -$ cd /path/to/source/root -$ CFLAGS=... CXXFLAGS=... LDFLAGS=.. meson --prefix /usr --buildtype=plain builddir -$ ninja -v -C builddir -$ ninja -C builddir test -$ DESTDIR=/path/to/staging/root ninja -C builddir install -``` - -The command line switch `--buildtype=plain` tells Meson not to add its -own flags to the command line. This gives the packager total control -on used flags. - -This is very similar to other build systems. The only difference is -that the `DESTDIR` variable is passed as an environment variable -rather than as an argument to `ninja install`. - -As distro builds happen always from scratch, we recommend you to -enable [unity builds](Unity-builds.md) whenever possible on your -packages because they are faster and produce better code. +See [the distributors page](Distributors.md) for more information. diff --git a/docs/markdown/Release-notes-for-0.45.0.md b/docs/markdown/Release-notes-for-0.45.0.md index b3df71c..96a66c7 100644 --- a/docs/markdown/Release-notes-for-0.45.0.md +++ b/docs/markdown/Release-notes-for-0.45.0.md @@ -5,12 +5,7 @@ short-description: Release notes for 0.45 (preliminary) # New features -This page is a placeholder for the eventual release notes. +## Added ability for distributors to easily override default directories -Notable new features should come with release note updates. This is -done by creating a file snippet called `snippets/featurename.md` and -whose contents should look like this: - - ## Feature name - - A short description explaining the new feature and how it should be used. +Distributors can now install a `distro_directories.py` file to override +the Meson defaults. See [the distributors page](Distributors.md) for more details. diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py index 0fdac8b..44ea83f 100644 --- a/mesonbuild/coredata.py +++ b/mesonbuild/coredata.py @@ -19,7 +19,7 @@ import sys from pathlib import PurePath from collections import OrderedDict from .mesonlib import MesonException -from .mesonlib import default_libdir, default_libexecdir, default_prefix +from .mesonlib import default_directories import ast version = '0.45.0.dev1' @@ -392,19 +392,19 @@ builtin_options = { 'buildtype': [UserComboOption, 'Build type to use.', ['plain', 'debug', 'debugoptimized', 'release', 'minsize'], 'debug'], 'strip': [UserBooleanOption, 'Strip targets on install.', False], 'unity': [UserComboOption, 'Unity build.', ['on', 'off', 'subprojects'], 'off'], - 'prefix': [UserStringOption, 'Installation prefix.', default_prefix()], - 'libdir': [UserStringOption, 'Library directory.', default_libdir()], - 'libexecdir': [UserStringOption, 'Library executable directory.', default_libexecdir()], - 'bindir': [UserStringOption, 'Executable directory.', 'bin'], - 'sbindir': [UserStringOption, 'System executable directory.', 'sbin'], - 'includedir': [UserStringOption, 'Header file directory.', 'include'], - 'datadir': [UserStringOption, 'Data file directory.', 'share'], - 'mandir': [UserStringOption, 'Manual page directory.', 'share/man'], - 'infodir': [UserStringOption, 'Info page directory.', 'share/info'], - 'localedir': [UserStringOption, 'Locale data directory.', 'share/locale'], - 'sysconfdir': [UserStringOption, 'Sysconf data directory.', 'etc'], - 'localstatedir': [UserStringOption, 'Localstate data directory.', 'var'], - 'sharedstatedir': [UserStringOption, 'Architecture-independent data directory.', 'com'], + 'prefix': [UserStringOption, 'Installation prefix.', default_directories['prefix']], + 'libdir': [UserStringOption, 'Library directory.', default_directories['libdir']], + 'libexecdir': [UserStringOption, 'Library executable directory.', default_directories['libexecdir']], + 'bindir': [UserStringOption, 'Executable directory.', default_directories['bindir']], + 'sbindir': [UserStringOption, 'System executable directory.', default_directories['sbindir']], + 'includedir': [UserStringOption, 'Header file directory.', default_directories['includedir']], + 'datadir': [UserStringOption, 'Data file directory.', default_directories['datadir']], + 'mandir': [UserStringOption, 'Manual page directory.', default_directories['mandir']], + 'infodir': [UserStringOption, 'Info page directory.', default_directories['infodir']], + 'localedir': [UserStringOption, 'Locale data directory.', default_directories['localedir']], + 'sysconfdir': [UserStringOption, 'Sysconf data directory.', default_directories['sysconfdir']], + 'localstatedir': [UserStringOption, 'Localstate data directory.', default_directories['localstatedir']], + 'sharedstatedir': [UserStringOption, 'Architecture-independent data directory.', default_directories['sharedstatedir']], 'werror': [UserBooleanOption, 'Treat warnings as errors.', False], 'warning_level': [UserComboOption, 'Compiler warning level to use.', ['1', '2', '3'], '1'], 'layout': [UserComboOption, 'Build directory layout.', ['mirror', 'flat'], 'mirror'], diff --git a/mesonbuild/dependencies/misc.py b/mesonbuild/dependencies/misc.py index 9614f1f..05adf52 100644 --- a/mesonbuild/dependencies/misc.py +++ b/mesonbuild/dependencies/misc.py @@ -390,7 +390,7 @@ class BoostDependency(ExternalDependency): if self.libdir: libdirs = [self.libdir] elif self.boost_root is None: - libdirs = mesonlib.get_library_dirs() + libdirs = mesonlib.default_directories['librarydirs'] else: libdirs = [os.path.join(self.boost_root, 'lib')] for libdir in libdirs: diff --git a/mesonbuild/mesonlib.py b/mesonbuild/mesonlib.py index 4871bf7..9d71c7e 100644 --- a/mesonbuild/mesonlib.py +++ b/mesonbuild/mesonlib.py @@ -449,7 +449,8 @@ def version_compare_many(vstr1, conditions): found.append(req) return not_found == [], not_found, found -def default_libdir(): + +def _default_libdir(): if is_debianlike(): try: pc = subprocess.Popen(['dpkg-architecture', '-qDEB_HOST_MULTIARCH'], @@ -465,14 +466,8 @@ def default_libdir(): return 'lib64' return 'lib' -def default_libexecdir(): - # There is no way to auto-detect this, so it must be set at build time - return 'libexec' - -def default_prefix(): - return 'c:/' if is_windows() else '/usr/local' -def get_library_dirs(): +def _default_library_dirs(): if is_windows(): return ['C:/mingw/lib'] # Fixme if is_osx(): @@ -500,6 +495,33 @@ def get_library_dirs(): return unixdirs +# These are mostly documented in builtin_options in coredata.py +default_directories = { + 'prefix': 'c:/' if is_windows() else '/usr/local', + 'bindir': 'bin', + 'sbindir': 'sbin', + 'libdir': _default_libdir(), + 'libexecdir': 'libexec', + 'datadir': 'share', + 'includedir': 'include', + 'mandir': 'share/man', + 'infodir': 'share/info', + 'localedir': 'share/locale', + 'sysconfdir': 'etc', + 'localstatedir': 'var', + 'sharedstatedir': 'com', + 'librarydirs': _default_library_dirs(), +} + + +try: + # Allow distros to insert a file that sets its own directories + from .distro_directories import default_directories as overrides + default_directories.update(overrides) +except ImportError: + pass + + def do_replacement(regex, line, confdata): missing_variables = set() |