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