7320f0140c4fc03df69761d30cd3392a749391f5
[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 1094 2007-11-16 08:38:42Z thierry $
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 # vserver expects something like fc4 or f7
55 # for fedora only as of now
56 case $pl_DISTRO in
57     [Ff]edora*)
58         if [ "$pl_DISTRO_RELEASE" -le 6 ] ; then
59             pl_DISTRO_NAME=fc$pl_DISTRO_RELEASE
60         else
61             pl_DISTRO_NAME=f$pl_DISTRO_RELEASE
62         fi ;;
63     *)
64         echo "build.common: WARNING - pl_DISTRO_NAME not set for distro=$pl_DISTRO" ;;
65 esac
66
67 # get patch to appropriate yumgroups.xml file
68 # XXX This path should be relative to PLDISTRO, as defined in
69 # build/Makefile
70 pl_YUMGROUPSXML="../build/groups/v4_yumgroups.xml"
71 # Thierry: quick & dirty improvement 
72 # this is updated by the toplevel build, from the appropriate pldistro-dep file
73 # use another var for now for safety
74 pl_DISTRO_YUMGROUPS="../../../RPMS/yumgroups.xml"
75
76 function pl_process_fedora_options () {
77     # Get options
78     shiftcount=0
79     while getopts "l:r:a:h" opt ; do
80         case $opt in
81             l)
82                 pl_DISTRO_URL=$OPTARG
83                 let shiftcount=$shiftcount+2
84                 ;;
85             r)
86                 pl_DISTRO_RELEASE=$OPTARG
87                 let shiftcount=$shiftcount+2
88                 ;;
89             a)
90                 pl_DISTRO_ARCH=$OPTARG
91                 let shiftcount=$shiftcount+2
92                 ;;
93             h|*)
94                 echo "Usage: $0 [OPTION]..."
95                 echo "  -l url          distro mirror location (default: $pl_DISTRO_URL)"
96                 echo "  -r release      distro release number (default: $pl_DISTRO_RELEASE)"
97                 echo "  -a arch         distro architecture (default: $pl_DISTRO_ARCH)"
98                 echo "where distro can be either fedora, centos, or redhat"
99                 echo "  -h              This message"
100                 exit 1
101                 ;;
102         esac
103     done
104     return $shiftcount
105 }
106
107 function pl_makedevs() {
108     vroot=$1
109     # Clean ${vroot}/dev, but only when ${vroot}!=""
110     [ -n $vroot ] && rm -rf $vroot/dev
111     
112     mkdir -p $vroot/dev
113     mknod -m 666 $vroot/dev/null c 1 3
114     mknod -m 666 $vroot/dev/zero c 1 5
115     mknod -m 666 $vroot/dev/full c 1 7
116     mknod -m 644 $vroot/dev/random c 1 8
117     mknod -m 644 $vroot/dev/urandom c 1 9
118     mknod -m 666 $vroot/dev/tty c 5 0
119     mknod -m 666 $vroot/dev/ptmx c 5 2
120     # For bash command substitution
121     ln -nsf ../proc/self/fd $vroot/dev/fd
122
123     # For df and linuxconf
124     touch $vroot/dev/hdv1
125
126     # For pseudo ttys
127     mkdir -p $vroot/dev/pts
128
129     # (Might have to remove the following for vserver-reference.)
130
131     # for tmpfs mount
132     mkdir -p $vroot/dev/shm
133
134     # For TUN/TAP
135     mkdir -p $vroot/dev/net
136     mknod -m 600 $vroot/dev/net/tun c 10 200
137
138     # For mkinitrd (in case a kernel is being installed)
139     # As well for loop back mounting within a vserver. 
140     for i in $(seq 0 255) ; do
141         mknod -m 640 $vroot/dev/loop$i b 7 $i
142     done
143 }
144
145 function pl_mkfedora() {
146     root=$1
147     shift
148     options=$@
149
150     pl_makedevs $root
151
152     [ -n "$pl_DISTRO_URL" ] && options="$options -l $pl_DISTRO_URL"
153     [ -n "$pl_DISTRO_ARCH" ] && options="$options -a $pl_DISTRO_ARCH"
154     [ -n "$pl_DISTRO_RELEASE" ] && options="$options -r $pl_DISTRO_RELEASE"
155     # echo "mkfedora -v $options $root"
156     eval mkfedora -v $options $root
157 }
158
159 function pl_setup_chroot() {
160     root=$1
161     shift
162     options=$@
163
164     pl_mkfedora $root $options
165
166     # Disable all services in reference image
167     chroot $root sh -c "/sbin/chkconfig --list | awk '{ print \$1 }' | xargs -i /sbin/chkconfig {} off"
168
169     # FC2 minilogd starts up during shutdown and makes unmounting
170     # impossible. Just get rid of it.
171     rm -f $root/sbin/minilogd
172     ln -nsf /bin/true $root/sbin/minilogd
173
174     # This tells the Boot Manager that it is okay to update
175     # /etc/resolv.conf and /etc/hosts whenever the network configuration
176     # changes. Users are free to delete this file.
177     touch $vroot/etc/AUTO_UPDATE_NET_FILES
178 }
179
180 # Move specified directories out of a src tree into a dst tree, and
181 # then for each moved directory create a symlink in src to dst.
182 function pl_move_dirs() {
183     root=$1
184     data=$2
185     store=$3
186     shift 3
187
188     mkdir -p $root/data
189     for datadir in "$@" ; do
190         mkdir -p ${data}${datadir}
191         if [ -d ${root}/${datadir} -a ! -h ${root}/${datadir} ] ; then
192             (cd ${root} && find ./${datadir} | cpio -p -d -u ../${data}/)
193         fi
194         rm -rf ${root}/${datadir}
195         mkdir -p $(dirname ${root}/${datadir})
196         ln -nsf /${store}/${datadir} ${root}/${datadir}
197     done
198 }
199
200 # Construct an image file from given some directory
201 # XXX in the future maybe use livecdtools?
202 function pl_make_image() {
203     root=$1
204     image=$2
205     extraspace=$3
206
207     # Leave about 100 MB free space and allow for about 20% inode overhead
208     bytes=$((($(du -sb $root | cut -f1) + $extraspace) * 120 / 100))
209     bs=4096
210     blocks=$(($bytes / $bs))
211     dd bs=$bs count=$blocks if=/dev/zero of=$image
212     mkfs.ext3 -b $bs -j -F $image
213
214     # Temporarily mount it
215     tmp=$(mktemp -d tmp.XXXXXX)
216     mount -o loop $image $tmp
217     trap "umount $tmp; rmdir $tmp" ERR INT
218
219     # Move files to it
220     (cd $root && tar cpf - .) | (cd $tmp && tar xpf -)
221
222     # Unmount it
223     umount -l $tmp
224     rmdir $tmp
225     trap - ERR INT
226 }
227
228 # Fix permissions on tmp directories
229 function pl_fixtmp_permissions() {
230     root=$1
231     chmod 1777 $root/tmp $root/usr/tmp $root/var/tmp
232 }
233
234 function pl_fixdirs() {
235     root=$1
236     datadirs=$2
237     for datadir in datadirs ; do
238         if [ -h ${root}/${datadir} ] ; then
239             rm -f ${root}/${datadir}
240             mkdir -p ${root}/${datadir}
241         fi
242     done
243 }
244
245 function pl_getPackages() {
246     filename=$1
247     packages=$(grep "^package:" $filename | sed -e s,package:,,)
248     echo "$packages"
249     return 0
250 }
251
252 # add -p before each package for mkfedora
253 function pl_getPackagesOptions() {
254     pl_getPackages "$@" | awk '{for (i=1;i<=NF;i++) {print "-p " $i}}'
255 }
256
257 function pl_getGroups() {
258     filename=$1
259     groups=$(grep "^group:" $filename | sed -e s,group:,,)
260     echo "$groups"
261     return 0
262 }
263
264 # add -g before each group for mkfedora
265 function pl_getGroupsOptions() {
266     pl_getGroups "$@" | awk '{for (i=1;i<=NF;i++) {print "-g " $i}}'
267 }
268