source: projects/vbootstrap/trunk/vbuilder.sh.in @ 423

Revision 423, 14.1 KB checked in by munepi, 14 years ago (diff)

vbuilder.sh.in: supported 4.2_i386 chroot on x86_64

Line 
1#!/bin/bash
2# -*- coding: utf-8-unix -*-
3
4Usage_C(){
5    cat<<EOF
6Usage:  $(basename $0) {--version [version]} {--arch [arch]} {--dist-upgrade} {--target [target]} {--with-compat32} {--build|--clean|--build-rpm [src.rpm]|--install-rpm [arch.rpm|package]|--remove-rpm [package]}
7
8Options:
9        --version:              set [version] (default: ${DEFAULT_VERSION})
10        --arch:                 set [arch] (default: $(uname -i))
11        --dist-upgrade:         make VineSeed bootstrap via ${STABLE_VERSION}
12        --target:               build rpms with [target]
13        --with-compat32:        build rpms with compat32 on boostrap
14
15Actions:
16        --clean:                clean boostrap of [version]
17        --build:                build boostrap of [version]
18        --build-rpm:            build [src.rpm] on boostrap
19        --install-rpm:          install [arch.rpm|package] on boostrap
20        --remove-rpm:           remove [package] on boostrap
21
22For example,
23* make a clean/plain build environment on the current archtecture:
24$(basename $0) --clean --build
25* build a source rpm:
26$(basename $0) --build-rpm [src.rpm]
27* make a plain build environment for Vine Linux 4.2:
28$(basename $0) --version 4.2 --clean --build
29* make a i386 chroot on x86_64:
30$(basename $0) --arch i386 --clean --build
31* build a kernel package with target i686
32$(basename $0) --target i686 --build-rpm [kernel src.rpm]
33* build a compat32 package:
34$(basename $0) --arch i386 --with-compat32 --build-rpm [src.rpm]
35$(/usr/sbin/vbootstrap | sed -e s/^Usage:.*// -e s/^E:.*//)
36EOF
37}
38
39Usage_ja(){
40    Usage_C
41}
42
43Msg_MissingParameter_C(){
44    para=$1
45    cat<<EOF
46E: Missing some parameter after ${para}
47EOF
48}
49
50Msg_MissingParameter_ja(){
51    para=$1
52    cat<<EOF
53E: ${para} 以後のいくつかのパラメータに間違いがあります
54EOF
55}
56
57Msg_NoSupportVARCH_C(){
58    cat<<EOF
59E: arch ${VARCH} is NO support on $(uname -i)
60EOF
61}
62
63Msg_NoSupportVARCH_ja(){
64    cat<<EOF
65E: ${VARCH} アーキテクチャは $(uname -i) 上で非サポートです
66EOF
67}
68
69Msg_NoSupportVERSION_C(){
70    cat<<EOF
71E: ${VERSION} is NO support
72EOF
73}
74
75Msg_NoSupportVERSION_ja(){
76    cat<<EOF
77E: バージョン ${VERSION} は非サポートです
78EOF
79}
80
81Msg_NoSupportDistUpgradeVERSION_C(){
82    cat<<EOF
83E: version ${VERSION} does not support --dist-upgrade option
84EOF
85}
86
87Msg_NoSupportDistUpgradeVERSION_ja(){
88    cat<<EOF
89E: バージョン ${VERSION} は --dist-upgrade オプションを非サポートです
90EOF
91}
92
93Msg_NoSupportTARGET_C(){
94    cat<<EOF
95E: rpm build target ${TARGET} is NO support
96EOF
97}
98
99Msg_NoSupportTARGET_ja(){
100    cat<<EOF
101E: rpm ビルドターゲット ${TARGET} は非サポートです
102EOF
103}
104
105Msg_NotPackageName_C(){
106    cat<<EOF
107E: $RPM_PKG is not package name
108EOF
109}
110
111Msg_NotPackageName_ja(){
112    cat<<EOF
113E: $RPM_PKG はパッケージ名でありません
114EOF
115}
116
117Msg_NotSourceRPM_C(){
118    cat<<EOF
119E: $RPM_PKG is not source RPM package
120EOF
121}
122
123Msg_NotSourceRPM_ja(){
124    cat<<EOF
125E: $RPM_PKG はソース RPM パッケージでありません
126EOF
127}
128
129##############################################################################
130
131check-parameter(){
132    if [ -z "$*" ]; then
133        Usage_$LOCALE
134        return 1
135    fi
136
137    while [ ! -z "$*" ]; do
138        case $1 in
139            --version|--arch|--target|--build-rpm|--install-rpm|--remove-rpm)
140                shift
141                check-next-parameter $1 || return 1
142                ;;
143            --dist-upgrade|--with-compat32|--build|--clean)
144                ;;
145            *)
146                Msg_MissingParameter_$LOCALE $1
147                return 1
148                ;;
149        esac
150        shift
151    done
152    return 0
153}
154
155check-next-parameter(){
156    arg=$1
157    if [ -z "${arg}" ]; then
158        Msg_MissingParameter_$LOCALE ${arg}
159        return 1
160    fi
161
162    if [ $(echo ${arg} | grep '^-') ]; then
163        Msg_MissingParameter_$LOCALE ${arg}
164        return 1
165    fi
166    return 0
167}
168
169setup-vbuilder(){
170    ## load default settings
171    if [ -r /etc/vbootstrap/vbuilder.conf ]; then
172        . /etc/vbootstrap/vbuilder.conf
173    fi
174    [ -z "${VBOOTSTRAP_DIR}" ] && \
175        VBOOTSTRAP_DIR=@@VBUILDER_VBOOTSTRAP_DIR@@
176    [ -z "${DEFAULT_VERSION}" ] && \
177        DEFAULT_VERSION=@@VBUILDER_DEFAULT_VERSION@@
178    [ -z "${BUILT_RPMS_DIR}" ] && \
179        BUILT_RPMS_DIR=@@VBUILDER_BUILT_RPMS_DIR@@
180    [ -d $VBOOTSTRAP_DIR ] || mkdir -p $VBOOTSTRAP_DIR
181    VERSION=$DEFAULT_VERSION
182
183    ## current stable relase version
184    STABLE_VERSION=@@VBUILDER_STABLE_VERSION@@
185
186    ## set locale
187    case $LANG in
188        ja*)  LOCALE=ja ;;
189        *)    LOCALE=C ;;
190    esac
191
192    ## set boolian
193    with_setup_vbootstrap=0
194    with_dist_upgrade=0
195}
196
197setup-vbootstrap(){
198    if [ ${with_setup_vbootstrap} -eq 0 ]; then
199        with_setup_vbootstrap=1
200
201        ## check a chroot archtecture
202        if [ ! -z ${VARCH} ]; then
203            case "${VARCH}" in
204                i386)
205                    [ "$(uname -i)" = "ppc" ] && \
206                        Msg_NoSupportVARCH_$LOCALE
207                    [ $? -eq 0 ] && exit 1
208                    ;;
209                x86_64)
210                    [ "$(uname -i)" = "ppc" ] && \
211                        Msg_NoSupportVARCH_$LOCALE
212                    [ $? -eq 0 ] && exit 1
213                    ;;
214                ppc)
215                    [ "$(uname -i)" = "i386" -o "$(uname -i)" = "x86_64" ] && \
216                        Msg_NoSupportVARCH_$LOCALE
217                    [ $? -eq 0 ] && exit 1
218                    ;;
219            esac
220        fi
221
222        [ -z ${VARCH} ] && VARCH=$(uname -i)
223
224        ##!! 4.2 is NO support on VARCH=x86_64
225        if [ "${VERSION}" = "4.2" -a "${VARCH}" = "x86_64" ]; then
226            Msg_NoSupportVERSION_${LOCALE}
227            exit 1
228        fi
229
230        ## support i386 chroot on x86_64 below:
231        [ "${VARCH}" != "$(uname -i)" ] && VERSION=${VERSION}_${VARCH}
232
233        ## check support ${VERSION}
234        if [ -z "$(/usr/sbin/vbootstrap | sed -e s/^Usage:.*// -e s/^E:.*// | grep -m 1 ${VERSION})" ]; then
235            Msg_NoSupportVERSION_$LOCALE
236            exit 1
237        fi
238
239        ## check ${VERSION} equals VineSeed*, when with_dist_upgrade=1
240        if [ $with_dist_upgrade -eq 1 ]; then
241            if [ "$(echo ${VERSION} | sed -e "s/\(VineSeed\).*/\1/")" != "VineSeed" ]; then
242                Msg_NoSupportDistUpgradeVERSION_$LOCALE
243                exit 1
244            fi
245        fi
246
247        ## check build target option ${TARGET}
248        if [ ! -z "${TARGET}" ]; then
249            RPM_TARGET_LIST="$(cat /usr/lib/rpm/rpmrc | grep arch_canon: | sed -e "s/arch_canon:[[:blank:]]*\(.*\):.*/\1/")"
250            if [ -z "$(echo $RPM_TARGET_LIST | grep $TARGET)" ]; then
251                Msg_NoSupportTARGET_$LOCALE
252                exit 1
253            fi
254        fi
255
256    fi
257
258    BUILD_ROOT=${VBOOTSTRAP_DIR}/${VERSION}
259    BUILD_USER=vbuilder
260    CACHE_DIR=${VBOOTSTRAP_DIR}/cache/${VERSION}
261    BUILD_DIR=/home/${BUILD_USER}/rpm
262
263    mkdir -p $VBOOTSTRAP_DIR
264}
265
266setup-vbootstrap-rpm(){
267    setup-vbootstrap
268
269    ## check ${BUILD_ROOT}
270    [ -d ${BUILD_ROOT} ] || Build
271
272    DIST_RELEASE=$(cat ${BUILD_ROOT}/etc/vine-release | cut -f3 -d" " | cut -f1 -d.)
273
274    if [ -f $RPM_PKG ]; then
275        BASE_RPM_PKG=$(basename $RPM_PKG)
276        cp -f $RPM_PKG $BUILD_ROOT${BUILD_DIR}
277    else
278        BASE_RPM_PKG=$RPM_PKG   
279    fi
280}
281
282## recover apt-get data on host/chroot
283apt-get-update(){
284    case $1 in
285        --host)
286            echo -n "apt-get update on host ... "
287            apt-get update > /dev/null 2>&1
288            echo "done."
289            ;;
290        --chroot)
291            echo -n "apt-get update on chroot ... "
292            /usr/sbin/chroot ${BUILD_ROOT} \
293                /bin/sh -c 'apt-get update' > /dev/null 2>&1
294            echo "done."
295            ;;
296        *)
297            echo apt-get-update: unknown option $1
298            exit 1
299            ;;
300    esac
301}
302
303## mount /home
304mount_home(){
305    if [ "$1" = "--umount" ]; then
306        [ -d ${BUILD_ROOT}/home ] || return 1
307        [ -z "$(mount | grep ${BUILD_ROOT}/home)" ] || \
308            umount ${BUILD_ROOT}/home
309    else
310        [ -d ${BUILD_ROOT}/home ] || mkdir -p ${BUILD_ROOT}/home
311        [ -z "$(mount | grep ${BUILD_ROOT}/home)" ] && \
312            mount -o rbind /home ${BUILD_ROOT}/home
313    fi
314}
315
316## mount /tmp for applications which use X
317mount_tmp(){
318    if [ "$1" = "--umount" ]; then
319        [ -d ${BUILD_ROOT}/tmp ] || return 1
320        [ -z "$(mount | grep ${BUILD_ROOT}/tmp)" ] || \
321            umount ${BUILD_ROOT}/tmp
322    else
323        [ -d ${BUILD_ROOT}/tmp ] || mkdir -p ${BUILD_ROOT}/tmp
324        [ -z "$(mount | grep ${BUILD_ROOT}/tmp)" ] && \
325            mount --bind /tmp ${BUILD_ROOT}/tmp
326    fi
327}
328
329## mount virtual file systems
330mount_vfs(){
331    if [ "$1" = "--umount" ]; then
332        # for dir in /sys /proc /dev/shm /dev/pts /dev; do
333        # [ -z "$(mount | grep ${BUILD_ROOT}${dir})" ] || \
334        #       umount ${BUILD_ROOT}${dir}
335        # done
336        [ -d ${BUILD_ROOT}/proc ] || return 1
337        [ -z "$(mount | grep ${BUILD_ROOT}/proc)" ] || \
338            umount ${BUILD_ROOT}/proc
339    else
340        # for dir in /dev /dev/pts /dev/shm /proc /sys; do
341        #       [ -d ${BUILD_ROOT}${dir} ] || mkdir -p ${BUILD_ROOT}${dir}
342        #       mount --bind ${dir} ${BUILD_ROOT}${dir}
343        # done
344        [ -d ${BUILD_ROOT}/proc ] || mkdir -p ${BUILD_ROOT}/proc
345        [ -z "$(mount | grep ${BUILD_ROOT}/proc)" ] && \
346            mount --bind /proc ${BUILD_ROOT}/proc
347    fi
348}
349
350
351##############################################################################
352
353Clean(){
354    setup-vbootstrap
355
356    # mount_home --umount
357    # mount_tmp --umount
358    mount_vfs --umount
359    apt-get-update --host
360
361    if [ -d ${BUILD_ROOT}/var/cache/apt/archives ]; then
362        echo -n "Caching RPMs in ${CACHE_DIR}/apt/archives ... "
363        [ -d ${CACHE_DIR}/apt/archives ] || mkdir -p ${CACHE_DIR}/apt/archives
364        mv -f ${BUILD_ROOT}/var/cache/apt/archives/*.rpm ${CACHE_DIR}/apt/archives/
365        echo "done."
366    fi
367
368    if [ -d ${BUILD_ROOT} ]; then
369        echo -n "Cleaning build root \"${BUILD_ROOT}\" ... "
370        rm -rf ${BUILD_ROOT}
371        echo "done."
372    fi
373
374    echo "Cleanup a build farm for ${VERSION} done."
375}
376
377Build(){
378    setup-vbootstrap
379
380    if [ $with_dist_upgrade -eq 1 ]; then
381        ## make bootstrap of ${STABLE_VERSION}
382        /usr/sbin/vbootstrap \
383            $(echo ${VERSION} | sed -e "s/VineSeed/${STABLE_VERSION}/") \
384            ${BUILD_ROOT}
385
386        ## aim apt-line to VineSeed
387        sed -i "s/apt ${STABLE_VERSION}/apt VineSeed/g" \
388            ${BUILD_ROOT}/etc/apt/sources.list.d/main.list
389    else
390        /usr/sbin/vbootstrap ${VERSION} ${BUILD_ROOT}
391    fi
392
393    mount_vfs
394    # mount_tmp
395    # mount_home
396
397    if [ -d ${CACHE_DIR} ]; then
398        echo -n "Copying cached RPMs to ${BUILD_ROOT}/var/cache/apt/archives ... "
399        cp -f ${CACHE_DIR}/apt/archives/*.rpm ${BUILD_ROOT}/var/cache/apt/archives/
400        echo "done."
401    fi
402
403    /usr/sbin/chroot ${BUILD_ROOT} \
404        /bin/sh -c 'apt-get update && apt-get -y dist-upgrade'
405
406    ##!! 4.2 has no apt-sourceslist-{plus,nonfree} packages
407    if [ "$(echo ${VERSION} | sed s/_i386//)" != "4.2" ]; then
408        /usr/sbin/chroot ${BUILD_ROOT} \
409            /bin/sh -c 'apt-get update && apt-get -y install apt-sourceslist-plus'
410        /usr/sbin/chroot ${BUILD_ROOT} \
411            /bin/sh -c 'apt-get update && apt-get -y install apt-sourceslist-nonfree'
412    fi
413
414    if [ $with_dist_upgrade -eq 1 ]; then
415        /usr/sbin/chroot ${BUILD_ROOT} \
416            /bin/sh -c 'apt-get update && apt-get -y dist-upgrade'
417    fi
418    /usr/sbin/chroot ${BUILD_ROOT} \
419        /bin/sh -c 'apt-get -y install build-essential'
420    /usr/sbin/chroot ${BUILD_ROOT} \
421        /bin/sh -c 'apt-get -y install self-build-setup'
422
423    /usr/sbin/chroot ${BUILD_ROOT} \
424        /bin/sh -c 'apt-get -y install etcskel shadow-utils'
425
426    /usr/sbin/chroot ${BUILD_ROOT} /bin/sh -c 'cd /dev && /sbin/MAKEDEV console'
427    /usr/sbin/chroot ${BUILD_ROOT} /bin/sh -c 'cd /dev && /sbin/MAKEDEV null'
428    /usr/sbin/chroot ${BUILD_ROOT} /bin/sh -c 'cd /dev && /sbin/MAKEDEV zero'
429
430    /usr/sbin/chroot ${BUILD_ROOT} /bin/sh -c '/usr/sbin/pwconv'
431    /usr/sbin/chroot ${BUILD_ROOT} /bin/sh -c "/usr/sbin/useradd ${BUILD_USER}"
432
433    # mount_home --umount
434    # mount_tmp --umount
435    mount_vfs --umount
436    apt-get-update --host
437
438    echo "Making a build farm for ${VERSION} done."
439}
440
441RPM_Remove(){
442    setup-vbootstrap-rpm
443    mount_vfs
444
445    if [ -f $RPM_PKG ]; then
446        Msg_NotPackageName_$LOCALE
447        exit 1
448    fi
449    /usr/sbin/chroot ${BUILD_ROOT} \
450        /bin/sh -c "apt-get -y remove $BASE_RPM_PKG"
451
452    mount_vfs --umount
453    apt-get-update --host
454}
455
456RPM_Install(){
457    setup-vbootstrap-rpm
458    mount_vfs
459    apt-get-update --chroot
460
461    /usr/sbin/chroot ${BUILD_ROOT} \
462        /bin/sh -c "cd ${BUILD_DIR} && apt-get -y install $BASE_RPM_PKG"
463
464    mount_vfs --umount
465    apt-get-update --host
466}
467
468RPM_Build(){
469    setup-vbootstrap-rpm
470    mount_vfs
471
472    if [ ! -f $RPM_PKG ]; then
473        Msg_NotSourceRPM_$LOCALE
474        exit 1
475    fi
476   
477    RPM_PKG_USER=$(stat -c %U $RPM_PKG)
478    RPM_PKG_GROUP=$(stat -c %G $RPM_PKG)
479    local __install="install -p -v -o ${RPM_PKG_USER} -g ${RPM_PKG_GROUP}"
480    RPM_PKG_ARCH_LIST="RPMS/i386 RPMS/x86_64 RPMS/ppc RPMS/noarch SRPMS"
481    [ -z "${TARGET}" ] || \
482        RPM_PKG_ARCH_LIST="RPMS/${TARGET} ${RPM_PKG_ARCH_LIST}"
483
484    ## make src.rpm for $VERSION
485    /usr/sbin/chroot ${BUILD_ROOT} \
486        /bin/sh -c "cd ${BUILD_DIR} && su ${BUILD_USER} -c 'rpm -ivh $BASE_RPM_PKG'"
487    /usr/sbin/chroot ${BUILD_ROOT} \
488        /bin/sh -c "cd ${BUILD_DIR} && su ${BUILD_USER} -c 'rpmbuild -bs --nodeps --clean --rmsource --rmspec ${BUILD_DIR}/SPECS/*.spec'"
489
490
491    ## change ${DIST_RELEASE}
492    BASE_RPM_PKG=$(echo $BASE_RPM_PKG | sed -e "s/vl\([0-9]*\)\./vl${DIST_RELEASE}\./")
493
494    ## rebuild $BASE_RPM_PKG on ${DIST_RELEASE}
495    /usr/sbin/chroot ${BUILD_ROOT} \
496        /bin/sh -c "cd ${BUILD_DIR}/SRPMS && apt-get -y build-dep $BASE_RPM_PKG"
497    /usr/sbin/chroot ${BUILD_ROOT} \
498        /bin/sh -c "cd ${BUILD_DIR}/SRPMS && su ${BUILD_USER} -c 'rpmbuild --rebuild $RPM_OPTS $BASE_RPM_PKG'"
499    /usr/sbin/chroot ${BUILD_ROOT} \
500        /bin/sh -c "cd ${BUILD_DIR} && apt-get -y install $(find $BUILD_ROOT${BUILD_DIR}/RPMS -type f -regex '.*\.rpm' | sed -e s@${BUILD_ROOT}@@g -e 's|.*\/compat32-.*||g' -e 's|.*\/.*\.src\.rpm||g' -e 's/$/ \\/g')"
501
502    ## copy built rpms to ${HOME}/rpm/ for each archtectures
503    echo "Copying built rpms to ${HOME}/rpm/ for each archtectures ... "
504    for i in $RPM_PKG_ARCH_LIST; do \
505        if [ -d $BUILD_ROOT${BUILD_DIR}/${i} ]; then
506            [ -d ${BUILT_RPMS_DIR}/${i} ] || \
507                $__install -d ${BUILT_RPMS_DIR}/${i}/
508            find $BUILD_ROOT${BUILD_DIR}/${i} -type f -regex '.*\.rpm' \
509                -exec $__install -m0644 {} ${BUILT_RPMS_DIR}/${i}/ \;
510        fi
511    done
512
513    mount_vfs --umount
514    apt-get-update --host
515
516    echo "done."
517}
518
519
520##############################################################################
521
522setup-vbuilder
523
524check-parameter $* || exit 1
525
526while [ $# -gt 0 ]; do
527    tmpARG=$1
528    case $tmpARG in
529        --version|--arch|--target|--build-rpm|--install-rpm|--remove-rpm)
530            shift
531            ;;
532        --dist-upgrade|--with-compat32|--build|--clean)
533            ;;
534        *)
535            echo unknown option $1
536            exit 1
537            ;;
538    esac
539
540    case $tmpARG in
541        --version)
542            VERSION=$1
543            ;;
544        --arch)
545            VARCH=$1
546            ;;
547        --dist-upgrade)
548            with_dist_upgrade=1
549            ;;
550        --target)
551            TARGET=$1
552            RPM_OPTS="${RPM_OPTS} --target $TARGET"
553            ;;
554        --with-compat32)
555            RPM_OPTS="${RPM_OPTS} --with compat32"
556            ;;
557        --build-rpm)
558            RPM_PKG=$1
559            RPM_Build || exit 1
560            ;;
561        --install-rpm)
562            RPM_PKG=$1
563            RPM_Install || exit 1
564            ;;
565        --remove-rpm)
566            RPM_PKG=$1
567            RPM_Remove || exit 1
568            ;;
569        --build)
570            Build
571            ;;
572        --clean)
573            Clean
574            ;;
575    esac
576    shift
577done
578
579exit
Note: See TracBrowser for help on using the repository browser.