forked from Mirror/pmbootstrap
In case the user does not specify for which arch packages should be built with `pmbootstrap build`, we detect it automatically. Previous logic was, that if the APKBUILD's arch is "all" or "noarch", then prefer the native arch, and otherwise use the first one in the list of available arches. New behavior is, that we also check if the list of possible arches contains the native arch (and if that fails, the device arch). If that is the case, we return the native/device arch instead of the first one in the list. ### Use case The arch from `gcc-armhf` and similar packages (as generated by `pmbootstrap aportgen`) used to be "all", but is nowadays a specific list of arches. This means, that after updating the `gcc-armhf` and `gcc-aarch64` packages, and calling `pmbootstrap build gcc-armhf`, it will try to build `gcc-armhf` for `aarch64` instead of the native architecture, because that is the first one listed. And since compiling to `aarch64` requires `gcc-aarch64`, it will build that for the native architecture first. So you're asking for `gcc-armhf` and it compiles `gcc-aarch64`, which is very confusing (see #1272).
102 lines
2.9 KiB
Python
102 lines
2.9 KiB
Python
"""
|
|
Copyright 2018 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 logging
|
|
import os
|
|
|
|
import pmb.config
|
|
import pmb.chroot.apk
|
|
import pmb.parse.arch
|
|
|
|
|
|
def arch_from_deviceinfo(args, pkgname, aport):
|
|
"""
|
|
The device- packages are noarch packages. But it only makes sense to build
|
|
them for the device's architecture, which is specified in the deviceinfo
|
|
file.
|
|
|
|
:returns: None (no deviceinfo file)
|
|
arch from the deviceinfo (e.g. "armhf")
|
|
"""
|
|
# Require a deviceinfo file in the aport
|
|
if not pkgname.startswith("device-"):
|
|
return
|
|
deviceinfo = aport + "/deviceinfo"
|
|
if not os.path.exists(deviceinfo):
|
|
return
|
|
|
|
# Return its arch
|
|
device = pkgname.split("-", 1)[1]
|
|
arch = pmb.parse.deviceinfo(args, device)["arch"]
|
|
logging.verbose(pkgname + ": arch from deviceinfo: " + arch)
|
|
return arch
|
|
|
|
|
|
def arch(args, pkgname):
|
|
"""
|
|
Find a good default in case the user did not specify for which architecture
|
|
a package should be built.
|
|
|
|
:returns: arch string like "x86_64" or "armhf". Preferred order, depending
|
|
on what is supported by the APKBUILD:
|
|
* native arch
|
|
* device arch
|
|
* first arch in the APKBUILD
|
|
"""
|
|
aport = pmb.build.find_aport(args, pkgname)
|
|
ret = arch_from_deviceinfo(args, pkgname, aport)
|
|
if ret:
|
|
return ret
|
|
|
|
apkbuild = pmb.parse.apkbuild(args, aport + "/APKBUILD")
|
|
arches = apkbuild["arch"]
|
|
if "noarch" in arches or "all" in arches or args.arch_native in arches:
|
|
return args.arch_native
|
|
|
|
arch_device = args.deviceinfo["arch"]
|
|
if arch_device in arches:
|
|
return arch_device
|
|
|
|
return apkbuild["arch"][0]
|
|
|
|
|
|
def suffix(args, apkbuild, arch):
|
|
if arch == args.arch_native:
|
|
return "native"
|
|
|
|
pkgname = apkbuild["pkgname"]
|
|
if args.cross:
|
|
for pattern in pmb.config.build_cross_native:
|
|
if fnmatch.fnmatch(pkgname, pattern):
|
|
return "native"
|
|
|
|
return "buildroot_" + arch
|
|
|
|
|
|
def crosscompile(args, apkbuild, arch, suffix):
|
|
"""
|
|
:returns: None, "native" or "distcc"
|
|
"""
|
|
if not args.cross:
|
|
return None
|
|
if not pmb.parse.arch.cpu_emulation_required(args, arch):
|
|
return None
|
|
if suffix == "native":
|
|
return "native"
|
|
return "distcc"
|