ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/App-Staticperl/staticperl.sh
Revision: 1.12
Committed: Fri Dec 10 02:35:54 2010 UTC (13 years, 7 months ago) by root
Content type: application/x-sh
Branch: MAIN
Changes since 1.11: +6 -1 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 #!/bin/sh
2    
3     #############################################################################
4     # configuration to fill in
5    
6     STATICPERL=~/.staticperl
7     CPAN=http://mirror.netcologne.de/cpan/ # which mirror to use
8     EMAIL="read the documentation <rtfm@example.org>"
9    
10     MKBUNDLE="$STATICPERL/mkbundle"
11    
12     # perl build variables
13 root 1.6 PERL_PREFIX="$STATICPERL/perl" # where the perl gets installed
14     PERL_VERSION=5.12.2 # 5.8.9 is also a good choice
15 root 1.4 PERL_CONFIGURE="" # additional Configure arguments
16 root 1.1 PERL_CPPFLAGS="-DPERL_DISABLE_PMC -DPERL_ARENA_SIZE=65536 -D_GNU_SOURCE -DNDEBUG -USITELIB_EXP -USITEARCHEXP -UARCHLIB_EXP"
17     PERL_OPTIMIZE="-Os -ffunction-sections -fdata-sections -finline-limit=8 -ffast-math"
18    
19     ARCH="$(uname -m)"
20    
21     case "$ARCH" in
22     i*86 | x86_64 | amd64 )
23     PERL_OPTIMIZE="$PERL_OPTIMIZE -mpush-args -mno-inline-stringops-dynamically -mno-align-stringops -mno-ieee-fp" # x86/amd64
24     case "$ARCH" in
25     i*86 )
26     PERL_OPTIMIZE="$PERL_OPTIMIZE -fomit-frame-pointer -march=pentium3 -mtune=i386" # x86 only
27     ;;
28     esac
29     ;;
30     esac
31    
32     # -Wl,--gc-sections makes it impossible to check for undefined references
33     # for some reason so we need to patch away the "-no" after Configure and before make :/
34     # -z muldefs is to work around uclibc's pthread static linking bug
35     PERL_LDFLAGS="-Wl,--no-gc-sections -z muldefs"
36     PERL_LIBS="-lm -lcrypt" # perl loves to add lotsa crap itself
37    
38     # some configuration options for modules
39     export PERL_MM_USE_DEFAULT=1
40     #export CORO_INTERFACE=p # needed without nptl on x86, due to bugs in linuxthreads - very slow
41     export EV_EXTRA_DEFS='-DEV_FEATURES=4+8+16+64 -DEV_USE_SELECT=0 -DEV_USE_POLL=1 -DEV_USE_EPOLL=1 -DEV_NO_LOOPS -DEV_COMPAT3=0'
42    
43     # which extra modules to install by default from CPAN that are
44     # required by mkbundle
45 root 1.2 STATICPERL_MODULES="common::sense Pod::Strip PPI::XS Pod::Usage"
46    
47     # which extra modules you might want to install
48     EXTRA_MODULES=""
49 root 1.1
50     # overridable functions
51 root 1.7 preconfigure() { : ; }
52 root 1.1 postconfigure() { : ; }
53     postbuild() { : ; }
54     postinstall() { : ; }
55    
56     # now source user config, if any
57     [ -r /etc/staticperlrc ] && . /etc/staticperlrc
58     [ -r ~/.staticperlrc ] && . ~/.staticperlrc
59     [ -r "$STATICPERL/rc" ] && . "$STATICPERL/rc"
60    
61     #############################################################################
62     # support
63    
64 root 1.12 unset PERL5OPT PERL5LIB PERLLIB PERL_UNICODE PERLIO_DEBUG
65     export LC_ALL=C # just to be on the safe side
66    
67 root 1.1 # set version in a way that Makefile.PL can extract
68     VERSION=VERSION; eval \
69 root 1.11 $VERSION=0.9
70 root 1.1
71     BZ2=bz2
72     BZIP2=bzip2
73    
74     fatal() {
75     printf -- "\nFATAL: %s\n\n" "$*" >&2
76     exit 1
77     }
78    
79     verbose() {
80     printf -- "%s\n" "$*"
81     }
82    
83     verblock() {
84     verbose
85     verbose "***"
86     while read line; do
87     verbose "*** $line"
88     done
89     verbose "***"
90     verbose
91     }
92    
93     rcd() {
94     cd "$1" || fatal "$1: cannot enter"
95     }
96    
97     trace() {
98     prefix="$1"; shift
99     # "$@" 2>&1 | while read line; do
100     # echo "$prefix: $line"
101     # done
102     "$@"
103     }
104    
105     trap wait 0
106    
107     #############################################################################
108     # clean
109    
110     distclean() {
111     verblock <<EOF
112     deleting everything installed by this script
113     EOF
114    
115     rm -rf "$STATICPERL"
116     }
117    
118     #############################################################################
119     # download/configure/compile/install perl
120    
121     clean() {
122 root 1.7 rm -rf "$STATICPERL/src/perl-$PERL_VERSION"
123 root 1.1 }
124    
125     fetch() {
126     rcd "$STATICPERL"
127    
128     mkdir -p src
129     rcd src
130    
131 root 1.6 if ! [ -d "perl-$PERL_VERSION" ]; then
132     if ! [ -e "perl-$PERL_VERSION.tar.$BZ2" ]; then
133 root 1.1
134 root 1.6 URL="$CPAN/src/5.0/perl-$PERL_VERSION.tar.$BZ2"
135 root 1.1
136     verblock <<EOF
137     downloading perl
138     to manually download perl yourself, place
139 root 1.6 perl-$PERL_VERSION.tar.$BZ2 in $STATICPERL
140 root 1.1 trying $URL
141     EOF
142    
143 root 1.6 rm -f perl-$PERL_VERSION.tar.$BZ2~ # just to be on the safe side
144     wget -O perl-$PERL_VERSION.tar.$BZ2~ "$URL" \
145     || curl >perl-$PERL_VERSION.tar.$BZ2~ "$URL" \
146 root 1.5 || fatal "$URL: unable to download"
147 root 1.6 mv perl-$PERL_VERSION.tar.$BZ2~ perl-$PERL_VERSION.tar.$BZ2
148 root 1.1 fi
149    
150     verblock <<EOF
151     unpacking perl
152     EOF
153    
154     mkdir -p unpack
155 root 1.8 $BZIP2 -d <perl-$PERL_VERSION.tar.bz2 | tar xC unpack \
156 root 1.6 || fatal "perl-$PERL_VERSION.tar.bz2: error during unpacking"
157 root 1.8 chmod -R u+w unpack/perl-$PERL_VERSION
158 root 1.6 mv unpack/perl-$PERL_VERSION perl-$PERL_VERSION
159 root 1.1 rmdir -p unpack
160     fi
161     }
162    
163     # similar to GNU-sed -i or perl -pi
164     sedreplace() {
165     sed -e "$1" <"$2" > "$2~" || fatal "error while running sed"
166     mv "$2~" "$2"
167     }
168    
169     configure() {
170     fetch
171    
172 root 1.6 rcd "$STATICPERL/src/perl-$PERL_VERSION"
173 root 1.1
174     [ -e staticstamp.configure ] && return
175    
176     verblock <<EOF
177 root 1.6 configuring $STATICPERL/src/perl-$PERL_VERSION
178 root 1.1 EOF
179    
180 root 1.8 rm -f "$PERL_PREFIX/staticstamp.install"
181 root 1.1
182 root 1.8 make distclean >/dev/null 2>&1
183 root 1.1
184     # I hate them
185     grep -q -- -fstack-protector Configure && \
186     sedreplace 's/-fstack-protector/-fno-stack-protector/g' Configure
187    
188 root 1.7 preconfigure
189    
190 root 1.1 # trace configure \
191     sh Configure -Duselargefiles \
192     -Uuse64bitint \
193     -Dusemymalloc=n \
194     -Uusedl \
195     -Uusethreads \
196     -Uuseithreads \
197     -Uusemultiplicity \
198     -Duseperlio \
199     -Uusesfio \
200     -Uuseshrplib \
201     -Dcppflags="$PERL_CPPFLAGS" \
202     -Dccflags="-g2 -fno-strict-aliasing" \
203     -Doptimize="$PERL_OPTIMIZE" \
204     -Dldflags="$PERL_LDFLAGS" \
205     -Dlibs="$PERL_LIBS" \
206 root 1.6 -Dprefix="$PERL_PREFIX" \
207     -Dbin="$PERL_PREFIX/bin" \
208     -Dprivlib="$PERL_PREFIX/lib" \
209     -Darchlib="$PERL_PREFIX/lib" \
210 root 1.1 -Uusevendorprefix \
211 root 1.6 -Dsitelib="$PERL_PREFIX/lib" \
212     -Dsitearch="$PERL_PREFIX/lib" \
213 root 1.1 -Usitelibexp \
214     -Uman1dir \
215     -Uman3dir \
216     -Usiteman1dir \
217     -Usiteman3dir \
218     -Dpager=/usr/bin/less \
219     -Demail="$EMAIL" \
220     -Dcf_email="$EMAIL" \
221     -Dcf_by="$EMAIL" \
222 root 1.4 $PERL_CONFIGURE \
223 root 1.1 -dE || fatal "Configure failed"
224    
225     sedreplace '
226     s/-Wl,--no-gc-sections/-Wl,--gc-sections/g
227     s/ *-fno-stack-protector */ /g
228     ' config.sh
229    
230     sh Configure -S || fatal "Configure -S failed"
231    
232     postconfigure || fatal "postconfigure hook failed"
233    
234     touch staticstamp.configure
235     }
236    
237     build() {
238     configure
239    
240 root 1.6 rcd "$STATICPERL/src/perl-$PERL_VERSION"
241 root 1.1
242     verblock <<EOF
243 root 1.6 building $STATICPERL/src/perl-$PERL_VERSION
244 root 1.1 EOF
245    
246 root 1.6 rm -f "$PERL_PREFIX/staticstamp.install"
247 root 1.1
248     make || fatal "make: error while building perl"
249    
250     postbuild || fatal "postbuild hook failed"
251     }
252    
253     install() {
254 root 1.9 if ! [ -e "$PERL_PREFIX/staticstamp.install" ]; then
255     build
256 root 1.1
257 root 1.9 verblock <<EOF
258 root 1.6 installing $STATICPERL/src/perl-$PERL_VERSION
259     to $PERL_PREFIX
260 root 1.1 EOF
261    
262 root 1.9 rm -rf "$PERL_PREFIX"
263    
264     make install || fatal "make install: error while installing"
265 root 1.1
266 root 1.9 rcd "$PERL_PREFIX"
267 root 1.2
268 root 1.9 # create a "make install" replacement for CPAN
269     cat >"$PERL_PREFIX"/bin/cpan-make-install <<EOF
270 root 1.10 make || exit
271    
272 root 1.1 if find blib/arch/auto -type f | grep -q -v .exists; then
273     echo Probably an XS module, rebuilding perl
274 root 1.10 if make perl; then
275     mv perl "$PERL_PREFIX"/bin/perl
276     make -f Makefile.aperl map_clean
277     else
278     make -f Makefile.aperl map_clean
279     exit 1
280     fi
281 root 1.1 fi
282 root 1.10
283     make install UNINST=1
284 root 1.1 EOF
285 root 1.9 chmod 755 "$PERL_PREFIX"/bin/cpan-make-install
286    
287     # trick CPAN into avoiding ~/.cpan completely
288     echo 1 >"$PERL_PREFIX/lib/CPAN/MyConfig.pm"
289 root 1.1
290 root 1.9 "$PERL_PREFIX"/bin/perl -MCPAN -e '
291     CPAN::Shell->o (conf => urllist => push => "'"$CPAN"'");
292     CPAN::Shell->o (conf => q<cpan_home>, "'"$STATICPERL"'/cpan");
293     CPAN::Shell->o (conf => q<init>);
294     CPAN::Shell->o (conf => q<cpan_home>, "'"$STATICPERL"'/cpan");
295     CPAN::Shell->o (conf => q<build_dir>, "'"$STATICPERL"'/cpan/build");
296     CPAN::Shell->o (conf => q<prefs_dir>, "'"$STATICPERL"'/cpan/prefs");
297     CPAN::Shell->o (conf => q<histfile> , "'"$STATICPERL"'/cpan/histfile");
298     CPAN::Shell->o (conf => q<keep_source_where>, "'"$STATICPERL"'/cpan/sources");
299     CPAN::Shell->o (conf => q<make_install_make_command>, "'"$PERL_PREFIX"'/bin/cpan-make-install");
300     CPAN::Shell->o (conf => q<prerequisites_policy>, q<follow>);
301     CPAN::Shell->o (conf => q<build_requires_install_policy>, q<no>);
302     CPAN::Shell->o (conf => q<commit>);
303     ' || fatal "error while initialising CPAN"
304 root 1.2
305 root 1.9 touch "$PERL_PREFIX/staticstamp.install"
306     fi
307    
308 root 1.10 if ! [ -e "$PERL_PREFIX/staticstamp.postinstall" ]; then
309 root 1.9 NOCHECK_INSTALL=+
310     instcpan $STATICPERL_MODULES
311     [ $EXTRA_MODULES ] && instcpan $EXTRA_MODULES
312 root 1.1
313 root 1.9 postinstall || fatal "postinstall hook failed"
314 root 1.1
315 root 1.9 touch "$PERL_PREFIX/staticstamp.postinstall"
316     fi
317 root 1.1 }
318    
319     #############################################################################
320     # install a module from CPAN
321    
322     instcpan() {
323     [ $NOCHECK_INSTALL ] || install
324    
325     verblock <<EOF
326     installing modules from CPAN
327     $@
328     EOF
329    
330     for mod in "$@"; do
331 root 1.6 "$PERL_PREFIX"/bin/perl -MCPAN -e 'notest install => "'"$mod"'"' \
332 root 1.1 || fatal "$mod: unable to install from CPAN"
333     done
334     rm -rf "$STATICPERL/build"
335     }
336    
337     #############################################################################
338     # install a module from unpacked sources
339    
340     instsrc() {
341     [ $NOCHECK_INSTALL ] || install
342    
343     verblock <<EOF
344     installing modules from source
345     $@
346     EOF
347    
348     for mod in "$@"; do
349     echo
350     echo $mod
351     (
352     rcd $mod
353     make -f Makefile.aperl map_clean >/dev/null 2>&1
354     make distclean >/dev/null 2>&1
355 root 1.6 "$PERL_PREFIX"/bin/perl Makefile.PL || fatal "$mod: error running Makefile.PL"
356 root 1.1 make || fatal "$mod: error building module"
357 root 1.6 "$PERL_PREFIX"/bin/cpan-make-install || fatal "$mod: error installing module"
358 root 1.1 make distclean >/dev/null 2>&1
359     exit 0
360     ) || exit $?
361     done
362     }
363    
364     #############################################################################
365     # main
366    
367     podusage() {
368     echo
369 root 1.6 if [ -e "$PERL_PREFIX/bin/perl" ]; then
370     "$PERL_PREFIX/bin/perl" -MPod::Usage -e \
371 root 1.1 'pod2usage -input => *STDIN, -output => *STDOUT, -verbose => '$1', -exitval => 0, -noperldoc => 1' <"$0" \
372     2>/dev/null && exit
373     fi
374     # try whatever perl we can find
375     perl -MPod::Usage -e \
376     'pod2usage -input => *STDIN, -output => *STDOUT, -verbose => '$1', -exitval => 0, -noperldoc => 1' <"$0" \
377     2>/dev/null && exit
378    
379     fatal "displaying documentation requires a working perl - try '$0 install' first"
380     }
381    
382     usage() {
383     podusage 0
384     }
385    
386     catmkbundle() {
387     {
388     read dummy
389 root 1.6 echo "#!$PERL_PREFIX/bin/perl"
390 root 1.1 cat
391     } <<'MKBUNDLE'
392     #CAT mkbundle
393     MKBUNDLE
394     }
395    
396     bundle() {
397     catmkbundle >"$MKBUNDLE~" || fatal "$MKBUNDLE~: cannot create"
398     chmod 755 "$MKBUNDLE~" && mv "$MKBUNDLE~" "$MKBUNDLE"
399 root 1.12 CACHE="$STATICPERL/cache"
400     mkdir -p "$CACHE"
401     "$PERL_PREFIX/bin/perl" -- "$MKBUNDLE" --cache "$CACHE" "$@"
402 root 1.1 }
403    
404     if [ $# -gt 0 ]; then
405     while [ $# -gt 0 ]; do
406     mkdir -p "$STATICPERL" || fatal "$STATICPERL: cannot create"
407 root 1.6 mkdir -p "$PERL_PREFIX" || fatal "$PERL_PREFIX: cannot create"
408 root 1.1
409     command="${1#--}"; shift
410     case "$command" in
411     fetch | configure | build | install | clean | distclean)
412     verblock <<EOF
413     $command
414     EOF
415 root 1.6 ( "$command" )
416 root 1.1 ;;
417     instsrc )
418 root 1.6 ( instsrc "$@" )
419 root 1.1 exit
420     ;;
421     instcpan )
422 root 1.6 ( instcpan "$@" )
423 root 1.1 exit
424     ;;
425     cpan )
426 root 1.6 ( install )
427     "$PERL_PREFIX/bin/cpan" "$@"
428 root 1.1 exit
429     ;;
430     mkbundle )
431 root 1.6 ( install )
432 root 1.1 bundle "$@"
433     exit
434     ;;
435     mkperl )
436 root 1.6 ( install )
437 root 1.1 bundle --perl "$@"
438     exit
439     ;;
440 root 1.11 mkapp )
441     ( install )
442     bundle --app "$@"
443     exit
444     ;;
445 root 1.1 help )
446     podusage 2
447     ;;
448     * )
449     exec 1>&2
450     echo
451     echo "Unknown command: $command"
452     podusage 0
453     ;;
454     esac
455     done
456     else
457     usage
458     fi
459    
460     exit 0
461    
462     #CAT staticperl.pod
463