blob: 967eddd6054ee6088521351ea4b8944ad959e395 [file] [log] [blame]
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001
2sysroot_stage_dir() {
3 src="$1"
4 dest="$2"
5 # if the src doesn't exist don't do anything
6 if [ ! -d "$src" ]; then
7 return
8 fi
9
10 mkdir -p "$dest"
11 (
12 cd $src
13 find . -print0 | cpio --null -pdlu $dest
14 )
15}
16
17sysroot_stage_libdir() {
18 src="$1"
19 dest="$2"
20
21 sysroot_stage_dir $src $dest
22}
23
24sysroot_stage_dirs() {
25 from="$1"
26 to="$2"
27
28 sysroot_stage_dir $from${includedir} $to${includedir}
29 if [ "${BUILD_SYS}" = "${HOST_SYS}" ]; then
30 sysroot_stage_dir $from${bindir} $to${bindir}
31 sysroot_stage_dir $from${sbindir} $to${sbindir}
32 sysroot_stage_dir $from${base_bindir} $to${base_bindir}
33 sysroot_stage_dir $from${base_sbindir} $to${base_sbindir}
34 sysroot_stage_dir $from${libexecdir} $to${libexecdir}
35 sysroot_stage_dir $from${sysconfdir} $to${sysconfdir}
36 sysroot_stage_dir $from${localstatedir} $to${localstatedir}
37 fi
38 if [ -d $from${libdir} ]
39 then
40 sysroot_stage_libdir $from${libdir} $to${libdir}
41 fi
42 if [ -d $from${base_libdir} ]
43 then
44 sysroot_stage_libdir $from${base_libdir} $to${base_libdir}
45 fi
46 if [ -d $from${nonarch_base_libdir} ]
47 then
48 sysroot_stage_libdir $from${nonarch_base_libdir} $to${nonarch_base_libdir}
49 fi
50 sysroot_stage_dir $from${datadir} $to${datadir}
51 # We don't care about docs/info/manpages/locales
52 rm -rf $to${mandir}/ $to${docdir}/ $to${infodir}/ ${to}${datadir}/locale/
53 rm -rf $to${datadir}/applications/ $to${datadir}/fonts/ $to${datadir}/pixmaps/
54}
55
56sysroot_stage_all() {
57 sysroot_stage_dirs ${D} ${SYSROOT_DESTDIR}
58}
59
60python sysroot_strip () {
61 import stat, errno
62
63 dvar = d.getVar('SYSROOT_DESTDIR', True)
64 pn = d.getVar('PN', True)
65
66 os.chdir(dvar)
67
68 # Return type (bits):
69 # 0 - not elf
70 # 1 - ELF
71 # 2 - stripped
72 # 4 - executable
73 # 8 - shared library
74 # 16 - kernel module
75 def isELF(path):
76 type = 0
77 ret, result = oe.utils.getstatusoutput("file \"%s\"" % path.replace("\"", "\\\""))
78
79 if ret:
80 bb.error("split_and_strip_files: 'file %s' failed" % path)
81 return type
82
83 # Not stripped
84 if "ELF" in result:
85 type |= 1
86 if "not stripped" not in result:
87 type |= 2
88 if "executable" in result:
89 type |= 4
90 if "shared" in result:
91 type |= 8
92 return type
93
94
95 elffiles = {}
96 inodes = {}
97 libdir = os.path.abspath(dvar + os.sep + d.getVar("libdir", True))
98 baselibdir = os.path.abspath(dvar + os.sep + d.getVar("base_libdir", True))
99 if (d.getVar('INHIBIT_SYSROOT_STRIP', True) != '1'):
100 #
101 # First lets figure out all of the files we may have to process
102 #
103 for root, dirs, files in os.walk(dvar):
104 for f in files:
105 file = os.path.join(root, f)
106
107 try:
108 ltarget = oe.path.realpath(file, dvar, False)
109 s = os.lstat(ltarget)
110 except OSError as e:
111 (err, strerror) = e.args
112 if err != errno.ENOENT:
113 raise
114 # Skip broken symlinks
115 continue
116 if not s:
117 continue
118 # Check its an excutable
119 if (s[stat.ST_MODE] & stat.S_IXUSR) or (s[stat.ST_MODE] & stat.S_IXGRP) or (s[stat.ST_MODE] & stat.S_IXOTH) \
120 or ((file.startswith(libdir) or file.startswith(baselibdir)) and ".so" in f):
121 # If it's a symlink, and points to an ELF file, we capture the readlink target
122 if os.path.islink(file):
123 continue
124
125 # It's a file (or hardlink), not a link
126 # ...but is it ELF, and is it already stripped?
127 elf_file = isELF(file)
128 if elf_file & 1:
129 if elf_file & 2:
130 bb.warn("File '%s' from %s was already stripped, this will prevent future debugging!" % (file[len(dvar):], pn))
131 continue
132
133 if s.st_ino in inodes:
134 os.unlink(file)
135 os.link(inodes[s.st_ino], file)
136 else:
137 inodes[s.st_ino] = file
138 # break hardlink
139 bb.utils.copyfile(file, file)
140 elffiles[file] = elf_file
141
142 #
143 # Now strip them (in parallel)
144 #
145 strip = d.getVar("STRIP", True)
146 sfiles = []
147 for file in elffiles:
148 elf_file = int(elffiles[file])
149 #bb.note("Strip %s" % file)
150 sfiles.append((file, elf_file, strip))
151
152 oe.utils.multiprocess_exec(sfiles, oe.package.runstrip)
153}
154
155do_populate_sysroot[dirs] = "${SYSROOT_DESTDIR}"
156do_populate_sysroot[umask] = "022"
157
158addtask populate_sysroot after do_install
159
160SYSROOT_PREPROCESS_FUNCS ?= ""
161SYSROOT_DESTDIR = "${WORKDIR}/sysroot-destdir/"
162SYSROOT_LOCK = "${STAGING_DIR}/staging.lock"
163
164# We clean out any existing sstate from the sysroot if we rerun configure
165python sysroot_cleansstate () {
166 ss = sstate_state_fromvars(d, "populate_sysroot")
167 sstate_clean(ss, d)
168}
169do_configure[prefuncs] += "sysroot_cleansstate"
170
171
172BB_SETSCENE_VERIFY_FUNCTION = "sysroot_checkhashes"
173
174def sysroot_checkhashes(covered, tasknames, fnids, fns, d, invalidtasks = None):
175 problems = set()
176 configurefnids = set()
177 if not invalidtasks:
178 invalidtasks = xrange(len(tasknames))
179 for task in invalidtasks:
180 if tasknames[task] == "do_configure" and task not in covered:
181 configurefnids.add(fnids[task])
182 for task in covered:
183 if tasknames[task] == "do_populate_sysroot" and fnids[task] in configurefnids:
184 problems.add(task)
185 return problems
186
187python do_populate_sysroot () {
188 bb.build.exec_func("sysroot_stage_all", d)
189 bb.build.exec_func("sysroot_strip", d)
190 for f in (d.getVar('SYSROOT_PREPROCESS_FUNCS', True) or '').split():
191 bb.build.exec_func(f, d)
192 pn = d.getVar("PN", True)
193 multiprov = d.getVar("MULTI_PROVIDER_WHITELIST", True).split()
194 provdir = d.expand("${SYSROOT_DESTDIR}${base_prefix}/sysroot-providers/")
195 bb.utils.mkdirhier(provdir)
196 for p in d.getVar("PROVIDES", True).split():
197 if p in multiprov:
198 continue
199 p = p.replace("/", "_")
200 with open(provdir + p, "w") as f:
201 f.write(pn)
202}
203
204do_populate_sysroot[vardeps] += "${SYSROOT_PREPROCESS_FUNCS}"
205do_populate_sysroot[vardepsexclude] += "MULTI_PROVIDER_WHITELIST"
206
207SSTATETASKS += "do_populate_sysroot"
208do_populate_sysroot[cleandirs] = "${SYSROOT_DESTDIR}"
209do_populate_sysroot[sstate-inputdirs] = "${SYSROOT_DESTDIR}"
210do_populate_sysroot[sstate-outputdirs] = "${STAGING_DIR_HOST}/"
211do_populate_sysroot[stamp-extra-info] = "${MACHINE}"
212
213python do_populate_sysroot_setscene () {
214 sstate_setscene(d)
215}
216addtask do_populate_sysroot_setscene
217
218