diff options
-rw-r--r-- | meta/classes/package.bbclass | 44 |
1 files changed, 32 insertions, 12 deletions
diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass index 79783071bc..fff7cebbe3 100644 --- a/meta/classes/package.bbclass +++ b/meta/classes/package.bbclass | |||
@@ -344,6 +344,20 @@ def parse_debugsources_from_dwarfsrcfiles_output(dwarfsrcfiles_output): | |||
344 | 344 | ||
345 | return debugfiles.keys() | 345 | return debugfiles.keys() |
346 | 346 | ||
347 | def append_source_info(file, sourcefile, d): | ||
348 | cmd = "'dwarfsrcfiles' '%s'" % (file) | ||
349 | (retval, output) = oe.utils.getstatusoutput(cmd) | ||
350 | # 255 means a specific file wasn't fully parsed to get the debug file list, which is not a fatal failure | ||
351 | if retval != 0 and retval != 255: | ||
352 | bb.fatal("dwarfsrcfiles failed with exit code %s (cmd was %s)%s" % (retval, cmd, ":\n%s" % output if output else "")) | ||
353 | |||
354 | debugsources = parse_debugsources_from_dwarfsrcfiles_output(output) | ||
355 | # filenames are null-separated - this is an artefact of the previous use | ||
356 | # of rpm's debugedit, which was writing them out that way, and the code elsewhere | ||
357 | # is still assuming that. | ||
358 | debuglistoutput = '\0'.join(debugsources) + '\0' | ||
359 | open(sourcefile, 'a').write(debuglistoutput) | ||
360 | |||
347 | 361 | ||
348 | def splitdebuginfo(file, debugfile, debugsrcdir, sourcefile, d): | 362 | def splitdebuginfo(file, debugfile, debugsrcdir, sourcefile, d): |
349 | # Function to split a single file into two components, one is the stripped | 363 | # Function to split a single file into two components, one is the stripped |
@@ -369,18 +383,7 @@ def splitdebuginfo(file, debugfile, debugsrcdir, sourcefile, d): | |||
369 | 383 | ||
370 | # We need to extract the debug src information here... | 384 | # We need to extract the debug src information here... |
371 | if debugsrcdir: | 385 | if debugsrcdir: |
372 | cmd = "'dwarfsrcfiles' '%s'" % (file) | 386 | append_source_info(file, sourcefile, d) |
373 | (retval, output) = oe.utils.getstatusoutput(cmd) | ||
374 | # 255 means a specific file wasn't fully parsed to get the debug file list, which is not a fatal failure | ||
375 | if retval != 0 and retval != 255: | ||
376 | bb.fatal("dwarfsrcfiles failed with exit code %s (cmd was %s)%s" % (retval, cmd, ":\n%s" % output if output else "")) | ||
377 | |||
378 | debugsources = parse_debugsources_from_dwarfsrcfiles_output(output) | ||
379 | # filenames are null-separated - this is an artefact of the previous use | ||
380 | # of rpm's debugedit, which was writing them out that way, and the code elsewhere | ||
381 | # is still assuming that. | ||
382 | debuglistoutput = '\0'.join(debugsources) + '\0' | ||
383 | open(sourcefile, 'a').write(debuglistoutput) | ||
384 | 387 | ||
385 | bb.utils.mkdirhier(os.path.dirname(debugfile)) | 388 | bb.utils.mkdirhier(os.path.dirname(debugfile)) |
386 | 389 | ||
@@ -936,6 +939,15 @@ python split_and_strip_files () { | |||
936 | type |= 8 | 939 | type |= 8 |
937 | return type | 940 | return type |
938 | 941 | ||
942 | def isStaticLib(path): | ||
943 | if path.endswith('.a') and not os.path.islink(path): | ||
944 | with open(path, 'rb') as fh: | ||
945 | # The magic must include the first slash to avoid | ||
946 | # matching golang static libraries | ||
947 | magic = b'!<arch>\x0a/' | ||
948 | start = fh.read(len(magic)) | ||
949 | return start == magic | ||
950 | return False | ||
939 | 951 | ||
940 | # | 952 | # |
941 | # First lets figure out all of the files we may have to process ... do this only once! | 953 | # First lets figure out all of the files we may have to process ... do this only once! |
@@ -943,6 +955,7 @@ python split_and_strip_files () { | |||
943 | elffiles = {} | 955 | elffiles = {} |
944 | symlinks = {} | 956 | symlinks = {} |
945 | kernmods = [] | 957 | kernmods = [] |
958 | staticlibs = [] | ||
946 | inodes = {} | 959 | inodes = {} |
947 | libdir = os.path.abspath(dvar + os.sep + d.getVar("libdir")) | 960 | libdir = os.path.abspath(dvar + os.sep + d.getVar("libdir")) |
948 | baselibdir = os.path.abspath(dvar + os.sep + d.getVar("base_libdir")) | 961 | baselibdir = os.path.abspath(dvar + os.sep + d.getVar("base_libdir")) |
@@ -955,6 +968,9 @@ python split_and_strip_files () { | |||
955 | if file.endswith(".ko") and file.find("/lib/modules/") != -1: | 968 | if file.endswith(".ko") and file.find("/lib/modules/") != -1: |
956 | kernmods.append(file) | 969 | kernmods.append(file) |
957 | continue | 970 | continue |
971 | if isStaticLib(file): | ||
972 | staticlibs.append(file) | ||
973 | continue | ||
958 | 974 | ||
959 | # Skip debug files | 975 | # Skip debug files |
960 | if debugappend and file.endswith(debugappend): | 976 | if debugappend and file.endswith(debugappend): |
@@ -1033,6 +1049,10 @@ python split_and_strip_files () { | |||
1033 | # Only store off the hard link reference if we successfully split! | 1049 | # Only store off the hard link reference if we successfully split! |
1034 | splitdebuginfo(file, fpath, debugsrcdir, sourcefile, d) | 1050 | splitdebuginfo(file, fpath, debugsrcdir, sourcefile, d) |
1035 | 1051 | ||
1052 | if debugsrcdir: | ||
1053 | for file in staticlibs: | ||
1054 | append_source_info(file, sourcefile, d) | ||
1055 | |||
1036 | # Hardlink our debug symbols to the other hardlink copies | 1056 | # Hardlink our debug symbols to the other hardlink copies |
1037 | for ref in inodes: | 1057 | for ref in inodes: |
1038 | if len(inodes[ref]) == 1: | 1058 | if len(inodes[ref]) == 1: |