diff --git a/pmb/build/crosscompiler.py b/pmb/build/crosscompiler.py
deleted file mode 100644
index 2897c941..00000000
--- a/pmb/build/crosscompiler.py
+++ /dev/null
@@ -1,32 +0,0 @@
-"""
-Copyright 2017 Oliver Smith
-
-This file is part of pmbootstrap.
-
-pmbootstrap is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-pmbootstrap is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with pmbootstrap. If not, see .
-"""
-import pmb.config
-import fnmatch
-
-
-def init(args, arch):
- packages = ["gcc-" + arch, "ccache-cross-symlinks"]
- pmb.chroot.apk.install(args, packages)
-
-
-def native_chroot(args, pkgname):
- for pattern in pmb.config.crosscompile_supported:
- if fnmatch.fnmatch(pkgname, pattern):
- return True
- return False
diff --git a/pmb/build/package.py b/pmb/build/package.py
index 2a6ca0c6..729dec93 100644
--- a/pmb/build/package.py
+++ b/pmb/build/package.py
@@ -22,7 +22,6 @@ import logging
import pmb.build
import pmb.build.autodetect
import pmb.build.buildinfo
-import pmb.build.crosscompiler
import pmb.chroot
import pmb.chroot.apk
import pmb.chroot.distccd
diff --git a/pmb/chroot/distccd.py b/pmb/chroot/distccd.py
index 4ee0880b..33fb8124 100644
--- a/pmb/chroot/distccd.py
+++ b/pmb/chroot/distccd.py
@@ -16,15 +16,19 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with pmbootstrap. If not, see .
"""
+import configparser
+import errno
import logging
import os
-import errno
import pmb.chroot
import pmb.config
import pmb.chroot.apk
def get_running_pid(args):
+ """
+ :returns: the running distccd's pid as integer or None
+ """
pidfile = args.work + "/chroot_native/home/user/distccd.pid"
if not os.path.exists(pidfile):
return None
@@ -33,23 +37,32 @@ def get_running_pid(args):
return int(lines[0][:-1])
-def get_running_arch(args):
+def get_running_info(args):
"""
- :returns: the architecture string of the running distccd process (eg.
- "armhf" or "aarch64") or "unknown" if the file does not exist.
+ :returns: A dictionary in the form of {"arch": .., "cmdline": "" }. arch is
+ the architecture (e.g. "armhf" or "aarch64"), and "cmdline" is the
+ saved value from the generate_cmdline() list, joined on space.
+ If the information can not be read, "arch" and "cmdline" are set to
+ "unknown".
+ The arch is used to print a nice stop message, the full cmdline is used to
+ check whether distccd needs to be restartet (e.g. because the arch has been
+ changed, or the verbose flag).
"""
- file = args.work + "/chroot_native/tmp/distccd_running_arch"
- if not os.path.exists(file):
- return "unknown"
- with open(file, "r") as handle:
- lines = handle.readlines()
- return lines[0][:-1]
+ info = configparser.ConfigParser()
+ path = args.work + "/chroot_native/tmp/distccd_running_info"
+ if os.path.exists(path):
+ info.read(path)
+ else:
+ info["distccd"] = {}
+ info["distccd"]["arch"] = "unknown"
+ info["distccd"]["cmdline"] = "unknown"
+ return info["distccd"]
def is_running(args):
"""
:returns: When not running: None
- When running: the arch string, e.g. "armhf"
+ When running: result from get_running_info()
"""
# Get the PID
pid = get_running_pid(args)
@@ -64,43 +77,58 @@ def is_running(args):
pmb.chroot.root(args, ["rm", "/home/user/distccd.pid"])
return False
elif err.errno == errno.EPERM: # access denied
- return get_running_arch(args)
+ return get_running_info(args)
+
+
+def generate_cmdline(args, arch):
+ """
+ :returns: a dictionary suitable for pmb.chroot.user(), to start the distccd
+ with the cross-compiler in the path and all options set.
+ """
+ path = "/usr/lib/gcc-cross-wrappers/" + arch + "/bin:" + pmb.config.chroot_path
+ ret = ["PATH=" + path,
+ "distccd",
+ "--pid-file", "/home/user/distccd.pid",
+ "--listen", "127.0.0.1",
+ "--allow", "127.0.0.1",
+ "--port", args.port_distccd,
+ "--log-file", "/home/user/distccd.log",
+ "--jobs", args.jobs,
+ "--nice", "19",
+ "--job-lifetime", "60",
+ "--daemon"
+ ]
+ if args.verbose:
+ ret.append("--verbose")
+ return ret
def start(args, arch):
- if is_running(args) == arch:
+ # Skip when already running with the same cmdline
+ cmdline = generate_cmdline(args, arch)
+ info = is_running(args)
+ if info and info["cmdline"] == " ".join(cmdline):
return
stop(args)
pmb.chroot.apk.install(args, ["distcc", "gcc-cross-wrappers"])
# Start daemon with cross-compiler in path
- path = "/usr/lib/gcc-cross-wrappers/" + arch + "/bin:" + pmb.config.chroot_path
- daemon = ["PATH=" + path,
- "distccd",
- "--pid-file", "/home/user/distccd.pid",
- "--listen", "127.0.0.1",
- "--allow", "127.0.0.1",
- "--port", args.port_distccd,
- "--log-file", "/home/user/distccd.log",
- "--jobs", args.jobs,
- "--nice", "19",
- "--job-lifetime", "60",
- "--daemon"
- ]
- logging.info(
- "(native) start distccd (" +
- arch +
- ") on 127.0.0.1:" +
- args.port_distccd)
- pmb.chroot.user(args, daemon)
+ logging.info("(native) start distccd (" + arch + ") on 127.0.0.1:" +
+ args.port_distccd)
+ pmb.chroot.user(args, cmdline)
- # Write down the running architecture
- with open(args.work + "/chroot_native/tmp/distccd_running_arch", "w") as handle:
- handle.write(arch + "\n")
+ # Write down the arch and cmdline (which also contains the relevant
+ # environment variables, /proc/$pid/cmdline does not!)
+ info = configparser.ConfigParser()
+ info["distccd"] = {}
+ info["distccd"]["arch"] = arch
+ info["distccd"]["cmdline"] = " ".join(cmdline)
+ with open(args.work + "/chroot_native/tmp/distccd_running_info", "w") as handle:
+ info.write(handle)
def stop(args):
- arch = is_running(args)
- if arch:
- logging.info("(native) stop distccd (" + arch + ")")
+ info = is_running(args)
+ if info:
+ logging.info("(native) stop distccd (" + info["arch"] + ")")
pmb.chroot.user(args, ["kill", str(get_running_pid(args))])
diff --git a/pmb/parse/arguments.py b/pmb/parse/arguments.py
index 0a6f5acd..08175219 100644
--- a/pmb/parse/arguments.py
+++ b/pmb/parse/arguments.py
@@ -108,7 +108,7 @@ def arguments():
parser.add_argument("-l", "--log", dest="log", default=None)
parser.add_argument("-v", "--verbose", dest="verbose",
action="store_true", help="write even more to the"
- "logfile (this may reduce performance)")
+ " logfiles (this may reduce performance)")
parser.add_argument("-q", "--quiet", dest="quiet",
action="store_true", help="do not output any log messages")