]>
Commit | Line | Data |
---|---|---|
166a6c21 MT |
1 | #!/bin/bash |
2 | ||
cee183e8 | 3 | LOGFILE=${BASEDIR}/naoki.log |
166a6c21 MT |
4 | |
5 | function exithandler() { | |
6 | local mount | |
7 | local mounts | |
8 | ||
9 | log DEBUG "Unmounting everything in ${BUILD_DIR}..." | |
10 | while true; do | |
11 | mounts=$(mount | grep "${BUILD_DIR}") | |
12 | if [ -z "${mounts}" ]; then | |
13 | log DEBUG " Everything is unmounted." | |
14 | break | |
15 | fi | |
16 | ||
17 | while read mount; do | |
18 | umount $(awk '{ print $3 }' <<<${mount}) | |
19 | done <<<"${mounts}" | |
20 | done | |
21 | ||
17c0ee8a MT |
22 | if [ ! -e "${BUILD_DIR}/.failed" ]; then |
23 | rm -rf ${BUILD_DIR} | |
166a6c21 MT |
24 | fi |
25 | ||
26 | log DEBUG "Shut down naoki instance with pid $$." | |
27 | log DEBUG "----------" | |
28 | } | |
29 | trap exithandler EXIT | |
30 | ||
31 | function debug() { | |
32 | [ "${DEBUG}" = "1" ] | |
33 | } | |
34 | ||
35 | function force() { | |
36 | [ "${FORCE}" = "1" ] | |
37 | } | |
38 | ||
39 | function naoki_lock() { | |
40 | local lockfile="${BUILD_DIR}/.lock" | |
41 | ||
42 | case "${1}" in | |
43 | 1) | |
44 | touch ${lockfile} | |
45 | ;; | |
46 | 0) | |
47 | rm -f ${lockfile} | |
48 | ;; | |
49 | *) | |
50 | if [ -e "${lockfile}" ]; then | |
51 | return 0 | |
52 | else | |
53 | return 1 | |
54 | fi | |
55 | ;; | |
56 | esac | |
57 | } | |
58 | ||
59 | function naoki_prepare() { | |
60 | local p=$(find_package ${1}) | |
61 | shift | |
62 | ||
166a6c21 MT |
63 | msg "Preparing environment ${BUILD_DIR}..." |
64 | ||
65 | mkdir -p \ | |
66 | ${BUILD_DIR} \ | |
17c0ee8a | 67 | ${BUILD_DIR}/{boot,root,tmp} \ |
166a6c21 MT |
68 | ${BUILD_DIR}/{dev,proc,sys} \ |
69 | ${BUILD_DIR}/{,usr/}{bin,lib,sbin} \ | |
70 | ${BUILD_DIR}/usr/src \ | |
71 | ${BUILD_DIR}/${BUILD_ROOT} \ | |
72 | ${BUILD_DIR}/${TOOLS_DIR} | |
73 | ||
74 | local i | |
6edb7ef6 | 75 | for i in cache ccache pkgs src tools ${DIR_PACKAGES##*/}; do |
166a6c21 MT |
76 | mkdir -p ${BASEDIR}/${i} ${BUILD_DIR}/usr/src/${i} 2>/dev/null |
77 | mount --bind ${BASEDIR}/${i} ${BUILD_DIR}/usr/src/${i} | |
78 | done | |
79 | mount --bind ${TOOLS_DIR} ${BUILD_DIR}/${TOOLS_DIR}/ | |
80 | ||
81 | # Mounting kernel fs | |
82 | for i in dev proc sys; do | |
83 | mount --bind /${i} ${BUILD_DIR}/${i} | |
84 | done | |
85 | ||
17c0ee8a MT |
86 | local object |
87 | local to_download | |
88 | for object in $(package_objects ${p}); do | |
89 | if [ -e "${DIR_TARBALLS}/${object}" ] || \ | |
90 | [ -e "${DIR_PATCHES}/${object}" ]; then | |
91 | continue | |
92 | fi | |
93 | to_download="${to_download} ${object}" | |
94 | done | |
95 | if [ -n "${to_download}" ]; then | |
96 | log DEBUG "Going to get file(s): ${to_download}" | |
97 | ${DOWNLOADER} --tarballs="${DIR_TARBALLS}" \ | |
98 | --patches="${DIR_PATCHES}" ${to_download} | |
99 | if [ "$?" != "0" ]; then | |
100 | return 1 | |
101 | fi | |
102 | fi | |
166a6c21 MT |
103 | |
104 | # Extract needed packages | |
17c0ee8a | 105 | local pkg_dependencies=$(package_dependencies_for_build ${p}) |
7cfd59ee MT |
106 | msg " Resolving dependencies: ${pkg_dependencies-None}" |
107 | local dep | |
17c0ee8a | 108 | local missing |
7cfd59ee MT |
109 | for dep in ${pkg_dependencies}; do |
110 | if ! package_is_built ${dep}; then | |
17c0ee8a | 111 | missing="${missing} ${dep}" |
7cfd59ee MT |
112 | fi |
113 | done | |
17c0ee8a MT |
114 | if [ -n "${missing}" ]; then |
115 | msg "Dependencies for ${p} are missing: ${missing}" | |
116 | return 4 | |
117 | fi | |
7cfd59ee MT |
118 | |
119 | for dep in ${pkg_dependencies}; do | |
120 | msg "Decompressing ${dep}..." | |
121 | package_decompress ${dep} | |
122 | done | |
166a6c21 | 123 | |
79f35170 | 124 | for i in /bin/bash /bin/pwd /bin/sh; do |
166a6c21 MT |
125 | if [ -e "${BUILD_DIR}${i}" ]; then |
126 | continue | |
127 | fi | |
128 | log DEBUG "Creating symlink: ${BUILD_DIR}${i} --> ${TOOLS_DIR}${i}" | |
129 | ln -sf ${TOOLS_DIR}${i} ${BUILD_DIR}${i} | |
130 | done | |
131 | ||
17c0ee8a | 132 | return 0 |
166a6c21 MT |
133 | } |
134 | ||
135 | function naoki_cleanup() { | |
136 | local p=$(find_package ${1}) | |
137 | ||
138 | log INFO "Cleaning up environment ${BUILD_DIR}..." | |
139 | ||
140 | if naoki_lock; then | |
141 | error "Cannot remove locked ${BUILD_DIR}..." | |
142 | return 1 | |
143 | fi | |
144 | ||
145 | #rm -rf ${BUILD_DIR} | |
146 | } | |
147 | ||
148 | function naoki_cmd() { | |
149 | local package | |
150 | local chroot_cmd | |
151 | local cmd | |
152 | local with_chroot=1 | |
153 | ||
154 | while [ $# -gt 0 ]; do | |
155 | case "${1}" in | |
156 | --without-chroot) | |
157 | with_chroot=0 | |
158 | ;; | |
159 | *) | |
160 | if [ -z "${package}" ]; then | |
161 | package=$(find_package ${1}) | |
162 | else | |
163 | cmd="${cmd} ${1}" | |
164 | fi | |
165 | ;; | |
166 | esac | |
167 | shift | |
168 | done | |
169 | cmd=${cmd:1} | |
170 | ||
171 | is_package ${package} || return 1 | |
172 | ||
173 | log DEBUG "Running command \"${cmd}\" - chroot=${with_chroot}." | |
174 | ||
175 | local path="/sbin:/usr/sbin:/bin:/usr/bin" | |
176 | if [ "${TOOLCHAIN}" = "1" ] || [ ! -e "${BUILD_DIR}/usr/bin/env" ]; then | |
177 | path="${TOOLS_DIR}/sbin:${TOOLS_DIR}/bin:${path}" | |
178 | fi | |
179 | log DEBUG " PATH : ${path}" | |
180 | ||
181 | local ps1="\u:\w\$ " | |
182 | ||
183 | if [ "${with_chroot}" = "1" ]; then | |
184 | chroot_cmd="chroot ${BUILD_DIR}" | |
185 | ps1="${CLR_NORM_RED}chroot${NORMAL}: \w\$ " | |
186 | ||
187 | touch ${BUILD_DIR}/.chroot | |
188 | fi | |
189 | ||
190 | local ret | |
191 | PATH=${path} \ | |
192 | ${chroot_cmd} \ | |
193 | env -i \ | |
194 | HOME="/root" \ | |
195 | TERM="${TERM}" \ | |
196 | PS1="${ps1}" \ | |
197 | PATH="${path}" \ | |
198 | \ | |
199 | DISTRO_NAME="${DISTRO_NAME}" \ | |
200 | DISTRO_SNAME="${DISTRO_SNAME}" \ | |
79f35170 | 201 | DISTRO_VERSION="${DISTRO_VERSION}" \ |
166a6c21 MT |
202 | DISTRO_EPOCH="${DISTRO_EPOCH}" \ |
203 | DISTRO_SLOGAN="${DISTRO_SLOGAN}" \ | |
204 | \ | |
79f35170 | 205 | BASEDIR="${BASEDIR}" \ |
166a6c21 MT |
206 | ROOT=$([ "${TOOLCHAIN}" = "1" ] && \ |
207 | echo "${BUILD_DIR}") \ | |
79f35170 | 208 | CHROOT="${with_chroot}" \ |
166a6c21 MT |
209 | TOOLS_DIR="${TOOLS_DIR}" \ |
210 | TOOLCHAIN="${TOOLCHAIN}" \ | |
211 | BUILDROOT="${BUILD_ROOT}" \ | |
212 | \ | |
213 | CFLAGS="${CFLAGS}" \ | |
214 | CXXFLAGS="${CXXFLAGS}" \ | |
215 | TARGET="${TARGET}" \ | |
216 | TARGET_MACHINE="${MACHINE}" \ | |
217 | PARALLELISMFLAGS="${PARALLELISMFLAGS}" \ | |
218 | \ | |
219 | ${cmd} | |
220 | ||
221 | ret=$? | |
222 | log DEBUG " Exit code: ${ret}" | |
223 | ||
224 | return ${ret} | |
225 | } | |
226 | ||
227 | function naoki_make() { | |
228 | local p=$(find_package ${1}) | |
229 | shift | |
230 | ||
231 | local cmd="make --no-print-directory -C" | |
232 | if [ "${CHROOT}" = "0" ] || [ "${TOOLCHAIN}" = "1" ]; then | |
cee183e8 | 233 | cmd="${cmd} ${DIR_PKGS}/${p}" |
166a6c21 MT |
234 | else |
235 | cmd="${cmd} /usr/src/pkgs/${p}" | |
236 | fi | |
237 | cmd="${cmd} -f ${p##*/}.nm" | |
238 | ||
17c0ee8a | 239 | naoki_cmd ${p} "${cmd}" $@ |
166a6c21 MT |
240 | return ${PIPESTATUS[0]} |
241 | } | |
242 | ||
166a6c21 MT |
243 | function naoki_build() { |
244 | local p=$(find_package ${1}) | |
245 | shift | |
246 | ||
247 | local ret | |
248 | msg "Going on to build package \"${p}\"." | |
249 | ||
250 | naoki_prepare ${p} $@ | |
251 | ret=$? | |
252 | ||
253 | if [ "${ret}" != "0" ]; then | |
254 | error "Prepare command failed." | |
255 | exit ${ret} | |
256 | fi | |
257 | ||
166a6c21 MT |
258 | naoki_make ${p} package $@ |
259 | ret=$? | |
260 | ||
261 | if [ "${ret}" != "0" ]; then | |
17c0ee8a MT |
262 | error "Package build failed." |
263 | touch ${BUILD_DIR}/.failed | |
166a6c21 MT |
264 | exit ${ret} |
265 | fi | |
266 | } | |
267 | ||
268 | function naoki_build_tree() { | |
269 | local packages | |
270 | local p | |
271 | ||
272 | package_tree $@ | \ | |
273 | while read packages; do | |
274 | for p in ${packages}; do | |
275 | naoki_build ${p} | |
276 | done | |
277 | done | |
278 | } | |
279 | ||
280 | function naoki_shell() { | |
281 | local p=$(find_package ${1}) | |
282 | shift | |
283 | ||
284 | naoki_prepare ${p} | |
17c0ee8a | 285 | naoki_make ${p} shell |
166a6c21 MT |
286 | |
287 | # A little help message | |
288 | echo | |
289 | echo -e " ${CLR_NORM_RED}Chroot environment${NORMAL}" | |
290 | echo | |
291 | echo " This is starting a chrooted environment where you can natively" | |
292 | echo " access the build system. When you leave the shell all files will" | |
293 | echo " be lost." | |
294 | echo | |
295 | echo " Source of ${PKG_NAME} is extracted to /usr/src." | |
296 | echo | |
297 | echo -e " ${BOLD}Exit with Ctrl+D.${NORMAL}" | |
298 | echo | |
299 | ||
300 | naoki_cmd ${p} "bash --login" | |
301 | local ret=$? | |
17c0ee8a | 302 | |
166a6c21 MT |
303 | echo |
304 | echo "Exit code: ${ret}" | |
305 | echo | |
306 | } | |
307 | ||
308 | function naoki_toolchain() { | |
309 | TOOLCHAIN=1 | |
310 | ||
311 | local p=$(find_package ${1}) | |
312 | shift | |
313 | ||
314 | naoki_build ${p} --without-chroot $@ | |
315 | } |