1 From 7518b647ea0085c231a903c7a3e4351b2b2966c4 Mon Sep 17 00:00:00 2001
2 From: Jackie Huang <jackie.huang@windriver.com>
3 Date: Wed, 26 Jul 2023 17:23:55 +0800
4 Subject: [PATCH 1/4] debrepack: add arm64 support for meta data
6 Content-Type: text/plain; charset=UTF-8
7 Content-Transfer-Encoding: 8bit
9 Add set_build_arch (similar to set_build_type) so
10 @BUILD_ARCH@ can be used as placeholder in meta data
11 files to avoid hardcoded arch names.
13 The items in dl_path/dl_files in meta_data.yaml may
14 have different values and the patches in the patches
15 or deb_patches directory may be different for arm64
16 arch, this change will allow multiple dl_path/dl_files
17 items exist in meta_data.yaml, and multiple series files
18 in patches or deb_patches directories exist, and the
19 arch specific ones will be used as first priority if
22 The arch specific ones will have sufix like _arm64,
23 e.g. in meta_data.yaml
26 pkg-file-amd64.tar.gz:
28 url: https://path/to/pkg-file-amd64.tar.gz
29 sha256sum: <sha256sum value>
31 pkg-file-arm64.tar.gz:
33 url: https://path/to/pkg-file-arm64.tar.gz
34 sha256sum: <sha256sum value>
37 name: pkg-name-amd64.tar.gz
38 url: https://path/to/pkg-name-amd64.tar.gz
39 sha256sum: <sha256sum value>
41 name: pkg-name-arm64.tar.gz
42 url: https://path/to/pkg-name-arm64.tar.gz
43 sha256sum: <sha256sum value>
45 e.g. for patches/deb_patches
48 ├── 0001-deb-patch1.patch
49 ├── 0002-deb-patch2.patch
50 ├── 0003-arm64-deb-patch1.patch
57 ├── 0002-arm64-patch1.patch
62 PASS: update meta data for packages in repos:
65 PASS: downloader -s on x86-64 host
66 PASS: downloader -s on arm64 host
67 PASS: build-pkgs -p <pkg> on x86-64 host
68 PASS: build-pkgs -p <pkg> on arm64 host
69 PASS: build-pkgs on x86-64 host
70 PASS: build-image on x86-64 host
71 PASS: build-pkgs on arm64 host
72 PASS: build-image on arm64 host
73 PASS: Deploy AIO-SX on x86-64 target
74 PASS: Deploy AIO-SX on arm64 target
79 Change-Id: I42063364c416e40794d85af41e7a22366a84faa1
80 Signed-off-by: Jackie Huang <jackie.huang@windriver.com>
82 build-tools/stx/debrepack.py | 114 ++++++++++++++++++++++++++++-------
83 1 file changed, 93 insertions(+), 21 deletions(-)
85 diff --git a/build-tools/stx/debrepack.py b/build-tools/stx/debrepack.py
86 index 524b38d..85f593b 100755
87 --- a/build-tools/stx/debrepack.py
88 +++ b/build-tools/stx/debrepack.py
89 @@ -28,6 +28,7 @@ import sys
91 from utils import run_shell_cmd, get_download_url
96 RELEASENOTES = " ".join([os.environ.get('PROJECT'), os.environ.get('MY_RELEASE'), "distribution"])
97 @@ -58,7 +59,21 @@ if STX_MIRROR_STRATEGY is None:
98 STX_MIRROR_STRATEGY = "stx_mirror_first"
100 BTYPE = "@KERNEL_TYPE@"
101 +BARCH = "@BUILD_ARCH@"
104 +host_arch = platform.machine()
105 +if host_arch == 'aarch64':
108 +DL_FILES_DEFAULT = "dl_files"
109 +DL_FILES_ARCH = DL_FILES_DEFAULT + "_" + STX_ARCH
111 +DL_PATH_DEFAULT = "dl_path"
112 +DL_PATH_ARCH = DL_PATH_DEFAULT + "_" + STX_ARCH
114 +SERIES_DEFAULT = "series"
115 +SERIES_ARCH = SERIES_DEFAULT + "_" + STX_ARCH
117 class DownloadProgress():
119 @@ -296,6 +311,16 @@ class Parser():
121 self.pkginfo["debfolder"] = os.path.join(local_debian)
123 + def set_build_arch(self):
125 + local_debian = os.path.join(self.pkginfo["packdir"], "local_debian")
127 + # clean @BUILD_ARCH@
128 + sed_cmd = 'sed -i s#%s#%s#g %s'
129 + for root, _, files in os.walk(local_debian):
131 + run_shell_cmd(sed_cmd % (BARCH, STX_ARCH, os.path.join(root, name)), self.logger)
133 def get_gitrevcount_srcdir(self, gitrevcount_obj):
134 src_dir = str(gitrevcount_obj.get("SRC_DIR", ""))
136 @@ -463,8 +488,14 @@ class Parser():
137 self.logger.info("Overwrite the debian folder by %s", metadata)
138 run_shell_cmd('cp -r %s/* %s' % (metadata, deb_folder), self.logger)
140 - series = os.path.join(metadata, "patches/series")
141 - if not os.path.isfile(series):
142 + series_default = os.path.join(metadata, "patches", SERIES_DEFAULT)
143 + series_arch = os.path.join(metadata, "patches", SERIES_ARCH)
145 + if os.path.isfile(series_arch):
146 + series = series_arch
147 + elif os.path.isfile(series_default):
148 + series = series_default
152 format_ver, format_type = self.set_deb_format()
153 @@ -497,11 +528,16 @@ class Parser():
154 run_shell_cmd('cp -rL %s %s' % (src_file, self.pkginfo["srcdir"]),
157 - if "dl_files" in self.meta_data:
158 + dl_files = DL_FILES_DEFAULT
159 + # Arch specific dl_files have higher priority
160 + if DL_FILES_ARCH in self.meta_data:
161 + dl_files = DL_FILES_ARCH
163 + if dl_files in self.meta_data:
165 os.chdir(self.pkginfo["packdir"])
166 - for dl_file in self.meta_data['dl_files']:
167 - dir_name = self.meta_data['dl_files'][dl_file]['topdir']
168 + for dl_file in self.meta_data[dl_files]:
169 + dir_name = self.meta_data[dl_files][dl_file]['topdir']
170 dl_path = os.path.join(self.pkginfo["packdir"], dl_file)
171 if not os.path.exists(dl_path):
172 self.logger.error("No such file %s in local mirror", dl_file)
173 @@ -537,8 +573,15 @@ class Parser():
174 def apply_src_patches(self):
176 format_ver, format_type = self.set_deb_format()
177 - series = os.path.join(self.pkginfo["debfolder"], "patches/series")
178 - if not os.path.isfile(series):
180 + series_default = os.path.join(self.pkginfo["debfolder"], "patches", SERIES_DEFAULT)
181 + series_arch = os.path.join(self.pkginfo["debfolder"], "patches", SERIES_ARCH)
183 + if os.path.isfile(series_arch):
184 + series = series_arch
185 + elif os.path.isfile(series_default):
186 + series = series_default
191 @@ -547,7 +590,13 @@ class Parser():
194 patches_folder = os.path.join(self.pkginfo["srcdir"], "debian/patches")
195 - series_file = os.path.join(self.pkginfo["srcdir"], "debian/patches/series")
196 + series_file_default = os.path.join(patches_folder, SERIES_DEFAULT)
197 + series_file_arch = os.path.join(patches_folder, SERIES_ARCH)
199 + series_file = series_file_default
200 + if os.path.isfile(series_file_arch):
201 + series_file = series_file_arch
203 if not os.path.isdir(patches_folder):
204 os.mkdir(patches_folder)
205 os.mknod(series_file)
206 @@ -587,9 +636,16 @@ class Parser():
208 def apply_deb_patches(self):
210 - series = os.path.join(self.pkginfo["debfolder"], "deb_patches/series")
211 - if not os.path.isfile(series):
212 + series_default = os.path.join(self.pkginfo["debfolder"], "deb_patches", SERIES_DEFAULT)
213 + series_arch = os.path.join(self.pkginfo["debfolder"], "deb_patches", SERIES_ARCH)
215 + if os.path.isfile(series_arch):
216 + series = series_arch
217 + elif os.path.isfile(series_default):
218 + series = series_default
223 patches = f.readlines()
224 patches_src = os.path.dirname(series)
225 @@ -609,8 +665,12 @@ class Parser():
228 def extract_tarball(self):
229 + # Arch specific dl_path have higher priority
230 + dl_path = DL_PATH_DEFAULT
231 + if DL_PATH_ARCH in self.meta_data:
232 + dl_path = DL_PATH_ARCH
234 - tarball_name = self.meta_data["dl_path"]["name"]
235 + tarball_name = self.meta_data[dl_path]["name"]
236 tarball_file = os.path.join(self.pkginfo["packdir"], tarball_name)
238 cmd, _, _ = tar_cmd(tarball_name, self.logger)
239 @@ -715,9 +775,15 @@ class Parser():
243 - if "dl_files" in self.meta_data:
244 - for dl_file in self.meta_data['dl_files']:
245 - dl_file_info = self.meta_data['dl_files'][dl_file]
247 + dl_files = DL_FILES_DEFAULT
248 + # Arch specific dl_files have higher priority
249 + if DL_FILES_ARCH in self.meta_data:
250 + dl_files = DL_FILES_ARCH
252 + if dl_files in self.meta_data:
253 + for dl_file in self.meta_data[dl_files]:
254 + dl_file_info = self.meta_data[dl_files][dl_file]
255 url = dl_file_info['url']
256 if "sha256sum" in dl_file_info:
257 check_cmd = "sha256sum"
258 @@ -739,16 +805,21 @@ class Parser():
259 if not checksum(dl_file, check_sum, check_cmd, self.logger):
260 raise Exception(f'Fail to download {dl_file}')
262 - if "dl_path" in self.meta_data:
263 - dl_file = self.meta_data["dl_path"]["name"]
264 - url = self.meta_data["dl_path"]["url"]
265 - if "sha256sum" in self.meta_data["dl_path"]:
266 + dl_path = DL_PATH_DEFAULT
267 + # Arch specific dl_path have higher priority
268 + if DL_PATH_ARCH in self.meta_data:
269 + dl_path = DL_PATH_ARCH
271 + if dl_path in self.meta_data:
272 + dl_file = self.meta_data[dl_path]["name"]
273 + url = self.meta_data[dl_path]["url"]
274 + if "sha256sum" in self.meta_data[dl_path]:
275 check_cmd = "sha256sum"
276 - check_sum = self.meta_data["dl_path"]['sha256sum']
277 + check_sum = self.meta_data[dl_path]['sha256sum']
279 self.logger.warning(f"{dl_file} missing sha256sum")
281 - check_sum = self.meta_data["dl_path"]['md5sum']
282 + check_sum = self.meta_data[dl_path]['md5sum']
283 if not checksum(dl_file, check_sum, check_cmd, self.logger):
284 (dl_url, alt_dl_url) = get_download_url(url, self.strategy)
286 @@ -813,6 +884,7 @@ class Parser():
287 os.mkdir(self.pkginfo["packdir"])
289 self.set_build_type()
290 + self.set_build_arch()
292 logfile = os.path.join(self.pkginfo["packdir"], self.pkginfo["pkgname"] + ".log")
293 if os.path.exists(logfile):
294 @@ -832,7 +904,7 @@ class Parser():
296 if "dl_hook" in self.meta_data:
298 - elif "dl_path" in self.meta_data:
299 + elif (DL_PATH_DEFAULT or DL_PATH_ARCH) in self.meta_data:
300 self.extract_tarball()
301 elif "src_path" in self.meta_data:
302 self.create_src_package()