ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/App-Staticperl/bin/staticperl
Revision: 1.74
Committed: Mon Mar 5 07:20:46 2012 UTC (14 years, 6 months ago) by root
Branch: MAIN
CVS Tags: rel-1_42
Changes since 1.73: +2 -2 lines
Log Message:
1.42

File Contents

# User Rev Content
1 root 1.1 #!/bin/sh
2    
3     #############################################################################
4 root 1.64 # configuration to fill in (or to replace in your .staticperlrc)
5 root 1.1
6     STATICPERL=~/.staticperl
7 root 1.19 CPAN=http://mirror.netcologne.de/cpan # which mirror to use
8 root 1.1 EMAIL="read the documentation <rtfm@example.org>"
9 root 1.64 DLCACHE=
10 root 1.1
11     # perl build variables
12 root 1.26 MAKE=make
13 root 1.69 PERL_VERSION=5.12.4 # 5.8.9 is also a good choice
14 root 1.24 PERL_CC=cc
15 root 1.8 PERL_CONFIGURE="" # additional Configure arguments
16 root 1.49 PERL_CCFLAGS="-g -DPERL_DISABLE_PMC -DPERL_ARENA_SIZE=16376 -DNO_PERL_MALLOC_ENV -D_GNU_SOURCE -DNDEBUG"
17 root 1.72 PERL_OPTIMIZE="-Os" # -Os -ffunction-sections -fdata-sections -finline-limit=8 -ffast-math"
18 root 1.1
19     ARCH="$(uname -m)"
20    
21 root 1.72 #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 root 1.1
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 root 1.21 # --allow-multiple-definition exists to work around uclibc's pthread static linking bug
35 root 1.56 #PERL_LDFLAGS="-Wl,--no-gc-sections -Wl,--allow-multiple-definition"
36     PERL_LDFLAGS=
37 root 1.1 PERL_LIBS="-lm -lcrypt" # perl loves to add lotsa crap itself
38    
39     # some configuration options for modules
40 root 1.31 PERL_MM_USE_DEFAULT=1
41 root 1.58 PERL_MM_OPT="MAN1PODS= MAN3PODS="
42 root 1.31 #CORO_INTERFACE=p # needed without nptl on x86, due to bugs in linuxthreads - very slow
43 root 1.66 #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'
44     export PERL_MM_USE_DEFAULT PERL_MM_OPT
45 root 1.1
46     # which extra modules to install by default from CPAN that are
47     # required by mkbundle
48 root 1.2 STATICPERL_MODULES="common::sense Pod::Strip PPI::XS Pod::Usage"
49    
50     # which extra modules you might want to install
51     EXTRA_MODULES=""
52 root 1.1
53     # overridable functions
54 root 1.11 preconfigure() { : ; }
55 root 1.56 patchconfig() { : ; }
56 root 1.1 postconfigure() { : ; }
57     postbuild() { : ; }
58     postinstall() { : ; }
59    
60     # now source user config, if any
61 root 1.19 if [ "$STATICPERLRC" ]; then
62     . "$STATICPERLRC"
63     else
64     [ -r /etc/staticperlrc ] && . /etc/staticperlrc
65     [ -r ~/.staticperlrc ] && . ~/.staticperlrc
66     [ -r "$STATICPERL/rc" ] && . "$STATICPERL/rc"
67     fi
68 root 1.1
69     #############################################################################
70     # support
71    
72 root 1.19 PERL_PREFIX="${PERL_PREFIX:=$STATICPERL/perl}" # where the perl gets installed
73    
74 root 1.57 unset PERL5OPT PERL5LIB PERLLIB PERL_UNICODE PERLIO_DEBUG
75 root 1.58 unset PERL_MB_OPT
76 root 1.31 LC_ALL=C; export LC_ALL # just to be on the safe side
77 root 1.18
78 root 1.57 # prepend PATH - not required by staticperl itself, but might make
79     # life easier when working in e.g. "staticperl cpan / look"
80     PATH="$PERL_PREFIX/perl/bin:$PATH"
81    
82 root 1.1 # set version in a way that Makefile.PL can extract
83     VERSION=VERSION; eval \
84 root 1.74 $VERSION="1.42"
85 root 1.1
86     BZ2=bz2
87     BZIP2=bzip2
88    
89     fatal() {
90     printf -- "\nFATAL: %s\n\n" "$*" >&2
91     exit 1
92     }
93    
94     verbose() {
95     printf -- "%s\n" "$*"
96     }
97    
98     verblock() {
99     verbose
100     verbose "***"
101     while read line; do
102     verbose "*** $line"
103     done
104     verbose "***"
105     verbose
106     }
107    
108     rcd() {
109     cd "$1" || fatal "$1: cannot enter"
110     }
111    
112     trace() {
113     prefix="$1"; shift
114     # "$@" 2>&1 | while read line; do
115     # echo "$prefix: $line"
116     # done
117     "$@"
118     }
119    
120     trap wait 0
121    
122     #############################################################################
123     # clean
124    
125     distclean() {
126     verblock <<EOF
127 root 1.19 deleting everything installed by this script (rm -rf $STATICPERL)
128 root 1.1 EOF
129    
130     rm -rf "$STATICPERL"
131     }
132    
133     #############################################################################
134     # download/configure/compile/install perl
135    
136     clean() {
137 root 1.68 rm -rf "$STATICPERL/src"
138 root 1.1 }
139    
140 root 1.28 realclean() {
141     rm -f "$PERL_PREFIX/staticstamp.postinstall"
142     rm -f "$PERL_PREFIX/staticstamp.install"
143     rm -f "$STATICPERL/src/perl-"*"/staticstamp.configure"
144     }
145    
146 root 1.1 fetch() {
147     rcd "$STATICPERL"
148    
149     mkdir -p src
150     rcd src
151    
152 root 1.10 if ! [ -d "perl-$PERL_VERSION" ]; then
153 root 1.64 PERLTAR=perl-$PERL_VERSION.tar.$BZ2
154 root 1.1
155 root 1.64 if ! [ -e $PERLTAR ]; then
156     URL="$CPAN/src/5.0/$PERLTAR"
157 root 1.1
158     verblock <<EOF
159     downloading perl
160     to manually download perl yourself, place
161 root 1.10 perl-$PERL_VERSION.tar.$BZ2 in $STATICPERL
162 root 1.1 trying $URL
163 root 1.61
164     either curl or wget is required for automatic download.
165     curl is tried first, then wget.
166 root 1.64
167     you can configure a download cache directory via DLCACHE
168     in your .staticperlrc to avoid repeated downloads.
169 root 1.1 EOF
170    
171 root 1.64 rm -f $PERLTAR~ # just to be on the safe side
172 root 1.68 { [ "$DLCACHE" ] && cp "$DLCACHE"/$PERLTAR $PERLTAR~ >/dev/null 2>&1; } \
173 root 1.64 || wget -O $PERLTAR~ "$URL" \
174     || curl -f >$PERLTAR~ "$URL" \
175 root 1.10 || fatal "$URL: unable to download"
176 root 1.64 rm -f $PERLTAR
177     mv $PERLTAR~ $PERLTAR
178     if [ "$DLCACHE" ]; then
179     mkdir -p "$DLCACHE"
180 root 1.65 cp $PERLTAR "$DLCACHE"/$PERLTAR~ && \
181 root 1.64 mv "$DLCACHE"/$PERLTAR~ "$DLCACHE"/$PERLTAR
182     fi
183 root 1.1 fi
184    
185     verblock <<EOF
186     unpacking perl
187     EOF
188    
189     mkdir -p unpack
190 root 1.25 rm -rf unpack/perl-$PERL_VERSION
191 root 1.64 $BZIP2 -d <$PERLTAR | ( cd unpack && tar xf - ) \
192     || fatal "$PERLTAR: error during unpacking"
193 root 1.12 chmod -R u+w unpack/perl-$PERL_VERSION
194 root 1.10 mv unpack/perl-$PERL_VERSION perl-$PERL_VERSION
195 root 1.1 rmdir -p unpack
196     fi
197     }
198    
199     # similar to GNU-sed -i or perl -pi
200     sedreplace() {
201     sed -e "$1" <"$2" > "$2~" || fatal "error while running sed"
202 root 1.25 rm -f "$2"
203 root 1.1 mv "$2~" "$2"
204     }
205    
206 root 1.27 configure_failure() {
207     cat <<EOF
208    
209    
210     ***
211     *** Configure failed - see above for the exact error message(s).
212     ***
213     *** Most commonly, this is because the default PERL_CCFLAGS or PERL_OPTIMIZE
214     *** flags are not supported by your compiler. Less often, this is because
215     *** PERL_LIBS either contains a library not available on your system (such as
216     *** -lcrypt), or because it lacks a required library (e.g. -lsocket or -lnsl).
217     ***
218     *** You can provide your own flags by creating a ~/.staticperlrc file with
219     *** variable assignments. For example (these are the actual values used):
220     ***
221    
222     PERL_CC="$PERL_CC"
223     PERL_CCFLAGS="$PERL_CCFLAGS"
224     PERL_OPTIMIZE="$PERL_OPTIMIZE"
225     PERL_LDFLAGS="$PERL_LDFLAGS"
226     PERL_LIBS="$PERL_LIBS"
227    
228     EOF
229     exit 1
230     }
231    
232 root 1.1 configure() {
233     fetch
234    
235 root 1.10 rcd "$STATICPERL/src/perl-$PERL_VERSION"
236 root 1.1
237     [ -e staticstamp.configure ] && return
238    
239     verblock <<EOF
240 root 1.10 configuring $STATICPERL/src/perl-$PERL_VERSION
241 root 1.1 EOF
242    
243 root 1.12 rm -f "$PERL_PREFIX/staticstamp.install"
244 root 1.1
245 root 1.26 "$MAKE" distclean >/dev/null 2>&1
246 root 1.1
247 root 1.28 sedreplace '/^#define SITELIB/d' config_h.SH
248    
249     # I hate them for this
250 root 1.1 grep -q -- -fstack-protector Configure && \
251     sedreplace 's/-fstack-protector/-fno-stack-protector/g' Configure
252    
253 root 1.56 # what did that bloke think
254     grep -q -- usedl=.define hints/darwin.sh && \
255     sedreplace '/^usedl=.define.;$/d' hints/darwin.sh
256    
257     preconfigure || fatal "preconfigure hook failed"
258 root 1.11
259 root 1.1 # trace configure \
260     sh Configure -Duselargefiles \
261     -Uuse64bitint \
262     -Dusemymalloc=n \
263     -Uusedl \
264     -Uusethreads \
265     -Uuseithreads \
266     -Uusemultiplicity \
267     -Uusesfio \
268     -Uuseshrplib \
269 root 1.33 -Uinstallusrbinperl \
270 root 1.27 -A ccflags=" $PERL_CCFLAGS" \
271 root 1.25 -Dcc="$PERL_CC" \
272 root 1.1 -Doptimize="$PERL_OPTIMIZE" \
273     -Dldflags="$PERL_LDFLAGS" \
274     -Dlibs="$PERL_LIBS" \
275 root 1.10 -Dprefix="$PERL_PREFIX" \
276     -Dbin="$PERL_PREFIX/bin" \
277     -Dprivlib="$PERL_PREFIX/lib" \
278     -Darchlib="$PERL_PREFIX/lib" \
279 root 1.1 -Uusevendorprefix \
280 root 1.10 -Dsitelib="$PERL_PREFIX/lib" \
281     -Dsitearch="$PERL_PREFIX/lib" \
282 root 1.1 -Uman1dir \
283     -Uman3dir \
284     -Usiteman1dir \
285     -Usiteman3dir \
286     -Dpager=/usr/bin/less \
287     -Demail="$EMAIL" \
288     -Dcf_email="$EMAIL" \
289     -Dcf_by="$EMAIL" \
290 root 1.8 $PERL_CONFIGURE \
291 root 1.25 -Duseperlio \
292 root 1.27 -dE || configure_failure
293 root 1.1
294     sedreplace '
295     s/-Wl,--no-gc-sections/-Wl,--gc-sections/g
296     s/ *-fno-stack-protector */ /g
297     ' config.sh
298    
299 root 1.56 patchconfig || fatal "patchconfig hook failed"
300    
301 root 1.1 sh Configure -S || fatal "Configure -S failed"
302    
303     postconfigure || fatal "postconfigure hook failed"
304    
305 root 1.68 : > staticstamp.configure
306 root 1.1 }
307    
308 root 1.58 write_shellscript() {
309     {
310     echo "#!/bin/sh"
311     echo "STATICPERL=\"$STATICPERL\""
312     echo "PERL_PREFIX=\"$PERL_PREFIX\""
313     echo "MAKE=\"$MAKE\""
314     cat
315     } >"$PERL_PREFIX/bin/$1"
316     chmod 755 "$PERL_PREFIX/bin/$1"
317     }
318    
319 root 1.1 build() {
320     configure
321    
322 root 1.10 rcd "$STATICPERL/src/perl-$PERL_VERSION"
323 root 1.1
324     verblock <<EOF
325 root 1.10 building $STATICPERL/src/perl-$PERL_VERSION
326 root 1.1 EOF
327    
328 root 1.10 rm -f "$PERL_PREFIX/staticstamp.install"
329 root 1.1
330 root 1.26 "$MAKE" || fatal "make: error while building perl"
331 root 1.1
332     postbuild || fatal "postbuild hook failed"
333     }
334    
335 root 1.68 _postinstall() {
336     if ! [ -e "$PERL_PREFIX/staticstamp.postinstall" ]; then
337     NOCHECK_INSTALL=+
338     instcpan $STATICPERL_MODULES
339     [ $EXTRA_MODULES ] && instcpan $EXTRA_MODULES
340    
341     postinstall || fatal "postinstall hook failed"
342    
343     : > "$PERL_PREFIX/staticstamp.postinstall"
344     fi
345     }
346    
347 root 1.1 install() {
348 root 1.13 if ! [ -e "$PERL_PREFIX/staticstamp.install" ]; then
349     build
350 root 1.1
351 root 1.13 verblock <<EOF
352 root 1.10 installing $STATICPERL/src/perl-$PERL_VERSION
353     to $PERL_PREFIX
354 root 1.1 EOF
355    
356 root 1.19 ln -sf "perl/bin/" "$STATICPERL/bin"
357     ln -sf "perl/lib/" "$STATICPERL/lib"
358    
359 root 1.58 mkdir "$STATICPERL/patched"
360    
361 root 1.19 ln -sf "$PERL_PREFIX" "$STATICPERL/perl" # might get overwritten
362     rm -rf "$PERL_PREFIX" # by this rm -rf
363    
364 root 1.26 "$MAKE" install || fatal "make install: error while installing"
365 root 1.1
366 root 1.13 rcd "$PERL_PREFIX"
367 root 1.2
368 root 1.13 # create a "make install" replacement for CPAN
369 root 1.58 write_shellscript SP-make-install-make <<'EOF'
370     #! sh
371    
372 root 1.26 "$MAKE" || exit
373 root 1.14
374 root 1.58 "$PERL_PREFIX"/bin/SP-patch-postinstall
375 root 1.55
376 root 1.68 if find blib/arch/auto -type f \( -name "*.a" -o -name "*.obj" -o -name "*.lib" \) | grep -q .; then
377     echo Probably a static XS module, rebuilding perl
378 root 1.58 if "$MAKE" all perl; then
379 root 1.25 mv perl "$PERL_PREFIX"/bin/perl~ \
380     && rm -f "$PERL_PREFIX"/bin/perl \
381     && mv "$PERL_PREFIX"/bin/perl~ "$PERL_PREFIX"/bin/perl
382 root 1.26 "$MAKE" -f Makefile.aperl map_clean
383 root 1.14 else
384 root 1.26 "$MAKE" -f Makefile.aperl map_clean
385 root 1.14 exit 1
386     fi
387 root 1.1 fi
388 root 1.14
389 root 1.26 "$MAKE" install UNINST=1
390 root 1.59
391 root 1.1 EOF
392 root 1.13
393 root 1.58 # create a "patch modules" helper
394     write_shellscript SP-patch-postinstall <<'EOF'
395     #! sh
396    
397     # helper to apply patches after installation
398    
399     patch() {
400     path="$PERL_PREFIX/lib/$1"
401     cache="$STATICPERL/patched/$2"
402     sed="$3"
403    
404     if "$PERL_PREFIX/bin/perl" -e 'exit ((stat shift)[9] <= (stat shift)[9])' "$path" "$cache"; then
405     echo "patching $path for a better tomorrrow"
406    
407     if ! sed -e "$sed" <"$path" > "$cache~"; then
408     echo
409     echo "*** FATAL: error while patching $path"
410     echo
411     else
412     rm -f "$cache"
413     mv "$cache~" "$cache"
414     rm -f "$path"
415     cp "$cache" "$path"
416     fi
417     fi
418     }
419    
420     # patch CPAN::HandleConfig.pm to always include _our_ MyConfig.pm,
421     # not the one in the users homedirectory, to avoid clobbering his.
422     patch CPAN/HandleConfig.pm cpan_handleconfig_pm '
423     1i\
424     use CPAN::MyConfig; # patched by staticperl
425     '
426    
427     # patch ExtUtils::MM_Unix to always search blib for modules
428 root 1.59 # when building a perl - this works around Pango/Gtk2 being misdetected
429 root 1.58 # as not being an XS module.
430     patch ExtUtils/MM_Unix.pm mm_unix_pm '
431     /^sub staticmake/,/^}/ s/if (@{$self->{C}}) {/if (@{$self->{C}} or $self->{NAME} =~ m%^(Pango|Gtk2)$%) { # patched by staticperl/
432     '
433    
434 root 1.73 # patch ExtUtils::MM_Any *temporarily* because it breaks Pod::Parser
435 root 1.74 patch ExtUtils/MM_Any.pm mm_any_pm '
436 root 1.73 /^sub metafile_data/ a\
437     return; # patched by staticperl
438     '
439    
440 root 1.67 # patch ExtUtils::Miniperl to always add DynaLoader
441     # this is required for dynamic loading in static perls,
442     # and static loading in dynamic perls, when rebuilding a new perl.
443     # Why this patch is necessray I don't understand. Yup.
444     patch ExtUtils/Miniperl.pm extutils_miniperl.pm '
445     /^sub writemain/ a\
446 root 1.68 push @_, canon("/","DynaLoader"); # patched by staticperl
447 root 1.67 '
448 root 1.58 EOF
449    
450     "$PERL_PREFIX/bin/SP-patch-postinstall"
451    
452     # help to trick CPAN into avoiding ~/.cpan completely
453 root 1.13 echo 1 >"$PERL_PREFIX/lib/CPAN/MyConfig.pm"
454 root 1.1
455 root 1.58 # we call cpan with -MCPAN::MyConfig in this script, which
456     # is strictly unnecssary as we have to patch CPAN anyway,
457     # so consider it "for good measure".
458 root 1.55 "$PERL_PREFIX"/bin/perl -MCPAN::MyConfig -MCPAN -e '
459 root 1.13 CPAN::Shell->o (conf => urllist => push => "'"$CPAN"'");
460     CPAN::Shell->o (conf => q<cpan_home>, "'"$STATICPERL"'/cpan");
461     CPAN::Shell->o (conf => q<init>);
462     CPAN::Shell->o (conf => q<cpan_home>, "'"$STATICPERL"'/cpan");
463     CPAN::Shell->o (conf => q<build_dir>, "'"$STATICPERL"'/cpan/build");
464     CPAN::Shell->o (conf => q<prefs_dir>, "'"$STATICPERL"'/cpan/prefs");
465     CPAN::Shell->o (conf => q<histfile> , "'"$STATICPERL"'/cpan/histfile");
466     CPAN::Shell->o (conf => q<keep_source_where>, "'"$STATICPERL"'/cpan/sources");
467 root 1.58 CPAN::Shell->o (conf => q<make_install_make_command>, "'"$PERL_PREFIX"'/bin/SP-make-install-make");
468 root 1.13 CPAN::Shell->o (conf => q<prerequisites_policy>, q<follow>);
469     CPAN::Shell->o (conf => q<build_requires_install_policy>, q<no>);
470 root 1.55 CPAN::Shell->o (conf => q<prefer_installer>, "EUMM");
471 root 1.13 CPAN::Shell->o (conf => q<commit>);
472     ' || fatal "error while initialising CPAN"
473 root 1.2
474 root 1.68 : > "$PERL_PREFIX/staticstamp.install"
475 root 1.13 fi
476    
477 root 1.68 _postinstall
478     }
479    
480     import() {
481     IMPORT="$1"
482    
483     rcd "$STATICPERL"
484    
485     if ! [ -e "$PERL_PREFIX/staticstamp.install" ]; then
486     verblock <<EOF
487     import perl from $IMPORT to $STATICPERL
488     EOF
489 root 1.1
490 root 1.68 rm -rf bin cpan lib patched perl src
491     mkdir -m 755 perl perl/bin
492     ln -s perl/bin/ bin
493     ln -s "$IMPORT" perl/bin/
494 root 1.1
495 root 1.72 echo "$IMPORT" > "$PERL_PREFIX/.import"
496    
497 root 1.68 : > "$PERL_PREFIX/staticstamp.install"
498 root 1.13 fi
499 root 1.68
500     _postinstall
501 root 1.1 }
502    
503     #############################################################################
504     # install a module from CPAN
505    
506     instcpan() {
507     [ $NOCHECK_INSTALL ] || install
508    
509     verblock <<EOF
510     installing modules from CPAN
511     $@
512     EOF
513    
514 root 1.72 MYCONFIG=
515     [ -e "$PERL_PREFIX/.import" ] || MYCONFIG=-MCPAN::MyConfig
516    
517     "$PERL_PREFIX"/bin/perl $MYCONFIG -MCPAN -e 'notest (install => $_) for @ARGV' -- "$@" | tee "$STATICPERL/instcpan.log"
518 root 1.68
519     if grep -q " -- NOT OK\$" "$STATICPERL/instcpan.log"; then
520     fatal "failure while installing modules from CPAN ($@)"
521     fi
522     rm -f "$STATICPERL/instcpan.log"
523 root 1.1 }
524    
525     #############################################################################
526     # install a module from unpacked sources
527    
528     instsrc() {
529     [ $NOCHECK_INSTALL ] || install
530    
531     verblock <<EOF
532     installing modules from source
533     $@
534     EOF
535    
536     for mod in "$@"; do
537     echo
538     echo $mod
539     (
540     rcd $mod
541 root 1.26 "$MAKE" -f Makefile.aperl map_clean >/dev/null 2>&1
542     "$MAKE" distclean >/dev/null 2>&1
543 root 1.10 "$PERL_PREFIX"/bin/perl Makefile.PL || fatal "$mod: error running Makefile.PL"
544 root 1.26 "$MAKE" || fatal "$mod: error building module"
545 root 1.58 "$PERL_PREFIX"/bin/SP-make-install-make install || fatal "$mod: error installing module"
546 root 1.26 "$MAKE" distclean >/dev/null 2>&1
547 root 1.1 exit 0
548     ) || exit $?
549     done
550     }
551    
552     #############################################################################
553     # main
554    
555     podusage() {
556     echo
557 root 1.22
558 root 1.10 if [ -e "$PERL_PREFIX/bin/perl" ]; then
559     "$PERL_PREFIX/bin/perl" -MPod::Usage -e \
560 root 1.1 'pod2usage -input => *STDIN, -output => *STDOUT, -verbose => '$1', -exitval => 0, -noperldoc => 1' <"$0" \
561     2>/dev/null && exit
562     fi
563 root 1.22
564 root 1.1 # try whatever perl we can find
565     perl -MPod::Usage -e \
566     'pod2usage -input => *STDIN, -output => *STDOUT, -verbose => '$1', -exitval => 0, -noperldoc => 1' <"$0" \
567     2>/dev/null && exit
568    
569 root 1.22 fatal "displaying documentation requires a working perl - try '$0 install' to build one in a safe location"
570 root 1.1 }
571    
572     usage() {
573     podusage 0
574     }
575    
576     catmkbundle() {
577     {
578     read dummy
579 root 1.10 echo "#!$PERL_PREFIX/bin/perl"
580 root 1.1 cat
581     } <<'MKBUNDLE'
582     #!/opt/bin/perl
583    
584     #############################################################################
585     # cannot load modules till after the tracer BEGIN block
586    
587 root 1.69 our $VERBOSE = 1;
588     our $STRIP = "pod"; # none, pod or ppi
589     our $UNISTRIP = 1; # always on, try to strip unicore swash data
590     our $PERL = 0;
591 root 1.17 our $APP;
592 root 1.69 our $VERIFY = 0;
593     our $STATIC = 0;
594     our $PACKLIST = 0;
595     our $IGNORE_ENV = 0;
596     our $ALLOW_DYNAMIC = 0;
597     our $HAVE_DYNAMIC; # maybe useful?
598 root 1.1
599 root 1.18 our $OPTIMISE_SIZE = 0; # optimise for raw file size instead of for compression?
600    
601     our $CACHE;
602     our $CACHEVER = 1; # do not change unless you know what you are doing
603    
604 root 1.1 my $PREFIX = "bundle";
605     my $PACKAGE = "static";
606    
607     my %pm;
608 root 1.8 my %pmbin;
609 root 1.1 my @libs;
610     my @static_ext;
611     my $extralibs;
612 root 1.18 my @staticlibs;
613     my @incext;
614 root 1.1
615     @ARGV
616     or die "$0: use 'staticperl help' (or read the sources of staticperl)\n";
617    
618 root 1.18 # remove "." from @INC - staticperl.sh does it for us, but be on the safe side
619     BEGIN { @INC = grep !/^\.$/, @INC }
620    
621 root 1.1 $|=1;
622    
623     our ($TRACER_W, $TRACER_R);
624    
625 root 1.19 sub find_incdir($) {
626 root 1.1 for (@INC) {
627     next if ref;
628     return $_ if -e "$_/$_[0]";
629     }
630    
631     undef
632     }
633    
634 root 1.19 sub find_inc($) {
635     my $dir = find_incdir $_[0];
636    
637     return "$dir/$_[0]"
638     if defined $dir;
639    
640     undef
641     }
642    
643 root 1.1 BEGIN {
644     # create a loader process to detect @INC requests before we load any modules
645     my ($W_TRACER, $R_TRACER); # used by tracer
646    
647     pipe $R_TRACER, $TRACER_W or die "pipe: $!";
648     pipe $TRACER_R, $W_TRACER or die "pipe: $!";
649    
650     unless (fork) {
651     close $TRACER_R;
652     close $TRACER_W;
653    
654 root 1.35 my $pkg = "pkg000000";
655    
656 root 1.1 unshift @INC, sub {
657 root 1.19 my $dir = find_incdir $_[1]
658 root 1.1 or return;
659    
660     syswrite $W_TRACER, "-\n$dir\n$_[1]\n";
661    
662     open my $fh, "<:perlio", "$dir/$_[1]"
663     or warn "ERROR: $dir/$_[1]: $!\n";
664    
665     $fh
666     };
667    
668     while (<$R_TRACER>) {
669     if (/use (.*)$/) {
670     my $mod = $1;
671 root 1.49 my $eval;
672    
673     if ($mod =~ /^'.*'$/ or $mod =~ /^".*"$/) {
674     $eval = "require $mod";
675     } elsif ($mod =~ y%/.%%) {
676     $eval = "require q\x00$mod\x00";
677     } else {
678     my $pkg = ++$pkg;
679     $eval = "{ package $pkg; use $mod; }";
680     }
681    
682 root 1.36 eval $eval;
683 root 1.1 warn "ERROR: $@ (while loading '$mod')\n"
684     if $@;
685     } elsif (/eval (.*)$/) {
686     my $eval = $1;
687     eval $eval;
688     warn "ERROR: $@ (in '$eval')\n"
689     if $@;
690     }
691 root 1.19
692     syswrite $W_TRACER, "\n";
693 root 1.1 }
694    
695     exit 0;
696     }
697     }
698    
699     # module loading is now safe
700 root 1.7
701 root 1.19 sub trace_parse {
702 root 1.1 for (;;) {
703     <$TRACER_R> =~ /^-$/ or last;
704     my $dir = <$TRACER_R>; chomp $dir;
705     my $name = <$TRACER_R>; chomp $name;
706    
707     $pm{$name} = "$dir/$name";
708 root 1.19
709     print "+ found potential dependency $name\n"
710     if $VERBOSE >= 3;
711 root 1.1 }
712     }
713    
714 root 1.19 sub trace_module {
715     print "tracing module $_[0]\n"
716     if $VERBOSE >= 2;
717    
718     syswrite $TRACER_W, "use $_[0]\n";
719     trace_parse;
720     }
721    
722 root 1.1 sub trace_eval {
723 root 1.19 print "tracing eval $_[0]\n"
724     if $VERBOSE >= 2;
725    
726 root 1.1 syswrite $TRACER_W, "eval $_[0]\n";
727 root 1.19 trace_parse;
728 root 1.1 }
729    
730     sub trace_finish {
731     close $TRACER_W;
732     close $TRACER_R;
733     }
734    
735     #############################################################################
736     # now we can use modules
737    
738     use common::sense;
739 root 1.18 use Config;
740 root 1.1 use Digest::MD5;
741    
742 root 1.18 sub cache($$$) {
743     my ($variant, $src, $filter) = @_;
744    
745 root 1.19 if (length $CACHE and 2048 <= length $src and defined $variant) {
746 root 1.18 my $file = "$CACHE/" . Digest::MD5::md5_hex "$CACHEVER\x00$variant\x00$src";
747    
748     if (open my $fh, "<:perlio", $file) {
749 root 1.19 print "using cache for $file\n"
750     if $VERBOSE >= 7;
751    
752 root 1.18 local $/;
753     return <$fh>;
754     }
755    
756     $src = $filter->($src);
757    
758 root 1.19 print "creating cache entry $file\n"
759     if $VERBOSE >= 8;
760    
761 root 1.18 if (open my $fh, ">:perlio", "$file~") {
762     if ((syswrite $fh, $src) == length $src) {
763     close $fh;
764     rename "$file~", $file;
765     }
766     }
767    
768     return $src;
769     }
770    
771     $filter->($src)
772     }
773    
774 root 1.1 sub dump_string {
775     my ($fh, $data) = @_;
776    
777     if (length $data) {
778 root 1.69 if ($^O eq "MSWin32") {
779     # 16 bit system, strings can't be longer than 64k. seriously.
780     print $fh "{\n";
781     for (
782     my $ofs = 0;
783     length (my $substr = substr $data, $ofs, 20);
784     $ofs += 20
785     ) {
786     $substr = join ",", map ord, split //, $substr;
787     print $fh " $substr,\n";
788     }
789     print $fh " 0 }\n";
790     } else {
791     for (
792     my $ofs = 0;
793     length (my $substr = substr $data, $ofs, 80);
794     $ofs += 80
795     ) {
796     $substr =~ s/([^\x20-\x21\x23-\x5b\x5d-\x7e])/sprintf "\\%03o", ord $1/ge;
797     $substr =~ s/\?/\\?/g; # trigraphs...
798     print $fh " \"$substr\"\n";
799     }
800 root 1.1 }
801     } else {
802     print $fh " \"\"\n";
803     }
804     }
805    
806 root 1.18 #############################################################################
807    
808     sub glob2re {
809     for (quotemeta $_[0]) {
810     s/\\\*/\x00/g;
811     s/\x00\x00/.*/g;
812     s/\x00/[^\/]*/g;
813     s/\\\?/[^\/]/g;
814    
815     $_ = s/^\\\/// ? "^$_\$" : "(?:^|/)$_\$";
816    
817     s/(?: \[\^\/\] | \. ) \*\$$//x;
818    
819     return qr<$_>s
820     }
821     }
822    
823     our %INCSKIP = (
824     "unicore/TestProp.pl" => undef, # 3.5MB of insanity, apparently just some testcase
825     );
826    
827     sub get_dirtree {
828     my $root = shift;
829    
830     my @tree;
831     my $skip;
832    
833     my $scan; $scan = sub {
834     for (sort do {
835     opendir my $fh, $_[0]
836     or return;
837     readdir $fh
838     }) {
839     next if /^\./;
840    
841     my $path = "$_[0]/$_";
842    
843     if (-d "$path/.") {
844     $scan->($path);
845     } else {
846     $path = substr $path, $skip;
847     push @tree, $path
848     unless exists $INCSKIP{$path};
849     }
850     }
851     };
852    
853     $root =~ s/\/$//;
854     $skip = 1 + length $root;
855     $scan->($root);
856    
857     \@tree
858     }
859    
860     my $inctrees;
861    
862     sub get_inctrees {
863     unless ($inctrees) {
864     my %inctree;
865     $inctree{$_} ||= [$_, get_dirtree $_] # entries in @INC are often duplicates
866     for @INC;
867     $inctrees = [values %inctree];
868     }
869    
870     @$inctrees
871     }
872 root 1.1
873 root 1.18 #############################################################################
874 root 1.1
875     sub cmd_boot {
876 root 1.69 $pm{"!boot"} = $_[0];
877 root 1.1 }
878    
879     sub cmd_add {
880 root 1.41 $_[0] =~ /^(.*?)(?:\s+(\S+))?$/
881 root 1.1 or die "$_[0]: cannot parse";
882    
883     my $file = $1;
884 root 1.44 my $as = defined $2 ? $2 : $1;
885 root 1.1
886     $pm{$as} = $file;
887 root 1.8 $pmbin{$as} = 1 if $_[1];
888 root 1.1 }
889    
890 root 1.18 sub cmd_staticlib {
891     push @staticlibs, $_
892     for split /\s+/, $_[0];
893     }
894    
895     sub cmd_include {
896     push @incext, [$_[1], glob2re $_[0]];
897     }
898    
899     sub cmd_incglob {
900     my ($pattern) = @_;
901    
902     $pattern = glob2re $pattern;
903    
904     for (get_inctrees) {
905     my ($dir, $files) = @$_;
906    
907     $pm{$_} = "$dir/$_"
908 root 1.31 for grep /$pattern/ && /\.(pl|pm)$/, @$files;
909 root 1.18 }
910     }
911    
912 root 1.19 sub parse_argv;
913    
914 root 1.1 sub cmd_file {
915     open my $fh, "<", $_[0]
916     or die "$_[0]: $!\n";
917    
918 root 1.19 local @ARGV;
919    
920 root 1.1 while (<$fh>) {
921     chomp;
922 root 1.19 next unless /\S/;
923     next if /^\s*#/;
924    
925     s/^\s*-*/--/;
926 root 1.1 my ($cmd, $args) = split / /, $_, 2;
927    
928 root 1.19 push @ARGV, $cmd;
929     push @ARGV, $args if defined $args;
930 root 1.1 }
931 root 1.19
932     parse_argv;
933 root 1.1 }
934    
935     use Getopt::Long;
936    
937 root 1.19 sub parse_argv {
938     GetOptions
939 root 1.49 "perl" => \$PERL,
940     "app=s" => \$APP,
941    
942     "verbose|v" => sub { ++$VERBOSE },
943     "quiet|q" => sub { --$VERBOSE },
944    
945 root 1.31 "strip=s" => \$STRIP,
946     "cache=s" => \$CACHE, # internal option
947     "eval|e=s" => sub { trace_eval $_[1] },
948     "use|M=s" => sub { trace_module $_[1] },
949     "boot=s" => sub { cmd_boot $_[1] },
950     "add=s" => sub { cmd_add $_[1], 0 },
951     "addbin=s" => sub { cmd_add $_[1], 1 },
952     "incglob=s" => sub { cmd_incglob $_[1] },
953     "include|i=s" => sub { cmd_include $_[1], 1 },
954     "exclude|x=s" => sub { cmd_include $_[1], 0 },
955 root 1.49 "usepacklists!" => \$PACKLIST,
956    
957 root 1.31 "static!" => \$STATIC,
958     "staticlib=s" => sub { cmd_staticlib $_[1] },
959 root 1.69 "allow-dynamic!"=> \$ALLOW_DYNAMIC,
960 root 1.49 "ignore-env" => \$IGNORE_ENV,
961    
962 root 1.31 "<>" => sub { cmd_file $_[0] },
963 root 1.19 or exit 1;
964     }
965    
966 root 1.1 Getopt::Long::Configure ("bundling", "no_auto_abbrev", "no_ignore_case");
967    
968 root 1.19 parse_argv;
969 root 1.1
970 root 1.17 die "cannot specify both --app and --perl\n"
971     if $PERL and defined $APP;
972    
973 root 1.18 # required for @INC loading, unfortunately
974     trace_module "PerlIO::scalar";
975    
976     #############################################################################
977 root 1.31 # apply include/exclude
978 root 1.18
979     {
980     my %pmi;
981    
982     for (@incext) {
983     my ($inc, $glob) = @$_;
984    
985     my @match = grep /$glob/, keys %pm;
986    
987     if ($inc) {
988     # include
989     @pmi{@match} = delete @pm{@match};
990 root 1.19
991     print "applying include $glob - protected ", (scalar @match), " files.\n"
992     if $VERBOSE >= 5;
993 root 1.18 } else {
994     # exclude
995     delete @pm{@match};
996 root 1.19
997 root 1.31 print "applying exclude $glob - removed ", (scalar @match), " files.\n"
998 root 1.19 if $VERBOSE >= 5;
999 root 1.18 }
1000     }
1001    
1002     my @pmi = keys %pmi;
1003     @pm{@pmi} = delete @pmi{@pmi};
1004     }
1005    
1006     #############################################################################
1007 root 1.31 # scan for AutoLoader, static archives and other dependencies
1008 root 1.18
1009     sub scan_al {
1010     my ($auto, $autodir) = @_;
1011    
1012     my $ix = "$autodir/autosplit.ix";
1013    
1014 root 1.19 print "processing autoload index for '$auto'\n"
1015     if $VERBOSE >= 6;
1016    
1017 root 1.18 $pm{"$auto/autosplit.ix"} = $ix;
1018    
1019     open my $fh, "<:perlio", $ix
1020     or die "$ix: $!";
1021    
1022     my $package;
1023    
1024     while (<$fh>) {
1025     if (/^\s*sub\s+ ([^[:space:];]+) \s* (?:\([^)]*\))? \s*;?\s*$/x) {
1026     my $al = "auto/$package/$1.al";
1027     my $inc = find_inc $al;
1028    
1029     defined $inc or die "$al: autoload file not found, but should be there.\n";
1030    
1031 root 1.19 $pm{$al} = $inc;
1032     print "found autoload function '$al'\n"
1033     if $VERBOSE >= 6;
1034 root 1.18
1035     } elsif (/^\s*package\s+([^[:space:];]+)\s*;?\s*$/) {
1036     ($package = $1) =~ s/::/\//g;
1037     } elsif (/^\s*(?:#|1?\s*;?\s*$)/) {
1038     # nop
1039     } else {
1040 root 1.19 warn "WARNING: $ix: unparsable line, please report: $_";
1041 root 1.18 }
1042     }
1043     }
1044    
1045     for my $pm (keys %pm) {
1046     if ($pm =~ /^(.*)\.pm$/) {
1047     my $auto = "auto/$1";
1048     my $autodir = find_inc $auto;
1049    
1050 root 1.19 if (defined $autodir && -d $autodir) {
1051 root 1.18 # AutoLoader
1052     scan_al $auto, $autodir
1053     if -f "$autodir/autosplit.ix";
1054    
1055     # extralibs.ld
1056     if (open my $fh, "<:perlio", "$autodir/extralibs.ld") {
1057 root 1.19 print "found extralibs for $pm\n"
1058     if $VERBOSE >= 6;
1059    
1060 root 1.18 local $/;
1061     $extralibs .= " " . <$fh>;
1062     }
1063    
1064     $pm =~ /([^\/]+).pm$/ or die "$pm: unable to match last component";
1065    
1066     my $base = $1;
1067    
1068     # static ext
1069     if (-f "$autodir/$base$Config{_a}") {
1070 root 1.19 print "found static archive for $pm\n"
1071     if $VERBOSE >= 3;
1072    
1073 root 1.18 push @libs, "$autodir/$base$Config{_a}";
1074     push @static_ext, $pm;
1075     }
1076    
1077     # dynamic object
1078 root 1.68 if (-f "$autodir/$base.$Config{dlext}") {
1079 root 1.69 if ($ALLOW_DYNAMIC) {
1080     my $as = "!$auto/$base.$Config{dlext}";
1081 root 1.68 $pm{$as} = "$autodir/$base.$Config{dlext}";
1082     $pmbin{$as} = 1;
1083    
1084 root 1.69 $HAVE_DYNAMIC = 1;
1085 root 1.68
1086 root 1.69 print "+ added dynamic object $as\n"
1087 root 1.68 if $VERBOSE >= 3;
1088     } else {
1089 root 1.69 die "ERROR: found shared object '$autodir/$base.$Config{dlext}' but --allow-dynamic not given, aborting.\n"
1090 root 1.68 }
1091     }
1092 root 1.19
1093     if ($PACKLIST && open my $fh, "<:perlio", "$autodir/.packlist") {
1094     print "found .packlist for $pm\n"
1095     if $VERBOSE >= 3;
1096    
1097     while (<$fh>) {
1098     chomp;
1099 root 1.31 s/ .*$//; # newer-style .packlists might contain key=value pairs
1100 root 1.19
1101     # only include certain files (.al, .ix, .pm, .pl)
1102     if (/\.(pm|pl|al|ix)$/) {
1103     for my $inc (@INC) {
1104     # in addition, we only add files that are below some @INC path
1105     $inc =~ s/\/*$/\//;
1106    
1107     if ($inc eq substr $_, 0, length $inc) {
1108     my $base = substr $_, length $inc;
1109     $pm{$base} = $_;
1110    
1111     print "+ added .packlist dependency $base\n"
1112     if $VERBOSE >= 3;
1113     }
1114    
1115     last;
1116     }
1117     }
1118     }
1119     }
1120 root 1.18 }
1121     }
1122     }
1123    
1124     #############################################################################
1125    
1126 root 1.19 print "processing bundle files (try more -v power if you get bored waiting here)...\n"
1127     if $VERBOSE >= 1;
1128    
1129 root 1.1 my $data;
1130     my @index;
1131     my @order = sort {
1132     length $a <=> length $b
1133     or $a cmp $b
1134     } keys %pm;
1135    
1136     # sorting by name - better compression, but needs more metadata
1137     # sorting by length - faster lookup
1138     # usually, the metadata overhead beats the loss through compression
1139    
1140     for my $pm (@order) {
1141     my $path = $pm{$pm};
1142    
1143     128 > length $pm
1144 root 1.18 or die "ERROR: $pm: path too long (only 128 octets supported)\n";
1145 root 1.1
1146     my $src = ref $path
1147     ? $$path
1148     : do {
1149 root 1.7 open my $pm, "<", $path
1150 root 1.1 or die "$path: $!";
1151    
1152     local $/;
1153    
1154     <$pm>
1155     };
1156    
1157 root 1.18 my $size = length $src;
1158    
1159 root 1.8 unless ($pmbin{$pm}) { # only do this unless the file is binary
1160     if ($pm =~ /^auto\/POSIX\/[^\/]+\.al$/) {
1161     if ($src =~ /^ unimpl \"/m) {
1162 root 1.22 print "$pm: skipping (raises runtime error only).\n"
1163 root 1.19 if $VERBOSE >= 3;
1164 root 1.8 next;
1165     }
1166 root 1.1 }
1167    
1168 root 1.19 $src = cache +($STRIP eq "ppi" ? "$UNISTRIP,$OPTIMISE_SIZE" : undef), $src, sub {
1169 root 1.18 if ($UNISTRIP && $pm =~ /^unicore\/.*\.pl$/) {
1170 root 1.19 print "applying unicore stripping $pm\n"
1171     if $VERBOSE >= 6;
1172    
1173 root 1.18 # special stripping for unicore swashes and properties
1174     # much more could be done by going binary
1175     $src =~ s{
1176     (^return\ <<'END';\n) (.*?\n) (END(?:\n|\Z))
1177     }{
1178     my ($pre, $data, $post) = ($1, $2, $3);
1179    
1180     for ($data) {
1181     s/^([0-9a-fA-F]+)\t([0-9a-fA-F]+)\t/sprintf "%X\t%X", hex $1, hex $2/gem
1182     if $OPTIMISE_SIZE;
1183    
1184     # s{
1185     # ^([0-9a-fA-F]+)\t([0-9a-fA-F]*)\t
1186     # }{
1187     # # ww - smaller filesize, UU - compress better
1188     # pack "C0UU",
1189     # hex $1,
1190     # length $2 ? (hex $2) - (hex $1) : 0
1191     # }gemx;
1192 root 1.1
1193 root 1.18 s/#.*\n/\n/mg;
1194     s/\s+\n/\n/mg;
1195     }
1196 root 1.8
1197 root 1.18 "$pre$data$post"
1198     }smex;
1199 root 1.1 }
1200    
1201 root 1.18 if ($STRIP =~ /ppi/i) {
1202     require PPI;
1203    
1204     if (my $ppi = PPI::Document->new (\$src)) {
1205     $ppi->prune ("PPI::Token::Comment");
1206     $ppi->prune ("PPI::Token::Pod");
1207    
1208     # prune END stuff
1209     for (my $last = $ppi->last_element; $last; ) {
1210     my $prev = $last->previous_token;
1211    
1212     if ($last->isa (PPI::Token::Whitespace::)) {
1213     $last->delete;
1214     } elsif ($last->isa (PPI::Statement::End::)) {
1215     $last->delete;
1216     last;
1217     } elsif ($last->isa (PPI::Token::Pod::)) {
1218     $last->delete;
1219     } else {
1220     last;
1221     }
1222    
1223     $last = $prev;
1224     }
1225    
1226     # prune some but not all insignificant whitespace
1227     for my $ws (@{ $ppi->find (PPI::Token::Whitespace::) }) {
1228     my $prev = $ws->previous_token;
1229     my $next = $ws->next_token;
1230    
1231     if (!$prev || !$next) {
1232     $ws->delete;
1233     } else {
1234     if (
1235     $next->isa (PPI::Token::Operator::) && $next->{content} =~ /^(?:,|=|!|!=|==|=>)$/ # no ., because of digits. == float
1236     or $prev->isa (PPI::Token::Operator::) && $prev->{content} =~ /^(?:,|=|\.|!|!=|==|=>)$/
1237     or $prev->isa (PPI::Token::Structure::)
1238     or ($OPTIMISE_SIZE &&
1239     ($prev->isa (PPI::Token::Word::)
1240     && (PPI::Token::Symbol:: eq ref $next
1241     || $next->isa (PPI::Structure::Block::)
1242     || $next->isa (PPI::Structure::List::)
1243     || $next->isa (PPI::Structure::Condition::)))
1244     )
1245     ) {
1246     $ws->delete;
1247     } elsif ($prev->isa (PPI::Token::Whitespace::)) {
1248     $ws->{content} = ' ';
1249     $prev->delete;
1250     } else {
1251     $ws->{content} = ' ';
1252     }
1253     }
1254     }
1255 root 1.1
1256 root 1.18 # prune whitespace around blocks
1257     if ($OPTIMISE_SIZE) {
1258     # these usually decrease size, but decrease compressability more
1259     for my $struct (PPI::Structure::Block::, PPI::Structure::Condition::) {
1260     for my $node (@{ $ppi->find ($struct) }) {
1261     my $n1 = $node->first_token;
1262     my $n2 = $n1->previous_token;
1263     $n1->delete if $n1->isa (PPI::Token::Whitespace::);
1264     $n2->delete if $n2 && $n2->isa (PPI::Token::Whitespace::);
1265     my $n1 = $node->last_token;
1266     my $n2 = $n1->next_token;
1267     $n1->delete if $n1->isa (PPI::Token::Whitespace::);
1268     $n2->delete if $n2 && $n2->isa (PPI::Token::Whitespace::);
1269     }
1270     }
1271    
1272     for my $node (@{ $ppi->find (PPI::Structure::List::) }) {
1273     my $n1 = $node->first_token;
1274     $n1->delete if $n1->isa (PPI::Token::Whitespace::);
1275     my $n1 = $node->last_token;
1276     $n1->delete if $n1->isa (PPI::Token::Whitespace::);
1277     }
1278 root 1.8 }
1279 root 1.1
1280 root 1.18 # reformat qw() lists which often have lots of whitespace
1281     for my $node (@{ $ppi->find (PPI::Token::QuoteLike::Words::) }) {
1282     if ($node->{content} =~ /^qw(.)(.*)(.)$/s) {
1283     my ($a, $qw, $b) = ($1, $2, $3);
1284     $qw =~ s/^\s+//;
1285     $qw =~ s/\s+$//;
1286     $qw =~ s/\s+/ /g;
1287     $node->{content} = "qw$a$qw$b";
1288     }
1289 root 1.8 }
1290 root 1.18
1291     $src = $ppi->serialize;
1292     } else {
1293     warn "WARNING: $pm{$pm}: PPI failed to parse this file\n";
1294 root 1.8 }
1295 root 1.33 } elsif ($STRIP =~ /pod/i && $pm ne "Opcode.pm") { # opcode parses its own pod
1296 root 1.18 require Pod::Strip;
1297 root 1.8
1298 root 1.18 my $stripper = Pod::Strip->new;
1299    
1300     my $out;
1301     $stripper->output_string (\$out);
1302     $stripper->parse_string_document ($src)
1303     or die;
1304     $src = $out;
1305 root 1.1 }
1306    
1307 root 1.18 if ($VERIFY && $pm =~ /\.pm$/ && $pm ne "Opcode.pm") {
1308     if (open my $fh, "-|") {
1309     <$fh>;
1310     } else {
1311     eval "#line 1 \"$pm\"\n$src" or warn "\n\n\n$pm\n\n$src\n$@\n\n\n";
1312     exit 0;
1313 root 1.8 }
1314 root 1.1 }
1315 root 1.8
1316 root 1.18 $src
1317     };
1318 root 1.1
1319 root 1.8 # if ($pm eq "Opcode.pm") {
1320     # open my $fh, ">x" or die; print $fh $src;#d#
1321     # exit 1;
1322     # }
1323 root 1.1 }
1324    
1325 root 1.19 print "adding $pm (original size $size, stored size ", length $src, ")\n"
1326 root 1.1 if $VERBOSE >= 2;
1327    
1328     push @index, ((length $pm) << 25) | length $data;
1329     $data .= $pm . $src;
1330     }
1331    
1332     length $data < 2**25
1333 root 1.19 or die "ERROR: bundle too large (only 32MB supported)\n";
1334 root 1.1
1335 root 1.51 my $varpfx = "bundle";
1336 root 1.1
1337     #############################################################################
1338     # output
1339    
1340 root 1.19 print "generating $PREFIX.h... "
1341     if $VERBOSE >= 1;
1342 root 1.1
1343     {
1344     open my $fh, ">", "$PREFIX.h"
1345     or die "$PREFIX.h: $!\n";
1346    
1347     print $fh <<EOF;
1348 root 1.52 /* do not edit, automatically created by staticperl */
1349 root 1.8
1350 root 1.1 #include <EXTERN.h>
1351     #include <perl.h>
1352     #include <XSUB.h>
1353    
1354     /* public API */
1355     EXTERN_C PerlInterpreter *staticperl;
1356 root 1.7 EXTERN_C void staticperl_xs_init (pTHX);
1357 root 1.37 EXTERN_C void staticperl_init (XSINIT_t xs_init); /* argument can be 0 */
1358 root 1.1 EXTERN_C void staticperl_cleanup (void);
1359 root 1.8
1360 root 1.1 EOF
1361     }
1362    
1363 root 1.19 print "\n"
1364     if $VERBOSE >= 1;
1365 root 1.1
1366     #############################################################################
1367     # output
1368    
1369 root 1.19 print "generating $PREFIX.c... "
1370     if $VERBOSE >= 1;
1371 root 1.1
1372     open my $fh, ">", "$PREFIX.c"
1373     or die "$PREFIX.c: $!\n";
1374    
1375     print $fh <<EOF;
1376 root 1.52 /* do not edit, automatically created by staticperl */
1377 root 1.1
1378     #include "bundle.h"
1379    
1380     /* public API */
1381     PerlInterpreter *staticperl;
1382    
1383     EOF
1384    
1385     #############################################################################
1386     # bundle data
1387    
1388     my $count = @index;
1389    
1390     print $fh <<EOF;
1391     #include "bundle.h"
1392    
1393     /* bundle data */
1394    
1395     static const U32 $varpfx\_count = $count;
1396     static const U32 $varpfx\_index [$count + 1] = {
1397     EOF
1398    
1399     my $col;
1400     for (@index) {
1401     printf $fh "0x%08x,", $_;
1402     print $fh "\n" unless ++$col % 10;
1403    
1404     }
1405     printf $fh "0x%08x\n};\n", (length $data);
1406    
1407     print $fh "static const char $varpfx\_data [] =\n";
1408     dump_string $fh, $data;
1409    
1410 root 1.19 print $fh ";\n\n";
1411 root 1.1
1412     #############################################################################
1413     # bootstrap
1414    
1415     # boot file for staticperl
1416     # this file will be eval'ed at initialisation time
1417    
1418 root 1.69 # lines marked with "^D" are only used when $HAVE_DYNAMIC
1419 root 1.1 my $bootstrap = '
1420     BEGIN {
1421     package ' . $PACKAGE . ';
1422    
1423 root 1.68 # the path prefix to use when putting files into %INC
1424     our $inc_prefix;
1425 root 1.1
1426 root 1.68 # the @INC hook to use when we have PerlIO::scalar available
1427     my $perlio_inc = sub {
1428 root 1.1 my $data = find "$_[1]"
1429     or return;
1430    
1431 root 1.68 $INC{$_[1]} = "$inc_prefix$_[1]";
1432 root 1.1
1433     open my $fh, "<", \$data;
1434     $fh
1435     };
1436 root 1.68
1437     D if (defined &PerlIO::scalar::bootstrap) {
1438     # PerlIO::scalar statically compiled in
1439     PerlIO::scalar->bootstrap;
1440     @INC = $perlio_inc;
1441 root 1.69 D } else {
1442     D # PerlIO::scalar not available, use slower method
1443     D @INC = sub {
1444     D # always check if PerlIO::scalar might now be available
1445     D if (defined &PerlIO::scalar::bootstrap) {
1446     D # switch to the faster perlio_inc hook
1447     D @INC = map { $_ == $_[0] ? $perlio_inc : $_ } @INC;
1448     D goto &$perlio_inc;
1449     D }
1450     D
1451     D my $data = find "$_[1]"
1452     D or return;
1453     D
1454     D $INC{$_[1]} = "$inc_prefix$_[1]";
1455     D
1456     D sub {
1457     D $data =~ /\G([^\n]*\n?)/g
1458     D or return;
1459     D
1460     D $_ = $1;
1461     D 1
1462     D }
1463     D };
1464     D }
1465 root 1.1 }
1466     ';
1467    
1468 root 1.69 $bootstrap .= "require '!boot';"
1469     if exists $pm{"!boot"};
1470 root 1.1
1471 root 1.69 if ($HAVE_DYNAMIC) {
1472 root 1.68 $bootstrap =~ s/^D/ /mg;
1473     } else {
1474     $bootstrap =~ s/^D.*$//mg;
1475     }
1476    
1477     $bootstrap =~ s/#.*$//mg;
1478 root 1.1 $bootstrap =~ s/\s+/ /g;
1479     $bootstrap =~ s/(\W) /$1/g;
1480     $bootstrap =~ s/ (\W)/$1/g;
1481    
1482     print $fh "const char bootstrap [] = ";
1483     dump_string $fh, $bootstrap;
1484     print $fh ";\n\n";
1485    
1486     print $fh <<EOF;
1487     /* search all bundles for the given file, using binary search */
1488     XS(find)
1489     {
1490     dXSARGS;
1491    
1492     if (items != 1)
1493     Perl_croak (aTHX_ "Usage: $PACKAGE\::find (\$path)");
1494    
1495     {
1496     STRLEN namelen;
1497     char *name = SvPV (ST (0), namelen);
1498     SV *res = 0;
1499    
1500     int l = 0, r = $varpfx\_count;
1501    
1502     while (l <= r)
1503     {
1504     int m = (l + r) >> 1;
1505     U32 idx = $varpfx\_index [m];
1506     int comp = namelen - (idx >> 25);
1507    
1508     if (!comp)
1509     {
1510     int ofs = idx & 0x1FFFFFFU;
1511     comp = memcmp (name, $varpfx\_data + ofs, namelen);
1512    
1513     if (!comp)
1514     {
1515     /* found */
1516     int ofs2 = $varpfx\_index [m + 1] & 0x1FFFFFFU;
1517    
1518     ofs += namelen;
1519     res = newSVpvn ($varpfx\_data + ofs, ofs2 - ofs);
1520     goto found;
1521     }
1522     }
1523    
1524     if (comp < 0)
1525     r = m - 1;
1526     else
1527     l = m + 1;
1528     }
1529    
1530     XSRETURN (0);
1531    
1532     found:
1533 root 1.68 ST (0) = sv_2mortal (res);
1534 root 1.1 }
1535    
1536     XSRETURN (1);
1537     }
1538    
1539     /* list all files in the bundle */
1540     XS(list)
1541     {
1542     dXSARGS;
1543    
1544     if (items != 0)
1545     Perl_croak (aTHX_ "Usage: $PACKAGE\::list");
1546    
1547     {
1548     int i;
1549    
1550     EXTEND (SP, $varpfx\_count);
1551    
1552     for (i = 0; i < $varpfx\_count; ++i)
1553     {
1554     U32 idx = $varpfx\_index [i];
1555    
1556 root 1.68 PUSHs (sv_2mortal (newSVpvn ($varpfx\_data + (idx & 0x1FFFFFFU), idx >> 25)));
1557 root 1.1 }
1558     }
1559    
1560     XSRETURN ($varpfx\_count);
1561     }
1562    
1563     EOF
1564    
1565     #############################################################################
1566     # xs_init
1567    
1568     print $fh <<EOF;
1569 root 1.7 void
1570     staticperl_xs_init (pTHX)
1571 root 1.1 {
1572     EOF
1573    
1574 root 1.68 @static_ext = sort @static_ext;
1575 root 1.1
1576     # prototypes
1577     for (@static_ext) {
1578     s/\.pm$//;
1579     (my $cname = $_) =~ s/\//__/g;
1580     print $fh " EXTERN_C void boot_$cname (pTHX_ CV* cv);\n";
1581     }
1582    
1583     print $fh <<EOF;
1584     char *file = __FILE__;
1585     dXSUB_SYS;
1586    
1587     newXSproto ("$PACKAGE\::find", find, file, "\$");
1588     newXSproto ("$PACKAGE\::list", list, file, "");
1589     EOF
1590    
1591     # calls
1592     for (@static_ext) {
1593     s/\.pm$//;
1594    
1595     (my $cname = $_) =~ s/\//__/g;
1596     (my $pname = $_) =~ s/\//::/g;
1597    
1598 root 1.68 my $bootstrap = $pname eq "DynaLoader" ? "boot_DynaLoader" : "bootstrap";
1599 root 1.1
1600     print $fh " newXS (\"$pname\::$bootstrap\", boot_$cname, file);\n";
1601     }
1602    
1603     print $fh <<EOF;
1604 root 1.69 #ifdef _WIN32
1605     /* windows perls usually trail behind unix perls 8-10 years in exporting symbols */
1606    
1607     if (!PL_preambleav)
1608     PL_preambleav = newAV ();
1609    
1610     av_unshift (PL_preambleav, 1);
1611     av_store (PL_preambleav, 0, newSVpv (bootstrap, sizeof (bootstrap) - 1));
1612     #else
1613 root 1.70 Perl_av_create_and_unshift_one (&PL_preambleav, newSVpv (bootstrap, sizeof (bootstrap) - 1));
1614 root 1.69 #endif
1615 root 1.37
1616     if (PL_oldname)
1617     ((XSINIT_t)PL_oldname)(aTHX);
1618 root 1.1 }
1619     EOF
1620    
1621     #############################################################################
1622     # optional perl_init/perl_destroy
1623    
1624 root 1.49 if ($IGNORE_ENV) {
1625     $IGNORE_ENV = <<EOF;
1626     unsetenv ("PERL_UNICODE");
1627     unsetenv ("PERL_HASH_SEED_DEBUG");
1628     unsetenv ("PERL_DESTRUCT_LEVEL");
1629     unsetenv ("PERL_SIGNALS");
1630     unsetenv ("PERL_DEBUG_MSTATS");
1631     unsetenv ("PERL5OPT");
1632     unsetenv ("PERLIO_DEBUG");
1633     unsetenv ("PERLIO");
1634     unsetenv ("PERL_HASH_SEED");
1635     EOF
1636     } else {
1637     $IGNORE_ENV = "";
1638     }
1639    
1640 root 1.17 if ($APP) {
1641     print $fh <<EOF;
1642    
1643     int
1644     main (int argc, char *argv [])
1645     {
1646     extern char **environ;
1647 root 1.36 int i, exitstatus;
1648     char **args = malloc ((argc + 3) * sizeof (const char *));
1649    
1650     args [0] = argv [0];
1651     args [1] = "-e";
1652     args [2] = "0";
1653     args [3] = "--";
1654 root 1.17
1655 root 1.36 for (i = 1; i < argc; ++i)
1656     args [i + 3] = argv [i];
1657 root 1.17
1658 root 1.49 $IGNORE_ENV
1659 root 1.17 PERL_SYS_INIT3 (&argc, &argv, &environ);
1660     staticperl = perl_alloc ();
1661     perl_construct (staticperl);
1662    
1663     PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
1664    
1665 root 1.36 exitstatus = perl_parse (staticperl, staticperl_xs_init, argc + 3, args, environ);
1666     free (args);
1667 root 1.17 if (!exitstatus)
1668     perl_run (staticperl);
1669    
1670     exitstatus = perl_destruct (staticperl);
1671     perl_free (staticperl);
1672     PERL_SYS_TERM ();
1673    
1674     return exitstatus;
1675     }
1676     EOF
1677     } elsif ($PERL) {
1678 root 1.1 print $fh <<EOF;
1679    
1680     int
1681     main (int argc, char *argv [])
1682     {
1683     extern char **environ;
1684     int exitstatus;
1685    
1686 root 1.49 $IGNORE_ENV
1687 root 1.1 PERL_SYS_INIT3 (&argc, &argv, &environ);
1688     staticperl = perl_alloc ();
1689     perl_construct (staticperl);
1690    
1691     PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
1692    
1693 root 1.7 exitstatus = perl_parse (staticperl, staticperl_xs_init, argc, argv, environ);
1694 root 1.1 if (!exitstatus)
1695     perl_run (staticperl);
1696    
1697     exitstatus = perl_destruct (staticperl);
1698     perl_free (staticperl);
1699     PERL_SYS_TERM ();
1700    
1701     return exitstatus;
1702     }
1703     EOF
1704     } else {
1705     print $fh <<EOF;
1706    
1707     EXTERN_C void
1708 root 1.37 staticperl_init (XSINIT_t xs_init)
1709 root 1.1 {
1710 root 1.17 static char *args[] = {
1711     "staticperl",
1712     "-e",
1713     "0"
1714     };
1715    
1716 root 1.36 extern char **environ;
1717     int argc = sizeof (args) / sizeof (args [0]);
1718     char **argv = args;
1719    
1720 root 1.49 $IGNORE_ENV
1721 root 1.1 PERL_SYS_INIT3 (&argc, &argv, &environ);
1722     staticperl = perl_alloc ();
1723     perl_construct (staticperl);
1724     PL_origalen = 1;
1725     PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
1726 root 1.37 PL_oldname = (char *)xs_init;
1727 root 1.7 perl_parse (staticperl, staticperl_xs_init, argc, argv, environ);
1728 root 1.1
1729     perl_run (staticperl);
1730     }
1731    
1732     EXTERN_C void
1733     staticperl_cleanup (void)
1734     {
1735     perl_destruct (staticperl);
1736     perl_free (staticperl);
1737     staticperl = 0;
1738     PERL_SYS_TERM ();
1739     }
1740     EOF
1741     }
1742    
1743 root 1.69 close $fh;
1744    
1745 root 1.19 print -s "$PREFIX.c", " octets (", (length $data) , " data octets).\n\n"
1746     if $VERBOSE >= 1;
1747 root 1.1
1748     #############################################################################
1749     # libs, cflags
1750    
1751 root 1.69 my $ccopts;
1752    
1753 root 1.1 {
1754 root 1.19 print "generating $PREFIX.ccopts... "
1755     if $VERBOSE >= 1;
1756 root 1.1
1757 root 1.72 $ccopts = "$Config{ccflags} $Config{optimize} $Config{cppflags} -I$Config{archlibexp}/CORE";
1758 root 1.69 $ccopts =~ s/([\(\)])/\\$1/g;
1759 root 1.1
1760     open my $fh, ">$PREFIX.ccopts"
1761     or die "$PREFIX.ccopts: $!";
1762 root 1.69 print $fh $ccopts;
1763 root 1.19
1764 root 1.69 print "$ccopts\n\n"
1765 root 1.19 if $VERBOSE >= 1;
1766 root 1.1 }
1767    
1768 root 1.69 my $ldopts;
1769    
1770 root 1.1 {
1771     print "generating $PREFIX.ldopts... ";
1772    
1773 root 1.69 $ldopts = $STATIC ? "-static " : "";
1774 root 1.1
1775 root 1.69 $ldopts .= "$Config{ccdlflags} $Config{ldflags} @libs $Config{archlibexp}/CORE/$Config{libperl} $Config{perllibs}";
1776 root 1.1
1777     my %seen;
1778 root 1.72 $ldopts .= " $_" for reverse grep !$seen{$_}++, reverse +($extralibs =~ /(\S+)/g);
1779 root 1.1
1780 root 1.18 for (@staticlibs) {
1781 root 1.69 $ldopts =~ s/(^|\s) (-l\Q$_\E) ($|\s)/$1-Wl,-Bstatic $2 -Wl,-Bdynamic$3/gx;
1782 root 1.18 }
1783    
1784 root 1.69 $ldopts =~ s/([\(\)])/\\$1/g;
1785 root 1.1
1786     open my $fh, ">$PREFIX.ldopts"
1787     or die "$PREFIX.ldopts: $!";
1788 root 1.69 print $fh $ldopts;
1789 root 1.19
1790 root 1.69 print "$ldopts\n\n"
1791 root 1.19 if $VERBOSE >= 1;
1792 root 1.1 }
1793    
1794 root 1.17 if ($PERL or defined $APP) {
1795     $APP = "perl" unless defined $APP;
1796    
1797 root 1.69 my $build = "$Config{cc} $ccopts -o \Q$APP\E$Config{_exe} bundle.c $ldopts";
1798    
1799     print "build $APP...\n"
1800 root 1.19 if $VERBOSE >= 1;
1801 root 1.17
1802 root 1.69 print "$build\n"
1803     if $VERBOSE >= 2;
1804    
1805     system $build;
1806 root 1.1
1807 root 1.69 # unlink "$PREFIX.$_"
1808     # for qw(ccopts ldopts c h);
1809 root 1.18
1810 root 1.19 print "\n"
1811     if $VERBOSE >= 1;
1812 root 1.1 }
1813    
1814     MKBUNDLE
1815     }
1816    
1817     bundle() {
1818 root 1.58 MKBUNDLE="${MKBUNDLE:=$PERL_PREFIX/bin/SP-mkbundle}"
1819 root 1.1 catmkbundle >"$MKBUNDLE~" || fatal "$MKBUNDLE~: cannot create"
1820     chmod 755 "$MKBUNDLE~" && mv "$MKBUNDLE~" "$MKBUNDLE"
1821 root 1.18 CACHE="$STATICPERL/cache"
1822     mkdir -p "$CACHE"
1823     "$PERL_PREFIX/bin/perl" -- "$MKBUNDLE" --cache "$CACHE" "$@"
1824 root 1.1 }
1825    
1826     if [ $# -gt 0 ]; then
1827     while [ $# -gt 0 ]; do
1828     mkdir -p "$STATICPERL" || fatal "$STATICPERL: cannot create"
1829 root 1.10 mkdir -p "$PERL_PREFIX" || fatal "$PERL_PREFIX: cannot create"
1830 root 1.1
1831     command="${1#--}"; shift
1832     case "$command" in
1833 root 1.19 version )
1834     echo "staticperl version $VERSION"
1835     ;;
1836 root 1.68 fetch | configure | build | install | clean | realclean | distclean )
1837 root 1.27 ( "$command" ) || exit
1838 root 1.1 ;;
1839 root 1.68 import )
1840     ( import "$1" ) || exit
1841     shift
1842     ;;
1843 root 1.1 instsrc )
1844 root 1.27 ( instsrc "$@" ) || exit
1845 root 1.1 exit
1846     ;;
1847     instcpan )
1848 root 1.27 ( instcpan "$@" ) || exit
1849 root 1.1 exit
1850     ;;
1851 root 1.58 perl )
1852     ( install ) || exit
1853     exec "$PERL_PREFIX/bin/perl" "$@"
1854     exit
1855     ;;
1856 root 1.1 cpan )
1857 root 1.27 ( install ) || exit
1858 root 1.68 PERL="$PERL_PREFIX/bin/perl"
1859     export PERL
1860 root 1.58 exec "$PERL_PREFIX/bin/cpan" "$@"
1861 root 1.1 exit
1862     ;;
1863     mkbundle )
1864 root 1.27 ( install ) || exit
1865 root 1.59 bundle "$@"
1866 root 1.1 exit
1867     ;;
1868     mkperl )
1869 root 1.27 ( install ) || exit
1870 root 1.59 bundle --perl "$@"
1871 root 1.1 exit
1872     ;;
1873 root 1.17 mkapp )
1874 root 1.27 ( install ) || exit
1875 root 1.59 bundle --app "$@"
1876 root 1.17 exit
1877     ;;
1878 root 1.1 help )
1879     podusage 2
1880     ;;
1881     * )
1882     exec 1>&2
1883     echo
1884     echo "Unknown command: $command"
1885     podusage 0
1886     ;;
1887     esac
1888     done
1889     else
1890     usage
1891     fi
1892    
1893     exit 0
1894    
1895     =head1 NAME
1896    
1897 root 1.73 staticperl - perl, libc, 100 modules, all in one standalone 500kb file
1898 root 1.1
1899     =head1 SYNOPSIS
1900    
1901     staticperl help # print the embedded documentation
1902     staticperl fetch # fetch and unpack perl sources
1903     staticperl configure # fetch and then configure perl
1904     staticperl build # configure and then build perl
1905     staticperl install # build and then install perl
1906     staticperl clean # clean most intermediate files (restart at configure)
1907     staticperl distclean # delete everything installed by this script
1908 root 1.58 staticperl perl ... # invoke the perlinterpreter
1909 root 1.1 staticperl cpan # invoke CPAN shell
1910 root 1.72 staticperl instsrc path... # install unpacked modules
1911 root 1.1 staticperl instcpan modulename... # install modules from CPAN
1912     staticperl mkbundle <bundle-args...> # see documentation
1913     staticperl mkperl <bundle-args...> # see documentation
1914 root 1.17 staticperl mkapp appname <bundle-args...> # see documentation
1915 root 1.1
1916     Typical Examples:
1917    
1918     staticperl install # fetch, configure, build and install perl
1919     staticperl cpan # run interactive cpan shell
1920 root 1.49 staticperl mkperl -MConfig_heavy.pl # build a perl that supports -V
1921 root 1.1 staticperl mkperl -MAnyEvent::Impl::Perl -MAnyEvent::HTTPD -MURI -MURI::http
1922     # build a perl with the above modules linked in
1923 root 1.17 staticperl mkapp myapp --boot mainprog mymodules
1924     # build a binary "myapp" from mainprog and mymodules
1925 root 1.1
1926     =head1 DESCRIPTION
1927    
1928 root 1.18 This script helps you to create single-file perl interpreters
1929     or applications, or embedding a perl interpreter in your
1930     applications. Single-file means that it is fully self-contained - no
1931     separate shared objects, no autoload fragments, no .pm or .pl files are
1932     needed. And when linking statically, you can create (or embed) a single
1933     file that contains perl interpreter, libc, all the modules you need, all
1934     the libraries you need and of course your actual program.
1935 root 1.1
1936 root 1.7 With F<uClibc> and F<upx> on x86, you can create a single 500kb binary
1937     that contains perl and 100 modules such as POSIX, AnyEvent, EV, IO::AIO,
1938 root 1.63 Coro and so on. Or any other choice of modules (and some other size :).
1939 root 1.1
1940 root 1.19 To see how this turns out, you can try out smallperl and bigperl, two
1941     pre-built static and compressed perl binaries with many and even more
1942     modules: just follow the links at L<http://staticperl.schmorp.de/>.
1943    
1944 root 1.4 The created files do not need write access to the file system (like PAR
1945 root 1.1 does). In fact, since this script is in many ways similar to PAR::Packer,
1946     here are the differences:
1947    
1948     =over 4
1949    
1950     =item * The generated executables are much smaller than PAR created ones.
1951    
1952     Shared objects and the perl binary contain a lot of extra info, while
1953     the static nature of F<staticperl> allows the linker to remove all
1954     functionality and meta-info not required by the final executable. Even
1955     extensions statically compiled into perl at build time will only be
1956     present in the final executable when needed.
1957    
1958     In addition, F<staticperl> can strip perl sources much more effectively
1959     than PAR.
1960    
1961     =item * The generated executables start much faster.
1962    
1963     There is no need to unpack files, or even to parse Zip archives (which is
1964     slow and memory-consuming business).
1965    
1966     =item * The generated executables don't need a writable filesystem.
1967    
1968     F<staticperl> loads all required files directly from memory. There is no
1969     need to unpack files into a temporary directory.
1970    
1971 root 1.18 =item * More control over included files, more burden.
1972 root 1.1
1973 root 1.4 PAR tries to be maintenance and hassle-free - it tries to include more
1974 root 1.18 files than necessary to make sure everything works out of the box. It
1975     mostly succeeds at this, but he extra files (such as the unicode database)
1976     can take substantial amounts of memory and file size.
1977 root 1.1
1978     With F<staticperl>, the burden is mostly with the developer - only direct
1979     compile-time dependencies and L<AutoLoader> are handled automatically.
1980     This means the modules to include often need to be tweaked manually.
1981    
1982 root 1.18 All this does not preclude more permissive modes to be implemented in
1983 root 1.67 the future, but right now, you have to resolve hidden dependencies
1984 root 1.18 manually.
1985    
1986 root 1.1 =item * PAR works out of the box, F<staticperl> does not.
1987    
1988     Maintaining your own custom perl build can be a pain in the ass, and while
1989     F<staticperl> tries to make this easy, it still requires a custom perl
1990     build and possibly fiddling with some modules. PAR is likely to produce
1991     results faster.
1992    
1993 root 1.13 Ok, PAR never has worked for me out of the box, and for some people,
1994     F<staticperl> does work out of the box, as they don't count "fiddling with
1995     module use lists" against it, but nevertheless, F<staticperl> is certainly
1996     a bit more difficult to use.
1997    
1998 root 1.1 =back
1999    
2000     =head1 HOW DOES IT WORK?
2001    
2002     Simple: F<staticperl> downloads, compile and installs a perl version of
2003     your choice in F<~/.staticperl>. You can add extra modules either by
2004     letting F<staticperl> install them for you automatically, or by using CPAN
2005     and doing it interactively. This usually takes 5-10 minutes, depending on
2006 root 1.4 the speed of your computer and your internet connection.
2007 root 1.1
2008     It is possible to do program development at this stage, too.
2009    
2010     Afterwards, you create a list of files and modules you want to include,
2011 root 1.4 and then either build a new perl binary (that acts just like a normal perl
2012 root 1.1 except everything is compiled in), or you create bundle files (basically C
2013     sources you can use to embed all files into your project).
2014    
2015 root 1.18 This step is very fast (a few seconds if PPI is not used for stripping, or
2016     the stripped files are in the cache), and can be tweaked and repeated as
2017     often as necessary.
2018 root 1.1
2019     =head1 THE F<STATICPERL> SCRIPT
2020    
2021     This module installs a script called F<staticperl> into your perl
2022 root 1.22 binary directory. The script is fully self-contained, and can be
2023     used without perl (for example, in an uClibc chroot environment). In
2024     fact, it can be extracted from the C<App::Staticperl> distribution
2025     tarball as F<bin/staticperl>, without any installation. The
2026     newest (possibly alpha) version can also be downloaded from
2027     L<http://staticperl.schmorp.de/staticperl>.
2028 root 1.1
2029     F<staticperl> interprets the first argument as a command to execute,
2030     optionally followed by any parameters.
2031    
2032     There are two command categories: the "phase 1" commands which deal with
2033     installing perl and perl modules, and the "phase 2" commands, which deal
2034     with creating binaries and bundle files.
2035    
2036     =head2 PHASE 1 COMMANDS: INSTALLING PERL
2037    
2038     The most important command is F<install>, which does basically
2039 root 1.46 everything. The default is to download and install perl 5.12.3 and a few
2040 root 1.1 modules required by F<staticperl> itself, but all this can (and should) be
2041     changed - see L<CONFIGURATION>, below.
2042    
2043     The command
2044    
2045     staticperl install
2046    
2047 root 1.27 is normally all you need: It installs the perl interpreter in
2048 root 1.1 F<~/.staticperl/perl>. It downloads, configures, builds and installs the
2049     perl interpreter if required.
2050    
2051 root 1.27 Most of the following F<staticperl> subcommands simply run one or more
2052     steps of this sequence.
2053    
2054     If it fails, then most commonly because the compiler options I selected
2055     are not supported by your compiler - either edit the F<staticperl> script
2056     yourself or create F<~/.staticperl> shell script where your set working
2057     C<PERL_CCFLAGS> etc. variables.
2058 root 1.1
2059 root 1.4 To force recompilation or reinstallation, you need to run F<staticperl
2060 root 1.1 distclean> first.
2061    
2062     =over 4
2063    
2064 root 1.19 =item F<staticperl version>
2065    
2066     Prints some info about the version of the F<staticperl> script you are using.
2067    
2068 root 1.1 =item F<staticperl fetch>
2069    
2070     Runs only the download and unpack phase, unless this has already happened.
2071    
2072     =item F<staticperl configure>
2073    
2074     Configures the unpacked perl sources, potentially after downloading them first.
2075    
2076     =item F<staticperl build>
2077    
2078     Builds the configured perl sources, potentially after automatically
2079     configuring them.
2080    
2081     =item F<staticperl install>
2082    
2083 root 1.4 Wipes the perl installation directory (usually F<~/.staticperl/perl>) and
2084     installs the perl distribution, potentially after building it first.
2085 root 1.1
2086 root 1.58 =item F<staticperl perl> [args...]
2087    
2088     Invokes the compiled perl interpreter with the given args. Basically the
2089     same as starting perl directly (usually via F<~/.staticperl/bin/perl>),
2090     but beats typing the path sometimes.
2091    
2092     Example: check that the Gtk2 module is installed and loadable.
2093    
2094     staticperl perl -MGtk2 -e0
2095    
2096 root 1.1 =item F<staticperl cpan> [args...]
2097    
2098 root 1.4 Starts an interactive CPAN shell that you can use to install further
2099     modules. Installs the perl first if necessary, but apart from that,
2100 root 1.1 no magic is involved: you could just as well run it manually via
2101 root 1.68 F<~/.staticperl/perl/bin/cpan>, except that F<staticperl> additionally
2102     sets the environment variable C<$PERL> to the path of the perl
2103     interpreter, which is handy in subshells.
2104 root 1.1
2105     Any additional arguments are simply passed to the F<cpan> command.
2106    
2107     =item F<staticperl instcpan> module...
2108    
2109     Tries to install all the modules given and their dependencies, using CPAN.
2110    
2111     Example:
2112    
2113     staticperl instcpan EV AnyEvent::HTTPD Coro
2114    
2115     =item F<staticperl instsrc> directory...
2116    
2117     In the unlikely case that you have unpacked perl modules around and want
2118 root 1.4 to install from these instead of from CPAN, you can do this using this
2119 root 1.1 command by specifying all the directories with modules in them that you
2120     want to have built.
2121    
2122     =item F<staticperl clean>
2123    
2124 root 1.11 Deletes the perl source directory (and potentially cleans up other
2125     intermediate files). This can be used to clean up files only needed for
2126 root 1.27 building perl, without removing the installed perl interpreter.
2127 root 1.11
2128     At the moment, it doesn't delete downloaded tarballs.
2129 root 1.1
2130 root 1.27 The exact semantics of this command will probably change.
2131    
2132 root 1.1 =item F<staticperl distclean>
2133    
2134     This wipes your complete F<~/.staticperl> directory. Be careful with this,
2135     it nukes your perl download, perl sources, perl distribution and any
2136     installed modules. It is useful if you wish to start over "from scratch"
2137     or when you want to uninstall F<staticperl>.
2138    
2139     =back
2140    
2141     =head2 PHASE 2 COMMANDS: BUILDING PERL BUNDLES
2142    
2143     Building (linking) a new F<perl> binary is handled by a separate
2144     script. To make it easy to use F<staticperl> from a F<chroot>, the script
2145     is embedded into F<staticperl>, which will write it out and call for you
2146     with any arguments you pass:
2147    
2148     staticperl mkbundle mkbundle-args...
2149    
2150     In the oh so unlikely case of something not working here, you
2151 root 1.2 can run the script manually as well (by default it is written to
2152 root 1.1 F<~/.staticperl/mkbundle>).
2153    
2154     F<mkbundle> is a more conventional command and expect the argument
2155 root 1.4 syntax commonly used on UNIX clones. For example, this command builds
2156 root 1.1 a new F<perl> binary and includes F<Config.pm> (for F<perl -V>),
2157     F<AnyEvent::HTTPD>, F<URI> and a custom F<httpd> script (from F<eg/httpd>
2158     in this distribution):
2159    
2160     # first make sure we have perl and the required modules
2161     staticperl instcpan AnyEvent::HTTPD
2162    
2163     # now build the perl
2164 root 1.49 staticperl mkperl -MConfig_heavy.pl -MAnyEvent::Impl::Perl \
2165 root 1.1 -MAnyEvent::HTTPD -MURI::http \
2166     --add 'eg/httpd httpd.pm'
2167    
2168     # finally, invoke it
2169     ./perl -Mhttpd
2170    
2171 root 1.2 As you can see, things are not quite as trivial: the L<Config> module has
2172     a hidden dependency which is not even a perl module (F<Config_heavy.pl>),
2173     L<AnyEvent> needs at least one event loop backend that we have to
2174 root 1.4 specify manually (here L<AnyEvent::Impl::Perl>), and the F<URI> module
2175 root 1.2 (required by L<AnyEvent::HTTPD>) implements various URI schemes as extra
2176     modules - since L<AnyEvent::HTTPD> only needs C<http> URIs, we only need
2177 root 1.4 to include that module. I found out about these dependencies by carefully
2178     watching any error messages about missing modules...
2179 root 1.2
2180 root 1.17 Instead of building a new perl binary, you can also build a standalone
2181     application:
2182    
2183     # build the app
2184     staticperl mkapp app --boot eg/httpd \
2185     -MAnyEvent::Impl::Perl -MAnyEvent::HTTPD -MURI::http
2186    
2187     # run it
2188     ./app
2189    
2190 root 1.29 Here are the three phase 2 commands:
2191    
2192     =over 4
2193    
2194     =item F<staticperl mkbundle> args...
2195    
2196     The "default" bundle command - it interprets the given bundle options and
2197     writes out F<bundle.h>, F<bundle.c>, F<bundle.ccopts> and F<bundle.ldopts>
2198     files, useful for embedding.
2199    
2200     =item F<staticperl mkperl> args...
2201    
2202     Creates a bundle just like F<staticperl mkbundle> (in fact, it's the same
2203     as invoking F<staticperl mkbundle --perl> args...), but then compiles and
2204     links a new perl interpreter that embeds the created bundle, then deletes
2205     all intermediate files.
2206    
2207     =item F<staticperl mkapp> filename args...
2208    
2209     Does the same as F<staticperl mkbundle> (in fact, it's the same as
2210     invoking F<staticperl mkbundle --app> filename args...), but then compiles
2211     and links a new standalone application that simply initialises the perl
2212     interpreter.
2213    
2214     The difference to F<staticperl mkperl> is that the standalone application
2215     does not act like a perl interpreter would - in fact, by default it would
2216     just do nothing and exit immediately, so you should specify some code to
2217     be executed via the F<--boot> option.
2218    
2219     =back
2220    
2221 root 1.2 =head3 OPTION PROCESSING
2222    
2223 root 1.4 All options can be given as arguments on the command line (typically
2224     using long (e.g. C<--verbose>) or short option (e.g. C<-v>) style). Since
2225 root 1.30 specifying a lot of options can make the command line very long and
2226     unwieldy, you can put all long options into a "bundle specification file"
2227     (one option per line, with or without C<--> prefix) and specify this
2228     bundle file instead.
2229 root 1.2
2230 root 1.30 For example, the command given earlier to link a new F<perl> could also
2231     look like this:
2232 root 1.2
2233     staticperl mkperl httpd.bundle
2234    
2235 root 1.30 With all options stored in the F<httpd.bundle> file (one option per line,
2236     everything after the option is an argument):
2237    
2238 root 1.2 use "Config_heavy.pl"
2239     use AnyEvent::Impl::Perl
2240     use AnyEvent::HTTPD
2241     use URI::http
2242     add eg/httpd httpd.pm
2243    
2244     All options that specify modules or files to be added are processed in the
2245 root 1.29 order given on the command line.
2246 root 1.19
2247 root 1.73 =head3 BUNDLE CREATION WORKFLOW / STATICPERL MKBUNDLE OPTIONS
2248 root 1.19
2249 root 1.29 F<staticperl mkbundle> works by first assembling a list of candidate
2250     files and modules to include, then filtering them by include/exclude
2251 root 1.30 patterns. The remaining modules (together with their direct dependencies,
2252     such as link libraries and L<AutoLoader> files) are then converted into
2253     bundle files suitable for embedding. F<staticperl mkbundle> can then
2254     optionally build a new perl interpreter or a standalone application.
2255 root 1.19
2256     =over 4
2257    
2258 root 1.29 =item Step 0: Generic argument processing.
2259 root 1.19
2260 root 1.29 The following options influence F<staticperl mkbundle> itself.
2261 root 1.2
2262     =over 4
2263    
2264 root 1.30 =item C<--verbose> | C<-v>
2265 root 1.2
2266     Increases the verbosity level by one (the default is C<1>).
2267    
2268 root 1.30 =item C<--quiet> | C<-q>
2269 root 1.2
2270     Decreases the verbosity level by one.
2271    
2272 root 1.29 =item any other argument
2273 root 1.2
2274 root 1.29 Any other argument is interpreted as a bundle specification file, which
2275 root 1.30 supports all options (without extra quoting), one option per line, in the
2276     format C<option> or C<option argument>. They will effectively be expanded
2277     and processed as if they were directly written on the command line, in
2278     place of the file name.
2279 root 1.2
2280 root 1.29 =back
2281 root 1.2
2282 root 1.29 =item Step 1: gather candidate files and modules
2283 root 1.2
2284 root 1.29 In this step, modules, perl libraries (F<.pl> files) and other files are
2285     selected for inclusion in the bundle. The relevant options are executed
2286     in order (this makes a difference mostly for C<--eval>, which can rely on
2287     earlier C<--use> options to have been executed).
2288 root 1.2
2289 root 1.29 =over 4
2290 root 1.2
2291 root 1.29 =item C<--use> F<module> | C<-M>F<module>
2292 root 1.17
2293 root 1.49 Include the named module or perl library and trace direct
2294     dependencies. This is done by loading the module in a subprocess and
2295     tracing which other modules and files it actually loads.
2296 root 1.2
2297     Example: include AnyEvent and AnyEvent::Impl::Perl.
2298    
2299     staticperl mkbundle --use AnyEvent --use AnyEvent::Impl::Perl
2300    
2301 root 1.49 Sometimes you want to load old-style "perl libraries" (F<.pl> files), or
2302     maybe other weirdly named files. To support this, the C<--use> option
2303     actually tries to do what you mean, depending on the string you specify:
2304    
2305     =over 4
2306    
2307     =item a possibly valid module name, e.g. F<common::sense>, F<Carp>,
2308     F<Coro::Mysql>.
2309    
2310     If the string contains no quotes, no F</> and no F<.>, then C<--use>
2311     assumes that it is a normal module name. It will create a new package and
2312     evaluate a C<use module> in it, i.e. it will load the package and do a
2313     default import.
2314    
2315     The import step is done because many modules trigger more dependencies
2316     when something is imported than without.
2317    
2318     =item anything that contains F</> or F<.> characters,
2319     e.g. F<utf8_heavy.pl>, F<Module/private/data.pl>.
2320    
2321     The string will be quoted and passed to require, as if you used C<require
2322     $module>. Nothing will be imported.
2323    
2324     =item "path" or 'path', e.g. C<"utf8_heavy.pl">.
2325    
2326     If you enclose the name into single or double quotes, then the quotes will
2327     be removed and the resulting string will be passed to require. This syntax
2328     is form compatibility with older versions of staticperl and should not be
2329     used anymore.
2330    
2331     =back
2332    
2333     Example: C<use> AnyEvent::Socket, once using C<use> (importing the
2334     symbols), and once via C<require>, not importing any symbols. The first
2335     form is preferred as many modules load some extra dependencies when asked
2336     to export symbols.
2337    
2338     staticperl mkbundle -MAnyEvent::Socket # use + import
2339     staticperl mkbundle -MAnyEvent/Socket.pm # require only
2340 root 1.2
2341     Example: include the required files for F<perl -V> to work in all its
2342 root 1.49 glory (F<Config.pm> is included automatically by the dependency tracker).
2343 root 1.2
2344 root 1.49 # shell command
2345     staticperl mkbundle -MConfig_heavy.pl
2346 root 1.2
2347     # bundle specification file
2348 root 1.49 use Config_heavy.pl
2349 root 1.2
2350 root 1.30 The C<-M>module syntax is included as a convenience that might be easier
2351     to remember than C<--use> - it's the same switch as perl itself uses
2352     to load modules. Or maybe it confuses people. Time will tell. Or maybe
2353     not. Sigh.
2354 root 1.2
2355 root 1.29 =item C<--eval> "perl code" | C<-e> "perl code"
2356 root 1.2
2357     Sometimes it is easier (or necessary) to specify dependencies using perl
2358     code, or maybe one of the modules you use need a special use statement. In
2359 root 1.29 that case, you can use C<--eval> to execute some perl snippet or set some
2360     variables or whatever you need. All files C<require>'d or C<use>'d while
2361     executing the snippet are included in the final bundle.
2362 root 1.2
2363 root 1.36 Keep in mind that F<mkbundle> will not import any symbols from the modules
2364     named by the C<--use> option, so do not expect the symbols from modules
2365     you C<--use>'d earlier on the command line to be available.
2366 root 1.2
2367     Example: force L<AnyEvent> to detect a backend and therefore include it
2368     in the final bundle.
2369    
2370     staticperl mkbundle --eval 'use AnyEvent; AnyEvent::detect'
2371    
2372     # or like this
2373 root 1.29 staticperl mkbundle -MAnyEvent --eval 'AnyEvent::detect'
2374 root 1.2
2375     Example: use a separate "bootstrap" script that C<use>'s lots of modules
2376 root 1.29 and also include this in the final bundle, to be executed automatically
2377     when the interpreter is initialised.
2378 root 1.2
2379     staticperl mkbundle --eval 'do "bootstrap"' --boot bootstrap
2380    
2381 root 1.29 =item C<--boot> F<filename>
2382    
2383     Include the given file in the bundle and arrange for it to be
2384     executed (using C<require>) before the main program when the new perl
2385     is initialised. This can be used to modify C<@INC> or do similar
2386     modifications before the perl interpreter executes scripts given on the
2387     command line (or via C<-e>). This works even in an embedded interpreter -
2388     the file will be executed during interpreter initialisation in that case.
2389    
2390     =item C<--incglob> pattern
2391    
2392     This goes through all standard library directories and tries to match any
2393     F<.pm> and F<.pl> files against the extended glob pattern (see below). If
2394     a file matches, it is added. The pattern is matched against the full path
2395     of the file (sans the library directory prefix), e.g. F<Sys/Syslog.pm>.
2396    
2397     This is very useful to include "everything":
2398    
2399     --incglob '*'
2400    
2401     It is also useful for including perl libraries, or trees of those, such as
2402 root 1.30 the unicode database files needed by some perl built-ins, the regex engine
2403 root 1.29 and other modules.
2404    
2405     --incglob '/unicore/**.pl'
2406    
2407     =item C<--add> F<file> | C<--add> "F<file> alias"
2408    
2409     Adds the given (perl) file into the bundle (and optionally call it
2410 root 1.39 "alias"). The F<file> is either an absolute path or a path relative to the
2411     current directory. If an alias is specified, then this is the name it will
2412 root 1.44 use for C<@INC> searches, otherwise the path F<file> will be used as the
2413 root 1.29 internal name.
2414    
2415     This switch is used to include extra files into the bundle.
2416    
2417     Example: embed the file F<httpd> in the current directory as F<httpd.pm>
2418     when creating the bundle.
2419    
2420     staticperl mkperl --add "httpd httpd.pm"
2421    
2422 root 1.39 # can be accessed via "use httpd"
2423    
2424     Example: add a file F<initcode> from the current directory.
2425    
2426 root 1.44 staticperl mkperl --add 'initcode &initcode'
2427 root 1.39
2428     # can be accessed via "do '&initcode'"
2429    
2430 root 1.29 Example: add local files as extra modules in the bundle.
2431    
2432     # specification file
2433     add file1 myfiles/file1.pm
2434     add file2 myfiles/file2.pm
2435     add file3 myfiles/file3.pl
2436    
2437     # then later, in perl, use
2438     use myfiles::file1;
2439     require myfiles::file2;
2440     my $res = do "myfiles/file3.pl";
2441    
2442     =item C<--binadd> F<file> | C<--add> "F<file> alias"
2443    
2444     Just like C<--add>, except that it treats the file as binary and adds it
2445     without any postprocessing (perl files might get stripped to reduce their
2446     size).
2447    
2448 root 1.69 If you specify an alias you should probably add a C</> prefix to avoid
2449     clashing with embedded perl files (whose paths never start with C</>),
2450     and/or use a special directory prefix, such as C</res/name>.
2451 root 1.29
2452 root 1.72 You can later get a copy of these files by calling C<static::find
2453 root 1.29 "alias">.
2454    
2455     An alternative way to embed binary files is to convert them to perl and
2456     use C<do> to get the contents - this method is a bit cumbersome, but works
2457 root 1.69 both inside and outside of a staticperl bundle, without extra ado:
2458 root 1.29
2459     # a "binary" file, call it "bindata.pl"
2460     <<'SOME_MARKER'
2461     binary data NOT containing SOME_MARKER
2462     SOME_MARKER
2463    
2464     # load the binary
2465     chomp (my $data = do "bindata.pl");
2466    
2467 root 1.69 =item C<--allow-dynamic>
2468 root 1.68
2469     By default, when F<mkbundle> hits a dynamic perl extension (e.g. a F<.so>
2470     or F<.dll> file), it will stop with a fatal error.
2471    
2472 root 1.69 When this option is enabled, F<mkbundle> packages the shared
2473     object into the bundle instead, with a prefix of F<!>
2474     (e.g. F<!auto/List/Util/Util.so>). What you do with that is currently up
2475     to you, F<staticperl> has no special support for this at the moment, apart
2476     from working around the lack of availability of F<PerlIO::scalar> while
2477     bootstrapping, at a speed cost.
2478    
2479     One way to deal with this is to write all files starting with F<!> into
2480     some directory and then C<unshift> that path onto C<@INC>.
2481 root 1.68
2482     #TODO: example
2483    
2484 root 1.29 =back
2485    
2486     =item Step 2: filter all files using C<--include> and C<--exclude> options.
2487    
2488     After all candidate files and modules are added, they are I<filtered>
2489     by a combination of C<--include> and C<--exclude> patterns (there is an
2490 root 1.30 implicit C<--include *> at the end, so if no filters are specified, all
2491 root 1.29 files are included).
2492    
2493     All that this step does is potentially reduce the number of files that are
2494     to be included - no new files are added during this step.
2495    
2496     =over 4
2497    
2498     =item C<--include> pattern | C<-i> pattern | C<--exclude> pattern | C<-x> pattern
2499    
2500     These specify an include or exclude pattern to be applied to the candidate
2501     file list. An include makes sure that the given files will be part of the
2502     resulting file set, an exclude will exclude remaining files. The patterns
2503     are "extended glob patterns" (see below).
2504    
2505     The patterns are applied "in order" - files included via earlier
2506     C<--include> specifications cannot be removed by any following
2507     C<--exclude>, and likewise, and file excluded by an earlier C<--exclude>
2508     cannot be added by any following C<--include>.
2509    
2510     For example, to include everything except C<Devel> modules, but still
2511     include F<Devel::PPPort>, you could use this:
2512    
2513     --incglob '*' -i '/Devel/PPPort.pm' -x '/Devel/**'
2514 root 1.2
2515 root 1.29 =back
2516    
2517     =item Step 3: add any extra or "hidden" dependencies.
2518    
2519     F<staticperl> currently knows about three extra types of depdendencies
2520     that are added automatically. Only one (F<.packlist> files) is currently
2521     optional and can be influenced, the others are always included:
2522 root 1.2
2523 root 1.29 =over 4
2524    
2525 root 1.31 =item C<--usepacklists>
2526 root 1.19
2527     Read F<.packlist> files for each distribution that happens to match a
2528     module name you specified. Sounds weird, and it is, so expect semantics to
2529     change somehow in the future.
2530    
2531     The idea is that most CPAN distributions have a F<.pm> file that matches
2532     the name of the distribution (which is rather reasonable after all).
2533    
2534     If this switch is enabled, then if any of the F<.pm> files that have been
2535     selected match an install distribution, then all F<.pm>, F<.pl>, F<.al>
2536     and F<.ix> files installed by this distribution are also included.
2537    
2538     For example, using this switch, when the L<URI> module is specified, then
2539     all L<URI> submodules that have been installed via the CPAN distribution
2540     are included as well, so you don't have to manually specify them.
2541    
2542 root 1.29 =item L<AutoLoader> splitfiles
2543    
2544     Some modules use L<AutoLoader> - less commonly (hopefully) used functions
2545     are split into separate F<.al> files, and an index (F<.ix>) file contains
2546     the prototypes.
2547    
2548     Both F<.ix> and F<.al> files will be detected automatically and added to
2549     the bundle.
2550    
2551     =item link libraries (F<.a> files)
2552    
2553     Modules using XS (or any other non-perl language extension compiled at
2554     installation time) will have a static archive (typically F<.a>). These
2555     will automatically be added to the linker options in F<bundle.ldopts>.
2556    
2557     Should F<staticperl> find a dynamic link library (typically F<.so>) it
2558     will warn about it - obviously this shouldn't happen unless you use
2559     F<staticperl> on the wrong perl, or one (probably wrongly) configured to
2560     use dynamic loading.
2561    
2562     =item extra libraries (F<extralibs.ld>)
2563 root 1.18
2564 root 1.29 Some modules need linking against external libraries - these are found in
2565     F<extralibs.ld> and added to F<bundle.ldopts>.
2566 root 1.18
2567 root 1.29 =back
2568    
2569     =item Step 4: write bundle files and optionally link a program
2570    
2571     At this point, the select files will be read, processed (stripped) and
2572     finally the bundle files get written to disk, and F<staticperl mkbundle>
2573     is normally finished. Optionally, it can go a step further and either link
2574     a new F<perl> binary with all selected modules and files inside, or build
2575     a standalone application.
2576    
2577     Both the contents of the bundle files and any extra linking is controlled
2578     by these options:
2579    
2580     =over 4
2581 root 1.18
2582 root 1.29 =item C<--strip> C<none>|C<pod>|C<ppi>
2583 root 1.18
2584 root 1.29 Specify the stripping method applied to reduce the file of the perl
2585     sources included.
2586 root 1.18
2587 root 1.29 The default is C<pod>, which uses the L<Pod::Strip> module to remove all
2588     pod documentation, which is very fast and reduces file size a lot.
2589 root 1.18
2590 root 1.29 The C<ppi> method uses L<PPI> to parse and condense the perl sources. This
2591     saves a lot more than just L<Pod::Strip>, and is generally safer,
2592     but is also a lot slower (some files take almost a minute to strip -
2593     F<staticperl> maintains a cache of stripped files to speed up subsequent
2594     runs for this reason). Note that this method doesn't optimise for raw file
2595     size, but for best compression (that means that the uncompressed file size
2596     is a bit larger, but the files compress better, e.g. with F<upx>).
2597 root 1.2
2598 root 1.29 Last not least, if you need accurate line numbers in error messages,
2599     or in the unlikely case where C<pod> is too slow, or some module gets
2600     mistreated, you can specify C<none> to not mangle included perl sources in
2601     any way.
2602 root 1.2
2603 root 1.30 =item C<--perl>
2604 root 1.2
2605 root 1.29 After writing out the bundle files, try to link a new perl interpreter. It
2606     will be called F<perl> and will be left in the current working
2607     directory. The bundle files will be removed.
2608 root 1.2
2609 root 1.29 This switch is automatically used when F<staticperl> is invoked with the
2610     C<mkperl> command instead of C<mkbundle>.
2611 root 1.2
2612 root 1.29 Example: build a new F<./perl> binary with only L<common::sense> inside -
2613     it will be even smaller than the standard perl interpreter as none of the
2614     modules of the base distribution (such as L<Fcntl>) will be included.
2615 root 1.2
2616 root 1.29 staticperl mkperl -Mcommon::sense
2617 root 1.8
2618 root 1.30 =item C<--app> F<name>
2619 root 1.8
2620 root 1.29 After writing out the bundle files, try to link a new standalone
2621     program. It will be called C<name>, and the bundle files get removed after
2622     linking it.
2623 root 1.8
2624 root 1.29 This switch is automatically used when F<staticperl> is invoked with the
2625     C<mkapp> command instead of C<mkbundle>.
2626 root 1.8
2627 root 1.29 The difference to the (mutually exclusive) C<--perl> option is that the
2628     binary created by this option will not try to act as a perl interpreter -
2629     instead it will simply initialise the perl interpreter, clean it up and
2630     exit.
2631 root 1.18
2632 root 1.39 This means that, by default, it will do nothing but burn a few CPU cycles
2633 root 1.29 - for it to do something useful you I<must> add some boot code, e.g. with
2634     the C<--boot> option.
2635 root 1.18
2636 root 1.29 Example: create a standalone perl binary called F<./myexe> that will
2637     execute F<appfile> when it is started.
2638 root 1.18
2639 root 1.29 staticperl mkbundle --app myexe --boot appfile
2640 root 1.18
2641 root 1.49 =item C<--ignore-env>
2642    
2643     Generates extra code to unset some environment variables before
2644     initialising/running perl. Perl supports a lot of environment variables
2645     that might alter execution in ways that might be undesirablre for
2646     standalone applications, and this option removes those known to cause
2647     trouble.
2648    
2649     Specifically, these are removed:
2650    
2651 root 1.73 C<PERL_HASH_SEED_DEBUG> and C<PERL_DEBUG_MSTATS> can cause undesirable
2652 root 1.49 output, C<PERL5OPT>, C<PERL_DESTRUCT_LEVEL>, C<PERL_HASH_SEED> and
2653     C<PERL_SIGNALS> can alter execution significantly, and C<PERL_UNICODE>,
2654     C<PERLIO_DEBUG> and C<PERLIO> can affect input and output.
2655    
2656     The variables C<PERL_LIB> and C<PERL5_LIB> are always ignored because the
2657     startup code used by F<staticperl> overrides C<@INC> in all cases.
2658    
2659     This option will not make your program more secure (unless you are
2660     running with elevated privileges), but it will reduce the surprise effect
2661     when a user has these environment variables set and doesn't expect your
2662     standalone program to act like a perl interpreter.
2663    
2664 root 1.30 =item C<--static>
2665 root 1.2
2666 root 1.29 Add C<-static> to F<bundle.ldopts>, which means a fully static (if
2667     supported by the OS) executable will be created. This is not immensely
2668     useful when just creating the bundle files, but is most useful when
2669     linking a binary with the C<--perl> or C<--app> options.
2670    
2671     The default is to link the new binary dynamically (that means all perl
2672     modules are linked statically, but all external libraries are still
2673 root 1.2 referenced dynamically).
2674    
2675     Keep in mind that Solaris doesn't support static linking at all, and
2676 root 1.29 systems based on GNU libc don't really support it in a very usable
2677     fashion either. Try uClibc if you want to create fully statically linked
2678     executables, or try the C<--staticlib> option to link only some libraries
2679 root 1.2 statically.
2680    
2681 root 1.30 =item C<--staticlib> libname
2682 root 1.18
2683     When not linking fully statically, this option allows you to link specific
2684 root 1.30 libraries statically. What it does is simply replace all occurrences of
2685 root 1.18 C<-llibname> with the GCC-specific C<-Wl,-Bstatic -llibname -Wl,-Bdynamic>
2686     option.
2687    
2688     This will have no effect unless the library is actually linked against,
2689     specifically, C<--staticlib> will not link against the named library
2690     unless it would be linked against anyway.
2691    
2692 root 1.30 Example: link libcrypt statically into the final binary.
2693 root 1.18
2694     staticperl mkperl -MIO::AIO --staticlib crypt
2695    
2696 root 1.29 # ldopts might now contain:
2697 root 1.18 # -lm -Wl,-Bstatic -lcrypt -Wl,-Bdynamic -lpthread
2698    
2699 root 1.29 =back
2700 root 1.2
2701     =back
2702    
2703 root 1.18 =head3 EXTENDED GLOB PATTERNS
2704    
2705     Some options of F<staticperl mkbundle> expect an I<extended glob
2706     pattern>. This is neither a normal shell glob nor a regex, but something
2707     in between. The idea has been copied from rsync, and there are the current
2708     matching rules:
2709    
2710     =over 4
2711    
2712     =item Patterns starting with F</> will be a anchored at the root of the library tree.
2713    
2714     That is, F</unicore> will match the F<unicore> directory in C<@INC>, but
2715     nothing inside, and neither any other file or directory called F<unicore>
2716     anywhere else in the hierarchy.
2717    
2718     =item Patterns not starting with F</> will be anchored at the end of the path.
2719    
2720     That is, F<idna.pl> will match any file called F<idna.pl> anywhere in the
2721     hierarchy, but not any directories of the same name.
2722    
2723 root 1.31 =item A F<*> matches anything within a single path component.
2724 root 1.18
2725     That is, F</unicore/*.pl> would match all F<.pl> files directly inside
2726     C</unicore>, not any deeper level F<.pl> files. Or in other words, F<*>
2727     will not match slashes.
2728    
2729     =item A F<**> matches anything.
2730    
2731     That is, F</unicore/**.pl> would match all F<.pl> files under F</unicore>,
2732     no matter how deeply nested they are inside subdirectories.
2733    
2734     =item A F<?> matches a single character within a component.
2735    
2736     That is, F</Encode/??.pm> matches F</Encode/JP.pm>, but not the
2737     hypothetical F</Encode/J/.pm>, as F<?> does not match F</>.
2738    
2739     =back
2740    
2741     =head2 F<STATICPERL> CONFIGURATION AND HOOKS
2742 root 1.2
2743 root 1.19 During (each) startup, F<staticperl> tries to source some shell files to
2744     allow you to fine-tune/override configuration settings.
2745    
2746     In them you can override shell variables, or define shell functions
2747     ("hooks") to be called at specific phases during installation. For
2748     example, you could define a C<postinstall> hook to install additional
2749     modules from CPAN each time you start from scratch.
2750    
2751     If the env variable C<$STATICPERLRC> is set, then F<staticperl> will try
2752     to source the file named with it only. Otherwise, it tries the following
2753     shell files in order:
2754 root 1.2
2755     /etc/staticperlrc
2756     ~/.staticperlrc
2757     $STATICPERL/rc
2758    
2759     Note that the last file is erased during F<staticperl distclean>, so
2760     generally should not be used.
2761    
2762     =head3 CONFIGURATION VARIABLES
2763    
2764     =head4 Variables you I<should> override
2765    
2766     =over 4
2767    
2768     =item C<EMAIL>
2769    
2770     The e-mail address of the person who built this binary. Has no good
2771     default, so should be specified by you.
2772    
2773     =item C<CPAN>
2774    
2775     The URL of the CPAN mirror to use (e.g. L<http://mirror.netcologne.de/cpan/>).
2776    
2777 root 1.6 =item C<EXTRA_MODULES>
2778 root 1.2
2779 root 1.6 Additional modules installed during F<staticperl install>. Here you can
2780     set which modules you want have to installed from CPAN.
2781 root 1.2
2782 root 1.10 Example: I really really need EV, AnyEvent, Coro and AnyEvent::AIO.
2783 root 1.2
2784 root 1.10 EXTRA_MODULES="EV AnyEvent Coro AnyEvent::AIO"
2785 root 1.2
2786 root 1.6 Note that you can also use a C<postinstall> hook to achieve this, and
2787     more.
2788 root 1.2
2789 root 1.10 =back
2790    
2791     =head4 Variables you might I<want> to override
2792    
2793     =over 4
2794    
2795     =item C<STATICPERL>
2796    
2797     The directory where staticperl stores all its files
2798     (default: F<~/.staticperl>).
2799    
2800 root 1.65 =item C<DLCACHE>
2801 root 1.2
2802 root 1.65 The path to a directory (will be created if it doesn't exist) where
2803     downloaded perl sources are being cached, to avoid downloading them
2804     again. The default is empty, which means there is no cache.
2805 root 1.2
2806 root 1.10 =item C<PERL_VERSION>
2807 root 1.6
2808 root 1.46 The perl version to install - default is currently C<5.12.3>, but C<5.8.9>
2809     is also a good choice (5.8.9 is much smaller than 5.12.3, while 5.10.1 is
2810     about as big as 5.12.3).
2811 root 1.2
2812 root 1.65 =item C<PERL_MM_USE_DEFAULT>, C<EV_EXTRA_DEFS>, ...
2813    
2814     Usually set to C<1> to make modules "less inquisitive" during their
2815 root 1.66 installation. You can set (and export!) any environment variable you want
2816     - some modules (such as L<Coro> or L<EV>) use environment variables for
2817     further tweaking.
2818 root 1.65
2819 root 1.10 =item C<PERL_PREFIX>
2820 root 1.2
2821 root 1.6 The prefix where perl gets installed (default: F<$STATICPERL/perl>),
2822     i.e. where the F<bin> and F<lib> subdirectories will end up.
2823 root 1.2
2824 root 1.8 =item C<PERL_CONFIGURE>
2825    
2826     Additional Configure options - these are simply passed to the perl
2827     Configure script. For example, if you wanted to enable dynamic loading,
2828     you could pass C<-Dusedl>. To enable ithreads (Why would you want that
2829     insanity? Don't! Use L<forks> instead!) you would pass C<-Duseithreads>
2830     and so on.
2831    
2832     More commonly, you would either activate 64 bit integer support
2833     (C<-Duse64bitint>), or disable large files support (-Uuselargefiles), to
2834     reduce filesize further.
2835    
2836 root 1.27 =item C<PERL_CC>, C<PERL_CCFLAGS>, C<PERL_OPTIMIZE>, C<PERL_LDFLAGS>, C<PERL_LIBS>
2837 root 1.2
2838 root 1.6 These flags are passed to perl's F<Configure> script, and are generally
2839     optimised for small size (at the cost of performance). Since they also
2840     contain subtle workarounds around various build issues, changing these
2841 root 1.27 usually requires understanding their default values - best look at
2842     the top of the F<staticperl> script for more info on these, and use a
2843     F<~/.staticperlrc> to override them.
2844    
2845     Most of the variables override (or modify) the corresponding F<Configure>
2846     variable, except C<PERL_CCFLAGS>, which gets appended.
2847 root 1.2
2848 root 1.72 The default for C<PERL_OPTIMIZE> is C<-Os> (assuming gcc), and for
2849     C<PERL_LIBS> is C<-lm -lcrypt>, which should be good for most (but not
2850     all) systems.
2851    
2852     For other compilers or more customised optimisation settings, you need to
2853     adjust these, e.g. in your F<~/.staticperlrc>.
2854    
2855     With gcc on x86 and amd64, you can get more space-savings by using:
2856    
2857     -Os -ffunction-sections -fdata-sections -finline-limit=8 -mpush-args
2858     -mno-inline-stringops-dynamically -mno-align-stringops
2859    
2860     And on x86 and pentium3 and newer (basically everything you might ever
2861     want to run on), adding these is even better for space-savings (use
2862     -mtune=core2 or something newer for much faster code, too):
2863    
2864     -fomit-frame-pointer -march=pentium3 -mtune=i386
2865 root 1.60
2866 root 1.2 =back
2867    
2868 root 1.5 =head4 Variables you probably I<do not want> to override
2869 root 1.2
2870     =over 4
2871    
2872 root 1.26 =item C<MAKE>
2873    
2874     The make command to use - default is C<make>.
2875    
2876 root 1.2 =item C<MKBUNDLE>
2877    
2878     Where F<staticperl> writes the C<mkbundle> command to
2879     (default: F<$STATICPERL/mkbundle>).
2880 root 1.1
2881 root 1.2 =item C<STATICPERL_MODULES>
2882 root 1.1
2883 root 1.2 Additional modules needed by C<mkbundle> - should therefore not be changed
2884     unless you know what you are doing.
2885    
2886     =back
2887    
2888     =head3 OVERRIDABLE HOOKS
2889    
2890     In addition to environment variables, it is possible to provide some
2891     shell functions that are called at specific times. To provide your own
2892 root 1.4 commands, just define the corresponding function.
2893 root 1.2
2894 root 1.56 The actual order in which hooks are invoked during a full install
2895     from scratch is C<preconfigure>, C<patchconfig>, C<postconfigure>,
2896     C<postbuild>, C<postinstall>.
2897    
2898 root 1.2 Example: install extra modules from CPAN and from some directories
2899     at F<staticperl install> time.
2900    
2901     postinstall() {
2902 root 1.5 rm -rf lib/threads* # weg mit Schaden
2903 root 1.2 instcpan IO::AIO EV
2904     instsrc ~/src/AnyEvent
2905     instsrc ~/src/XML-Sablotron-1.0100001
2906 root 1.5 instcpan Anyevent::AIO AnyEvent::HTTPD
2907 root 1.2 }
2908    
2909     =over 4
2910    
2911 root 1.11 =item preconfigure
2912    
2913 root 1.56 Called just before running F<./Configure> in the perl source
2914 root 1.11 directory. Current working directory is the perl source directory.
2915    
2916     This can be used to set any C<PERL_xxx> variables, which might be costly
2917     to compute.
2918    
2919 root 1.56 =item patchconfig
2920    
2921     Called after running F<./Configure> in the perl source directory to create
2922     F<./config.sh>, but before running F<./Configure -S> to actually apply the
2923     config. Current working directory is the perl source directory.
2924    
2925     Can be used to tailor/patch F<config.sh> or do any other modifications.
2926    
2927 root 1.2 =item postconfigure
2928    
2929     Called after configuring, but before building perl. Current working
2930     directory is the perl source directory.
2931    
2932     =item postbuild
2933    
2934     Called after building, but before installing perl. Current working
2935     directory is the perl source directory.
2936    
2937     I have no clue what this could be used for - tell me.
2938    
2939     =item postinstall
2940    
2941     Called after perl and any extra modules have been installed in C<$PREFIX>,
2942     but before setting the "installation O.K." flag.
2943    
2944     The current working directory is C<$PREFIX>, but maybe you should not rely
2945     on that.
2946    
2947     This hook is most useful to customise the installation, by deleting files,
2948     or installing extra modules using the C<instcpan> or C<instsrc> functions.
2949    
2950     The script must return with a zero exit status, or the installation will
2951     fail.
2952 root 1.1
2953 root 1.2 =back
2954 root 1.1
2955 root 1.7 =head1 ANATOMY OF A BUNDLE
2956    
2957     When not building a new perl binary, C<mkbundle> will leave a number of
2958     files in the current working directory, which can be used to embed a perl
2959     interpreter in your program.
2960    
2961     Intimate knowledge of L<perlembed> and preferably some experience with
2962     embedding perl is highly recommended.
2963    
2964     C<mkperl> (or the C<--perl> option) basically does this to link the new
2965     interpreter (it also adds a main program to F<bundle.>):
2966    
2967     $Config{cc} $(cat bundle.ccopts) -o perl bundle.c $(cat bundle.ldopts)
2968    
2969     =over 4
2970    
2971     =item bundle.h
2972    
2973     A header file that contains the prototypes of the few symbols "exported"
2974     by bundle.c, and also exposes the perl headers to the application.
2975    
2976     =over 4
2977    
2978 root 1.37 =item staticperl_init (xs_init = 0)
2979 root 1.7
2980     Initialises the perl interpreter. You can use the normal perl functions
2981     after calling this function, for example, to define extra functions or
2982     to load a .pm file that contains some initialisation code, or the main
2983     program function:
2984    
2985     XS (xsfunction)
2986     {
2987     dXSARGS;
2988    
2989     // now we have items, ST(i) etc.
2990     }
2991    
2992     static void
2993     run_myapp(void)
2994     {
2995 root 1.37 staticperl_init (0);
2996 root 1.7 newXSproto ("myapp::xsfunction", xsfunction, __FILE__, "$$;$");
2997     eval_pv ("require myapp::main", 1); // executes "myapp/main.pm"
2998     }
2999    
3000 root 1.37 When your bootcode already wants to access some XS functions at
3001     compiletime, then you need to supply an C<xs_init> function pointer that
3002     is called as soon as perl is initialised enough to define XS functions,
3003     but before the preamble code is executed:
3004    
3005     static void
3006     xs_init (pTHX)
3007     {
3008     newXSproto ("myapp::xsfunction", xsfunction, __FILE__, "$$;$");
3009     }
3010    
3011     static void
3012     run_myapp(void)
3013     {
3014     staticperl_init (xs_init);
3015     }
3016    
3017     =item staticperl_cleanup ()
3018    
3019     In the unlikely case that you want to destroy the perl interpreter, here
3020     is the corresponding function.
3021    
3022 root 1.7 =item staticperl_xs_init (pTHX)
3023    
3024     Sometimes you need direct control over C<perl_parse> and C<perl_run>, in
3025     which case you do not want to use C<staticperl_init> but call them on your
3026     own.
3027    
3028     Then you need this function - either pass it directly as the C<xs_init>
3029 root 1.37 function to C<perl_parse>, or call it as one of the first things from your
3030     own C<xs_init> function.
3031 root 1.7
3032     =item PerlInterpreter *staticperl
3033    
3034     The perl interpreter pointer used by staticperl. Not normally so useful,
3035     but there it is.
3036    
3037     =back
3038    
3039     =item bundle.ccopts
3040    
3041     Contains the compiler options required to compile at least F<bundle.c> and
3042     any file that includes F<bundle.h> - you should probably use it in your
3043     C<CFLAGS>.
3044    
3045     =item bundle.ldopts
3046    
3047     The linker options needed to link the final program.
3048    
3049     =back
3050    
3051     =head1 RUNTIME FUNCTIONALITY
3052    
3053 root 1.69 Binaries created with C<mkbundle>/C<mkperl> contain extra functionality,
3054     mostly related to the extra files bundled in the binary (the virtual
3055     filesystem). All of this data is statically compiled into the binary, and
3056     accessing means copying it from a read-only section of your binary. Data
3057     pages in this way is usually freed by the operating system, as it isn't
3058     use more the onace.
3059    
3060     =head2 VIRTUAL FILESYSTEM
3061    
3062     Every bundle has a virtual filesystem. The only information stored in it
3063     is the path and contents of each file that was bundled.
3064    
3065     =head3 LAYOUT
3066    
3067     Any path starting with an ampersand (F<&>) or exclamation mark (F<!>) are
3068     reserved by F<staticperl>. They must only be used as described in this
3069     section.
3070 root 1.7
3071 root 1.69 =over 4
3072    
3073     =item !
3074    
3075     All files that typically cannot be loaded from memory (such as dynamic
3076     objects or shared libraries), but have to reside in the filesystem, are
3077     prefixed with F<!>. Typically these files get written out to some
3078     (semi-)temporary directory shortly after program startup, or before being
3079     used.
3080    
3081     =item !boot
3082    
3083     The bootstrap file, if specified during bundling.
3084    
3085     =item !auto/
3086    
3087     Shared objects or dlls corresponding to dynamically-linked perl extensions
3088     are stored with an F<!auto/> prefix.
3089    
3090     =item !lib/
3091    
3092     External shared libraries are stored in this directory.
3093    
3094     =item any letter
3095    
3096     Any path starting with a letter is a perl library file. For example,
3097     F<Coro/AIO.pm> corresponds to the file loaded by C<use Coro::AIO>, and
3098     F<Coro/jit.pl> corresponds to C<require "Coro/jit.pl">.
3099    
3100     Obviously, module names shouldn't start with any other characters than
3101     letters :)
3102    
3103     =back
3104    
3105     =head3 FUNCTIONS
3106 root 1.7
3107     =over 4
3108    
3109 root 1.72 =item $file = static::find $path
3110 root 1.7
3111     Returns the data associated with the given C<$path>
3112 root 1.69 (e.g. C<Digest/MD5.pm>, C<auto/POSIX/autosplit.ix>).
3113 root 1.7
3114     Returns C<undef> if the file isn't embedded.
3115    
3116 root 1.72 =item @paths = static::list
3117 root 1.7
3118     Returns the list of all paths embedded in this binary.
3119    
3120     =back
3121    
3122 root 1.69 =head2 EXTRA FEATURES
3123    
3124     In addition, for the embedded loading of perl files to work, F<staticperl>
3125     overrides the C<@INC> array.
3126    
3127 root 1.31 =head1 FULLY STATIC BINARIES - UCLIBC AND BUILDROOT
3128 root 1.8
3129     To make truly static (Linux-) libraries, you might want to have a look at
3130     buildroot (L<http://buildroot.uclibc.org/>).
3131    
3132     Buildroot is primarily meant to set up a cross-compile environment (which
3133     is not so useful as perl doesn't quite like cross compiles), but it can also compile
3134     a chroot environment where you can use F<staticperl>.
3135    
3136     To do so, download buildroot, and enable "Build options => development
3137     files in target filesystem" and optionally "Build options => gcc
3138     optimization level (optimize for size)". At the time of writing, I had
3139     good experiences with GCC 4.4.x but not GCC 4.5.
3140    
3141     To minimise code size, I used C<-pipe -ffunction-sections -fdata-sections
3142     -finline-limit=8 -fno-builtin-strlen -mtune=i386>. The C<-mtune=i386>
3143     doesn't decrease codesize much, but it makes the file much more
3144 root 1.63 compressible (and the execution a lot slower...).
3145 root 1.8
3146     If you don't need Coro or threads, you can go with "linuxthreads.old" (or
3147     no thread support). For Coro, it is highly recommended to switch to a
3148     uClibc newer than 0.9.31 (at the time of this writing, I used the 20101201
3149     snapshot) and enable NPTL, otherwise Coro needs to be configured with the
3150     ultra-slow pthreads backend to work around linuxthreads bugs (it also uses
3151     twice the address space needed for stacks).
3152    
3153     If you use C<linuxthreads.old>, then you should also be aware that
3154     uClibc shares C<errno> between all threads when statically linking. See
3155     L<http://lists.uclibc.org/pipermail/uclibc/2010-June/044157.html> for a
3156 root 1.64 workaround (and L<https://bugs.uclibc.org/2089> for discussion).
3157 root 1.8
3158 root 1.10 C<ccache> support is also recommended, especially if you want
3159     to play around with buildroot options. Enabling the C<miniperl>
3160     package will probably enable all options required for a successful
3161     perl build. F<staticperl> itself additionally needs either C<wget>
3162     (recommended, for CPAN) or C<curl>.
3163 root 1.8
3164     As for shells, busybox should provide all that is needed, but the default
3165     busybox configuration doesn't include F<comm> which is needed by perl -
3166     either make a custom busybox config, or compile coreutils.
3167    
3168     For the latter route, you might find that bash has some bugs that keep
3169     it from working properly in a chroot - either use dash (and link it to
3170     F</bin/sh> inside the chroot) or link busybox to F</bin/sh>, using it's
3171     built-in ash shell.
3172    
3173     Finally, you need F</dev/null> inside the chroot for many scripts to work
3174 root 1.64 - either F<cp /dev/null output/target/dev> or bind-mounting your F</dev>
3175     will provide this.
3176 root 1.8
3177     After you have compiled and set up your buildroot target, you can copy
3178     F<staticperl> from the C<App::Staticperl> distribution or from your
3179 root 1.64 perl F<bin> directory (if you installed it) into the F<output/target>
3180 root 1.8 filesystem, chroot inside and run it.
3181    
3182 root 1.18 =head1 RECIPES / SPECIFIC MODULES
3183    
3184     This section contains some common(?) recipes and information about
3185     problems with some common modules or perl constructs that require extra
3186     files to be included.
3187    
3188     =head2 MODULES
3189    
3190     =over 4
3191    
3192     =item utf8
3193    
3194     Some functionality in the utf8 module, such as swash handling (used
3195     for unicode character ranges in regexes) is implemented in the
3196     C<"utf8_heavy.pl"> library:
3197    
3198 root 1.49 -Mutf8_heavy.pl
3199 root 1.18
3200     Many Unicode properties in turn are defined in separate modules,
3201     such as C<"unicore/Heavy.pl"> and more specific data tables such as
3202     C<"unicore/To/Digit.pl"> or C<"unicore/lib/Perl/Word.pl">. These tables
3203     are big (7MB uncompressed, although F<staticperl> contains special
3204     handling for those files), so including them on demand by your application
3205     only might pay off.
3206    
3207     To simply include the whole unicode database, use:
3208    
3209 root 1.32 --incglob '/unicore/**.pl'
3210 root 1.18
3211     =item AnyEvent
3212    
3213     AnyEvent needs a backend implementation that it will load in a delayed
3214     fashion. The L<AnyEvent::Impl::Perl> backend is the default choice
3215     for AnyEvent if it can't find anything else, and is usually a safe
3216     fallback. If you plan to use e.g. L<EV> (L<POE>...), then you need to
3217     include the L<AnyEvent::Impl::EV> (L<AnyEvent::Impl::POE>...) backend as
3218     well.
3219    
3220     If you want to handle IRIs or IDNs (L<AnyEvent::Util> punycode and idn
3221     functions), you also need to include C<"AnyEvent/Util/idna.pl"> and
3222     C<"AnyEvent/Util/uts46data.pl">.
3223    
3224 root 1.31 Or you can use C<--usepacklists> and specify C<-MAnyEvent> to include
3225 root 1.19 everything.
3226    
3227 root 1.58 =item Cairo
3228    
3229     See Glib, same problem, same solution.
3230    
3231 root 1.18 =item Carp
3232    
3233     Carp had (in older versions of perl) a dependency on L<Carp::Heavy>. As of
3234     perl 5.12.2 (maybe earlier), this dependency no longer exists.
3235    
3236     =item Config
3237    
3238     The F<perl -V> switch (as well as many modules) needs L<Config>, which in
3239     turn might need L<"Config_heavy.pl">. Including the latter gives you
3240     both.
3241    
3242 root 1.58 =item Glib
3243    
3244     Glib literally requires Glib to be installed already to build - it tries
3245     to fake this by running Glib out of the build directory before being
3246     built. F<staticperl> tries to work around this by forcing C<MAN1PODS> and
3247     C<MAN3PODS> to be empty via the C<PERL_MM_OPT> environment variable.
3248    
3249     =item Gtk2
3250    
3251     See Pango, same problems, same solution.
3252    
3253     =item Pango
3254    
3255     In addition to the C<MAN3PODS> problem in Glib, Pango also routes around
3256     L<ExtUtils::MakeMaker> by compiling its files on its own. F<staticperl>
3257     tries to patch L<ExtUtils::MM_Unix> to route around Pango.
3258    
3259 root 1.18 =item Term::ReadLine::Perl
3260    
3261 root 1.31 Also needs L<Term::ReadLine::readline>, or C<--usepacklists>.
3262 root 1.18
3263     =item URI
3264    
3265     URI implements schemes as separate modules - the generic URL scheme is
3266     implemented in L<URI::_generic>, HTTP is implemented in L<URI::http>. If
3267 root 1.19 you need to use any of these schemes, you should include these manually,
3268 root 1.31 or use C<--usepacklists>.
3269 root 1.18
3270     =back
3271    
3272     =head2 RECIPES
3273    
3274     =over 4
3275    
3276 root 1.31 =item Just link everything in
3277 root 1.18
3278     To link just about everything installed in the perl library into a new
3279 root 1.31 perl, try this (the first time this runs it will take a long time, as a
3280     lot of files need to be parsed):
3281    
3282     staticperl mkperl -v --strip ppi --incglob '*'
3283    
3284     If you don't mind the extra megabytes, this can be a very effective way of
3285     creating bundles without having to worry about forgetting any modules.
3286 root 1.18
3287 root 1.31 You get even more useful variants of this method by first selecting
3288     everything, and then excluding stuff you are reasonable sure not to need -
3289     L<bigperl|http://staticperl.schmorp.de/bigperl.html> uses this approach.
3290 root 1.18
3291 root 1.31 =item Getting rid of netdb functions
3292 root 1.18
3293     The perl core has lots of netdb functions (C<getnetbyname>, C<getgrent>
3294     and so on) that few applications use. You can avoid compiling them in by
3295     putting the following fragment into a C<preconfigure> hook:
3296    
3297     preconfigure() {
3298     for sym in \
3299     d_getgrnam_r d_endgrent d_endgrent_r d_endhent \
3300     d_endhostent_r d_endnent d_endnetent_r d_endpent \
3301     d_endprotoent_r d_endpwent d_endpwent_r d_endsent \
3302     d_endservent_r d_getgrent d_getgrent_r d_getgrgid_r \
3303     d_getgrnam_r d_gethbyaddr d_gethent d_getsbyport \
3304     d_gethostbyaddr_r d_gethostbyname_r d_gethostent_r \
3305     d_getlogin_r d_getnbyaddr d_getnbyname d_getnent \
3306     d_getnetbyaddr_r d_getnetbyname_r d_getnetent_r \
3307     d_getpent d_getpbyname d_getpbynumber d_getprotobyname_r \
3308     d_getprotobynumber_r d_getprotoent_r d_getpwent \
3309     d_getpwent_r d_getpwnam_r d_getpwuid_r d_getsent \
3310     d_getservbyname_r d_getservbyport_r d_getservent_r \
3311     d_getspnam_r d_getsbyname
3312     # d_gethbyname
3313     do
3314     PERL_CONFIGURE="$PERL_CONFIGURE -U$sym"
3315     done
3316     }
3317    
3318 root 1.32 This mostly gains space when linking statically, as the functions will
3319 root 1.22 likely not be linked in. The gain for dynamically-linked binaries is
3320 root 1.18 smaller.
3321    
3322     Also, this leaves C<gethostbyname> in - not only is it actually used
3323     often, the L<Socket> module also exposes it, so leaving it out usually
3324     gains little. Why Socket exposes a C function that is in the core already
3325     is anybody's guess.
3326    
3327     =back
3328    
3329 root 1.1 =head1 AUTHOR
3330    
3331     Marc Lehmann <schmorp@schmorp.de>
3332     http://software.schmorp.de/pkg/staticperl.html
3333