pmbootstrap-meow/pmb/build/autodetect.py
Oliver Smith bed1eacbb5 Close #256: Implement strict package building mode (#532)
Contrary to abuild, pmbootstrap only installs makedepends, and
keeps the installed packages around - both hacks save lots of time.

However, they may introduce missing makedepends in the APKBUILDs,
that the authors of the APKBUILDs do not notice because it works
for them.

This PR adss a strict mode, which will always clean the chroots
before building a package, and also remove all installed dependencies
after the package was built. You can use the following syntax to
only zap once, but build many packages at once:
`pmbootstrap build --strict hello-world 0xffff heimdall`

It also builds dependencies properly without leaving makedepends
behind.
2017-09-08 23:50:59 +00:00

72 lines
2.3 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 fnmatch
import pmb.config
import pmb.chroot.apk
import pmb.parse.arch
def carch(args, apkbuild, carch, strict=False):
if "noarch" in apkbuild["arch"]:
if "noarch_arch" in args and args.noarch_arch:
return args.noarch_arch
if strict:
return args.deviceinfo["arch"]
return args.arch_native
if carch:
if "all" not in apkbuild["arch"] and carch not in apkbuild["arch"]:
raise RuntimeError("Architecture '" + carch + "' is not supported"
" for this package. Please add it to the"
" 'arch=' line inside the APKBUILD and try"
" again: " + apkbuild["pkgname"])
return carch
if ("all" in apkbuild["arch"] or
args.arch_native in apkbuild["arch"]):
return args.arch_native
return apkbuild["arch"][0]
def suffix(args, apkbuild, carch):
if carch == args.arch_native:
return "native"
pkgname = apkbuild["pkgname"]
if pkgname.endswith("-repack"):
return "native"
if args.cross:
for pattern in pmb.config.build_cross_native:
if fnmatch.fnmatch(pkgname, pattern):
return "native"
return "buildroot_" + carch
def crosscompile(args, apkbuild, carch, suffix):
"""
:returns: None, "native" or "distcc"
"""
if not args.cross:
return None
if apkbuild["pkgname"].endswith("-repack"):
return None
if not pmb.parse.arch.cpu_emulation_required(args, carch):
return None
if suffix == "native":
return "native"
return "distcc"