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