]>
git.ipfire.org Git - pakfire.git/blob - python/pakfire/packages/make.py
2 ###############################################################################
4 # Pakfire - The IPFire package management system #
5 # Copyright (C) 2011 Pakfire development team #
7 # This program is free software: you can redistribute it and/or modify #
8 # it under the terms of the GNU General Public License as published by #
9 # the Free Software Foundation, either version 3 of the License, or #
10 # (at your option) any later version. #
12 # This program is distributed in the hope that it will be useful, #
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
15 # GNU General Public License for more details. #
17 # You should have received a copy of the GNU General Public License #
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. #
20 ###############################################################################
29 from urlgrabber
.grabber
import URLGrabber
, URLGrabError
30 from urlgrabber
.progress
import TextMeter
35 import pakfire
.chroot
as chroot
36 import pakfire
.util
as util
38 from base
import Package
39 from file import SourcePackage
41 from pakfire
.constants
import *
42 from pakfire
.i18n
import _
44 # XXX to be moved to pakfire.downloader
45 class SourceDownloader(object):
46 def __init__(self
, pakfire
, mirrors
=None):
47 self
.pakfire
= pakfire
48 self
.mirrors
= mirrors
50 # XXX need to use downloader.py
51 self
.grabber
= URLGrabber(
52 prefix
= self
.pakfire
.config
.get("source_download_url"),
53 progress_obj
= TextMeter(),
57 def download(self
, filename
):
58 filename
= os
.path
.join(SOURCE_CACHE_DIR
, filename
)
60 if os
.path
.exists(filename
):
63 dirname
= os
.path
.dirname(filename
)
64 if not os
.path
.exists(dirname
):
68 self
.grabber
.urlgrab(os
.path
.basename(filename
), filename
=filename
)
69 except URLGrabError
, e
:
70 raise DownloadError
, "%s %s" % (os
.path
.basename(filename
), e
)
75 class MakefileBase(Package
):
76 def __init__(self
, pakfire
, filename
):
77 Package
.__init
__(self
, pakfire
)
79 # Save the filename of the makefile.
80 self
.filename
= os
.path
.abspath(filename
)
82 # Open and parse the makefile.
83 # XXX pass environment to lexer
84 self
.lexer
= lexer
.RootLexer
.open(self
.filename
,
85 environ
=self
.pakfire
.environ
)
88 def package_filename(self
):
89 return PACKAGE_FILENAME_FMT
% {
91 "ext" : PACKAGE_EXTENSION
,
93 "release" : self
.release
,
94 "version" : self
.version
,
101 errors
.append(_("Package name is undefined."))
104 errors
.append(_("Package version is undefined."))
112 return self
.lexer
.get_var("name")
116 epoch
= self
.lexer
.get_var("epoch")
124 return self
.lexer
.get_var("version")
128 release
= self
.lexer
.get_var("release")
131 tag
= self
.lexer
.get_var("DISTRO_DISTTAG")
134 return ".".join((release
, tag
))
138 return self
.lexer
.get_var("summary")
141 def description(self
):
142 description
= self
.lexer
.get_var("description")
144 # Replace all backslashes at the end of a line.
145 return description
.replace("\\\n", "\n")
149 groups
= self
.lexer
.get_var("groups").split()
151 return sorted(groups
)
155 return self
.lexer
.get_var("url")
159 return self
.lexer
.get_var("license")
162 def maintainer(self
):
163 maintainer
= self
.lexer
.get_var("maintainer")
166 maintainer
= self
.lexer
.get_var("DISTRO_MAINTAINER")
172 return self
.lexer
.get_var("DISTRO_VENDOR")
175 def build_host(self
):
176 return socket
.gethostname()
178 # XXX build_id and build_time are used to create a source package
183 # Not existant for Makefiles
187 def build_time(self
):
189 # Not existant for Makefiles
193 class Makefile(MakefileBase
):
196 hash1
= util
.calc_hash1(self
.filename
)
198 # Return UUID version 5 (SHA1 hash)
199 return "%8s-%4s-5%3s-%4s-%11s" % \
200 (hash1
[0:8], hash1
[9:13], hash1
[14:17], hash1
[18:22], hash1
[23:34])
204 return os
.path
.dirname(self
.filename
)
209 This is only used to create the name of the source package.
217 for lexer
in self
.lexer
.packages
:
218 name
= lexer
.get_var("_name")
220 pkg
= MakefilePackage(self
.pakfire
, name
, lexer
)
229 if self
.pakfire
.distro
.source_dl
:
230 dls
.append(self
.pakfire
.distro
.source_dl
)
232 dl
= self
.lexer
.get_var("source_dl")
240 Download all external sources and return a list with the local
243 # Download source files.
244 # XXX need to implement mirrors
245 downloader
= SourceDownloader(self
.pakfire
, mirrors
=self
.source_dl
)
248 for filename
in self
.sources
:
249 filename
= downloader
.download(filename
)
250 files
.append(filename
)
254 def dist(self
, resultdirs
):
256 Create a source package.
258 We assume that all required files are in /build.
261 #for line in dump.splitlines():
264 p
= packager
.SourcePackager(self
.pakfire
, self
)
267 def dump(self
, *args
, **kwargs
):
268 dump
= MakefileBase
.dump(self
, *args
, **kwargs
)
269 dump
= dump
.splitlines()
271 #dump += ["", _("Containing the following binary packages:"),]
273 #for pkg in self.packages:
274 # _dump = pkg.dump(*args, **kwargs)
276 # for line in _dump.splitlines():
277 # dump.append(" %s" % line)
280 return "\n".join(dump
)
282 def get_buildscript(self
, stage
):
283 return self
.lexer
.build
.get_var("_%s" % stage
)
286 def prerequires(self
):
291 return self
.lexer
.build
.get_var("requires", "").split()
308 basedir
= os
.path
.dirname(self
.filename
)
310 for dirs
, subdirs
, _files
in os
.walk(basedir
):
312 files
.append(os
.path
.join(dirs
, f
))
318 return self
.lexer
.get_var("sources").split()
324 # Include quality agent exports.
325 exports
.update(self
.lexer
.quality_agent
.exports
)
327 for export
in self
.lexer
.build
.exports
:
328 exports
[export
] = self
.lexer
.build
.get_var(export
)
332 def extract(self
, message
=None, prefix
=None):
333 # XXX neeed to make this waaaaaaaaaay better.
340 message
= "%-10s : %s" % (message
, self
.friendly_name
)
341 pb
= util
.make_progress(message
, len(files
), eta
=False)
343 dir_len
= len(os
.path
.dirname(self
.filename
))
345 # Copy all files that belong to the package
353 logging
.debug("%s/%s" % (prefix
, _f
))
355 path
= "%s/%s" % (prefix
, _f
)
357 path_dir
= os
.path
.dirname(path
)
358 if not os
.path
.exists(path_dir
):
359 os
.makedirs(path_dir
)
361 shutil
.copy2(f
, path
)
366 # Download source files.
367 downloader
= SourceDownloader(self
.pakfire
, mirrors
=self
.source_dl
)
368 for filename
in self
.sources
:
369 _filename
= downloader
.download(filename
)
372 filename
= "%s/files/%s" % (prefix
, os
.path
.basename(_filename
))
373 dirname
= os
.path
.dirname(filename
)
375 if not os
.path
.exists(dirname
):
378 shutil
.copy2(_filename
, filename
)
385 class MakefilePackage(MakefileBase
):
386 def __init__(self
, pakfire
, name
, lexer
):
387 Package
.__init
__(self
, pakfire
)
392 # Store additional dependencies in here.
393 self
._dependencies
= {}
401 return self
.lexer
.get_var("arch", "%{DISTRO_ARCH}")
404 def configfiles(self
):
405 return self
.lexer
.get_var("configfiles").split()
409 return self
.lexer
.get_var("files").split()
415 def track_dependencies(self
, builder
, path
):
416 result
= builder
.do("/usr/lib/pakfire/dependency-tracker %s" \
417 % path
, returnOutput
=True)
419 for line
in result
.splitlines():
420 m
= re
.match(r
"^(\w+)=(.*)$", line
)
424 key
, val
= m
.groups()
426 if not key
in ("prerequires", "requires", "provides", "conflicts", "obsoletes",):
429 val
= val
.strip("\"")
432 self
._dependencies
[key
] = sorted(val
)
434 def get_deps(self
, key
):
435 # Collect all dependencies that were set in the makefile by the user.
436 deps
= self
.lexer
.get_var(key
).split()
438 # Collect all dependencies that were discovered by the tracker.
439 deps
+= self
._dependencies
.get(key
, [])
448 def prerequires(self
):
449 return self
.get_deps("prerequires")
453 return self
.get_deps("requires")
457 return self
.get_deps("provides")
461 return self
.get_deps("obsoletes")
465 return self
.get_deps("conflicts")
467 def get_scriptlet(self
, type):
468 return self
.lexer
.scriptlets
.get(type, None)
472 # The size of this is unknown.