d78c6124cbd385aedb9634599c9682c03fa80df5
[build.git] / build.common
1 # -*-Shell-script-*-
2 #
3 # Common functions for build scripts used by various packages
4 # incorporated (e.g., build, myplc, myplc-devel, vserver-reference)
5 #
6 # Marc E. Fiuczynski <mef@cs.princeton.edu>
7 # Copyright (C) 2007 The Trustees of Princeton University
8 #
9 # $Id: build.common,v 1.3 2007/08/31 03:17:34 mef Exp $
10 #
11
12 function pl_getDefaultDistro() {
13     # FC4 is currently the default release
14     echo "Fedora"
15 }
16
17 function pl_getDefaultRelease() {
18     # FC4 is currently the default release
19     echo "4"
20 }
21
22 function pl_getDistro() {
23     defaultDistro=$(pl_getDefaultDistro)
24     if [ -f "/etc/redhat-release" ] ; then
25         distro=$(awk ' { print $1 } ' /etc/redhat-release)
26     else
27         distro=$defaultDistro
28     fi
29     echo "$distro"
30 }
31
32 function pl_getRelease() {
33     defaultRelease=$(pl_getDefaultRelease)
34     if [ -f "/etc/redhat-release" ] ; then
35         release=$(awk ' { if ($1=="Fedora" && $2=="Core") print $4 ; if (($1=="Fedora" && $2!="Core")||$1=="CentOS") print $3 } ' /etc/redhat-release)
36         [ $release -lt $defaultRelease ] && release=$defaultRelease
37     else
38         release=$defaultRelease
39     fi
40     echo "$release"
41 }
42
43 # figure out which redhat distro we are using (fedora, centos, redhat)
44 pl_DISTRO=$(pl_getDistro)
45
46 # select basearch of the host devel environment
47 pl_DISTRO_ARCH=$(uname -i)
48
49 # let mkfedora select one of its mirrors
50 pl_DISTRO_URL=""
51
52 pl_DISTRO_RELEASE=$(pl_getRelease)
53
54 # get patch to appropriate yumgroups.xml file
55 # XXX This path should be relative to PLDISTRO, as defined in
56 # build/Makefile
57 pl_YUMGROUPSXML="../build/groups/v4_yumgroups.xml"
58
59 function pl_process_fedora_options () {
60     # Get options
61     shiftcount=0
62     while getopts "l:r:a:h" opt ; do
63         case $opt in
64             l)
65                 pl_DISTRO_URL=$OPTARG
66                 let shiftcount=$shiftcount+2
67                 ;;
68             r)
69                 pl_DISTRO_RELEASE=$OPTARG
70                 let shiftcount=$shiftcount+2
71                 ;;
72             a)
73                 pl_DISTRO_ARCH=$OPTARG
74                 let shiftcount=$shiftcount+2
75                 ;;
76             h|*)
77                 echo "Usage: $0 [OPTION]..."
78                 echo "  -l url          distro mirror location (default: $pl_DISTRO_URL)"
79                 echo "  -r release      distro release number (default: $pl_DISTRO_RELEASE)"
80                 echo "  -a arch         distro architecture (default: $pl_DISTRO_ARCH)"
81                 echo "where distro can be either fedora, centos, or redhat"
82                 echo "  -h              This message"
83                 exit 1
84                 ;;
85         esac
86     done
87     return $shiftcount
88 }
89
90 function pl_makedevs() {
91     vroot=$1
92     # Clean ${vroot}/dev, but only when ${vroot}!=""
93     [ -n $vroot ] && rm -rf $vroot/dev
94     
95     mkdir -p $vroot/dev
96     mknod -m 666 $vroot/dev/null c 1 3
97     mknod -m 666 $vroot/dev/zero c 1 5
98     mknod -m 666 $vroot/dev/full c 1 7
99     mknod -m 644 $vroot/dev/random c 1 8
100     mknod -m 644 $vroot/dev/urandom c 1 9
101     mknod -m 666 $vroot/dev/tty c 5 0
102     mknod -m 666 $vroot/dev/ptmx c 5 2
103     # For bash command substitution
104     ln -nsf ../proc/self/fd $vroot/dev/fd
105
106     # For df and linuxconf
107     touch $vroot/dev/hdv1
108
109     # For pseudo ttys
110     mkdir -p $vroot/dev/pts
111
112     # (Might have to remove the following for vserver-reference.)
113
114     # for tmpfs mount
115     mkdir -p $vroot/dev/shm
116
117     # For TUN/TAP
118     mkdir -p $vroot/dev/net
119     mknod -m 600 $vroot/dev/net/tun c 10 200
120
121     # For mkinitrd (in case a kernel is being installed)
122     # As well for loop back mounting within a vserver. 
123     for i in $(seq 0 255) ; do
124         mknod -m 640 $vroot/dev/loop$i b 7 $i
125     done
126 }
127
128 function pl_mkfedora() {
129     root=$1
130     shift
131     options=$@
132
133     pl_makedevs $root
134
135     [ -n "$pl_DISTRO_URL" ] && options="$options -l $pl_DISTRO_URL"
136     [ -n "$pl_DISTRO_ARCH" ] && options="$options -a $pl_DISTRO_ARCH"
137     [ -n "$pl_DISTRO_RELEASE" ] && options="$options -r $pl_DISTRO_RELEASE"
138     # echo "mkfedora -v $options $root"
139     eval mkfedora -v $options $root
140 }
141
142 function pl_setup_chroot() {
143     root=$1
144     shift
145     options=$@
146
147     pl_mkfedora $root $options
148
149     # Disable all services in reference image
150     chroot $root sh -c "/sbin/chkconfig --list | awk '{ print \$1 }' | xargs -i /sbin/chkconfig {} off"
151
152     # FC2 minilogd starts up during shutdown and makes unmounting
153     # impossible. Just get rid of it.
154     rm -f $root/sbin/minilogd
155     ln -nsf /bin/true $root/sbin/minilogd
156
157     # This tells the Boot Manager that it is okay to update
158     # /etc/resolv.conf and /etc/hosts whenever the network configuration
159     # changes. Users are free to delete this file.
160     touch $vroot/etc/AUTO_UPDATE_NET_FILES
161 }
162
163 # Move specified directories out of a src tree into a dst tree, and
164 # then for each moved directory create a symlink in src to dst.
165 function pl_move_dirs() {
166     root=$1
167     data=$2
168     store=$3
169     shift 3
170
171     mkdir -p $root/data
172     for datadir in "$@" ; do
173         mkdir -p ${data}${datadir}
174         if [ -d ${root}/${datadir} -a ! -h ${root}/${datadir} ] ; then
175             (cd ${root} && find ./${datadir} | cpio -p -d -u ../${data}/)
176         fi
177         rm -rf ${root}/${datadir}
178         mkdir -p $(dirname ${root}/${datadir})
179         ln -nsf /${store}/${datadir} ${root}/${datadir}
180     done
181 }
182
183 # Construct an image file from given some directory
184 # XXX in the future maybe use livecdtools?
185 function pl_make_image() {
186     root=$1
187     image=$2
188     extraspace=$3
189
190     # Leave about 100 MB free space and allow for about 20% inode overhead
191     bytes=$((($(du -sb $root | cut -f1) + $extraspace) * 120 / 100))
192     bs=4096
193     blocks=$(($bytes / $bs))
194     dd bs=$bs count=$blocks if=/dev/zero of=$image
195     mkfs.ext3 -b $bs -j -F $image
196
197     # Temporarily mount it
198     tmp=$(mktemp -d tmp.XXXXXX)
199     mount -o loop $image $tmp
200     trap "umount $tmp; rmdir $tmp" ERR INT
201
202     # Move files to it
203     (cd $root && tar cpf - .) | (cd $tmp && tar xpf -)
204
205     # Unmount it
206     umount -l $tmp
207     rmdir $tmp
208     trap - ERR INT
209 }
210
211 # Fix permissions on tmp directories
212 function pl_fixtmp_permissions() {
213     root=$1
214     chmod 1777 $root/tmp $root/usr/tmp $root/var/tmp
215 }
216
217 function pl_fixdirs() {
218     root=$1
219     datadirs=$2
220     for datadir in datadirs ; do
221         if [ -h ${root}/${datadir} ] ; then
222             rm -f ${root}/${datadir}
223             mkdir -p ${root}/${datadir}
224         fi
225     done
226 }
227
228 function pl_getPackages() {
229     filename=$1
230     packages=$(grep "^package:.*" $filename | awk ' {print $2}')
231     echo "$packages"
232     return 0
233 }
234
235 function pl_getGroups() {
236     filename=$1
237     groups=$(grep "^group:.*" $filename | awk ' {print $2}')
238     echo "$groups"
239     return 0
240 }