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