cd557713e8f1d2ad2573186cb7fbb2777953c42a
[hdw-linux/hdw-linux.git] / scripts / Build
1 #! /bin/bash
2 #
3 # author: hackbard@hackdaworld.dyndns.org
4 #
5 # this script is used to build hdw-linux packages. 
6 #
7
8 stage=""
9 package=""
10 no_src_del=""
11 priority=""
12 dir="*"
13
14 while [ "$1" ] ; do
15         case "$1" in 
16                 -stage)         stage=$2        ; shift 2 ;;
17                 -package)       package=$2      ; shift 2 ;;
18                 -no_src_del)    no_src_del="1"  ; shift 1 ;;
19                 -priority)      priority=$2     ; shift 2 ;;
20                 -dir)           dir=$2          ; shift 2 ;;
21                 *)
22                                 echo
23                                 echo "Usage:"
24                                 echo
25                                 echo -e " ./scripts/Build \t-stage stagelevel"
26                                 echo -e "\t\t\t-package package-name"
27                                 echo
28                                 exit 1 ;;
29         esac
30 done
31
32 if [ -z "$package" ]; then
33         echo "no package specified, abort."
34         exit 1
35 fi
36
37 if [ -z "$stage" ]; then
38         echo "no stage level specified, abort."
39         exit 1
40 fi
41
42 if [ -z "$priority" ] ; then
43         echo "no priority specified, abort."
44         exit 1
45 fi
46 export priority
47
48 # load config andsubroutines
49 . ./scripts/Config -stage $stage
50 . ./scripts/subroutines
51 # optimization
52 . ./scripts/optimization
53
54 # check for dietlibc
55 if [ "$stage" != "1" -a "$hdw_use_dietlibc" = "1" ] ; then
56         export CC="diet-dyn $CC -nostdinc"
57         export CXX="diet-dyn $CXX -nostdinc"
58 fi
59
60 # okay, this is going to be fun - happy h4ck1n6
61 #
62
63 # defining build environment variables to build a package.
64 if [ "$dir" = "*" ] ; then
65         dirs="`ls ./packages/*/$package/$package`"
66         if [ "`echo $dirs | awk '{ print NF }'`" -gt "1" ] ; then
67                 echo "please specify a category using -dir, possibilities:"
68                 for dir in $dirs; do
69                         echo "-> $dir"
70                 done
71                 exit 1
72         else
73                 dir="`echo $dirs | awk -F/ '{ print $3 }'`"
74         fi
75 fi
76
77 if [ -f ./packages/$dir/$package/$package ] ; then
78 echo "found $package config file ..."
79         
80         # defining help variables
81         confdir="$hdw_home_dir/packages/$dir/$package"
82         archdir="$hdw_home_dir/download/$dir/$package"
83
84         # lets get some package info
85         pkgs=`cat $confdir/$package | grep '^#\ \[D\]' | \
86                 awk '{ print $3 }'`
87         pkg=`echo $pkgs | awk '{ print $1 }'` # to make sure there is only 1
88         ver=`cat $confdir/$package | grep '^#\ \[V\]' | \
89                 awk '{ print $3 }'`
90         patch=`cat $confdir/$package | grep '^#\ \[P\]' | \
91                 awk '{ print $3 }'`
92
93         # lets see whether we have the source
94         if [ ! -f ./download/$dir/$package/$pkg -a ! -z "$pkg" ]; then
95                 echo "sources for $package not found, trying to get them ..."
96                 ./scripts/Download -package $package
97         fi
98         if [ ! -f ./download/$dir/$package/$pkg -a ! -z "$pkg" ]; then
99                 echo "sources still not found, aborting ..."
100                 exit 1
101         fi
102
103         # compress format of source?
104         if [ ! -z "`echo \`detect_file_ending $pkg\` | grep 'bz2'`" ] ; then
105                 compress="bzip2"
106         elif [ ! -z "`echo \`detect_file_ending $pkg\` | grep 'tbz2'`"] ; then
107                 compress="bzip2"
108         else
109                 compress="gzip"
110         fi
111
112         #
113         # defining elementary build functions and variables
114         #
115         custmain="0"
116         autoextract="1"
117         srcdir="$package*"
118         skip=""; s_reason=""
119         make_conf=""; install_conf=""
120         
121         prefix=""; docdir=""
122         if [ "$stage" -lt "2" ] ; then
123                 # use the symlink as prefix
124                 prefix="/${tc_name}"
125                 docdir="$prefix/share/doc/$package"
126                 install_conf="PREFIX=$prefix"
127         else
128                 if [ "$stage" = "2" -o "$stage" = "3" ] ; then
129                         prefix="$root/usr"; docdir="$root/usr/doc/$package"
130                         localstatedir="$root/var"
131                         sysconfdir="$root/etc"
132                 elif [ "$stage" = "4" ] ; then
133                         prefix="$root/opt/$package"
134                         docdir="$root/opt/$package/doc"
135                         localstatedir="$root/var/opt/$package"
136                         sysconfdir="$root/etc/opt/$package"
137                 fi
138         fi
139         
140         if [ -z "$prefix" ] ; then
141                 echo "problem: no prefix found! aborting .."
142                 exit 1
143         fi
144
145         # defining confopt now
146         confopt="--prefix=$prefix --bindir=$prefix/bin"
147         confopt="$confopt --sbindir=$prefix/sbin"
148         confopt="$confopt --libdir=$prefix/lib"
149         confopt="$confopt --datadir=$prefix/share"
150         confopt="$confopt --infodir=$prefix/info"
151         confopt="$confopt --mandir=$prefix/man"
152         if [ "$stage" -gt "1" ] ; then
153                 confopt="$confopt --localstatedir=$localstatedir"
154                 confopt="$confopt --sysconfdir=$sysconfdir"
155         fi
156         # architecture specific stuff
157         confopt="$confopt --build=$hdw_arch_build"
158         confopt="$confopt --host=$hdw_arch_host"
159         # crosscompiling
160         [ "$package" = "gcc" -o "$package" = "binutils" ] && \
161                 confopt="$confopt --target=$hdw_arch_target"
162
163         # buildfunctions
164         pre_install()   { 
165                 echo "hdw rules!" 
166                         }
167         post_install()  {
168                 echo "hdw rules!" 
169                         }
170         build_main ()   {
171                 echo
172                 echo "hdw-linux: \$confopt = $confopt"
173                 echo "hdw-linux: \$make_conf = $make_conf"
174                 echo "hdw-linux: \$install_conf = $install_conf"
175                 echo "lets do it ..."
176                 if [ -f ./configure ] ; then
177                         echo "run ./configure $confopt"
178                         ./configure $confopt
179                 fi
180                 echo ; echo "run make $make_conf"
181                 make $make_conf
182                 echo ; echo "run make $install_conf install"
183                 make $install_conf install
184                         }
185         
186         # flist find variables/command
187         flist_path="bin/ boot/ etc/ lib/ opt/ sbin/ usr/ var/"
188         [ "$stage" -lt "2" ] && flist_path="${flist_path} ${tc_name}/"
189         flist_cmd="find \$flist_path \( -cnewer $root/.time_$package -o \
190                 -newer $root/.time_$package \) \( -not -type d -o \
191                 -type d -empty \) -print"
192         flist_pruned="var/adm|var/log|var/run|var/tmp|var/spool"
193         flist_pruned="${flist_pruned}|var/cache|var/lock"
194         
195         # reading config functions and variables
196         . $confdir/$package
197         
198         # lets begin building, in case we dont skip it!
199         if [ -z "$skip" ] ; then
200         
201         # setting umask, we dont reset it!
202         umask 0022
203
204         # run ldconfig to, maybe we installed some libs before!
205         if [ "$stage" != "1" ] ; then
206                 echo "running ldconfig ..."
207                 ldconfig
208         fi
209         
210         # for creating the flist
211         #
212         cd $root/
213         touch .time_${package} && sleep 1
214         cd $hdw_home_dir
215
216         set -e
217         # use trap to catch errors in block
218         # we may kick out abort_when_package_build_failed lines
219         # can we use $_ instead off TRAP_ERR ?
220         {
221         trap 'abort_when_package_build_failed 1 $_' ERR
222
223         # automated build procedure
224         if [ "$custmain" != "0" ] ; then
225                 #build according packages custmain function
226                 if [ "$no_src_del" != "1" ] ; then
227                         rm -rf $root/src.$package
228                 fi
229                 mkdir -p $root/src.$package
230                 cd $root/src.$package
231                 if [ "$hdw_debug_buildenv" = "1" ] ; then
232                         echo 
233                         echo "Debug: (buildenvironment)"
234                         printenv
235                         echo
236                 fi
237                 custmain
238                 cd $hdw_home_dir
239                 rm -rf $root/src.$package
240         else    
241                 #now we go for automated building       
242                 # automated extract
243                 if [ "$no_src_del" != "1" ] ; then
244                         if [ "$autoextract" != "0" ] ; then
245                                 rm -rf $root/src.$package
246                                 mkdir -p $root/src.$package
247                                 tar --use-compress-program=$compress \
248                                         -xvf ./download/$dir/$package/$pkg \
249                                         -C $root/src.$package
250                         fi
251                 fi
252                 # change to directory and build
253                 cd $root/src.$package/$srcdir &&
254                 # patches from [P] tag
255                 if [ ! -z "$patch" ] ; then
256                         for every_single_patch in $patch; do
257                                 echo "aplying patch $every_single_patch ..."
258                                 patch -Nfp1 < $hdw_home_dir/download/$dir/$package/$every_single_patch
259                         done
260                         echo
261                 fi
262                 # patches from confdir
263                 # general patches
264                 for xtra_patch in `ls $confdir/*.patch 2> /dev/null`; do
265                         echo "applying patch $xtra_patch ..."
266                         patch -Nfp1 < $xtra_patch
267                 done
268                 # architecture dependent patches
269                 for xtra_patch in `ls $confdir/*.patch.${hdw_arch} 2> /dev/null`; do
270                         echo "applying patch $xtra_patch ..."
271                         patch -Nfp1 < $xtra_patch
272                 done
273                 # target specific patches
274                 for xtra_patch in `ls $confdir/*.patch.${hdw_target} 2> /dev/null`; do
275                         echo "applying patch $xtra_patch ..."
276                         patch -Nfp1 < $xtra_patch
277                 done
278                 # dietlibc patches
279                 if [ "$hdw_use_dietlibc" = "1" ] ; then
280                         for xtra_patch in `ls $confdir/*.patch.dietlibc 2> /dev/null`; do
281                                 echo "applying patch $xtra_patch ..."
282                                 patch -Nfp1 < $xtra_patch
283                         done
284                 fi
285                 # stage specific patches
286                 for xtra_patch in `ls $confdir/*.patch.${stage} 2> /dev/null`; do
287                         echo "applying patch $xtra_patch ..."
288                         patch -Nfp1 < $xtra_patch
289                 done
290                 # patch section end ;)
291                 echo
292                 pre_install
293                 if [ "$hdw_debug_buildenv" = "1" ] ; then
294                         echo
295                         echo "Debug: (buildenvironment)"
296                         printenv
297                         echo
298                 fi
299                 build_main 
300                 post_install
301                 cd $hdw_home_dir 
302                 rm -rf $root/src.$package
303         fi
304         # init
305         # dirty! not create *.init for 00-init-conf, manually done.
306         if [ "$package" != "00-init-conf" ] ; then
307                 for my_init in `ls $confdir/*.init 2> /dev/null`; do
308                         create_init $my_init
309                 done
310         fi
311         # setup scripts
312         if [ "$stage" != "1" ] ; then
313                 for my_setup in `ls $confdir/*.setup 2> /dev/null`; do
314                         create_setup_scripts $my_setup
315                 done
316         fi
317
318         }
319         # end of trap block
320
321         # let's see what we installed
322         #
323         cd $root/
324         eval $flist_cmd | grep -vE $flist_pruned > flist.$package
325
326         # let's create the flist
327         append=""
328         [ "$stage" = "0" ] && append=".stage0"
329         [ "$stage" = "1" ] && append=".stage1"
330         append="${append}-${priority}"
331         export package
332         export append
333         export stage
334         export priority
335         awk '\
336         BEGIN   { package=ENVIRON["package"] ; append=ENVIRON["append"] ; \
337                   stage=ENVIRON["stage"] ; priority=ENVIRON["priority"] } \
338                 { print package ": " $0 } \
339         END     { print package ": " "var/adm/logs/" stage "-" priority "-" \
340                   package ; \
341                   print package ": " "var/adm/flists/" package append }' \
342         $root/flist.$package > $root/var/adm/flists/${package}${append}
343         # manually add dependency files, calculated after flist
344         if [ "$stage" -ge "3" ] ; then
345                 echo "${package}: var/adm/deps/build/$package" >> \
346                 $root/var/adm/flists/${package}${append}
347                 echo "${package}: var/adm/deps/run/$package" >> \
348                 $root/var/adm/flists/${package}${append}
349         fi
350
351         # build/runtime dependencies (just libs >= stage 3, 
352         # default is 'hardcoded')
353         # still in development !!
354         if [ "$stage" -ge "3" ] ; then
355                 # build deps
356                 rm -f $root/var/adm/deps/build/$package
357                 echo -n "calculating build dependencies ... "
358                 alldeps=""
359                 for lib in `grep '\ -l[A-Za-z]' \
360                 $root/var/adm/logs/${stage}-${priority}-$package.out`; do
361                         if [ -n "`echo $lib | grep '^-l'`" ] ; then
362                                 lib=${lib//-l/lib}
363                                 for dep in `grep "/$lib\." \
364                                 -r $root/var/adm/flists | \
365                                 awk -F: '{ print $2 }'`; do
366                                         add=1
367                                         for cmp in $alldeps; do
368                                                 [ "$cmp" = "$dep" ] && add=0
369                                         done
370                                         [ "$add" = "1" ] && \
371                                                 alldeps="$dep $alldeps"
372                                 done
373                         fi
374                 done
375                 for dep in $alldeps; do
376                         echo "$dep" >> $root/var/adm/deps/build/$package
377                 done
378                 touch $root/var/adm/deps/build/$package
379                 echo "done"
380                 # runtime deps
381                 rm -f $root/var/adm/deps/run/$package
382                 echo -n "calculating runtime dependencies ... "
383                 alldeps=""
384                 for binary in `grep 'bin\/' \
385                                 $root/var/adm/flists/${package}${append} | \
386                                 awk '{ print $2 }'`; do
387                         for rdep in `ldd $root/$binary 2>&1 | \
388                                         awk '{ print $3 }' | \
389                                         sed 's$/$$' | grep -v 'dynamic' | \
390                                         grep -v '^ldd'`; do
391                                 for rpkg in `grep $rdep -r \
392                                                 $root/var/adm/flists | \
393                                                 grep -v $tc_name | \
394                                                 awk -F: '{ print $2 }'`; do
395                                         add=1
396                                         for cmp in $alldeps; do
397                                                 [ "$cmp" = "$rpkg" ] && add=0
398                                         done
399                                         [ "$add" = "1" ] && \
400                                                 alldeps="$rpkg $alldeps"
401                                 done
402                         done
403                 done
404                 for library in `grep 'lib\/.*.so.*' \
405                                 $root/var/adm/flists/${package}${append} | \
406                                 awk '{ print $2 }'`; do
407                         for rdep in `ldd $root/$library 2>&1 | \
408                                         awk '{ print $3 }' | \
409                                         sed 's$/$$' | grep -v 'dynamic' | \
410                                         grep -v '^ldd'`; do
411                                 for rpkg in `grep $rdep -r \
412                                                 $root/var/adm/flists | \
413                                                 grep -v $tc_name | \
414                                                 awk -F: '{ print $2 }'`; do
415                                         add=1
416                                         for cmp in $alldeps; do
417                                                 [ "$cmp" = "$rpkg" ] && add=0
418                                         done
419                                         [ "$add" = "1" ] && \
420                                                 alldeps="$rpkg $alldeps"
421                                 done
422                         done
423                 done
424                 for dep in $alldeps; do
425                         echo "$dep" >> $root/var/adm/deps/run/$package
426                 done
427                 touch $root/var/adm/deps/run/$package
428                 echo "done"
429         fi
430         
431         # remove flist stuff 
432         rm .time_${package}
433         rm flist.$package
434         cd $hdw_home_dir
435
436         else 
437                 [ -z "$s_reason" ] && s_reason=unknown
438                 echo
439                 echo "FYI: $package build skipped, reason: $s_reason"
440         fi # (if [ -z "$skip" ])
441
442 else
443         echo "cannot find $package config file ..."
444         exit 1
445 fi