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

File Contents

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