ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/App-Staticperl/bin/staticperl
Revision: 1.108
Committed: Mon Aug 7 05:00:03 2023 UTC (3 years, 3 months ago) by root
Branch: MAIN
Changes since 1.107: +2 -1 lines
Log Message:
*** empty log message ***

File Contents

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