]>
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 ###############################################################################
28 from urlgrabber
.grabber
import URLGrabber
, URLGrabError
29 from urlgrabber
.progress
import TextMeter
35 log
= logging
.getLogger("pakfire")
37 import pakfire
.chroot
as chroot
38 import pakfire
.downloader
as downloader
39 import pakfire
.util
as util
41 from base
import Package
42 from file import SourcePackage
44 from pakfire
.constants
import *
45 from pakfire
.i18n
import _
47 class MakefileBase(Package
):
48 def __init__(self
, pakfire
, filename
):
49 Package
.__init
__(self
, pakfire
)
51 # Save the filename of the makefile.
52 self
.filename
= os
.path
.abspath(filename
)
55 environ
= self
.pakfire
.environ
57 "PARALLELISMFLAGS" : "-j%s" % util
.calc_parallelism(),
60 # Open and parse the makefile.
61 self
.lexer
= lexer
.RootLexer
.open(self
.filename
, environ
=environ
)
64 def package_filename(self
):
65 return PACKAGE_FILENAME_FMT
% {
67 "ext" : PACKAGE_EXTENSION
,
69 "release" : self
.release
,
70 "version" : self
.version
,
77 errors
.append(_("Package name is undefined."))
80 errors
.append(_("Package version is undefined."))
88 return self
.lexer
.get_var("name")
92 epoch
= self
.lexer
.get_var("epoch")
100 return self
.lexer
.get_var("version")
104 release
= self
.lexer
.get_var("release")
107 tag
= self
.lexer
.get_var("DISTRO_DISTTAG")
110 return ".".join((release
, tag
))
114 return self
.lexer
.get_var("summary")
117 def description(self
):
118 description
= self
.lexer
.get_var("description")
120 # Replace all backslashes at the end of a line.
121 return description
.replace("\\\n", "\n")
125 groups
= self
.lexer
.get_var("groups").split()
127 return sorted(groups
)
131 return self
.lexer
.get_var("url")
135 return self
.lexer
.get_var("license")
138 def maintainer(self
):
139 maintainer
= self
.lexer
.get_var("maintainer")
142 maintainer
= self
.lexer
.get_var("DISTRO_MAINTAINER")
148 return self
.lexer
.get_var("DISTRO_VENDOR")
152 return self
.lexer
.get_var("BUILDROOT")
155 def build_host(self
):
156 return socket
.gethostname()
158 # XXX build_id and build_time are used to create a source package
163 # Not existant for Makefiles
167 def build_time(self
):
169 # Not existant for Makefiles
173 class Makefile(MakefileBase
):
176 hash1
= util
.calc_hash1(self
.filename
)
178 # Return UUID version 5 (SHA1 hash)
179 return "%8s-%4s-5%3s-%4s-%11s" % \
180 (hash1
[0:8], hash1
[9:13], hash1
[14:17], hash1
[18:22], hash1
[23:34])
184 return os
.path
.dirname(self
.filename
)
191 def supported_arches(self
):
193 These are the supported arches. Which means, packages of these
194 architectures can be built out of this source package.
196 return self
.lexer
.get_var("sup_arches", "all")
202 for lexer
in self
.lexer
.packages
:
203 name
= lexer
.get_var("_name")
205 pkg
= MakefilePackage(self
.pakfire
, name
, lexer
)
214 if self
.pakfire
.distro
.source_dl
:
215 dls
.append(self
.pakfire
.distro
.source_dl
)
217 dl
= self
.lexer
.get_var("source_dl")
225 Download all external sources and return a list with the local
228 # Download source files.
229 grabber
= downloader
.SourceDownloader(self
.pakfire
,
230 mirrors
=self
.source_dl
)
232 return grabber
.download(self
.sources
)
234 def dist(self
, resultdirs
):
236 Create a source package.
238 # Download all files we need for this package.
241 p
= packager
.SourcePackager(self
.pakfire
, self
)
244 def dump(self
, *args
, **kwargs
):
245 dump
= MakefileBase
.dump(self
, *args
, **kwargs
)
246 dump
= dump
.splitlines()
248 #dump += ["", _("Containing the following binary packages:"),]
250 #for pkg in self.packages:
251 # _dump = pkg.dump(*args, **kwargs)
253 # for line in _dump.splitlines():
254 # dump.append(" %s" % line)
257 return "\n".join(dump
)
259 def get_buildscript(self
, stage
):
260 return self
.lexer
.build
.get_var("_%s" % stage
)
263 def prerequires(self
):
268 return self
.lexer
.build
.get_var("requires", "").split()
285 basedir
= os
.path
.dirname(self
.filename
)
287 for dirs
, subdirs
, _files
in os
.walk(basedir
):
289 files
.append(os
.path
.join(dirs
, f
))
295 return self
.lexer
.get_var("sources").split()
301 # Include quality agent exports.
302 exports
.update(self
.lexer
.quality_agent
.exports
)
304 for export
in self
.lexer
.build
.exports
:
305 exports
[export
] = self
.lexer
.build
.get_var(export
)
309 def extract(self
, message
=None, prefix
=None):
310 # XXX neeed to make this waaaaaaaaaay better.
317 message
= "%-10s : %s" % (message
, self
.friendly_name
)
318 pb
= util
.make_progress(message
, len(files
), eta
=False)
320 dir_len
= len(os
.path
.dirname(self
.filename
))
322 # Copy all files that belong to the package
330 log
.debug("%s/%s" % (prefix
, _f
))
332 path
= "%s/%s" % (prefix
, _f
)
334 path_dir
= os
.path
.dirname(path
)
335 if not os
.path
.exists(path_dir
):
336 os
.makedirs(path_dir
)
338 shutil
.copy2(f
, path
)
343 # Download source files.
344 for _filename
in self
.download():
345 filename
= "%s/files/%s" % (prefix
, os
.path
.basename(_filename
))
346 dirname
= os
.path
.dirname(filename
)
348 if not os
.path
.exists(dirname
):
351 shutil
.copy2(_filename
, filename
)
354 class MakefilePackage(MakefileBase
):
355 def __init__(self
, pakfire
, name
, lexer
):
356 Package
.__init
__(self
, pakfire
)
361 # Store additional dependencies in here.
362 self
._dependencies
= {}
370 return self
.lexer
.get_var("arch", "%{DISTRO_ARCH}")
373 def configfiles(self
):
374 return self
.lexer
.get_var("configfiles").split()
378 return self
.lexer
.get_var("files").split()
384 def track_dependencies(self
, builder
, path
):
386 dep_types
= ("prerequires", "requires", "provides", "conflicts", "obsoletes",)
388 result
= builder
.do("/usr/lib/pakfire/dependency-tracker %s" \
389 % path
, returnOutput
=True)
391 for line
in result
.splitlines():
392 m
= re
.match(r
"^(\w+)=(.*)$", line
)
396 key
, val
= m
.groups()
398 if not key
in dep_types
:
401 val
= val
.strip("\"")
404 self
._dependencies
[key
] = sorted(val
)
406 # Filter dependencies.
407 for key
in dep_types
:
408 self
._dependencies
[key
] = self
.filter_deps(
409 self
._dependencies
.get(key
, []),
410 self
.lexer
.get_var("filter_%s" % key
)
414 def filter_deps(deps
, filters
):
418 filters
= filters
.splitlines()
423 for filter in filters
:
424 m
= re
.search(filter, dep
)
428 # Yes, we found a match.
432 filtered_deps
.append(dep
)
436 def get_deps(self
, key
):
437 # Collect all dependencies that were set in the makefile by the user.
438 deps
= self
.lexer
.get_var(key
).split()
440 # Collect all dependencies that were discovered by the tracker.
441 deps
+= self
._dependencies
.get(key
, [])
450 def prerequires(self
):
451 return self
.get_deps("prerequires")
455 return self
.get_deps("requires")
459 return self
.get_deps("provides")
463 return self
.get_deps("obsoletes")
467 return self
.get_deps("conflicts")
469 def get_scriptlet(self
, type):
470 return self
.lexer
.get_scriptlet(type)
474 # The size of this is unknown.