return environ
def do(self, command, shell=True, personality=None, cwd=None, *args, **kwargs):
+ try:
+ logger = kwargs["logger"]
+ except KeyError:
+ logger = logging.getLogger("pakfire")
+ kwargs["logger"] = logger
+
# Environment variables
log.debug("Environment:")
for k, v in sorted(self.environ.items()):
personality=personality,
shell=False,
env=self.environ,
- logger=logging.getLogger("pakfire"),
cwd=cwd,
*args,
**kwargs
)
+ def run_script(self, script, *args):
+ if not script.startswith("/"):
+ script = os.path.join(SCRIPT_DIR, script)
+
+ assert os.path.exists(script), "Script we should run does not exist: %s" % script
+
+ cmd = [script,]
+ for arg in args:
+ cmd.append(arg)
+ cmd = " ".join(cmd)
+
+ # Returns the output of the command, but the output won't get
+ # logged.
+ return self.do(cmd, returnOutput=True, logger=None)
+
def create_icecream_toolchain(self):
try:
out = self.do("icecc --build-native 2>/dev/null", returnOutput=True, cwd="/tmp")
log.error(_("Extracting debuginfo did not complete with success. Aborting build."))
raise
+ def find_prerequires(self, scriptlet_file):
+ assert os.path.exists(scriptlet_file), "Scriptlet file does not exist: %s" % scriptlet_file
+
+ res = self.run_script("find-prerequires", scriptlet_file)
+ prerequires = set(res.splitlines())
+
+ return prerequires
+
def cleanup(self):
if os.path.exists(self.buildroot):
util.rm(self.buildroot)
self._dependencies[key], self.lexer.get_var("filter_%s" % key)
)
+ def update_prerequires(self, prerequires):
+ if not prerequires:
+ return
+
+ _prerequires = self._dependencies.get("prerequires", [])
+ _prerequires = set(_prerequires + prerequires)
+
+ self._dependencies["prerequires"] = list(prerequires)
+
@staticmethod
def filter_deps(deps, filters):
if not filters:
def create_scriptlets(self):
scriptlets = []
+ # Collect all prerequires for the scriptlets.
+ prerequires = []
+
for scriptlet_name in SCRIPTS:
scriptlet = self.pkg.get_scriptlet(scriptlet_name)
s.close()
+ if scriptlet_name in SCRIPTS_PREREQUIRES:
+ # Shell scripts require a shell to be executed.
+ prerequires.append("/bin/sh")
+
+ prerequires += self.builder.find_prerequires(scriptlet_file)
+
else:
raise Exception, "Unknown scriptlet language: %s" % scriptlet["lang"]
scriptlets.append((scriptlet_name, scriptlet_file))
- # XXX scan for script dependencies
+ # Cleanup prerequires.
+ self.pkg.update_prerequires(prerequires)
return scriptlets
--- /dev/null
+#!/bin/bash
+
+if [ -z "${1}" ]; then
+ echo >&2 "No input file passed!"
+ exit 1
+fi
+
+prereqs=$(bash --rpm-requires < ${1} | sort | uniq | sed -e 's/^bash(//' -e 's/)$//' -e 's/^executable(//' -e 's/)$//')
+[ -z "${prereqs}" ] && exit 0
+
+for prereq in ${prereqs}; do
+ case "${prereq}" in
+ /*)
+ echo ${prereq}
+ ;;
+ *)
+ which ${prereq} 2>/dev/null
+ ;;
+ esac
+done | sort | uniq