ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/App-Staticperl/bin/staticperl
Revision: 1.89
Committed: Mon Jun 26 20:33:30 2017 UTC (9 years, 3 months ago) by root
Branch: MAIN
Changes since 1.88: +3 -2 lines
Log Message:
*** empty log message ***

File Contents

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