ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/App-Staticperl/bin/staticperl
Revision: 1.80
Committed: Thu Jan 16 20:12:47 2014 UTC (12 years, 8 months ago) by root
Branch: MAIN
Changes since 1.79: +37 -16 lines
Log Message:
*** empty log message ***

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