diff options
Diffstat (limited to 'meta/classes/package.bbclass')
-rw-r--r-- | meta/classes/package.bbclass | 253 |
1 files changed, 243 insertions, 10 deletions
diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass index 8f91c95ca6..0161c68054 100644 --- a/meta/classes/package.bbclass +++ b/meta/classes/package.bbclass | |||
@@ -16,24 +16,26 @@ | |||
16 | # d) split_and_strip_files - split the files into runtime and debug and strip them. | 16 | # d) split_and_strip_files - split the files into runtime and debug and strip them. |
17 | # Debug files include debug info split, and associated sources that end up in -dbg packages | 17 | # Debug files include debug info split, and associated sources that end up in -dbg packages |
18 | # | 18 | # |
19 | # e) populate_packages - Split the files in PKGD into separate packages in PKGDEST/<pkgname> | 19 | # e) fixup_perms - Fix up permissions in the package before we split it. |
20 | # | ||
21 | # f) populate_packages - Split the files in PKGD into separate packages in PKGDEST/<pkgname> | ||
20 | # Also triggers the binary stripping code to put files in -dbg packages. | 22 | # Also triggers the binary stripping code to put files in -dbg packages. |
21 | # | 23 | # |
22 | # f) package_do_filedeps - Collect perfile run-time dependency metadata | 24 | # g) package_do_filedeps - Collect perfile run-time dependency metadata |
23 | # The data is stores in FILER{PROVIDES,DEPENDS}_file_pkg variables with | 25 | # The data is stores in FILER{PROVIDES,DEPENDS}_file_pkg variables with |
24 | # a list of affected files in FILER{PROVIDES,DEPENDS}FLIST_pkg | 26 | # a list of affected files in FILER{PROVIDES,DEPENDS}FLIST_pkg |
25 | # | 27 | # |
26 | # g) package_do_shlibs - Look at the shared libraries generated and autotmatically add any | 28 | # h) package_do_shlibs - Look at the shared libraries generated and autotmatically add any |
27 | # depenedencies found. Also stores the package name so anyone else using this library | 29 | # depenedencies found. Also stores the package name so anyone else using this library |
28 | # knows which package to depend on. | 30 | # knows which package to depend on. |
29 | # | 31 | # |
30 | # h) package_do_pkgconfig - Keep track of which packages need and provide which .pc files | 32 | # i) package_do_pkgconfig - Keep track of which packages need and provide which .pc files |
31 | # | 33 | # |
32 | # i) read_shlibdeps - Reads the stored shlibs information into the metadata | 34 | # j) read_shlibdeps - Reads the stored shlibs information into the metadata |
33 | # | 35 | # |
34 | # j) package_depchains - Adds automatic dependencies to -dbg and -dev packages | 36 | # k) package_depchains - Adds automatic dependencies to -dbg and -dev packages |
35 | # | 37 | # |
36 | # k) emit_pkgdata - saves the packaging data into PKGDATA_DIR for use in later | 38 | # l) emit_pkgdata - saves the packaging data into PKGDATA_DIR for use in later |
37 | # packaging steps | 39 | # packaging steps |
38 | 40 | ||
39 | inherit packagedata | 41 | inherit packagedata |
@@ -237,7 +239,7 @@ def splitfile2(debugsrcdir, d): | |||
237 | # We need to ignore files that are not actually ours | 239 | # We need to ignore files that are not actually ours |
238 | # we do this by only paying attention to items from this package | 240 | # we do this by only paying attention to items from this package |
239 | processdebugsrc += "fgrep -z '%s' | " | 241 | processdebugsrc += "fgrep -z '%s' | " |
240 | processdebugsrc += "(cd '%s' ; cpio -pd0mL '%s%s' 2>/dev/null)" | 242 | processdebugsrc += "(cd '%s' ; cpio -pd0mL --no-preserve-owner '%s%s' 2>/dev/null)" |
241 | 243 | ||
242 | os.system(processdebugsrc % (sourcefile, workbasedir, workparentdir, dvar, debugsrcdir)) | 244 | os.system(processdebugsrc % (sourcefile, workbasedir, workparentdir, dvar, debugsrcdir)) |
243 | 245 | ||
@@ -410,10 +412,239 @@ python perform_packagecopy () { | |||
410 | os.system('tar -cf - -C %s -ps . | tar -xf - -C %s' % (dest, dvar)) | 412 | os.system('tar -cf - -C %s -ps . | tar -xf - -C %s' % (dest, dvar)) |
411 | } | 413 | } |
412 | 414 | ||
415 | # We generate a master list of directories to process, we start by | ||
416 | # seeding this list with reasonable defaults, then load from | ||
417 | # the fs-perms.txt files | ||
418 | python fixup_perms () { | ||
419 | import os, pwd, grp | ||
420 | |||
421 | # init using a string with the same format as a line as documented in | ||
422 | # the fs-perms.txt file | ||
423 | # <path> <mode> <uid> <gid> <walk> <fmode> <fuid> <fgid> | ||
424 | # <path> link <link target> | ||
425 | # | ||
426 | # __str__ can be used to print out an entry in the input format | ||
427 | # | ||
428 | # if fs_perms_entry.path is None: | ||
429 | # an error occured | ||
430 | # if fs_perms_entry.link, you can retrieve: | ||
431 | # fs_perms_entry.path = path | ||
432 | # fs_perms_entry.link = target of link | ||
433 | # if not fs_perms_entry.link, you can retrieve: | ||
434 | # fs_perms_entry.path = path | ||
435 | # fs_perms_entry.mode = expected dir mode or None | ||
436 | # fs_perms_entry.uid = expected uid or -1 | ||
437 | # fs_perms_entry.gid = expected gid or -1 | ||
438 | # fs_perms_entry.walk = 'true' or something else | ||
439 | # fs_perms_entry.fmode = expected file mode or None | ||
440 | # fs_perms_entry.fuid = expected file uid or -1 | ||
441 | # fs_perms_entry_fgid = expected file gid or -1 | ||
442 | class fs_perms_entry(): | ||
443 | def __init__(self, line): | ||
444 | lsplit = line.split() | ||
445 | if len(lsplit) == 3 and lsplit[1].lower() == "link": | ||
446 | self._setlink(lsplit[0], lsplit[2]) | ||
447 | elif len(lsplit) == 8: | ||
448 | self._setdir(lsplit[0], lsplit[1], lsplit[2], lsplit[3], lsplit[4], lsplit[5], lsplit[6], lsplit[7]) | ||
449 | else: | ||
450 | bb.error("Fixup Perms: invalid config line %s" % line) | ||
451 | self.path = None | ||
452 | self.link = None | ||
453 | |||
454 | def _setdir(self, path, mode, uid, gid, walk, fmode, fuid, fgid): | ||
455 | self.path = os.path.normpath(path) | ||
456 | self.link = None | ||
457 | self.mode = self._procmode(mode) | ||
458 | self.uid = self._procuid(uid) | ||
459 | self.gid = self._procgid(gid) | ||
460 | self.walk = walk.lower() | ||
461 | self.fmode = self._procmode(fmode) | ||
462 | self.fuid = self._procuid(fuid) | ||
463 | self.fgid = self._procgid(fgid) | ||
464 | |||
465 | def _setlink(self, path, link): | ||
466 | self.path = os.path.normpath(path) | ||
467 | self.link = link | ||
468 | |||
469 | def _procmode(self, mode): | ||
470 | if not mode or (mode and mode == "-"): | ||
471 | return None | ||
472 | else: | ||
473 | return int(mode,8) | ||
474 | |||
475 | # Note uid/gid -1 has special significance in os.chown | ||
476 | def _procuid(self, uid): | ||
477 | if uid is None or uid == "-": | ||
478 | return -1 | ||
479 | elif uid.isdigit(): | ||
480 | return int(uid) | ||
481 | else: | ||
482 | return pwd.getpwnam(uid).pw_uid | ||
483 | |||
484 | def _procgid(self, gid): | ||
485 | if gid is None or gid == "-": | ||
486 | return -1 | ||
487 | elif gid.isdigit(): | ||
488 | return int(gid) | ||
489 | else: | ||
490 | return grp.getgrnam(gid).gr_gid | ||
491 | |||
492 | # Use for debugging the entries | ||
493 | def __str__(self): | ||
494 | if self.link: | ||
495 | return "%s link %s" % (self.path, self.link) | ||
496 | else: | ||
497 | mode = "-" | ||
498 | if self.mode: | ||
499 | mode = "0%o" % self.mode | ||
500 | fmode = "-" | ||
501 | if self.fmode: | ||
502 | fmode = "0%o" % self.fmode | ||
503 | uid = self._mapugid(self.uid) | ||
504 | gid = self._mapugid(self.gid) | ||
505 | fuid = self._mapugid(self.fuid) | ||
506 | fgid = self._mapugid(self.fgid) | ||
507 | return "%s %s %s %s %s %s %s %s" % (self.path, mode, uid, gid, self.walk, fmode, fuid, fgid) | ||
508 | |||
509 | def _mapugid(self, id): | ||
510 | if id is None or id == -1: | ||
511 | return "-" | ||
512 | else: | ||
513 | return "%d" % id | ||
514 | |||
515 | # Fix the permission, owner and group of path | ||
516 | def fix_perms(path, mode, uid, gid, dir): | ||
517 | if mode: | ||
518 | #bb.note("Fixup Perms: chmod 0%o %s" % (mode, dir)) | ||
519 | os.chmod(path, mode) | ||
520 | # -1 is a special value that means don't change the uid/gid | ||
521 | # if they are BOTH -1, don't bother to chown | ||
522 | if not (uid == -1 and gid == -1): | ||
523 | #bb.note("Fixup Perms: chown %d:%d %s" % (uid, gid, dir)) | ||
524 | os.chown(path, uid, gid) | ||
525 | |||
526 | # Return a list of configuration files based on either the default | ||
527 | # files/fs-perms.txt or the contents of FILESYSTEM_PERMS_TABLES | ||
528 | # paths are resolved via BBPATH | ||
529 | def get_fs_perms_list(d): | ||
530 | str = "" | ||
531 | fs_perms_tables = bb.data.getVar('FILESYSTEM_PERMS_TABLES', d, True) | ||
532 | if not fs_perms_tables: | ||
533 | fs_perms_tables = 'files/fs-perms.txt' | ||
534 | for conf_file in fs_perms_tables.split(): | ||
535 | str += " %s" % bb.which(bb.data.getVar('BBPATH', d, True), conf_file) | ||
536 | return str | ||
537 | |||
538 | |||
539 | |||
540 | dvar = bb.data.getVar('PKGD', d, True) | ||
541 | |||
542 | fs_perms_table = {} | ||
543 | |||
544 | # By default all of the standard directories specified in | ||
545 | # bitbake.conf will get 0755 root:root. | ||
546 | target_path_vars = [ 'base_prefix', | ||
547 | 'prefix', | ||
548 | 'exec_prefix', | ||
549 | 'base_bindir', | ||
550 | 'base_sbindir', | ||
551 | 'base_libdir', | ||
552 | 'datadir', | ||
553 | 'sysconfdir', | ||
554 | 'servicedir', | ||
555 | 'sharedstatedir', | ||
556 | 'localstatedir', | ||
557 | 'infodir', | ||
558 | 'mandir', | ||
559 | 'docdir', | ||
560 | 'bindir', | ||
561 | 'sbindir', | ||
562 | 'libexecdir', | ||
563 | 'libdir', | ||
564 | 'includedir', | ||
565 | 'oldincludedir' ] | ||
566 | |||
567 | for path in target_path_vars: | ||
568 | dir = bb.data.getVar(path, d, True) or "" | ||
569 | if dir == "": | ||
570 | continue | ||
571 | fs_perms_table[dir] = fs_perms_entry(bb.data.expand("%s 0755 root root false - - -" % (dir), d)) | ||
572 | |||
573 | # Now we actually load from the configuration files | ||
574 | for conf in get_fs_perms_list(d).split(): | ||
575 | if os.path.exists(conf): | ||
576 | f = open(conf) | ||
577 | for line in f: | ||
578 | if line.startswith('#'): | ||
579 | continue | ||
580 | lsplit = line.split() | ||
581 | if len(lsplit) == 0: | ||
582 | continue | ||
583 | if len(lsplit) != 8 and not (len(lsplit) == 3 and lsplit[1].lower() == "link"): | ||
584 | bb.error("Fixup perms: %s invalid line: %s" % (conf, line)) | ||
585 | continue | ||
586 | entry = fs_perms_entry(bb.data.expand(line, d)) | ||
587 | if entry and entry.path: | ||
588 | fs_perms_table[entry.path] = entry | ||
589 | f.close() | ||
590 | |||
591 | # Debug -- list out in-memory table | ||
592 | #for dir in fs_perms_table: | ||
593 | # bb.note("Fixup Perms: %s: %s" % (dir, str(fs_perms_table[dir]))) | ||
594 | |||
595 | # We process links first, so we can go back and fixup directory ownership | ||
596 | # for any newly created directories | ||
597 | for dir in fs_perms_table: | ||
598 | if not fs_perms_table[dir].link: | ||
599 | continue | ||
600 | |||
601 | origin = dvar + dir | ||
602 | if not (os.path.exists(origin) and os.path.isdir(origin) and not os.path.islink(origin)): | ||
603 | continue | ||
604 | |||
605 | link = fs_perms_table[dir].link | ||
606 | if link[0] == "/": | ||
607 | target = dvar + link | ||
608 | ptarget = link | ||
609 | else: | ||
610 | target = os.path.join(os.path.dirname(origin), link) | ||
611 | ptarget = os.path.join(os.path.dirname(dir), link) | ||
612 | if os.path.exists(target): | ||
613 | bb.error("Fixup Perms: Unable to correct directory link, target already exists: %s -> %s" % (dir, ptarget)) | ||
614 | continue | ||
615 | |||
616 | # Create path to move directory to, move it, and then setup the symlink | ||
617 | bb.mkdirhier(os.path.dirname(target)) | ||
618 | #bb.note("Fixup Perms: Rename %s -> %s" % (dir, ptarget)) | ||
619 | os.rename(origin, target) | ||
620 | #bb.note("Fixup Perms: Link %s -> %s" % (dir, link)) | ||
621 | os.symlink(link, origin) | ||
622 | |||
623 | for dir in fs_perms_table: | ||
624 | if fs_perms_table[dir].link: | ||
625 | continue | ||
626 | |||
627 | origin = dvar + dir | ||
628 | if not (os.path.exists(origin) and os.path.isdir(origin)): | ||
629 | continue | ||
630 | |||
631 | fix_perms(origin, fs_perms_table[dir].mode, fs_perms_table[dir].uid, fs_perms_table[dir].gid, dir) | ||
632 | |||
633 | if fs_perms_table[dir].walk == 'true': | ||
634 | for root, dirs, files in os.walk(origin): | ||
635 | for dr in dirs: | ||
636 | each_dir = os.path.join(root, dr) | ||
637 | fix_perms(each_dir, fs_perms_table[dir].mode, fs_perms_table[dir].uid, fs_perms_table[dir].gid, dir) | ||
638 | for f in files: | ||
639 | each_file = os.path.join(root, f) | ||
640 | fix_perms(each_file, fs_perms_table[dir].fmode, fs_perms_table[dir].fuid, fs_perms_table[dir].fgid, dir) | ||
641 | } | ||
642 | |||
413 | python split_and_strip_files () { | 643 | python split_and_strip_files () { |
414 | import commands, stat, errno | 644 | import commands, stat, errno |
415 | 645 | ||
416 | dvar = bb.data.getVar('PKGD', d, True) | 646 | dvar = bb.data.getVar('PKGD', d, True) |
647 | pn = bb.data.getVar('PN', d, True) | ||
417 | 648 | ||
418 | # We default to '.debug' style | 649 | # We default to '.debug' style |
419 | if bb.data.getVar('PACKAGE_DEBUG_SPLIT_STYLE', d, True) == 'debug-file-directory': | 650 | if bb.data.getVar('PACKAGE_DEBUG_SPLIT_STYLE', d, True) == 'debug-file-directory': |
@@ -551,7 +782,7 @@ python split_and_strip_files () { | |||
551 | if file_list[file].startswith("ELF: "): | 782 | if file_list[file].startswith("ELF: "): |
552 | elf_file = int(file_list[file][5:]) | 783 | elf_file = int(file_list[file][5:]) |
553 | if elf_file & 2: | 784 | if elf_file & 2: |
554 | bb.warn("File '%s' was already stripped, this will prevent future debugging!" % (src)) | 785 | bb.warn("File '%s' from %s was already stripped, this will prevent future debugging!" % (src, pn)) |
555 | continue | 786 | continue |
556 | 787 | ||
557 | # Split the file... | 788 | # Split the file... |
@@ -690,7 +921,7 @@ python populate_packages () { | |||
690 | unshipped.append(path) | 921 | unshipped.append(path) |
691 | 922 | ||
692 | if unshipped != []: | 923 | if unshipped != []: |
693 | bb.warn("the following files were installed but not shipped in any package:") | 924 | bb.warn("the following files were installed but not shipped in any package: %s" % pn) |
694 | for f in unshipped: | 925 | for f in unshipped: |
695 | bb.warn(" " + f) | 926 | bb.warn(" " + f) |
696 | 927 | ||
@@ -1373,6 +1604,7 @@ PACKAGEFUNCS ?= "package_get_auto_pr \ | |||
1373 | ${PACKAGE_PREPROCESS_FUNCS} \ | 1604 | ${PACKAGE_PREPROCESS_FUNCS} \ |
1374 | package_do_split_locales \ | 1605 | package_do_split_locales \ |
1375 | split_and_strip_files \ | 1606 | split_and_strip_files \ |
1607 | fixup_perms \ | ||
1376 | populate_packages \ | 1608 | populate_packages \ |
1377 | package_do_filedeps \ | 1609 | package_do_filedeps \ |
1378 | package_do_shlibs \ | 1610 | package_do_shlibs \ |
@@ -1400,6 +1632,7 @@ python do_package () { | |||
1400 | for f in (bb.data.getVar('PACKAGEFUNCS', d, True) or '').split(): | 1632 | for f in (bb.data.getVar('PACKAGEFUNCS', d, True) or '').split(): |
1401 | bb.build.exec_func(f, d) | 1633 | bb.build.exec_func(f, d) |
1402 | } | 1634 | } |
1635 | |||
1403 | do_package[dirs] = "${SHLIBSWORKDIR} ${PKGDESTWORK} ${D}" | 1636 | do_package[dirs] = "${SHLIBSWORKDIR} ${PKGDESTWORK} ${D}" |
1404 | addtask package before do_build after do_install | 1637 | addtask package before do_build after do_install |
1405 | 1638 | ||