[elbe-devel] [PATCH v2 2/4] Add optional mirror for host architecture
Kory Maincent
kory.maincent at bootlin.com
Fri Jun 12 21:04:57 CEST 2020
If the primary mirror does not contain the packages for both target and host
architecture the build_host_sysroot process fails.
This patch adds support for describing in the XML configuration an additional
optional mirror containing packages for the host architecture, like:
<mirror>
<host>http://archive.ubuntu.com/ubuntu</host>
</mirror>
It also adds the architecture type in the sources.list file to avoid issues
with apt-get update.
Signed-off-by: Kory Maincent <kory.maincent at bootlin.com>
---
elbepack/elbexml.py | 36 ++++++++++++++++++++++++------------
elbepack/rfs.py | 30 +++++++++++++++++++++---------
schema/dbsfed.xsd | 7 +++++++
3 files changed, 52 insertions(+), 21 deletions(-)
diff --git a/elbepack/elbexml.py b/elbepack/elbexml.py
index fa81583..f0e3307 100644
--- a/elbepack/elbexml.py
+++ b/elbepack/elbexml.py
@@ -14,6 +14,8 @@ from elbepack.treeutils import etree
from elbepack.validate import validate_xml
from elbepack.xmldefaults import ElbeDefaults
+from elbepack.shellhelper import get_command_out
+
from elbepack.version import elbe_version, is_devel
try:
from urllib.request import (urlopen, install_opener, build_opener,
@@ -132,13 +134,16 @@ class ElbeXML(object):
return mirror.replace("LOCALMACHINE", "10.0.2.2")
- def get_primary_mirror(self, cdrompath, initvm=True):
+ def get_primary_mirror(self, cdrompath, initvm=True, hostsdk=False):
if self.prj.has("mirror/primary_host"):
m = self.prj.node("mirror")
- mirror = m.text("primary_proto") + "://"
- mirror += m.text("primary_host") + "/"
- mirror += m.text("primary_path")
+ if hostsdk and self.prj.has("mirror/host"):
+ mirror = m.text("host")
+ else:
+ mirror = m.text("primary_proto") + "://"
+ mirror += m.text("primary_host") + "/"
+ mirror += m.text("primary_path")
elif self.prj.has("mirror/cdrom") and cdrompath:
mirror = "file://%s" % cdrompath
@@ -146,7 +151,7 @@ class ElbeXML(object):
return replace_localmachine(mirror, initvm)
# XXX: maybe add cdrom path param ?
- def create_apt_sources_list(self, build_sources=False, initvm=True):
+ def create_apt_sources_list(self, build_sources=False, initvm=True, hostsdk=False):
if self.prj is None:
return "# No Project"
@@ -155,24 +160,31 @@ class ElbeXML(object):
noauth = ""
if self.prj.has("noauth"):
- noauth = "[trusted=yes] "
+ noauth = "trusted=yes "
+
+ if hostsdk:
+ arch = get_command_out("dpkg --print-architecture").strip().decode()
+ else:
+ arch = self.text("project/buildimage/arch", key="arch")
mirror = ""
+ option = "[" + noauth + " arch=" + arch +"] "
if self.prj.has("mirror/primary_host"):
- mirror += "deb " + noauth + self.get_primary_mirror(None)
+ mirror += "deb " + option + self.get_primary_mirror(None, hostsdk=hostsdk)
mirror += " " + self.prj.text("suite") + " main\n"
+
if build_sources:
- mirror += "deb-src " + noauth + self.get_primary_mirror(None)
+ mirror += "deb-src " + option + self.get_primary_mirror(None, hostsdk=hostsdk)
mirror += " " + self.prj.text("suite") + " main\n"
- if self.prj.has("mirror/url-list"):
+ if self.prj.has("mirror/url-list") and not hostsdk:
for url in self.prj.node("mirror/url-list"):
if url.has("binary"):
- mirror += "deb " + noauth + \
- url.text("binary").strip() + "\n"
+ mirror += "deb " + option + \
+ url.text("binary").strip() + "\n"
if url.has("source"):
- mirror += "deb-src " + noauth + \
+ mirror += "deb-src " + option + \
url.text("source").strip() + "\n"
if self.prj.has("mirror/cdrom"):
diff --git a/elbepack/rfs.py b/elbepack/rfs.py
index 6967d28..85c3d4b 100644
--- a/elbepack/rfs.py
+++ b/elbepack/rfs.py
@@ -96,7 +96,14 @@ class BuildEnv (object):
self.fresh_debootstrap = False
self.need_dumpdebootstrap = False
- self.initialize_dirs(build_sources=build_sources)
+ host_arch = get_command_out("dpkg --print-architecture").strip().decode()
+
+ if arch == host_arch:
+ hostsdk = True
+ else:
+ hostsdk = False
+
+ self.initialize_dirs(build_sources=build_sources, hostsdk=hostsdk)
create_apt_prefs(self.xml, self.rfs)
def cdrom_umount(self):
@@ -161,8 +168,18 @@ class BuildEnv (object):
cleanup = False
suite = self.xml.prj.text("suite")
+ if arch == "default":
+ arch = self.xml.text("project/buildimage/arch", key="arch")
+
+ host_arch = get_command_out("dpkg --print-architecture").strip().decode()
+
+ if arch == host_arch:
+ hostsdk = True
+ else:
+ hostsdk = False
+
primary_mirror = self.xml.get_primary_mirror(
- self.rfs.fname('/cdrom/targetrepo'))
+ self.rfs.fname('/cdrom/targetrepo'), hostsdk=hostsdk)
if self.xml.prj.has("mirror/primary_proxy"):
os.environ["no_proxy"] = "10.0.2.2,localhost,127.0.0.1"
@@ -183,11 +200,6 @@ class BuildEnv (object):
logging.info("Debootstrap log")
- if arch == "default":
- arch = self.xml.text("project/buildimage/arch", key="arch")
-
- host_arch = get_command_out("dpkg --print-architecture").strip().decode()
-
includepkgs = None
strapcmd = 'debootstrap '
if self.xml.has("target/debootstrapvariant"):
@@ -297,8 +309,8 @@ class BuildEnv (object):
key = "\n".join(line.strip(" \t") for line in url.text('raw-key').splitlines()[1:-1])
self.add_key(key)
- def initialize_dirs(self, build_sources=False):
- mirror = self.xml.create_apt_sources_list(build_sources=build_sources)
+ def initialize_dirs(self, build_sources=False, hostsdk=False):
+ mirror = self.xml.create_apt_sources_list(build_sources=build_sources, hostsdk=hostsdk)
if self.rfs.lexists("etc/apt/sources.list"):
self.rfs.remove("etc/apt/sources.list")
diff --git a/schema/dbsfed.xsd b/schema/dbsfed.xsd
index a78501e..e3709de 100644
--- a/schema/dbsfed.xsd
+++ b/schema/dbsfed.xsd
@@ -273,6 +273,13 @@
</documentation>
</annotation>
</element>
+ <element name="host" type="rfs:string" minOccurs="0" maxOccurs="1">
+ <annotation>
+ <documentation>
+ Url of the host mirror.
+ </documentation>
+ </annotation>
+ </element>
<element name="url-list" type="rfs:url-list" minOccurs="0">
<annotation>
<documentation>
--
2.17.1
More information about the elbe-devel
mailing list