]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
Add "ExtraSearchPaths=" and --extra-search-paths 229/head
authorCaio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Wed, 31 Jan 2018 22:33:29 +0000 (14:33 -0800)
committerCaio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Tue, 6 Feb 2018 19:55:49 +0000 (11:55 -0800)
This variable keeps a colon-delimited list of paths to be prepended to
PATH in the context of mkosi execution. Unlike shell variable
expansion, if any path refers to an unset variable, that path will be
ignored.

Besides the environment variables, the variable SUDO_HOME can be used
to refer to the home directory of the user calling mkosi with
sudo. This allows settings like

    ExtraSearchPaths=$SUDO_HOME/go/bin

mkosi

diff --git a/mkosi b/mkosi
index ff6545681d5543369e3a89ae8ce9f0569511e936..7fc595301999671b0498ee36e1d19f263eb6789b 100755 (executable)
--- a/mkosi
+++ b/mkosi
@@ -17,6 +17,7 @@ import pathlib
 import platform
 import shutil
 import stat
+import string
 import sys
 import tempfile
 import urllib.request
@@ -2273,6 +2274,9 @@ class ListAction(argparse.Action):
 class CommaDelimitedListAction(ListAction):
     delimiter = ","
 
+class ColonDelimitedListAction(ListAction):
+    delimiter = ":"
+
 def parse_args():
     parser = argparse.ArgumentParser(description='Build Legacy-Free OS Images', add_help=False)
 
@@ -2338,6 +2342,9 @@ def parse_args():
     group.add_argument("--bmap", action='store_true', help='Write block map file (.bmap) for bmaptool usage (only raw_gpt, raw_btrfs)')
     group.add_argument("--password", help='Set the root password')
 
+    group = parser.add_argument_group("Host configuration")
+    group.add_argument("--extra-search-paths", action=ColonDelimitedListAction, default=[], help="List of colon-separated paths to look for programs before looking in PATH")
+
     group = parser.add_argument_group("Additional Configuration")
     group.add_argument('-C', "--directory", help='Change to specified directory before doing anything', metavar='PATH')
     group.add_argument("--default", dest='default_path', help='Read configuration data from file', metavar='PATH')
@@ -2648,6 +2655,11 @@ def process_setting(args, section, key, value):
             return True
         else:
             return False
+    elif section == "Host":
+        if key == "ExtraSearchPaths":
+            list_value = value if type(value) == list else value.split()
+            for v in list_value:
+                args.extra_search_paths.extend(v.split(":"))
     else:
         return False
 
@@ -2861,6 +2873,8 @@ def load_args():
     find_passphrase(args)
     find_secure_boot(args)
 
+    args.extra_search_paths = expand_paths(args.extra_search_paths)
+
     if args.cmdline and args.verb not in ('shell', 'boot', 'qemu'):
         die("Additional parameters only accepted for 'shell', 'boot', 'qemu' invocations.")
 
@@ -3182,6 +3196,9 @@ def print_summary(args):
         sys.stderr.write("               GPG Key: " + ("default" if args.key is None else args.key) + "\n")
         sys.stderr.write("              Password: " + ("default" if args.password is None else "set") + "\n")
 
+    sys.stderr.write("\nHOST CONFIGURATION:\n")
+    sys.stderr.write("    Extra search paths: " + line_join_list(args.extra_search_paths) + "\n")
+
 def reuse_cache_tree(args, workspace, run_build_script, for_cache, cached):
     """If there's a cached version of this tree around, use it and
     initialize our new root directly from it. Returns a boolean indicating
@@ -3501,6 +3518,40 @@ def run_qemu(args):
 
     os.execvp(cmdline[0], cmdline)
 
+def expand_paths(paths):
+    if not paths:
+        return []
+
+    environ = os.environ.copy()
+    # Add a fake SUDO_HOME variable to allow non-root users specify
+    # paths in their home when using mkosi via sudo.
+    sudo_user = os.getenv("SUDO_USER")
+    if sudo_user and "SUDO_HOME" not in environ:
+        environ["SUDO_HOME"] = os.path.expanduser("~{}".format(sudo_user))
+
+    # No os.path.expandvars because it treats unset variables as empty.
+    expanded = []
+    for path in paths:
+        try:
+            path = string.Template(path).substitute(environ)
+            expanded.append(path)
+        except KeyError:
+            # Skip path if it uses a variable not defined.
+            pass
+    return expanded
+
+def prepend_to_environ_path(paths):
+    if not paths:
+        return
+
+    original_path = os.getenv("PATH", None)
+    new_path = ":".join(paths)
+
+    if original_path is None:
+        os.environ["PATH"] = new_path
+    else:
+        os.environ["PATH"] = new_path + ":" + original_path
+
 def main():
     args = load_args()
 
@@ -3516,6 +3567,8 @@ def main():
     if args.verb == "summary" or needs_build:
         print_summary(args)
 
+    prepend_to_environ_path(args.extra_search_paths)
+
     if needs_build:
         check_root()
         init_namespace(args)