forked from Mirror/pmbootstrap
* Ignore `>`, `<`, `=` and `!` operators, when they are specified in the dependencies. This was the desired behavior before, but it was not implemented correctly (so it wouldn't ignore them everywhere). Of course the real fix would be to honor these operators like apk does. But this isn't feasible right now, and it should work for most, if not all, our use-cases. I have documented this in the wiki under build internals and if we happen to need correct operator handling, we should do it then. Minor other changes: * `pmbootstrap parse_apkindex`: support optional package parameter to only show the parsed content for one package. * Support building most python APKBUILDs by replacing ${pkgname#py-} properly
98 lines
3.1 KiB
Python
98 lines
3.1 KiB
Python
"""
|
|
Copyright 2017 Oliver Smith
|
|
|
|
This file is part of pmbootstrap.
|
|
|
|
pmbootstrap is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
pmbootstrap is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with pmbootstrap. If not, see <http://www.gnu.org/licenses/>.
|
|
"""
|
|
import logging
|
|
import pmb.chroot
|
|
import pmb.chroot.apk
|
|
import pmb.parse.apkindex
|
|
|
|
|
|
def apkindex(args, pkgname, arch):
|
|
"""
|
|
Non-recursively get the dependencies of one package in any APKINDEX.
|
|
"""
|
|
index_data = pmb.parse.apkindex.read_any_index(args, pkgname, arch)
|
|
if index_data:
|
|
return index_data["depends"]
|
|
else:
|
|
return None
|
|
|
|
|
|
def recurse_error_message(pkgname, in_aports, in_apkindexes):
|
|
ret = "Could not find package '" + pkgname + "'"
|
|
if in_aports:
|
|
ret += " aport"
|
|
if in_apkindexes:
|
|
ret += " and could not find it"
|
|
if in_apkindexes:
|
|
ret += " in any APKINDEX"
|
|
return ret
|
|
|
|
|
|
def recurse(args, pkgnames, arch=None, in_apkindexes=True, in_aports=True,
|
|
strict=False):
|
|
"""
|
|
Find all dependencies of the given pkgnames.
|
|
|
|
:param in_apkindexes: look through all APKINDEX files (with the specified arch)
|
|
:param in_aports: look through the aports folder
|
|
:param strict: raise RuntimeError, when a dependency can not be found.
|
|
"""
|
|
logging.debug("Calculate depends of packages " + str(pkgnames) +
|
|
", arch: " + arch)
|
|
logging.verbose("Search in_aports: " + str(in_aports) + ", in_apkindexes: " +
|
|
str(in_apkindexes))
|
|
|
|
# Sanity check
|
|
if not apkindex and not in_aports:
|
|
raise RuntimeError("Set at least one of apkindex or aports to True.")
|
|
|
|
todo = list(pkgnames)
|
|
ret = []
|
|
while len(todo):
|
|
# Skip already passed entries
|
|
pkgname = todo.pop(0)
|
|
if pkgname in ret:
|
|
continue
|
|
|
|
# Get depends
|
|
logging.verbose("Getting depends of single package: " + pkgname)
|
|
depends = None
|
|
if in_aports:
|
|
aport = pmb.build.find_aport(args, pkgname, False)
|
|
if aport:
|
|
logging.verbose("-> Found aport: " + aport)
|
|
apkbuild = pmb.parse.apkbuild(args, aport + "/APKBUILD")
|
|
depends = apkbuild["depends"]
|
|
if depends is None and in_apkindexes:
|
|
logging.verbose("-> Search through APKINDEX files")
|
|
depends = apkindex(args, pkgname, arch)
|
|
if depends is None and strict:
|
|
raise RuntimeError(
|
|
recurse_error_message(
|
|
pkgname,
|
|
in_aports,
|
|
in_apkindexes))
|
|
|
|
# Append to todo/ret
|
|
logging.verbose("-> Depends: " + str(depends))
|
|
if depends:
|
|
todo += depends
|
|
ret.append(pkgname)
|
|
|
|
return ret
|