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