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