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