diff options
-rw-r--r-- | meta/classes/package.bbclass | 85 |
1 files changed, 82 insertions, 3 deletions
diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass index 58de841666..e17627eaac 100644 --- a/meta/classes/package.bbclass +++ b/meta/classes/package.bbclass | |||
@@ -318,6 +318,76 @@ python package_do_split_locales() { | |||
318 | #bb.data.setVar('RDEPENDS_%s' % mainpkg, ' '.join(rdep), d) | 318 | #bb.data.setVar('RDEPENDS_%s' % mainpkg, ' '.join(rdep), d) |
319 | } | 319 | } |
320 | 320 | ||
321 | def copyfile(src,dest,newmtime=None,sstat=None): | ||
322 | """ | ||
323 | Copies a file from src to dest, preserving all permissions and | ||
324 | attributes; mtime will be preserved even when moving across | ||
325 | filesystems. Returns true on success and false on failure. | ||
326 | """ | ||
327 | import os, stat, shutil, commands | ||
328 | |||
329 | #print "copyfile("+src+","+dest+","+str(newmtime)+","+str(sstat)+")" | ||
330 | try: | ||
331 | if not sstat: | ||
332 | sstat=os.lstat(src) | ||
333 | except Exception, e: | ||
334 | print "copyfile: Stating source file failed...", e | ||
335 | return False | ||
336 | |||
337 | destexists=1 | ||
338 | try: | ||
339 | dstat=os.lstat(dest) | ||
340 | except: | ||
341 | dstat=os.lstat(os.path.dirname(dest)) | ||
342 | destexists=0 | ||
343 | |||
344 | if destexists: | ||
345 | if stat.S_ISLNK(dstat[stat.ST_MODE]): | ||
346 | try: | ||
347 | os.unlink(dest) | ||
348 | destexists=0 | ||
349 | except Exception, e: | ||
350 | pass | ||
351 | |||
352 | if stat.S_ISLNK(sstat[stat.ST_MODE]): | ||
353 | try: | ||
354 | target=os.readlink(src) | ||
355 | if destexists and not stat.S_ISDIR(dstat[stat.ST_MODE]): | ||
356 | os.unlink(dest) | ||
357 | os.symlink(target,dest) | ||
358 | #os.lchown(dest,sstat[stat.ST_UID],sstat[stat.ST_GID]) | ||
359 | return os.lstat(dest) | ||
360 | except Exception, e: | ||
361 | print "copyfile: failed to properly create symlink:", dest, "->", target, e | ||
362 | return False | ||
363 | |||
364 | if stat.S_ISREG(sstat[stat.ST_MODE]): | ||
365 | try: # For safety copy then move it over. | ||
366 | shutil.copyfile(src,dest+"#new") | ||
367 | os.rename(dest+"#new",dest) | ||
368 | except Exception, e: | ||
369 | print 'copyfile: copy', src, '->', dest, 'failed.', e | ||
370 | return False | ||
371 | else: | ||
372 | #we don't yet handle special, so we need to fall back to /bin/mv | ||
373 | a=commands.getstatusoutput("/bin/cp -f "+"'"+src+"' '"+dest+"'") | ||
374 | if a[0]!=0: | ||
375 | print "copyfile: Failed to copy special file:" + src + "' to '" + dest + "'", a | ||
376 | return False # failure | ||
377 | try: | ||
378 | os.lchown(dest,sstat[stat.ST_UID],sstat[stat.ST_GID]) | ||
379 | os.chmod(dest, stat.S_IMODE(sstat[stat.ST_MODE])) # Sticky is reset on chown | ||
380 | except Exception, e: | ||
381 | print "copyfile: Failed to chown/chmod/unlink", dest, e | ||
382 | return False | ||
383 | |||
384 | if newmtime: | ||
385 | os.utime(dest,(newmtime,newmtime)) | ||
386 | else: | ||
387 | os.utime(dest, (sstat[stat.ST_ATIME], sstat[stat.ST_MTIME])) | ||
388 | newmtime=sstat[stat.ST_MTIME] | ||
389 | return newmtime | ||
390 | |||
321 | python populate_packages () { | 391 | python populate_packages () { |
322 | import glob, stat, errno, re | 392 | import glob, stat, errno, re |
323 | 393 | ||
@@ -380,6 +450,8 @@ python populate_packages () { | |||
380 | pkgdest = bb.data.getVar('PKGDEST', d, 1) | 450 | pkgdest = bb.data.getVar('PKGDEST', d, 1) |
381 | os.system('rm -rf %s' % pkgdest) | 451 | os.system('rm -rf %s' % pkgdest) |
382 | 452 | ||
453 | seen = [] | ||
454 | |||
383 | for pkg in package_list: | 455 | for pkg in package_list: |
384 | localdata = bb.data.createCopy(d) | 456 | localdata = bb.data.createCopy(d) |
385 | root = os.path.join(pkgdest, pkg) | 457 | root = os.path.join(pkgdest, pkg) |
@@ -410,11 +482,17 @@ python populate_packages () { | |||
410 | continue | 482 | continue |
411 | if (not os.path.islink(file)) and (not os.path.exists(file)): | 483 | if (not os.path.islink(file)) and (not os.path.exists(file)): |
412 | continue | 484 | continue |
485 | if file in seen: | ||
486 | continue | ||
487 | seen.append(file) | ||
488 | if os.path.isdir(file): | ||
489 | bb.mkdirhier(os.path.join(root,file)) | ||
490 | continue | ||
413 | fpath = os.path.join(root,file) | 491 | fpath = os.path.join(root,file) |
414 | dpath = os.path.dirname(fpath) | 492 | dpath = os.path.dirname(fpath) |
415 | bb.mkdirhier(dpath) | 493 | bb.mkdirhier(dpath) |
416 | ret = bb.movefile(file,fpath) | 494 | ret = copyfile(file, fpath) |
417 | if ret is None or ret == 0: | 495 | if ret is False or ret == 0: |
418 | raise bb.build.FuncFailed("File population failed") | 496 | raise bb.build.FuncFailed("File population failed") |
419 | del localdata | 497 | del localdata |
420 | os.chdir(workdir) | 498 | os.chdir(workdir) |
@@ -423,7 +501,8 @@ python populate_packages () { | |||
423 | for root, dirs, files in os.walk(dvar): | 501 | for root, dirs, files in os.walk(dvar): |
424 | for f in files: | 502 | for f in files: |
425 | path = os.path.join(root[len(dvar):], f) | 503 | path = os.path.join(root[len(dvar):], f) |
426 | unshipped.append(path) | 504 | if ('.' + path) not in seen: |
505 | unshipped.append(path) | ||
427 | 506 | ||
428 | if unshipped != []: | 507 | if unshipped != []: |
429 | bb.note("the following files were installed but not shipped in any package:") | 508 | bb.note("the following files were installed but not shipped in any package:") |