summaryrefslogtreecommitdiffstats
path: root/meta/lib/oe/package_manager.py
diff options
context:
space:
mode:
authorLaurentiu Palcu <laurentiu.palcu@intel.com>2014-01-13 10:10:09 +0200
committerRichard Purdie <richard.purdie@linuxfoundation.org>2014-02-11 11:53:39 +0000
commited83ace10a850aec516d492c5a2f7508d9749910 (patch)
tree4befc22e733b8989d5ac1c7759e730a6b6e9ca03 /meta/lib/oe/package_manager.py
parent2979098c57d827b95c5be6d08f5d7dec4ef50599 (diff)
downloadpoky-ed83ace10a850aec516d492c5a2f7508d9749910.tar.gz
lib/oe/package_manager.py: add support for opkg backend
Additionaly, the commit contains a couple of minor changes (comments, error printing, etc). (From OE-Core rev: ef3faaef6b1a25c943a8d5594ce55b0e558b62f3) Signed-off-by: Laurentiu Palcu <laurentiu.palcu@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/lib/oe/package_manager.py')
-rw-r--r--meta/lib/oe/package_manager.py218
1 files changed, 210 insertions, 8 deletions
diff --git a/meta/lib/oe/package_manager.py b/meta/lib/oe/package_manager.py
index fd86938ced..e06ded401a 100644
--- a/meta/lib/oe/package_manager.py
+++ b/meta/lib/oe/package_manager.py
@@ -14,7 +14,7 @@ def create_index(arg):
14 subprocess.check_output(index_cmd, shell=True) 14 subprocess.check_output(index_cmd, shell=True)
15 except subprocess.CalledProcessError as e: 15 except subprocess.CalledProcessError as e:
16 return("Index creation command %s failed with return code %d!" % 16 return("Index creation command %s failed with return code %d!" %
17 (' '.join(e.cmd), e.returncode)) 17 (e.cmd, e.returncode))
18 18
19 return None 19 return None
20 20
@@ -54,8 +54,7 @@ class PackageManager(object):
54 pass 54 pass
55 55
56 """ 56 """
57 This function creates the Packages.gz files in each arch directory in 57 This function creates the index files
58 DEPLOY_DIR_DEB.
59 """ 58 """
60 @abstractmethod 59 @abstractmethod
61 def write_index(self): 60 def write_index(self):
@@ -138,12 +137,215 @@ class RpmPM(PackageManager):
138 137
139 138
140class OpkgPM(PackageManager): 139class OpkgPM(PackageManager):
141 def __init__(self): 140 def __init__(self, d, target_rootfs, config_file, archs):
142 super(OpkgPM, self).__init__() 141 super(OpkgPM, self).__init__(d)
143 142
144 """ 143 self.target_rootfs = target_rootfs
145 TBD 144 self.config_file = config_file
146 """ 145 self.pkg_archs = archs
146
147 self.deploy_dir = self.d.getVar("DEPLOY_DIR_IPK", True)
148 self.deploy_lock_file = os.path.join(self.deploy_dir, "deploy.lock")
149
150 self.opkg_cmd = bb.utils.which(os.getenv('PATH'), "opkg-cl")
151 self.opkg_args = "-f %s -o %s " % (self.config_file, target_rootfs)
152 self.opkg_args += self.d.getVar("OPKG_ARGS", True)
153
154 opkg_lib_dir = self.d.getVar('OPKGLIBDIR', True)
155 if opkg_lib_dir[0] == "/":
156 opkg_lib_dir = opkg_lib_dir[1:]
157
158 self.opkg_dir = os.path.join(target_rootfs, opkg_lib_dir, "opkg")
159
160 bb.utils.mkdirhier(self.opkg_dir)
161
162 self._create_config()
163
164 def _create_config(self):
165 with open(self.config_file, "w+") as config_file:
166 priority = 1
167 for arch in self.pkg_archs.split():
168 config_file.write("arch %s %d\n" % (arch, priority))
169 priority += 5
170
171 config_file.write("src oe file:%s\n" % self.deploy_dir)
172
173 for arch in self.pkg_archs.split():
174 pkgs_dir = os.path.join(self.deploy_dir, arch)
175 if os.path.isdir(pkgs_dir):
176 config_file.write("src oe-%s file:%s\n" % (arch, pkgs_dir))
177
178 def update(self):
179 self.deploy_dir_lock()
180
181 cmd = "%s %s update" % (self.opkg_cmd, self.opkg_args)
182
183 try:
184 subprocess.check_output(cmd.split())
185 except subprocess.CalledProcessError as e:
186 self.deploy_dir_unlock()
187 bb.fatal("Unable to update the package index files. Command %s "
188 "returned %d" % (cmd, e.returncode))
189
190 self.deploy_dir_unlock()
191
192 def install(self, pkgs, attempt_only=False):
193 cmd = "%s %s install %s" % (self.opkg_cmd, self.opkg_args, ' '.join(pkgs))
194
195 os.environ['D'] = self.target_rootfs
196 os.environ['OFFLINE_ROOT'] = self.target_rootfs
197 os.environ['IPKG_OFFLINE_ROOT'] = self.target_rootfs
198 os.environ['OPKG_OFFLINE_ROOT'] = self.target_rootfs
199 os.environ['INTERCEPT_DIR'] = os.path.join(self.d.getVar('WORKDIR', True),
200 "intercept_scripts")
201 os.environ['NATIVE_ROOT'] = self.d.getVar('STAGING_DIR_NATIVE', True)
202
203 try:
204 bb.note("Installing the following packages: %s" % ' '.join(pkgs))
205 subprocess.check_output(cmd.split())
206 except subprocess.CalledProcessError as e:
207 (bb.fatal, bb.note)[attempt_only]("Unable to install packages. "
208 "Command %s returned %d" %
209 (cmd, e.returncode))
210
211 def remove(self, pkgs, with_dependencies=True):
212 if with_dependencies:
213 cmd = "%s %s remove %s" % \
214 (self.opkg_cmd, self.opkg_args, ' '.join(pkgs))
215 else:
216 cmd = "%s %s --force-depends remove %s" % \
217 (self.opkg_cmd, self.opkg_args, ' '.join(pkgs))
218
219 try:
220 subprocess.check_output(cmd.split())
221 except subprocess.CalledProcessError as e:
222 bb.fatal("Unable to remove packages. Command %s "
223 "returned %d" % (e.cmd, e.returncode))
224
225 def write_index(self):
226 arch_vars = ["ALL_MULTILIB_PACKAGE_ARCHS",
227 "SDK_PACKAGE_ARCHS",
228 "MULTILIB_ARCHS"]
229
230 tmpdir = self.d.getVar('TMPDIR', True)
231 if os.path.exists(os.path.join(tmpdir, "stamps", "IPK_PACKAGE_INDEX_CLEAN")):
232 return
233
234 self.deploy_dir_lock()
235
236 opkg_index_cmd = bb.utils.which(os.getenv('PATH'), "opkg-make-index")
237
238 if not os.path.exists(os.path.join(self.deploy_dir, "Packages")):
239 open(os.path.join(self.deploy_dir, "Packages"), "w").close()
240
241 index_cmds = []
242 for arch_var in arch_vars:
243 archs = self.d.getVar(arch_var, True)
244 if archs is None:
245 continue
246
247 for arch in archs.split():
248 pkgs_dir = os.path.join(self.deploy_dir, arch)
249 pkgs_file = os.path.join(pkgs_dir, "Packages")
250
251 if not os.path.isdir(pkgs_dir):
252 continue
253
254 if not os.path.exists(pkgs_file):
255 open(pkgs_file, "w").close()
256
257 index_cmds.append('%s -r %s -p %s -m %s' %
258 (opkg_index_cmd, pkgs_file, pkgs_file, pkgs_dir))
259
260 if len(index_cmds) == 0:
261 self.deploy_dir_unlock()
262 bb.fatal("There are no packages in %s!" % self.deploy_dir)
263
264 nproc = multiprocessing.cpu_count()
265 pool = bb.utils.multiprocessingpool(nproc)
266 results = list(pool.imap(create_index, index_cmds))
267 pool.close()
268 pool.join()
269
270 self.deploy_dir_unlock()
271
272 for result in results:
273 if result is not None:
274 bb.fatal(result)
275
276 open(os.path.join(tmpdir, "stamps", "IPK_PACKAGE_INDEX_CLEAN"), "w").close()
277
278 def remove_packaging_data(self):
279 bb.utils.remove(self.opkg_dir)
280 # create the directory back, it's needed by PM lock
281 bb.utils.mkdirhier(self.opkg_dir)
282
283 def list_installed(self, format=None):
284 opkg_query_cmd = bb.utils.which(os.getenv('PATH'), "opkg-query-helper.py")
285
286 if format == "arch":
287 cmd = "%s %s status | %s -a" % \
288 (self.opkg_cmd, self.opkg_args, opkg_query_cmd)
289 elif format == "file":
290 cmd = "%s %s status | %s -f" % \
291 (self.opkg_cmd, self.opkg_args, opkg_query_cmd)
292 elif format == "ver":
293 cmd = "%s %s status | %s -v" % \
294 (self.opkg_cmd, self.opkg_args, opkg_query_cmd)
295 else:
296 cmd = "%s %s list_installed | cut -d' ' -f1" % \
297 (self.opkg_cmd, self.opkg_args)
298
299 try:
300 output = subprocess.check_output(cmd, shell=True).strip()
301 except subprocess.CalledProcessError as e:
302 bb.fatal("Cannot get the installed packages list. Command %s "
303 "returned %d" % (cmd, e.returncode))
304
305 if format == "file":
306 tmp_output = ""
307 for pkg, pkg_file, pkg_arch in tuple(output.split('\n')):
308 full_path = os.path.join(self.deploy_dir, pkg_arch, pkg_file)
309 if os.path.exists(full_path):
310 tmp_output += "%s %s %s\n" % (pkg, full_path, pkg_arch)
311 else:
312 tmp_output += "%s %s %s\n" % (pkg, pkg_file, pkg_arch)
313
314 output = tmp_output
315
316 return output
317
318 def handle_bad_recommendations(self):
319 bad_recommendations = self.d.getVar("BAD_RECOMMENDATIONS", True)
320 if bad_recommendations is None:
321 return
322
323 status_file = os.path.join(self.opkg_dir, "status")
324
325 cmd = [self.opkg_cmd, self.opkg_args, "info"]
326
327 with open(status_file, "w+") as status:
328 for pkg in bad_recommendations.split():
329 pkg_info = cmd + [pkg]
330
331 try:
332 output = subprocess.check_output(pkg_info).strip()
333 except subprocess.CalledProcessError as e:
334 bb.fatal("Cannot get package info. Command %s "
335 "returned %d" % (' '.join(pkg_info), e.returncode))
336
337 if output == "":
338 bb.note("Requested ignored recommendation $i is "
339 "not a package" % pkg)
340 continue
341
342 for line in output.split('\n'):
343 if line.startswith("Package:") or \
344 line.startswith("Architecture:") or \
345 line.startswith("Version:"):
346 status.write(line)
347
348 status.write("Status: deinstall hold not-installed\n")
147 349
148 350
149class DpkgPM(PackageManager): 351class DpkgPM(PackageManager):