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