summaryrefslogtreecommitdiffstats
path: root/meta/classes/package.bbclass
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2013-02-03 17:11:58 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2013-02-06 13:13:00 +0000
commit85b4891a1ccfe65872435cb9b393d0eb35743b06 (patch)
tree8ec30e26af8803dc0f661afc0d25e9e695d9e158 /meta/classes/package.bbclass
parentf2ee5b48d95a5fb824e19ae71a2938d19047b702 (diff)
downloadpoky-85b4891a1ccfe65872435cb9b393d0eb35743b06.tar.gz
package.bbclass: Rewrite split_and_strip_files
The split_and_strip_files funciton was hard to follow and its usage of prefixes to strings was unusual. This rewrites it to use a list of hardlinks, symlinks and elffiles where each list is iterated over at the correct point. This means we can avoid creating dandling symlinks for example so we can simply delete the cleanup code for this. The isfile() check is also removed which gives a significant improvement in speed. Its uneeded since os.walk will have already checked things in files are files. (From OE-Core rev: 0cd295d8cdc8cc39d6b6c7d26ea8a2a10a979d7c) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/classes/package.bbclass')
-rw-r--r--meta/classes/package.bbclass202
1 files changed, 97 insertions, 105 deletions
diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass
index 679055ff1b..164e38c505 100644
--- a/meta/classes/package.bbclass
+++ b/meta/classes/package.bbclass
@@ -722,8 +722,9 @@ python split_and_strip_files () {
722 # 722 #
723 # First lets figure out all of the files we may have to process ... do this only once! 723 # First lets figure out all of the files we may have to process ... do this only once!
724 # 724 #
725 file_list = {} 725 elffiles = {}
726 file_links = {} 726 symlinks = {}
727 hardlinks = {}
727 kernmods = [] 728 kernmods = []
728 if (d.getVar('INHIBIT_PACKAGE_DEBUG_SPLIT', True) != '1') and \ 729 if (d.getVar('INHIBIT_PACKAGE_DEBUG_SPLIT', True) != '1') and \
729 (d.getVar('INHIBIT_PACKAGE_STRIP', True) != '1'): 730 (d.getVar('INHIBIT_PACKAGE_STRIP', True) != '1'):
@@ -734,119 +735,111 @@ python split_and_strip_files () {
734 kernmods.append(file) 735 kernmods.append(file)
735 continue 736 continue
736 737
737 # Only process files (and symlinks)... Skip files that are obviously debug files 738 # Skip debug files
738 if not (debugappend != "" and file.endswith(debugappend)) and \ 739 if debugappend and file.endswith(debugappend):
739 not (debugdir != "" and debugdir in os.path.dirname(file[len(dvar):])) and \ 740 continue
740 os.path.isfile(file): 741 if debugdir and debugdir in os.path.dirname(file[len(dvar):]):
741 try: 742 continue
742 s = os.stat(file) 743
743 except OSError, (err, strerror): 744 try:
744 if err != errno.ENOENT: 745 s = os.stat(file)
745 raise 746 except OSError, (err, strerror):
746 # Skip broken symlinks 747 if err != errno.ENOENT:
748 raise
749 # Skip broken symlinks
750 continue
751 # Check its an excutable
752 if (s[stat.ST_MODE] & stat.S_IXUSR) or (s[stat.ST_MODE] & stat.S_IXGRP) or (s[stat.ST_MODE] & stat.S_IXOTH):
753 # If it's a symlink, and points to an ELF file, we capture the readlink target
754 if os.path.islink(file):
755 target = os.readlink(file)
756 if not os.path.isabs(target):
757 ltarget = os.path.join(os.path.dirname(file), target)
758 else:
759 ltarget = target
760
761 if isELF(ltarget):
762 #bb.note("Sym: %s (%d)" % (ltarget, isELF(ltarget)))
763 symlinks[file] = target
747 continue 764 continue
748 # Is the item excutable? Then we need to process it. 765 # It's a file (or hardlink), not a link
749 if (s[stat.ST_MODE] & stat.S_IXUSR) or \ 766 # ...but is it ELF, and is it already stripped?
750 (s[stat.ST_MODE] & stat.S_IXGRP) or \ 767 elf_file = isELF(file)
751 (s[stat.ST_MODE] & stat.S_IXOTH): 768 if elf_file & 1:
752 # If it's a symlink, and points to an ELF file, we capture the readlink target 769 if elf_file & 2:
753 if os.path.islink(file): 770 bb.warn("File '%s' from %s was already stripped, this will prevent future debugging!" % (src, pn))
754 target = os.readlink(file)
755 if not os.path.isabs(target):
756 ltarget = os.path.join(os.path.dirname(file), target)
757 else:
758 ltarget = target
759
760 if isELF(ltarget):
761 #bb.note("Sym: %s (%d)" % (ltarget, isELF(ltarget)))
762 file_list[file] = "sym: " + target
763 continue 771 continue
764 # It's a file (or hardlink), not a link 772 # Check if it's a hard link to something else
765 # ...but is it ELF, and is it already stripped? 773 if s.st_nlink > 1:
766 elf_file = isELF(file) 774 file_reference = "%d_%d" % (s.st_dev, s.st_ino)
767 if elf_file & 1: 775 # Hard link to something else
768 # Check if it's a hard link to something else 776 hardlinks[file] = file_reference
769 if s.st_nlink > 1: 777 continue
770 file_reference = "%d_%d" % (s.st_dev, s.st_ino) 778 elffiles[file] = elf_file
771 # Hard link to something else
772 file_list[file] = "hard: " + file_reference
773 continue
774
775 file_list[file] = "ELF: %d" % elf_file
776
777 779
778 # 780 #
779 # First lets process debug splitting 781 # First lets process debug splitting
780 # 782 #
781 if (d.getVar('INHIBIT_PACKAGE_DEBUG_SPLIT', True) != '1'): 783 if (d.getVar('INHIBIT_PACKAGE_DEBUG_SPLIT', True) != '1'):
782 for file in file_list: 784 hardlinkmap = {}
785 # For hardlinks, process only one of the files
786 for file in hardlinks:
787 file_reference = hardlinks[file]
788 if file_reference not in hardlinkmap:
789 # If this is a new file, add it as a reference, and
790 # update it's type, so we can fall through and split
791 elffiles[file] = isELF(file)
792 hardlinkmap[file_reference] = file
793
794 for file in elffiles:
783 src = file[len(dvar):] 795 src = file[len(dvar):]
784 dest = debuglibdir + os.path.dirname(src) + debugdir + "/" + os.path.basename(src) + debugappend 796 dest = debuglibdir + os.path.dirname(src) + debugdir + "/" + os.path.basename(src) + debugappend
785 fpath = dvar + dest 797 fpath = dvar + dest
786 # Preserve symlinks in debug area...
787 if file_list[file].startswith("sym: "):
788 ltarget = file_list[file][5:]
789 lpath = os.path.dirname(ltarget)
790 lbase = os.path.basename(ltarget)
791 ftarget = ""
792 if lpath and lpath != ".":
793 ftarget += lpath + debugdir + "/"
794 ftarget += lbase + debugappend
795 if lpath.startswith(".."):
796 ftarget = os.path.join("..", ftarget)
797 bb.mkdirhier(os.path.dirname(fpath))
798 #bb.note("Symlink %s -> %s" % (fpath, ftarget))
799 os.symlink(ftarget, fpath)
800 continue
801 798
802 # Preserve hard links in debug area... 799 # Split the file...
803 file_reference = "" 800 bb.utils.mkdirhier(os.path.dirname(fpath))
804 if file_list[file].startswith("hard: "): 801 #bb.note("Split %s -> %s" % (file, fpath))
805 file_reference = file_list[file][6:] 802 # Only store off the hard link reference if we successfully split!
806 if file_reference not in file_links: 803 splitdebuginfo(file, fpath, debugsrcdir, d)
807 # If this is a new file, add it as a reference, and
808 # update it's type, so we can fall through and split
809 file_list[file] = "ELF: %d" % (isELF(file))
810 else:
811 target = file_links[file_reference][len(dvar):]
812 ftarget = dvar + debuglibdir + os.path.dirname(target) + debugdir + "/" + os.path.basename(target) + debugappend
813 bb.mkdirhier(os.path.dirname(fpath))
814 #bb.note("Link %s -> %s" % (fpath, ftarget))
815 os.link(ftarget, fpath)
816 continue
817
818 # It's ELF...
819 if file_list[file].startswith("ELF: "):
820 elf_file = int(file_list[file][5:])
821 if elf_file & 2:
822 bb.warn("File '%s' from %s was already stripped, this will prevent future debugging!" % (src, pn))
823 continue
824 804
825 # Split the file... 805 # Hardlink our debug symbols to the other hardlink copies
826 bb.mkdirhier(os.path.dirname(fpath)) 806 for file in hardlinks:
827 #bb.note("Split %s -> %s" % (file, fpath)) 807 if file not in elffiles:
828 # Only store off the hard link reference if we successfully split!
829 if splitdebuginfo(file, fpath, debugsrcdir, d) == 0 and file_reference != "":
830 file_links[file_reference] = file
831
832 # The above may have generated dangling symlinks, remove them!
833 # Dangling symlinks are a result of something NOT being split, such as a stripped binary.
834 # This should be a rare occurance, but we want to clean up anyway.
835 for file in file_list:
836 if file_list[file].startswith("sym: "):
837 src = file[len(dvar):] 808 src = file[len(dvar):]
838 dest = debuglibdir + os.path.dirname(src) + debugdir + "/" + os.path.basename(src) + debugappend 809 dest = debuglibdir + os.path.dirname(src) + debugdir + "/" + os.path.basename(src) + debugappend
839 fpath = dvar + dest 810 fpath = dvar + dest
840 try: 811 file_reference = hardlinks[file]
841 s = os.stat(fpath) 812 target = hardlinkmap[file_reference][len(dvar):]
842 except OSError, (err, strerror): 813 ftarget = dvar + debuglibdir + os.path.dirname(target) + debugdir + "/" + os.path.basename(target) + debugappend
843 if err != errno.ENOENT: 814 bb.utils.mkdirhier(os.path.dirname(fpath))
844 raise 815 #bb.note("Link %s -> %s" % (fpath, ftarget))
845 #bb.note("Remove dangling link %s -> %s" % (fpath, os.readlink(fpath))) 816 os.link(ftarget, fpath)
846 os.unlink(fpath) 817
847 # This could leave an empty debug directory laying around 818 # Create symlinks for all cases we were able to split symbols
848 # take care of the obvious case... 819 for file in symlinks:
849 subprocess.call("rmdir %s 2>/dev/null" % os.path.dirname(fpath), shell=True) 820 src = file[len(dvar):]
821 dest = debuglibdir + os.path.dirname(src) + debugdir + "/" + os.path.basename(src) + debugappend
822 fpath = dvar + dest
823 # Skip it if the target doesn't exist
824 try:
825 s = os.stat(fpath)
826 except OSError, (err, strerror):
827 if err != errno.ENOENT:
828 raise
829 continue
830
831 ltarget = symlinks[file]
832 lpath = os.path.dirname(ltarget)
833 lbase = os.path.basename(ltarget)
834 ftarget = ""
835 if lpath and lpath != ".":
836 ftarget += lpath + debugdir + "/"
837 ftarget += lbase + debugappend
838 if lpath.startswith(".."):
839 ftarget = os.path.join("..", ftarget)
840 bb.utils.mkdirhier(os.path.dirname(fpath))
841 #bb.note("Symlink %s -> %s" % (fpath, ftarget))
842 os.symlink(ftarget, fpath)
850 843
851 # Process the debugsrcdir if requested... 844 # Process the debugsrcdir if requested...
852 # This copies and places the referenced sources for later debugging... 845 # This copies and places the referenced sources for later debugging...
@@ -861,11 +854,10 @@ python split_and_strip_files () {
861 if (d.getVar('INHIBIT_PACKAGE_STRIP', True) != '1'): 854 if (d.getVar('INHIBIT_PACKAGE_STRIP', True) != '1'):
862 strip = d.getVar("STRIP", True) 855 strip = d.getVar("STRIP", True)
863 sfiles = [] 856 sfiles = []
864 for file in file_list: 857 for file in elffiles:
865 if file_list[file].startswith("ELF: "): 858 elf_file = int(elffiles[file])
866 elf_file = int(file_list[file][5:]) 859 #bb.note("Strip %s" % file)
867 #bb.note("Strip %s" % file) 860 sfiles.append((file, elf_file, strip))
868 sfiles.append((file, elf_file, strip))
869 for f in kernmods: 861 for f in kernmods:
870 sfiles.append((f, 16, strip)) 862 sfiles.append((f, 16, strip))
871 863