From: Michael Tremer Date: Tue, 30 Aug 2011 14:34:36 +0000 (+0200) Subject: Fix automatic dependency detection. X-Git-Tag: 0.9.9~19 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5dda54e441f10470be142ca7425de7733adde856;p=pakfire.git Fix automatic dependency detection. --- diff --git a/pakfire/builder.py b/pakfire/builder.py index 28c6fb139..a6185471e 100644 --- a/pakfire/builder.py +++ b/pakfire/builder.py @@ -696,7 +696,8 @@ class Builder2(object): # Make all these little package from the build environment. logging.info(_("Creating packages:")) for pkg in reversed(self.pkg.packages): - packager = packages.packager.BinaryPackager(self.pakfire, pkg, self.buildroot) + packager = packages.packager.BinaryPackager(self.pakfire, pkg, + self, self.buildroot) packager.run(self.resultdir) logging.info("") diff --git a/pakfire/constants.py b/pakfire/constants.py index 06c3f01b6..a6bbf6160 100644 --- a/pakfire/constants.py +++ b/pakfire/constants.py @@ -117,6 +117,7 @@ package license = %(license)s summary = %(summary)s + def description %(description)s end diff --git a/pakfire/packages/make.py b/pakfire/packages/make.py index 813ae4f3e..8f51c57f6 100644 --- a/pakfire/packages/make.py +++ b/pakfire/packages/make.py @@ -21,6 +21,7 @@ import logging import os +import re import shutil import socket import tarfile @@ -31,6 +32,7 @@ from urlgrabber.progress import TextMeter import lexer import packager +import pakfire.chroot as chroot import pakfire.util as util from base import Package @@ -368,6 +370,9 @@ class MakefilePackage(MakefileBase): self._name = name self.lexer = lexer + # Store additional dependencies in here. + self._dependencies = {} + @property def name(self): return self._name @@ -388,28 +393,57 @@ class MakefilePackage(MakefileBase): def uuid(self): return None - def get_deps_from_builder(self, builder): - pass + def track_dependencies(self, builder, path): + result = builder.do("/usr/lib/buildsystem-tools/dependency-tracker %s" \ + % path, returnOutput=True) + + for line in result.splitlines(): + m = re.match(r"^(\w+)=(.*)$", line) + if m is None: + continue + + key, val = m.groups() + + if not key in ("prerequires", "requires", "provides", "conflicts", "obsoletes",): + continue + + val = val.strip("\"") + val = val.split() + + self._dependencies[key] = sorted(val) + + def get_deps(self, key): + # Collect all dependencies that were set in the makefile by the user. + deps = self.lexer.get_var(key).split() + + # Collect all dependencies that were discovered by the tracker. + deps += self._dependencies.get(key, []) + + # Remove duplicates. + deps = set(deps) + deps = list(deps) + + return sorted(deps) @property def prerequires(self): - return [] + return self.get_deps("prerequires") @property def requires(self): - return [] + return self.get_deps("requires") @property def provides(self): - return [] + return self.get_deps("provides") @property def obsoletes(self): - return [] + return self.get_deps("obsoletes") @property def conflicts(self): - return [] + return self.get_deps("conflicts") def get_scriptlet(self, type): return self.lexer.scriptlets.get(type, None) diff --git a/pakfire/packages/packager.py b/pakfire/packages/packager.py index c5a1fbee3..b97bac678 100644 --- a/pakfire/packages/packager.py +++ b/pakfire/packages/packager.py @@ -59,12 +59,19 @@ class Packager(object): continue logging.debug("Removing tmpfile: %s" % file) - os.remove(file) - def mktemp(self): + if os.path.isdir(file): + util.rm(file) + else: + os.remove(file) + + def mktemp(self, directory=False): # XXX use real mk(s)temp here filename = os.path.join("/", LOCAL_TMP_PATH, util.random_string()) + if directory: + os.makedirs(filename) + self.tmpfiles.append(filename) return filename @@ -170,14 +177,25 @@ class Packager(object): class BinaryPackager(Packager): - def __init__(self, pakfire, pkg, buildroot): + def __init__(self, pakfire, pkg, builder, buildroot): Packager.__init__(self, pakfire, pkg) + self.builder = builder self.buildroot = buildroot def create_metafile(self, datafile): info = collections.defaultdict(lambda: "") + # Extract datafile in temporary directory and scan for dependencies. + tmpdir = self.mktemp(directory=True) + + tarfile = InnerTarFile(datafile) + tarfile.extractall(path=tmpdir) + tarfile.close() + + # Run the dependency tracker. + self.pkg.track_dependencies(self.builder, tmpdir) + # Generic package information including Pakfire information. info.update({ "pakfire_version" : PAKFIRE_VERSION, @@ -190,8 +208,17 @@ class BinaryPackager(Packager): # Update package information for string formatting. info.update({ - "groups" : " ".join(self.pkg.groups), - "requires" : " ".join(self.pkg.requires), + "groups" : " ".join(self.pkg.groups), + "prerequires" : "\n".join([PACKAGE_INFO_DEPENDENCY_LINE % d \ + for d in self.pkg.prerequires]), + "requires" : "\n".join([PACKAGE_INFO_DEPENDENCY_LINE % d \ + for d in self.pkg.requires]), + "provides" : "\n".join([PACKAGE_INFO_DEPENDENCY_LINE % d \ + for d in self.pkg.provides]), + "conflicts" : "\n".join([PACKAGE_INFO_DEPENDENCY_LINE % d \ + for d in self.pkg.conflicts]), + "obsoletes" : "\n".join([PACKAGE_INFO_DEPENDENCY_LINE % d \ + for d in self.pkg.obsoletes]), }) # Format description. diff --git a/po/pakfire.pot b/po/pakfire.pot index 2f6c0805c..ffeb57b56 100644 --- a/po/pakfire.pot +++ b/po/pakfire.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-08-29 18:18+0200\n" +"POT-Creation-Date: 2011-08-29 19:24+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -334,7 +334,7 @@ msgstr "" msgid "Do not verify build dependencies." msgstr "" -#: ../pakfire/compress.py:133 ../pakfire/packages/packager.py:462 +#: ../pakfire/compress.py:133 ../pakfire/packages/packager.py:483 #, python-format msgid "Compressing %s" msgstr "" @@ -465,11 +465,11 @@ msgid "Package version is undefined." msgstr "" #. Load progressbar. -#: ../pakfire/packages/packager.py:288 +#: ../pakfire/packages/packager.py:309 msgid "Packaging" msgstr "" -#: ../pakfire/packages/packager.py:579 +#: ../pakfire/packages/packager.py:600 #, python-format msgid "Building source package %s:" msgstr ""