aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2017-11-13 21:14:59 +0200
committerGitHub <noreply@github.com>2017-11-13 21:14:59 +0200
commit69bd87a71624e2e665c3d43d765a3c5fb1313c96 (patch)
treea58f541c74a1071ff916611b6316bbc62ab2b563
parentc6781744cf0ff1c64a18d07a3d32d87a45d2faa7 (diff)
parent3e0069f65e58175d7979fac687c0bb5b3544b72e (diff)
downloadmeson-69bd87a71624e2e665c3d43d765a3c5fb1313c96.zip
meson-69bd87a71624e2e665c3d43d765a3c5fb1313c96.tar.gz
meson-69bd87a71624e2e665c3d43d765a3c5fb1313c96.tar.bz2
Merge pull request #2511 from jon-turney/prefix-dependent-defaults
Make sysconfdir, localstatedir and sharedstatedir defaults depend on prefix
-rw-r--r--docs/markdown/snippets/prefix-dependent-defaults.md10
-rw-r--r--mesonbuild/coredata.py31
-rw-r--r--mesonbuild/mesonmain.py7
-rwxr-xr-xrun_unittests.py49
4 files changed, 82 insertions, 15 deletions
diff --git a/docs/markdown/snippets/prefix-dependent-defaults.md b/docs/markdown/snippets/prefix-dependent-defaults.md
new file mode 100644
index 0000000..7cc1792
--- /dev/null
+++ b/docs/markdown/snippets/prefix-dependent-defaults.md
@@ -0,0 +1,10 @@
+# Prefix-dependent defaults for sysconfdir, localstatedir and sharedstatedir
+
+These options now default in a way consistent with
+[FHS](http://refspecs.linuxfoundation.org/fhs.shtml) and common usage.
+
+If prefix is `/usr`, default sysconfdir to `/etc`, localstatedir to `/var` and
+sharedstatedir to `/var/lib`.
+
+If prefix is `/usr/local` (the default), default localstatedir to `/var/local`
+and sharedstatedir to `/var/local/lib`.
diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py
index ba5d2ac..e8b23fd 100644
--- a/mesonbuild/coredata.py
+++ b/mesonbuild/coredata.py
@@ -1,3 +1,4 @@
+
# Copyright 2012-2017 The Meson development team
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -232,7 +233,7 @@ class CoreData:
value = self.sanitize_dir_option_value(options.prefix, key, value)
setattr(options, key, value)
else:
- value = get_builtin_option_default(key)
+ value = get_builtin_option_default(key, prefix=options.prefix)
args = [key] + builtin_options[key][1:-1] + [value]
self.builtins[key] = builtin_options[key][0](*args)
@@ -308,11 +309,19 @@ def get_builtin_option_description(optname):
else:
raise RuntimeError('Tried to get the description for an unknown builtin option \'%s\'.' % optname)
-def get_builtin_option_default(optname):
+def get_builtin_option_default(optname, prefix='', noneIfSuppress=False):
if is_builtin_option(optname):
o = builtin_options[optname]
if o[0] == UserComboOption:
return o[3]
+ if optname in builtin_dir_noprefix_options:
+ if noneIfSuppress:
+ # Return None if argparse defaulting should be suppressed for
+ # this option (so we can determine the default later based on
+ # prefix)
+ return None
+ elif prefix in builtin_dir_noprefix_options[optname]:
+ return builtin_dir_noprefix_options[optname][prefix]
return o[2]
else:
raise RuntimeError('Tried to get the default value for an unknown builtin option \'%s\'.' % optname)
@@ -331,15 +340,6 @@ builtin_options = {
'mandir': [UserStringOption, 'Manual page directory.', 'share/man'],
'infodir': [UserStringOption, 'Info page directory.', 'share/info'],
'localedir': [UserStringOption, 'Locale data directory.', 'share/locale'],
- # sysconfdir, localstatedir and sharedstatedir are a bit special. These defaults to ${prefix}/etc,
- # ${prefix}/var and ${prefix}/com but nobody uses that. Instead they always set it
- # manually to /etc, /var and /var/lib. This default values is thus pointless and not really used
- # but we set it to this for consistency with other systems.
- #
- # Projects installing to sysconfdir, localstatedir or sharedstatedir probably want
- # to set the following in project():
- #
- # default_options : ['sysconfdir=/etc', 'localstatedir=/var', 'sharedstatedir=/var/lib']
'sysconfdir': [UserStringOption, 'Sysconf data directory.', 'etc'],
'localstatedir': [UserStringOption, 'Localstate data directory.', 'var'],
'sharedstatedir': [UserStringOption, 'Architecture-independent data directory.', 'com'],
@@ -352,8 +352,13 @@ builtin_options = {
'errorlogs': [UserBooleanOption, "Whether to print the logs from failing tests.", True],
}
-# Installation directories that can reside in a path outside of the prefix
-builtin_dir_noprefix_options = {'sysconfdir', 'localstatedir', 'sharedstatedir'}
+# Special prefix-dependent defaults for installation directories that reside in
+# a path outside of the prefix in FHS and common usage.
+builtin_dir_noprefix_options = {
+ 'sysconfdir': {'/usr': '/etc'},
+ 'localstatedir': {'/usr': '/var', '/usr/local': '/var/local'},
+ 'sharedstatedir': {'/usr': '/var/lib', '/usr/local': '/var/local/lib'},
+}
forbidden_target_names = {'clean': None,
'clean-ctlist': None,
diff --git a/mesonbuild/mesonmain.py b/mesonbuild/mesonmain.py
index a1e7c1c..8d5fb85 100644
--- a/mesonbuild/mesonmain.py
+++ b/mesonbuild/mesonmain.py
@@ -37,7 +37,12 @@ def add_builtin_argument(name, **kwargs):
h = h.rstrip('.') + ' (default: %s).' % coredata.get_builtin_option_default(k)
if c and not b:
kwargs['choices'] = c
- parser.add_argument('--' + name, default=coredata.get_builtin_option_default(k), help=h, **kwargs)
+ default = coredata.get_builtin_option_default(k, noneIfSuppress=True)
+ if default is not None:
+ kwargs['default'] = default
+ else:
+ kwargs['default'] = argparse.SUPPRESS
+ parser.add_argument('--' + name, help=h, **kwargs)
add_builtin_argument('prefix')
add_builtin_argument('libdir')
diff --git a/run_unittests.py b/run_unittests.py
index fa8f049..ce1bf06 100755
--- a/run_unittests.py
+++ b/run_unittests.py
@@ -1,3 +1,4 @@
+
#!/usr/bin/env python3
# Copyright 2016-2017 The Meson development team
@@ -490,7 +491,10 @@ class BasePlatformTests(unittest.TestCase):
print(f.read())
def tearDown(self):
- windows_proof_rmtree(self.builddir)
+ try:
+ windows_proof_rmtree(self.builddir)
+ except FileNotFoundError:
+ pass
os.environ = self.orig_env
super().tearDown()
@@ -739,6 +743,49 @@ class AllPlatformTests(BasePlatformTests):
self.init(testdir)
self.assertRaises(subprocess.CalledProcessError, self.setconf, '-Dlibdir=/opt', False)
+ def test_prefix_dependent_defaults(self):
+ '''
+ Tests that configured directory paths are set to prefix dependent
+ defaults.
+ '''
+ testdir = os.path.join(self.common_test_dir, '1 trivial')
+ expected = {
+ '/opt': {'prefix': '/opt',
+ 'bindir': 'bin', 'datadir': 'share', 'includedir': 'include',
+ 'infodir': 'share/info',
+ 'libexecdir': 'libexec', 'localedir': 'share/locale',
+ 'localstatedir': 'var', 'mandir': 'share/man',
+ 'sbindir': 'sbin', 'sharedstatedir': 'com',
+ 'sysconfdir': 'etc'},
+ '/usr': {'prefix': '/usr',
+ 'bindir': 'bin', 'datadir': 'share', 'includedir': 'include',
+ 'infodir': 'share/info',
+ 'libexecdir': 'libexec', 'localedir': 'share/locale',
+ 'localstatedir': '/var', 'mandir': 'share/man',
+ 'sbindir': 'sbin', 'sharedstatedir': '/var/lib',
+ 'sysconfdir': '/etc'},
+ '/usr/local': {'prefix': '/usr/local',
+ 'bindir': 'bin', 'datadir': 'share',
+ 'includedir': 'include', 'infodir': 'share/info',
+ 'libexecdir': 'libexec',
+ 'localedir': 'share/locale',
+ 'localstatedir': '/var/local', 'mandir': 'share/man',
+ 'sbindir': 'sbin', 'sharedstatedir': '/var/local/lib',
+ 'sysconfdir': 'etc'},
+ # N.B. We don't check 'libdir' as it's platform dependent, see
+ # default_libdir():
+ }
+ for prefix in expected:
+ args = ['--prefix', prefix]
+ self.init(testdir, args, default_args=False)
+ opts = self.introspect('--buildoptions')
+ for opt in opts:
+ name = opt['name']
+ value = opt['value']
+ if name in expected[prefix]:
+ self.assertEqual(value, expected[prefix][name])
+ self.wipe()
+
def test_static_library_overwrite(self):
'''
Tests that static libraries are never appended to, always overwritten.