reorganized Config file
[hdw-linux/hdw-linux.git] / scripts / create_cross_env
1 # hdw - linux create cross environment script
2 #
3 # author: hackbard@hackdaworld.dyndns.org
4 #
5 # this script is used to create the cross env
6 #
7
8 #
9 # hopefully obsolete, as toolchain gets build in every build now!
10 #
11 # just kept for nostalgic reasons, and damn it was a lot work to type
12 # this bullshit here ...
13 #
14
15 echo "create cross environment script obsolete now."
16 echo "we build a tool-chain in the beginning of stage 1"
17 echo "aborting ..."
18
19 exit
20
21 # some usefull functions
22 patch_it() {
23         package=$1
24         patches=`ls $hdw_home_dir/packages/base/$package/*.patch`
25         for patch in $patches; do
26                 echo "applying patch $patch ..."
27                 patch -Nfp1 < $patch
28         done
29         patches=`ls $hdw_home_dir/packages/base/$package/*.patch.${hdw_arch}`
30         for patch in $patches; do
31                 echo "applying patch $patch ..."
32                 patch -Nfp1 < $patch
33         done
34         patches=`ls $hdw_home_dir/misc/crossbuild/$package/*.patch`
35         for patch in $patches; do
36                 echo "applying patch $patch ..."
37                 patch -Nfp1 < $patch
38         done
39         patches=`ls $hdw_home_dir/misc/crossbuild/$package/*.patch.${hdw_arch}`
40         for patch in $patches; do
41                 echo "applying patch $patch ..."
42                 patch -Nfp1 < $patch
43         done
44 }
45
46 run_it() {
47         echo "running: $@"
48         $@
49         return $?
50 }
51
52 set_cflags()    {
53         echo "set apropriate compiler flags ..."
54         export CC=cc AS=as LD=ld AR=ar NM=nm F77=f77 CXX=c++ 
55         export STRIP=strip GASP=gasp RANLIB=ranlib KCC=kcc
56         unset CFLAGS
57 }
58         
59 # start
60
61 cross_root=""
62 no_glibc="0"
63
64 if [ ! -z "$1" ] ; then
65         # this seems to be a standalone call
66         . ./scripts/Config -stage 1 # no reason for other stage
67         . ./scripts/subroutines
68         # arguments
69         while [ "$1" ] ; do
70                 case "$1" in
71                         -cross_root)    cross_root="$2" ; shift 2 ;;
72                         -standalone)    echo "default standalone call"
73                                         shift 1 ;;
74                         -no_glibc)      no_glibc="1" 
75                                         echo "not building glibc"
76                                         shift 1 ;;
77                         *)              echo "usage:"
78                                         echo "$0 -cross_root foobar"
79                                         echo "$0 -standalone"
80                                         echo ; exit 1 ;;
81                 esac
82         done
83 fi
84
85 # small check
86 if [ -z "$hdw_build_dir" ] ; then
87         echo "debug: \$hdw_build_dir variable not set"
88         exit 1
89 fi
90
91 [ -z "$cross_root" ] && cross_root="$hdw_build_dir/crossenv-$hdw_arch"
92
93 if [ ! -f $cross_root/.cross_env ] ; then
94         # prepare
95         echo
96         echo_r "warning: " 
97         echo_y "crossbuilding is devel right now - you might crash your system!"
98         echo
99         echo_g "creating crossenv:"
100         echo -e "\a" ; sleep 2
101         # creating the cross root directory
102         mkdir -p $cross_root
103         
104         # look for sources
105         for object in linux binutils; do
106                 eval ${object}_src=`awk '/^# \[D\]/ { print $3 }' \
107                         packages/base/$object/$object | sort -r | tail -1`
108                 eval ${object}_ver=`awk '/^# \[V\]/ { print $3 }' \
109                         packages/base/$object/$object`
110                 eval tmp=\$${object}_src
111                 if [ -f download/base/$object/$tmp ] ; then
112                         echo "found $object package -> $tmp"
113                 else 
114                         echo "$tmp missing, aborting."
115                         exit 1
116                 fi
117         done
118         # gcc & glibc
119         gcc_src=`awk '/^# \[D\]/ { print $3 }' packages/base/gcc/gcc`
120         gcc_ver=`awk '/^# \[V\]/ { print $3 }' packages/base/gcc/gcc`
121         glibc_src=`awk '/^# \[D\]/ { print $3 }' packages/base/glibc/glibc`
122         glibc_ver=`awk '/^# \[V\]/ { print $3 }' packages/base/glibc/glibc`
123         for i in $gcc_src; do
124                 if [ -f download/base/gcc/$i ] ; then
125                         echo "found gcc package -> $i"
126                 else
127                         echo "$i missing, aborting."
128                         exit 1
129                 fi
130         done
131         for i in $glibc_src; do
132                 if [ -f download/base/glibc/$i ] ; then
133                         echo "found glibc package -> $i"
134                 else
135                         echo "$i missing, aborting."
136                         exit 1
137                 fi
138         done
139         gcc1_src=`echo $gcc_src | awk '{ print $1 }'`
140         gcc2_src=`echo $gcc_src | awk '{ print $2 }'`
141         g_a="" ; [ "$gcc_ver" != "cvs" ] && g_a="-$gcc_ver"
142
143         # we need it in PATH
144         export PATH="$PATH:$cross_root/bin:$cross_root/$hdw_arch_target/bin"
145
146         # create directories
147         echo
148         echo "creating build and crossenv directories ..."
149         mkdir -p $hdw_build_dir/src.crossenv
150         mkdir -p $cross_root/$hdw_arch_target/include
151         
152         #
153         # prepare confopt, make_conf, install_conf and cmd variables
154         #
155         # variables
156         set_cflags
157         
158         # build:
159         cd $hdw_build_dir/src.crossenv
160
161         # essential headers
162         # linux headers
163         echo "creating linux-headers"
164         if [ -f .linux-header ] ; then
165                 echo "linux headers already build, skipping ..."
166                 echo "build date: -> `cat .linux-header`"
167         else
168                 (
169                 echo "extracting linux source ..."
170                 tar --use-compress-program=bzip2 \
171                         -xvf $hdw_home_dir/download/base/linux/$linux_src
172                 cd linux-$linux_ver* &&
173                 # patching
174                 patch_it linux
175                 # make headers
176                 run_it make include/linux/version.h
177                 # copy them
178                 echo "copy headers ..."
179                 cp -rv include/linux $cross_root/$hdw_arch_target/include
180                 cp -rv include/asm-$hdw_arch \
181                         $cross_root/$hdw_arch_target/include/asm
182                 
183                 cd ..
184                 echo "`date`" > .linux-header
185                 ) > linux-header.log 2>&1
186         fi
187         # glibc headers
188         echo "creating glibc-headers"
189         if [ -f .glibc-header ] ; then
190                 echo "glibc headers already build, skipping ..."
191                 echo "build date: -> `cat .glibc-header`"
192         else
193                 (
194                 for s_src in $glibc_src; do
195                         echo "extracting $s_src ..."
196                         foo=""
197                         [ ! -z "`echo $s_src | grep threads`" ] &&
198                                 foo="-C glibc-$glibc_ver"
199                         tar --use-compress-program=bzip2 \
200                         -xvf $hdw_home_dir/download/base/glibc/$s_src $foo
201                 done
202                 mkdir -p glibc-build
203                 cd glibc-build &&
204                 cd ../glibc-$glibc_ver
205                 # patching
206                 patch_it glibc
207                 cd -
208                 # install headers
209                 run_it ../glibc-$glibc_ver/configure --prefix=$cross_root/$hdw_arch_target --enable-add-ons --with-headers=$cross_root/$hdw_arch_target/include --target=$hdw_arch_target $hdw_arch_build
210                 abort_when_package_build_failed $? $_
211                 # according to Roland McGrath <roland at gnu dot org>
212                 run_it make crosscompiling=yes no_deps=t install-headers
213                 # ignore errors ..
214                 # abort_when_package_build_failed $? $_
215                 # copying some files
216                 cd ../glibc-$glibc_ver
217                 mkdir -p $cross_root/$hdw_arch_target/include/{gnu,bits}
218                 cp -v include/features.h $cross_root/$hdw_arch_target/include
219                 # cp bits/stdio_lim.h $cross_root/$hdw_arch_target/include/bits
220                 touch $cross_root/$hdw_arch_target/include/gnu/stubs.h
221                 cd ..
222                 echo "`date`" > .glibc-header
223                 ) > glibc-header.log 2>&1
224         fi
225         # binutils
226         echo "creating cross binutils"
227         if [ -f .binutils ] ; then
228                 echo "binutils already build, skipping ..."
229                 echo "build date: -> `cat .binutils`"
230         else
231                 (
232                 echo "extracting binutils source ..."
233                 tar --use-compress-program=bzip2 \
234                         -xvf $hdw_home_dir/download/base/binutils/$binutils_src
235                 cd binutils-* &&
236                 # patching
237                 patch_it binutils
238                 #build
239                 run_it ./configure --prefix=$cross_root --program-prefix=$hdw_arch_prefix --target=$hdw_arch_target $hdw_arch_build
240                 abort_when_package_build_failed $? $_
241                 run_it make all install
242                 abort_when_package_build_failed $? $_
243                 cd ..
244                 echo "`date`" > .binutils
245                 ) > binutils.log 2>&1
246         fi
247         # bootstrap gcc
248         echo "creating bootstrap gcc"
249         if [ -f .bootstrap-gcc ] ; then
250                 echo "bootstrap gcc already build, skipping ..."
251                 echo "build date: -> `cat .bootstrap-gcc`"
252         else
253                 (
254                 echo "extracting gcc source ..."
255                 tar --use-compress-program=bzip2 \
256                         -xvf $hdw_home_dir/download/base/gcc/$gcc1_src
257                 mkdir gcc-build
258                 cd gcc-build &&
259                 cd ../gcc${g_a}
260                 # patching
261                 patch_it gcc
262                 cd -
263                 # build
264                 run_it ../gcc${g_a}/configure --prefix=$cross_root --program-prefix=$hdw_arch_prefix --disable-cpp --disable-shared --disable-multilib --enable-languages=c --target=$hdw_arch_target $hdw_arch_build
265                 abort_when_package_build_failed $? $_
266                 run_it make all install
267                 abort_when_package_build_failed $? $_
268                 cd ..
269                 echo "`date`" > .bootstrap-gcc
270                 ) > bootstrap-gcc.log 2>&1
271         fi
272         
273         # end here for a kernel crosscompiler
274         if [ "$no_glibc" = "1" ] ; then
275                 echo
276                 echo "finished creating crossenvironment"
277                 echo "you should now be able to build kernels for your alien."
278                 echo "add $cross_root/bin to your PATH variable"
279                 echo "edit ARCH and CROSS_COMPILE in your kernel's Makefile."
280                 echo "have fun ..."
281                 echo
282                 exit 0
283         fi
284         
285         # we need to specify the tools now
286         echo
287         echo "running optimization script to specify build tools"
288         echo
289         . $hdw_home_dir/scripts/optimization
290         
291         # glibc
292         echo "creating glibc"
293         if [ -f .glibc ] ; then
294                 echo "glibc already build, skipping ..."
295                 echo "build date: -> `cat .glibc`"
296         else
297                 (
298                 echo "recreating build directory ..."
299                 rm -rf glibc-build && mkdir glibc-build
300                 cd glibc-build &&
301                 # build cross glibc
302                 echo "debug: env variables"
303                 set
304                 echo
305                 run_it ../glibc-$glibc_ver/configure --enable-add-ons --enable-shared --with-headers=$cross_root/$hdw_arch_target/include --build=$hdw_arch_build --host=$hdw_arch_target --prefix=
306                 abort_when_package_build_failed $? $_
307                 run_it make
308                 abort_when_package_build_failed $? $_
309                 run_it make install_root=$cross_root/$hdw_arch_target install
310                 abort_when_package_build_failed $? $_
311                 cd ..
312                 echo "`date`" > .glibc
313                 ) > glibc.log 2>&1
314         fi
315         # cross gcc
316         # we again need diffrent cflags
317         set_cflags
318         echo "creating cross gcc"
319         if [ -f .gcc ] ; then
320                 echo "cross gcc already build, skipping ..."
321                 echo "build date: -> `cat .gcc`"
322         else
323                 (
324                 tar --use-compress-program=bzip2 \
325                 -xvf $hdw_home_dir/download/base/gcc/$gcc2_src
326                 echo "recreating build directory ..."
327                 rm -rf gcc-build && mkdir gcc-build
328                 cd gcc-build &&
329                 #build
330                 echo "debug: env variables"
331                 set
332                 echo
333                 run_it ../gcc${g_a}/configure --prefix=$cross_root --program-prefix=$hdw_arch_prefix --enable-languages="c,c++" --enable-shared --enable-threads --disable-multilib --target=$hdw_arch_target $hdw_arch_build # --host=$hdw_arch_build --build=$hdw_arch_build
334                 abort_when_package_build_failed $? $_
335                 run_it make
336                 abort_when_package_build_failed $? $_
337                 run_it make install
338                 abort_when_package_build_failed $? $_
339                 echo "`date`" > .gcc
340                 ) > gcc.log 2>&1
341         fi
342         
343
344         # making note
345         date > $cross_root/.cross_env
346         echo "crossenvironment ready - here we go now ;) ..."
347 else
348         echo "crossenv allready existing, build at:"
349         echo "-> `cat $cross_root/.cross_env`"
350         if [ -z "`echo $PATH | grep $cross_root\/bin`" ] ; then 
351                 echo "just updating PATH variable ..."
352                 export PATH="$PATH:$cross_root/bin"
353                 export PATH="$PATH:$cross_root/$hdw_arch_target/bin"
354         fi
355 fi
356
357 # return to home directory
358 cd $hdw_home_dir
359