# vi: encoding=utf-8 ts=8 sts=4 sw=4 et import re import string import xreadlines from util import * def get_build_requires(spec, bconds_with, bconds_without): cond_rx = re.compile(r"%\{(\!\?|\?\!|\?)([a-zA-Z0-9_+]+)\s*:([^%\{\}]*)\}") def expand_conds(l): def expand_one(m): if m.group(1) == "?": if macros.has_key(m.group(2)): return m.group(3) else: if not macros.has_key(m.group(2)): return m.group(3) return "" for i in range(10): l = cond_rx.sub(expand_one, l) if len(l) > 1000: break return l macro_rx = re.compile(r"%\{([a-zA-Z0-9_+]+)\}") def expand_macros(l): def expand_one(m): if macros.has_key(m.group(1)): return string.strip(macros[m.group(1)]) else: return m.group(0) # don't change for i in range(10): l = macro_rx.sub(expand_one, l) if len(l) > 1000: break return expand_conds(l) simple_br_rx = re.compile(r"^BuildRequires\s*:\s*([^\s]+)", re.I) bcond_rx = re.compile(r"^%bcond_(with|without)\s+([^\s]+)") version_rx = re.compile(r"^Version\s*:\s*([^\s]+)", re.I) release_rx = re.compile(r"^Release\s*:\s*([^\s]+)", re.I) name_rx = re.compile(r"^Name\s*:\s*([^\s]+)", re.I) define_rx = re.compile(r"^\%define\s+([a-zA-Z0-9_+]+)\s+(.*)", re.I) any_br_rx = re.compile(r"BuildRequires", re.I) macros = {} for b in bconds_with: macros["_with_%s" % b] = 1 for b in bconds_without: macros["_without_%s" % b] = 1 macros["__perl"] = "/usr/bin/perl" macros["_bindir"] = "/usr/bin" macros["_sbindir"] = "/usr/sbin" macros["kgcc_package"] = "gcc" build_req = [] f = open(spec) for l in xreadlines.xreadlines(f): l = string.strip(l) if l == "%changelog": break # %bcond_with.. m = bcond_rx.search(l) if m: bcond = m.group(2) if m.group(1) == "with": if macros.has_key("_with_%s" % bcond): macros["with_%s" % bcond] = 1 else: if not macros.has_key("_without_%s" % bcond): macros["with_%s" % bcond] = 1 continue # name,version,release m = version_rx.search(l) if m: macros["version"] = m.group(1) m = release_rx.search(l) if m: macros["release"] = m.group(1) m = name_rx.search(l) if m: macros["name"] = m.group(1) # %define m = define_rx.search(l) if m: macros[m.group(1)] = m.group(2) # *BuildRequires* if any_br_rx.search(l): l = expand_macros(l) m = simple_br_rx.search(l) if m: build_req.append(m.group(1)) else: if l <> "" and l[0] <> '#': msg("spec error (%s): %s\n" % (spec, l)) for x in build_req: print x