diff options
author | Nathan Rossi <nathan@nathanrossi.com> | 2019-09-10 12:40:59 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2019-09-11 07:30:13 +0100 |
commit | 5f79ad273e5edd1ec09499767e1d6037c19b4091 (patch) | |
tree | 98042afd232edd49e0e97750de2a71825669d82a | |
parent | 4a10fa34cadef6c8ca80c39f5298a763cc97033b (diff) | |
download | poky-5f79ad273e5edd1ec09499767e1d6037c19b4091.tar.gz |
chrpath.bbclass: Add break_hardlinks kwarg to allow breaking hardlinks
Add the break_hardlinks kwarg to break hardlinks when modifying files.
This uses the bb.utils.break_hardlinks function to break hardlinks. The
default is to maintain existing behaviour and leave hardlinks in place.
(From OE-Core rev: 7628f6bdb5704c018d83e284364994b72557eaa5)
Signed-off-by: Nathan Rossi <nathan@nathanrossi.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r-- | meta/classes/chrpath.bbclass | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/meta/classes/chrpath.bbclass b/meta/classes/chrpath.bbclass index ad3c3975a5..2870c10d51 100644 --- a/meta/classes/chrpath.bbclass +++ b/meta/classes/chrpath.bbclass | |||
@@ -1,7 +1,7 @@ | |||
1 | CHRPATH_BIN ?= "chrpath" | 1 | CHRPATH_BIN ?= "chrpath" |
2 | PREPROCESS_RELOCATE_DIRS ?= "" | 2 | PREPROCESS_RELOCATE_DIRS ?= "" |
3 | 3 | ||
4 | def process_file_linux(cmd, fpath, rootdir, baseprefix, tmpdir, d): | 4 | def process_file_linux(cmd, fpath, rootdir, baseprefix, tmpdir, d, break_hardlinks = False): |
5 | import subprocess as sub | 5 | import subprocess as sub |
6 | 6 | ||
7 | p = sub.Popen([cmd, '-l', fpath],stdout=sub.PIPE,stderr=sub.PIPE) | 7 | p = sub.Popen([cmd, '-l', fpath],stdout=sub.PIPE,stderr=sub.PIPE) |
@@ -39,6 +39,9 @@ def process_file_linux(cmd, fpath, rootdir, baseprefix, tmpdir, d): | |||
39 | 39 | ||
40 | # if we have modified some rpaths call chrpath to update the binary | 40 | # if we have modified some rpaths call chrpath to update the binary |
41 | if modified: | 41 | if modified: |
42 | if break_hardlinks: | ||
43 | bb.utils.break_hardlinks(fpath) | ||
44 | |||
42 | args = ":".join(new_rpaths) | 45 | args = ":".join(new_rpaths) |
43 | #bb.note("Setting rpath for %s to %s" %(fpath, args)) | 46 | #bb.note("Setting rpath for %s to %s" %(fpath, args)) |
44 | p = sub.Popen([cmd, '-r', args, fpath],stdout=sub.PIPE,stderr=sub.PIPE) | 47 | p = sub.Popen([cmd, '-r', args, fpath],stdout=sub.PIPE,stderr=sub.PIPE) |
@@ -46,7 +49,7 @@ def process_file_linux(cmd, fpath, rootdir, baseprefix, tmpdir, d): | |||
46 | if p.returncode != 0: | 49 | if p.returncode != 0: |
47 | bb.fatal("%s: chrpath command failed with exit code %d:\n%s%s" % (d.getVar('PN'), p.returncode, out, err)) | 50 | bb.fatal("%s: chrpath command failed with exit code %d:\n%s%s" % (d.getVar('PN'), p.returncode, out, err)) |
48 | 51 | ||
49 | def process_file_darwin(cmd, fpath, rootdir, baseprefix, tmpdir, d): | 52 | def process_file_darwin(cmd, fpath, rootdir, baseprefix, tmpdir, d, break_hardlinks = False): |
50 | import subprocess as sub | 53 | import subprocess as sub |
51 | 54 | ||
52 | p = sub.Popen([d.expand("${HOST_PREFIX}otool"), '-L', fpath],stdout=sub.PIPE,stderr=sub.PIPE) | 55 | p = sub.Popen([d.expand("${HOST_PREFIX}otool"), '-L', fpath],stdout=sub.PIPE,stderr=sub.PIPE) |
@@ -61,11 +64,14 @@ def process_file_darwin(cmd, fpath, rootdir, baseprefix, tmpdir, d): | |||
61 | if baseprefix not in rpath: | 64 | if baseprefix not in rpath: |
62 | continue | 65 | continue |
63 | 66 | ||
67 | if break_hardlinks: | ||
68 | bb.utils.break_hardlinks(fpath) | ||
69 | |||
64 | newpath = "@loader_path/" + os.path.relpath(rpath, os.path.dirname(fpath.replace(rootdir, "/"))) | 70 | newpath = "@loader_path/" + os.path.relpath(rpath, os.path.dirname(fpath.replace(rootdir, "/"))) |
65 | p = sub.Popen([d.expand("${HOST_PREFIX}install_name_tool"), '-change', rpath, newpath, fpath],stdout=sub.PIPE,stderr=sub.PIPE) | 71 | p = sub.Popen([d.expand("${HOST_PREFIX}install_name_tool"), '-change', rpath, newpath, fpath],stdout=sub.PIPE,stderr=sub.PIPE) |
66 | out, err = p.communicate() | 72 | out, err = p.communicate() |
67 | 73 | ||
68 | def process_dir (rootdir, directory, d): | 74 | def process_dir(rootdir, directory, d, break_hardlinks = False): |
69 | import stat | 75 | import stat |
70 | 76 | ||
71 | rootdir = os.path.normpath(rootdir) | 77 | rootdir = os.path.normpath(rootdir) |
@@ -95,7 +101,7 @@ def process_dir (rootdir, directory, d): | |||
95 | continue | 101 | continue |
96 | 102 | ||
97 | if os.path.isdir(fpath): | 103 | if os.path.isdir(fpath): |
98 | process_dir(rootdir, fpath, d) | 104 | process_dir(rootdir, fpath, d, break_hardlinks = break_hardlinks) |
99 | else: | 105 | else: |
100 | #bb.note("Testing %s for relocatability" % fpath) | 106 | #bb.note("Testing %s for relocatability" % fpath) |
101 | 107 | ||
@@ -108,8 +114,9 @@ def process_dir (rootdir, directory, d): | |||
108 | else: | 114 | else: |
109 | # Temporarily make the file writeable so we can chrpath it | 115 | # Temporarily make the file writeable so we can chrpath it |
110 | os.chmod(fpath, perms|stat.S_IRWXU) | 116 | os.chmod(fpath, perms|stat.S_IRWXU) |
111 | process_file(cmd, fpath, rootdir, baseprefix, tmpdir, d) | 117 | |
112 | 118 | process_file(cmd, fpath, rootdir, baseprefix, tmpdir, d, break_hardlinks = break_hardlinks) | |
119 | |||
113 | if perms: | 120 | if perms: |
114 | os.chmod(fpath, perms) | 121 | os.chmod(fpath, perms) |
115 | 122 | ||