]>
git.ipfire.org Git - people/ms/ipfire-3.x.git/blob - naoki/backend.py
8 from constants
import *
11 "package_names" : None,
15 def get_package_names(toolchain
=False):
16 if not __cache
["package_names"]:
18 for repo
in get_repositories(toolchain
):
19 names
.extend(repo
.package_names
)
21 __cache
["package_names"] = sorted(names
)
23 return __cache
["package_names"]
25 def get_group_names():
26 if not __cache
["group_names"]:
28 for package
in get_package_names():
29 package
= PackageInfo(package
)
30 if not package
.group
in groups
:
31 groups
.append(package
.group
)
33 __cache
["group_names"] = sorted(groups
)
35 return __cache
["group_names"]
37 def find_package_name(name
, toolchain
=False):
38 if name
in get_package_names(toolchain
):
41 for package
in get_package_names(toolchain
):
42 if os
.path
.basename(package
) == name
:
45 def depsolve(packages
, recursive
=False):
47 for package
in packages
:
48 if not package
in deps
:
51 if not recursive
or not deps
:
57 deps
.extend(dep
.dependencies
)
61 if not dep
in new_deps
:
66 if length
== len(deps
):
72 def deptree(packages
):
78 for package
in stage
[:]:
79 for dep
in package
.info
.dependencies_all
:
94 def depsort(packages
):
96 for l1
in deptree(packages
):
100 class PackageInfo(object):
103 def __init__(self
, name
):
107 return "<PackageInfo %s>" % self
.name
110 if not self
.__data
.has_key(self
.name
):
111 self
.__data
[self
.name
] = self
.fetch()
113 return self
.__data
[self
.name
]
115 def set_data(self
, data
):
116 self
.__data
[self
.name
] = data
118 _data
= property(get_data
, set_data
)
121 env
= os
.environ
.copy()
122 env
.update(config
.environment
)
123 env
["PKGROOT"] = PKGSDIR
124 output
= util
.do("make -f %s" % self
.filename
, shell
=True,
125 cwd
=os
.path
.join(PKGSDIR
, self
.name
), returnOutput
=1, env
=env
)
128 for line
in output
.splitlines():
129 a
= line
.split("=", 1)
130 if not len(a
) == 2: continue
132 ret
[key
] = val
.strip("\"")
134 ret
["FINGERPRINT"] = self
.fingerprint
141 def getPackage(self
, naoki
):
142 return Package(self
.name
, naoki
)
147 "description" : self
.description
,
148 "filename" : self
.filename
,
149 "fingerprint" : self
.fingerprint
,
150 "group" : self
.group
,
151 "license" : self
.license
,
152 "maintainer" : self
.maintainer
,
154 "objects" : self
.objects
,
155 "patches" : self
.patches
,
156 "release" : self
.release
,
157 "summary" : self
.summary
,
158 "version" : self
.version
,
161 def _dependencies(self
, s
, recursive
=False):
163 if not self
._data
.has_key(c
):
165 for name
in self
._data
.get(s
).split(" "):
166 name
= find_package_name(name
)
168 deps
.append(Dependency(name
))
170 self
._data
.update({c
: depsolve(deps
, recursive
)})
172 return self
._data
.get(c
)
175 def dependencies(self
):
176 return self
._dependencies
("PKG_DEPENDENCIES")
179 def dependencies_build(self
):
180 return self
._dependencies
("PKG_BUILD_DEPENDENCIES")
183 def dependencies_all(self
):
184 return depsolve(self
.dependencies
+ self
.dependencies_build
, recursive
=True)
187 def description(self
):
188 return self
._data
.get("PKG_DESCRIPTION")
192 return os
.path
.join(PKGSDIR
, self
.name
, os
.path
.basename(self
.name
)) + ".nm"
195 def fingerprint(self
):
196 return "%d" % os
.stat(self
.filename
).st_mtime
200 return self
._data
.get("PKG_GROUP")
204 return "%s-%s-%s" % (self
.name
, self
.version
, self
.release
)
208 return self
._data
.get("PKG_LICENSE")
211 def maintainer(self
):
212 return self
._data
.get("PKG_MAINTAINER")
220 return self
._data
.get("PKG_OBJECTS").split(" ")
223 def package_files(self
):
224 return self
._data
.get("PKG_PACKAGES_FILES").split(" ")
228 return self
._data
.get("PKG_PATCHES").split(" ")
232 return self
._data
.get("PKG_REL")
236 return self
._data
.get("PKG_SUMMARY")
240 return self
._data
.get("PKG_VER")
243 class Dependency(PackageInfo
):
245 return "<Dependency %s>" % self
.name
248 class Package(object):
249 def __init__(self
, name
, naoki
):
250 self
.info
= PackageInfo(name
)
253 #self.log.debug("Initialized package object %s" % name)
256 environment
= chroot
.Environment(self
)
261 files
= self
.info
.objects
262 #self.log.info("Downloading %s..." % files)
263 download(self
.info
.objects
)
265 def extract(self
, dest
):
266 files
= [os
.path
.join(PACKAGESDIR
, file) for file in self
.info
.package_files
]
270 self
.log
.debug("Extracting %s..." % files
)
271 util
.do("%s --root=%s %s" % (os
.path
.join(TOOLSDIR
, "decompressor"),
272 dest
, " ".join(files
)), shell
=True)
276 return self
.naoki
.logging
.getBuildLogger(self
.info
.id)
279 def get_repositories(toolchain
=False):
281 return Repository("toolchain")
284 for repo
in os
.listdir(PKGSDIR
):
285 if os
.path
.isdir(os
.path
.join(PKGSDIR
, repo
)):
288 repos
.remove("toolchain")
290 return [Repository(repo
) for repo
in repos
]
292 class Repository(object):
293 def __init__(self
, name
):
297 return "<Repository %s>" % self
.name
302 for package
in os
.listdir(self
.path
):
303 package
= PackageInfo(os
.path
.join(self
.name
, package
))
304 packages
.append(package
)
309 def package_names(self
):
310 return [package
.name
for package
in self
.packages
]
314 return os
.path
.join(PKGSDIR
, self
.name
)
316 if __name__
== "__main__":
317 pi
= PackageInfo("core/grub")
319 print pi
.dependencies