ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/App-Staticperl/bin/staticperl
Revision: 1.96
Committed: Sat Jul 29 04:00:47 2023 UTC (3 years, 2 months ago) by root
Branch: MAIN
Changes since 1.95: +2 -1 lines
Log Message:
*** empty log message ***

File Contents

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