ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/App-Staticperl/bin/staticperl
Revision: 1.92
Committed: Tue Mar 19 15:24:49 2019 UTC (7 years, 6 months ago) by root
Branch: MAIN
Changes since 1.91: +46 -23 lines
Log Message:
*** empty log message ***

File Contents

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