ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/App-Staticperl/bin/staticperl
Revision: 1.35
Committed: Thu Jan 20 21:32:47 2011 UTC (15 years, 9 months ago) by root
Branch: MAIN
Changes since 1.34: +4 -1 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 #!/bin/sh
2    
3     #############################################################################
4     # configuration to fill in
5    
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    
10     # perl build variables
11 root 1.26 MAKE=make
12 root 1.10 PERL_VERSION=5.12.2 # 5.8.9 is also a good choice
13 root 1.24 PERL_CC=cc
14 root 1.8 PERL_CONFIGURE="" # additional Configure arguments
15 root 1.28 PERL_CCFLAGS="-DPERL_DISABLE_PMC -DPERL_ARENA_SIZE=65536 -D_GNU_SOURCE -DNDEBUG"
16 root 1.1 PERL_OPTIMIZE="-Os -ffunction-sections -fdata-sections -finline-limit=8 -ffast-math"
17    
18     ARCH="$(uname -m)"
19    
20     case "$ARCH" in
21     i*86 | x86_64 | amd64 )
22 root 1.27 PERL_OPTIMIZE="$PERL_OPTIMIZE -mpush-args -mno-inline-stringops-dynamically -mno-align-stringops -mno-ieee-fp" # x86/amd64
23 root 1.1 case "$ARCH" in
24     i*86 )
25     PERL_OPTIMIZE="$PERL_OPTIMIZE -fomit-frame-pointer -march=pentium3 -mtune=i386" # x86 only
26     ;;
27     esac
28     ;;
29     esac
30    
31     # -Wl,--gc-sections makes it impossible to check for undefined references
32     # for some reason so we need to patch away the "-no" after Configure and before make :/
33 root 1.21 # --allow-multiple-definition exists to work around uclibc's pthread static linking bug
34     PERL_LDFLAGS="-Wl,--no-gc-sections -Wl,--allow-multiple-definition"
35 root 1.1 PERL_LIBS="-lm -lcrypt" # perl loves to add lotsa crap itself
36    
37     # some configuration options for modules
38 root 1.31 PERL_MM_USE_DEFAULT=1
39     #CORO_INTERFACE=p # needed without nptl on x86, due to bugs in linuxthreads - very slow
40     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'
41     export PERL_MM_USE_DEFAULT CORO_INTERFACE EV_EXTRA_DEFS
42 root 1.1
43     # which extra modules to install by default from CPAN that are
44     # required by mkbundle
45 root 1.2 STATICPERL_MODULES="common::sense Pod::Strip PPI::XS Pod::Usage"
46    
47     # which extra modules you might want to install
48     EXTRA_MODULES=""
49 root 1.1
50     # overridable functions
51 root 1.11 preconfigure() { : ; }
52 root 1.1 postconfigure() { : ; }
53     postbuild() { : ; }
54     postinstall() { : ; }
55    
56     # now source user config, if any
57 root 1.19 if [ "$STATICPERLRC" ]; then
58     . "$STATICPERLRC"
59     else
60     [ -r /etc/staticperlrc ] && . /etc/staticperlrc
61     [ -r ~/.staticperlrc ] && . ~/.staticperlrc
62     [ -r "$STATICPERL/rc" ] && . "$STATICPERL/rc"
63     fi
64 root 1.1
65     #############################################################################
66     # support
67    
68 root 1.19 MKBUNDLE="${MKBUNDLE:=$STATICPERL/mkbundle}"
69     PERL_PREFIX="${PERL_PREFIX:=$STATICPERL/perl}" # where the perl gets installed
70    
71 root 1.18 unset PERL5OPT PERL5LIB PERLLIB PERL_UNICODE PERLIO_DEBUG
72 root 1.31 LC_ALL=C; export LC_ALL # just to be on the safe side
73 root 1.18
74 root 1.1 # set version in a way that Makefile.PL can extract
75     VERSION=VERSION; eval \
76 root 1.34 $VERSION="1.0"
77 root 1.1
78     BZ2=bz2
79     BZIP2=bzip2
80    
81     fatal() {
82     printf -- "\nFATAL: %s\n\n" "$*" >&2
83     exit 1
84     }
85    
86     verbose() {
87     printf -- "%s\n" "$*"
88     }
89    
90     verblock() {
91     verbose
92     verbose "***"
93     while read line; do
94     verbose "*** $line"
95     done
96     verbose "***"
97     verbose
98     }
99    
100     rcd() {
101     cd "$1" || fatal "$1: cannot enter"
102     }
103    
104     trace() {
105     prefix="$1"; shift
106     # "$@" 2>&1 | while read line; do
107     # echo "$prefix: $line"
108     # done
109     "$@"
110     }
111    
112     trap wait 0
113    
114     #############################################################################
115     # clean
116    
117     distclean() {
118     verblock <<EOF
119 root 1.19 deleting everything installed by this script (rm -rf $STATICPERL)
120 root 1.1 EOF
121    
122     rm -rf "$STATICPERL"
123     }
124    
125     #############################################################################
126     # download/configure/compile/install perl
127    
128     clean() {
129 root 1.11 rm -rf "$STATICPERL/src/perl-$PERL_VERSION"
130 root 1.1 }
131    
132 root 1.28 realclean() {
133     rm -f "$PERL_PREFIX/staticstamp.postinstall"
134     rm -f "$PERL_PREFIX/staticstamp.install"
135     rm -f "$STATICPERL/src/perl-"*"/staticstamp.configure"
136     }
137    
138 root 1.1 fetch() {
139     rcd "$STATICPERL"
140    
141     mkdir -p src
142     rcd src
143    
144 root 1.10 if ! [ -d "perl-$PERL_VERSION" ]; then
145     if ! [ -e "perl-$PERL_VERSION.tar.$BZ2" ]; then
146 root 1.1
147 root 1.10 URL="$CPAN/src/5.0/perl-$PERL_VERSION.tar.$BZ2"
148 root 1.1
149     verblock <<EOF
150     downloading perl
151     to manually download perl yourself, place
152 root 1.10 perl-$PERL_VERSION.tar.$BZ2 in $STATICPERL
153 root 1.1 trying $URL
154     EOF
155    
156 root 1.10 rm -f perl-$PERL_VERSION.tar.$BZ2~ # just to be on the safe side
157 root 1.32 curl -f >perl-$PERL_VERSION.tar.$BZ2~ "$URL" \
158     || wget -O perl-$PERL_VERSION.tar.$BZ2~ "$URL" \
159 root 1.10 || fatal "$URL: unable to download"
160 root 1.25 rm -f perl-$PERL_VERSION.tar.$BZ2
161 root 1.10 mv perl-$PERL_VERSION.tar.$BZ2~ perl-$PERL_VERSION.tar.$BZ2
162 root 1.1 fi
163    
164     verblock <<EOF
165     unpacking perl
166     EOF
167    
168     mkdir -p unpack
169 root 1.25 rm -rf unpack/perl-$PERL_VERSION
170 root 1.19 $BZIP2 -d <perl-$PERL_VERSION.tar.bz2 | tar xfC - unpack \
171 root 1.10 || fatal "perl-$PERL_VERSION.tar.bz2: error during unpacking"
172 root 1.12 chmod -R u+w unpack/perl-$PERL_VERSION
173 root 1.10 mv unpack/perl-$PERL_VERSION perl-$PERL_VERSION
174 root 1.1 rmdir -p unpack
175     fi
176     }
177    
178     # similar to GNU-sed -i or perl -pi
179     sedreplace() {
180     sed -e "$1" <"$2" > "$2~" || fatal "error while running sed"
181 root 1.25 rm -f "$2"
182 root 1.1 mv "$2~" "$2"
183     }
184    
185 root 1.27 configure_failure() {
186     cat <<EOF
187    
188    
189     ***
190     *** Configure failed - see above for the exact error message(s).
191     ***
192     *** Most commonly, this is because the default PERL_CCFLAGS or PERL_OPTIMIZE
193     *** flags are not supported by your compiler. Less often, this is because
194     *** PERL_LIBS either contains a library not available on your system (such as
195     *** -lcrypt), or because it lacks a required library (e.g. -lsocket or -lnsl).
196     ***
197     *** You can provide your own flags by creating a ~/.staticperlrc file with
198     *** variable assignments. For example (these are the actual values used):
199     ***
200    
201     PERL_CC="$PERL_CC"
202     PERL_CCFLAGS="$PERL_CCFLAGS"
203     PERL_OPTIMIZE="$PERL_OPTIMIZE"
204     PERL_LDFLAGS="$PERL_LDFLAGS"
205     PERL_LIBS="$PERL_LIBS"
206    
207     EOF
208     exit 1
209     }
210    
211 root 1.1 configure() {
212     fetch
213    
214 root 1.10 rcd "$STATICPERL/src/perl-$PERL_VERSION"
215 root 1.1
216     [ -e staticstamp.configure ] && return
217    
218     verblock <<EOF
219 root 1.10 configuring $STATICPERL/src/perl-$PERL_VERSION
220 root 1.1 EOF
221    
222 root 1.12 rm -f "$PERL_PREFIX/staticstamp.install"
223 root 1.1
224 root 1.26 "$MAKE" distclean >/dev/null 2>&1
225 root 1.1
226 root 1.28 sedreplace '/^#define SITELIB/d' config_h.SH
227    
228     # I hate them for this
229 root 1.1 grep -q -- -fstack-protector Configure && \
230     sedreplace 's/-fstack-protector/-fno-stack-protector/g' Configure
231    
232 root 1.11 preconfigure
233    
234 root 1.1 # trace configure \
235     sh Configure -Duselargefiles \
236     -Uuse64bitint \
237     -Dusemymalloc=n \
238     -Uusedl \
239     -Uusethreads \
240     -Uuseithreads \
241     -Uusemultiplicity \
242     -Uusesfio \
243     -Uuseshrplib \
244 root 1.33 -Uinstallusrbinperl \
245 root 1.27 -A ccflags=" $PERL_CCFLAGS" \
246 root 1.25 -Dcc="$PERL_CC" \
247 root 1.1 -Doptimize="$PERL_OPTIMIZE" \
248     -Dldflags="$PERL_LDFLAGS" \
249     -Dlibs="$PERL_LIBS" \
250 root 1.10 -Dprefix="$PERL_PREFIX" \
251     -Dbin="$PERL_PREFIX/bin" \
252     -Dprivlib="$PERL_PREFIX/lib" \
253     -Darchlib="$PERL_PREFIX/lib" \
254 root 1.1 -Uusevendorprefix \
255 root 1.10 -Dsitelib="$PERL_PREFIX/lib" \
256     -Dsitearch="$PERL_PREFIX/lib" \
257 root 1.1 -Uman1dir \
258     -Uman3dir \
259     -Usiteman1dir \
260     -Usiteman3dir \
261     -Dpager=/usr/bin/less \
262     -Demail="$EMAIL" \
263     -Dcf_email="$EMAIL" \
264     -Dcf_by="$EMAIL" \
265 root 1.8 $PERL_CONFIGURE \
266 root 1.25 -Duseperlio \
267 root 1.27 -dE || configure_failure
268 root 1.1
269     sedreplace '
270     s/-Wl,--no-gc-sections/-Wl,--gc-sections/g
271     s/ *-fno-stack-protector */ /g
272     ' config.sh
273    
274     sh Configure -S || fatal "Configure -S failed"
275    
276     postconfigure || fatal "postconfigure hook failed"
277    
278     touch staticstamp.configure
279     }
280    
281     build() {
282     configure
283    
284 root 1.10 rcd "$STATICPERL/src/perl-$PERL_VERSION"
285 root 1.1
286     verblock <<EOF
287 root 1.10 building $STATICPERL/src/perl-$PERL_VERSION
288 root 1.1 EOF
289    
290 root 1.10 rm -f "$PERL_PREFIX/staticstamp.install"
291 root 1.1
292 root 1.26 "$MAKE" || fatal "make: error while building perl"
293 root 1.1
294     postbuild || fatal "postbuild hook failed"
295     }
296    
297     install() {
298 root 1.13 if ! [ -e "$PERL_PREFIX/staticstamp.install" ]; then
299     build
300 root 1.1
301 root 1.13 verblock <<EOF
302 root 1.10 installing $STATICPERL/src/perl-$PERL_VERSION
303     to $PERL_PREFIX
304 root 1.1 EOF
305    
306 root 1.19 ln -sf "perl/bin/" "$STATICPERL/bin"
307     ln -sf "perl/lib/" "$STATICPERL/lib"
308    
309     ln -sf "$PERL_PREFIX" "$STATICPERL/perl" # might get overwritten
310     rm -rf "$PERL_PREFIX" # by this rm -rf
311    
312 root 1.26 "$MAKE" install || fatal "make install: error while installing"
313 root 1.1
314 root 1.13 rcd "$PERL_PREFIX"
315 root 1.2
316 root 1.13 # create a "make install" replacement for CPAN
317     cat >"$PERL_PREFIX"/bin/cpan-make-install <<EOF
318 root 1.26 "$MAKE" || exit
319 root 1.14
320 root 1.1 if find blib/arch/auto -type f | grep -q -v .exists; then
321     echo Probably an XS module, rebuilding perl
322 root 1.26 if "$MAKE" perl; then
323 root 1.25 mv perl "$PERL_PREFIX"/bin/perl~ \
324     && rm -f "$PERL_PREFIX"/bin/perl \
325     && mv "$PERL_PREFIX"/bin/perl~ "$PERL_PREFIX"/bin/perl
326 root 1.26 "$MAKE" -f Makefile.aperl map_clean
327 root 1.14 else
328 root 1.26 "$MAKE" -f Makefile.aperl map_clean
329 root 1.14 exit 1
330     fi
331 root 1.1 fi
332 root 1.14
333 root 1.26 "$MAKE" install UNINST=1
334 root 1.1 EOF
335 root 1.13 chmod 755 "$PERL_PREFIX"/bin/cpan-make-install
336    
337     # trick CPAN into avoiding ~/.cpan completely
338     echo 1 >"$PERL_PREFIX/lib/CPAN/MyConfig.pm"
339 root 1.1
340 root 1.13 "$PERL_PREFIX"/bin/perl -MCPAN -e '
341     CPAN::Shell->o (conf => urllist => push => "'"$CPAN"'");
342     CPAN::Shell->o (conf => q<cpan_home>, "'"$STATICPERL"'/cpan");
343     CPAN::Shell->o (conf => q<init>);
344     CPAN::Shell->o (conf => q<cpan_home>, "'"$STATICPERL"'/cpan");
345     CPAN::Shell->o (conf => q<build_dir>, "'"$STATICPERL"'/cpan/build");
346     CPAN::Shell->o (conf => q<prefs_dir>, "'"$STATICPERL"'/cpan/prefs");
347     CPAN::Shell->o (conf => q<histfile> , "'"$STATICPERL"'/cpan/histfile");
348     CPAN::Shell->o (conf => q<keep_source_where>, "'"$STATICPERL"'/cpan/sources");
349     CPAN::Shell->o (conf => q<make_install_make_command>, "'"$PERL_PREFIX"'/bin/cpan-make-install");
350     CPAN::Shell->o (conf => q<prerequisites_policy>, q<follow>);
351     CPAN::Shell->o (conf => q<build_requires_install_policy>, q<no>);
352     CPAN::Shell->o (conf => q<commit>);
353     ' || fatal "error while initialising CPAN"
354 root 1.2
355 root 1.13 touch "$PERL_PREFIX/staticstamp.install"
356     fi
357    
358 root 1.14 if ! [ -e "$PERL_PREFIX/staticstamp.postinstall" ]; then
359 root 1.13 NOCHECK_INSTALL=+
360     instcpan $STATICPERL_MODULES
361     [ $EXTRA_MODULES ] && instcpan $EXTRA_MODULES
362 root 1.1
363 root 1.13 postinstall || fatal "postinstall hook failed"
364 root 1.1
365 root 1.13 touch "$PERL_PREFIX/staticstamp.postinstall"
366     fi
367 root 1.1 }
368    
369     #############################################################################
370     # install a module from CPAN
371    
372     instcpan() {
373     [ $NOCHECK_INSTALL ] || install
374    
375     verblock <<EOF
376     installing modules from CPAN
377     $@
378     EOF
379    
380     for mod in "$@"; do
381 root 1.10 "$PERL_PREFIX"/bin/perl -MCPAN -e 'notest install => "'"$mod"'"' \
382 root 1.1 || fatal "$mod: unable to install from CPAN"
383     done
384     rm -rf "$STATICPERL/build"
385     }
386    
387     #############################################################################
388     # install a module from unpacked sources
389    
390     instsrc() {
391     [ $NOCHECK_INSTALL ] || install
392    
393     verblock <<EOF
394     installing modules from source
395     $@
396     EOF
397    
398     for mod in "$@"; do
399     echo
400     echo $mod
401     (
402     rcd $mod
403 root 1.26 "$MAKE" -f Makefile.aperl map_clean >/dev/null 2>&1
404     "$MAKE" distclean >/dev/null 2>&1
405 root 1.10 "$PERL_PREFIX"/bin/perl Makefile.PL || fatal "$mod: error running Makefile.PL"
406 root 1.26 "$MAKE" || fatal "$mod: error building module"
407 root 1.10 "$PERL_PREFIX"/bin/cpan-make-install || fatal "$mod: error installing module"
408 root 1.26 "$MAKE" distclean >/dev/null 2>&1
409 root 1.1 exit 0
410     ) || exit $?
411     done
412     }
413    
414     #############################################################################
415     # main
416    
417     podusage() {
418     echo
419 root 1.22
420 root 1.10 if [ -e "$PERL_PREFIX/bin/perl" ]; then
421     "$PERL_PREFIX/bin/perl" -MPod::Usage -e \
422 root 1.1 'pod2usage -input => *STDIN, -output => *STDOUT, -verbose => '$1', -exitval => 0, -noperldoc => 1' <"$0" \
423     2>/dev/null && exit
424     fi
425 root 1.22
426 root 1.1 # try whatever perl we can find
427     perl -MPod::Usage -e \
428     'pod2usage -input => *STDIN, -output => *STDOUT, -verbose => '$1', -exitval => 0, -noperldoc => 1' <"$0" \
429     2>/dev/null && exit
430    
431 root 1.22 fatal "displaying documentation requires a working perl - try '$0 install' to build one in a safe location"
432 root 1.1 }
433    
434     usage() {
435     podusage 0
436     }
437    
438     catmkbundle() {
439     {
440     read dummy
441 root 1.10 echo "#!$PERL_PREFIX/bin/perl"
442 root 1.1 cat
443     } <<'MKBUNDLE'
444     #!/opt/bin/perl
445    
446     #############################################################################
447     # cannot load modules till after the tracer BEGIN block
448    
449     our $VERBOSE = 1;
450     our $STRIP = "pod"; # none, pod or ppi
451 root 1.18 our $UNISTRIP = 1; # always on, try to strip unicore swash data
452 root 1.1 our $PERL = 0;
453 root 1.17 our $APP;
454 root 1.1 our $VERIFY = 0;
455     our $STATIC = 0;
456 root 1.19 our $PACKLIST = 0;
457 root 1.1
458 root 1.18 our $OPTIMISE_SIZE = 0; # optimise for raw file size instead of for compression?
459    
460     our $CACHE;
461     our $CACHEVER = 1; # do not change unless you know what you are doing
462    
463 root 1.1 my $PREFIX = "bundle";
464     my $PACKAGE = "static";
465    
466     my %pm;
467 root 1.8 my %pmbin;
468 root 1.1 my @libs;
469     my @static_ext;
470     my $extralibs;
471 root 1.18 my @staticlibs;
472     my @incext;
473 root 1.1
474     @ARGV
475     or die "$0: use 'staticperl help' (or read the sources of staticperl)\n";
476    
477 root 1.18 # remove "." from @INC - staticperl.sh does it for us, but be on the safe side
478     BEGIN { @INC = grep !/^\.$/, @INC }
479    
480 root 1.1 $|=1;
481    
482     our ($TRACER_W, $TRACER_R);
483    
484 root 1.19 sub find_incdir($) {
485 root 1.1 for (@INC) {
486     next if ref;
487     return $_ if -e "$_/$_[0]";
488     }
489    
490     undef
491     }
492    
493 root 1.19 sub find_inc($) {
494     my $dir = find_incdir $_[0];
495    
496     return "$dir/$_[0]"
497     if defined $dir;
498    
499     undef
500     }
501    
502 root 1.1 BEGIN {
503     # create a loader process to detect @INC requests before we load any modules
504     my ($W_TRACER, $R_TRACER); # used by tracer
505    
506     pipe $R_TRACER, $TRACER_W or die "pipe: $!";
507     pipe $TRACER_R, $W_TRACER or die "pipe: $!";
508    
509     unless (fork) {
510     close $TRACER_R;
511     close $TRACER_W;
512    
513 root 1.35 my $pkg = "pkg000000";
514    
515 root 1.1 unshift @INC, sub {
516 root 1.19 my $dir = find_incdir $_[1]
517 root 1.1 or return;
518    
519     syswrite $W_TRACER, "-\n$dir\n$_[1]\n";
520    
521     open my $fh, "<:perlio", "$dir/$_[1]"
522     or warn "ERROR: $dir/$_[1]: $!\n";
523    
524     $fh
525     };
526    
527     while (<$R_TRACER>) {
528     if (/use (.*)$/) {
529     my $mod = $1;
530 root 1.35 my $pkg = ++$pkg;
531     eval "{ package $pkg; use $mod; }";
532 root 1.1 warn "ERROR: $@ (while loading '$mod')\n"
533     if $@;
534     } elsif (/eval (.*)$/) {
535     my $eval = $1;
536     eval $eval;
537     warn "ERROR: $@ (in '$eval')\n"
538     if $@;
539     }
540 root 1.19
541     syswrite $W_TRACER, "\n";
542 root 1.1 }
543    
544     exit 0;
545     }
546     }
547    
548     # module loading is now safe
549 root 1.7
550 root 1.19 sub trace_parse {
551 root 1.1 for (;;) {
552     <$TRACER_R> =~ /^-$/ or last;
553     my $dir = <$TRACER_R>; chomp $dir;
554     my $name = <$TRACER_R>; chomp $name;
555    
556     $pm{$name} = "$dir/$name";
557 root 1.19
558     print "+ found potential dependency $name\n"
559     if $VERBOSE >= 3;
560 root 1.1 }
561     }
562    
563 root 1.19 sub trace_module {
564     print "tracing module $_[0]\n"
565     if $VERBOSE >= 2;
566    
567     syswrite $TRACER_W, "use $_[0]\n";
568     trace_parse;
569     }
570    
571 root 1.1 sub trace_eval {
572 root 1.19 print "tracing eval $_[0]\n"
573     if $VERBOSE >= 2;
574    
575 root 1.1 syswrite $TRACER_W, "eval $_[0]\n";
576 root 1.19 trace_parse;
577 root 1.1 }
578    
579     sub trace_finish {
580     close $TRACER_W;
581     close $TRACER_R;
582     }
583    
584     #############################################################################
585     # now we can use modules
586    
587     use common::sense;
588 root 1.18 use Config;
589 root 1.1 use Digest::MD5;
590    
591 root 1.18 sub cache($$$) {
592     my ($variant, $src, $filter) = @_;
593    
594 root 1.19 if (length $CACHE and 2048 <= length $src and defined $variant) {
595 root 1.18 my $file = "$CACHE/" . Digest::MD5::md5_hex "$CACHEVER\x00$variant\x00$src";
596    
597     if (open my $fh, "<:perlio", $file) {
598 root 1.19 print "using cache for $file\n"
599     if $VERBOSE >= 7;
600    
601 root 1.18 local $/;
602     return <$fh>;
603     }
604    
605     $src = $filter->($src);
606    
607 root 1.19 print "creating cache entry $file\n"
608     if $VERBOSE >= 8;
609    
610 root 1.18 if (open my $fh, ">:perlio", "$file~") {
611     if ((syswrite $fh, $src) == length $src) {
612     close $fh;
613     rename "$file~", $file;
614     }
615     }
616    
617     return $src;
618     }
619    
620     $filter->($src)
621     }
622    
623 root 1.1 sub dump_string {
624     my ($fh, $data) = @_;
625    
626     if (length $data) {
627     for (
628     my $ofs = 0;
629     length (my $substr = substr $data, $ofs, 80);
630     $ofs += 80
631     ) {
632     $substr =~ s/([^\x20-\x21\x23-\x5b\x5d-\x7e])/sprintf "\\%03o", ord $1/ge;
633     $substr =~ s/\?/\\?/g; # trigraphs...
634     print $fh " \"$substr\"\n";
635     }
636     } else {
637     print $fh " \"\"\n";
638     }
639     }
640    
641 root 1.18 #############################################################################
642    
643     sub glob2re {
644     for (quotemeta $_[0]) {
645     s/\\\*/\x00/g;
646     s/\x00\x00/.*/g;
647     s/\x00/[^\/]*/g;
648     s/\\\?/[^\/]/g;
649    
650     $_ = s/^\\\/// ? "^$_\$" : "(?:^|/)$_\$";
651    
652     s/(?: \[\^\/\] | \. ) \*\$$//x;
653    
654     return qr<$_>s
655     }
656     }
657    
658     our %INCSKIP = (
659     "unicore/TestProp.pl" => undef, # 3.5MB of insanity, apparently just some testcase
660     );
661    
662     sub get_dirtree {
663     my $root = shift;
664    
665     my @tree;
666     my $skip;
667    
668     my $scan; $scan = sub {
669     for (sort do {
670     opendir my $fh, $_[0]
671     or return;
672     readdir $fh
673     }) {
674     next if /^\./;
675    
676     my $path = "$_[0]/$_";
677    
678     if (-d "$path/.") {
679     $scan->($path);
680     } else {
681     $path = substr $path, $skip;
682     push @tree, $path
683     unless exists $INCSKIP{$path};
684     }
685     }
686     };
687    
688     $root =~ s/\/$//;
689     $skip = 1 + length $root;
690     $scan->($root);
691    
692     \@tree
693     }
694    
695     my $inctrees;
696    
697     sub get_inctrees {
698     unless ($inctrees) {
699     my %inctree;
700     $inctree{$_} ||= [$_, get_dirtree $_] # entries in @INC are often duplicates
701     for @INC;
702     $inctrees = [values %inctree];
703     }
704    
705     @$inctrees
706     }
707 root 1.1
708 root 1.18 #############################################################################
709 root 1.1
710     sub cmd_boot {
711     $pm{"//boot"} = $_[0];
712     }
713    
714     sub cmd_add {
715 root 1.3 $_[0] =~ /^(.*)(?:\s+(\S+))$/
716 root 1.1 or die "$_[0]: cannot parse";
717    
718     my $file = $1;
719     my $as = defined $2 ? $2 : "/$1";
720    
721     $pm{$as} = $file;
722 root 1.8 $pmbin{$as} = 1 if $_[1];
723 root 1.1 }
724    
725 root 1.18 sub cmd_staticlib {
726     push @staticlibs, $_
727     for split /\s+/, $_[0];
728     }
729    
730     sub cmd_include {
731     push @incext, [$_[1], glob2re $_[0]];
732     }
733    
734     sub cmd_incglob {
735     my ($pattern) = @_;
736    
737     $pattern = glob2re $pattern;
738    
739     for (get_inctrees) {
740     my ($dir, $files) = @$_;
741    
742     $pm{$_} = "$dir/$_"
743 root 1.31 for grep /$pattern/ && /\.(pl|pm)$/, @$files;
744 root 1.18 }
745     }
746    
747 root 1.19 sub parse_argv;
748    
749 root 1.1 sub cmd_file {
750     open my $fh, "<", $_[0]
751     or die "$_[0]: $!\n";
752    
753 root 1.19 local @ARGV;
754    
755 root 1.1 while (<$fh>) {
756     chomp;
757 root 1.19 next unless /\S/;
758     next if /^\s*#/;
759    
760     s/^\s*-*/--/;
761 root 1.1 my ($cmd, $args) = split / /, $_, 2;
762    
763 root 1.19 push @ARGV, $cmd;
764     push @ARGV, $args if defined $args;
765 root 1.1 }
766 root 1.19
767     parse_argv;
768 root 1.1 }
769    
770     use Getopt::Long;
771    
772 root 1.19 sub parse_argv {
773     GetOptions
774 root 1.31 "strip=s" => \$STRIP,
775     "cache=s" => \$CACHE, # internal option
776     "verbose|v" => sub { ++$VERBOSE },
777     "quiet|q" => sub { --$VERBOSE },
778     "perl" => \$PERL,
779     "app=s" => \$APP,
780     "eval|e=s" => sub { trace_eval $_[1] },
781     "use|M=s" => sub { trace_module $_[1] },
782     "boot=s" => sub { cmd_boot $_[1] },
783     "add=s" => sub { cmd_add $_[1], 0 },
784     "addbin=s" => sub { cmd_add $_[1], 1 },
785     "incglob=s" => sub { cmd_incglob $_[1] },
786     "include|i=s" => sub { cmd_include $_[1], 1 },
787     "exclude|x=s" => sub { cmd_include $_[1], 0 },
788     "static!" => \$STATIC,
789     "usepacklists!" => \$PACKLIST,
790     "staticlib=s" => sub { cmd_staticlib $_[1] },
791     "<>" => sub { cmd_file $_[0] },
792 root 1.19 or exit 1;
793     }
794    
795 root 1.1 Getopt::Long::Configure ("bundling", "no_auto_abbrev", "no_ignore_case");
796    
797 root 1.19 parse_argv;
798 root 1.1
799 root 1.17 die "cannot specify both --app and --perl\n"
800     if $PERL and defined $APP;
801    
802 root 1.18 # required for @INC loading, unfortunately
803     trace_module "PerlIO::scalar";
804    
805     #############################################################################
806 root 1.31 # apply include/exclude
807 root 1.18
808     {
809     my %pmi;
810    
811     for (@incext) {
812     my ($inc, $glob) = @$_;
813    
814     my @match = grep /$glob/, keys %pm;
815    
816     if ($inc) {
817     # include
818     @pmi{@match} = delete @pm{@match};
819 root 1.19
820     print "applying include $glob - protected ", (scalar @match), " files.\n"
821     if $VERBOSE >= 5;
822 root 1.18 } else {
823     # exclude
824     delete @pm{@match};
825 root 1.19
826 root 1.31 print "applying exclude $glob - removed ", (scalar @match), " files.\n"
827 root 1.19 if $VERBOSE >= 5;
828 root 1.18 }
829     }
830    
831     my @pmi = keys %pmi;
832     @pm{@pmi} = delete @pmi{@pmi};
833     }
834    
835     #############################################################################
836 root 1.31 # scan for AutoLoader, static archives and other dependencies
837 root 1.18
838     sub scan_al {
839     my ($auto, $autodir) = @_;
840    
841     my $ix = "$autodir/autosplit.ix";
842    
843 root 1.19 print "processing autoload index for '$auto'\n"
844     if $VERBOSE >= 6;
845    
846 root 1.18 $pm{"$auto/autosplit.ix"} = $ix;
847    
848     open my $fh, "<:perlio", $ix
849     or die "$ix: $!";
850    
851     my $package;
852    
853     while (<$fh>) {
854     if (/^\s*sub\s+ ([^[:space:];]+) \s* (?:\([^)]*\))? \s*;?\s*$/x) {
855     my $al = "auto/$package/$1.al";
856     my $inc = find_inc $al;
857    
858     defined $inc or die "$al: autoload file not found, but should be there.\n";
859    
860 root 1.19 $pm{$al} = $inc;
861     print "found autoload function '$al'\n"
862     if $VERBOSE >= 6;
863 root 1.18
864     } elsif (/^\s*package\s+([^[:space:];]+)\s*;?\s*$/) {
865     ($package = $1) =~ s/::/\//g;
866     } elsif (/^\s*(?:#|1?\s*;?\s*$)/) {
867     # nop
868     } else {
869 root 1.19 warn "WARNING: $ix: unparsable line, please report: $_";
870 root 1.18 }
871     }
872     }
873    
874     for my $pm (keys %pm) {
875     if ($pm =~ /^(.*)\.pm$/) {
876     my $auto = "auto/$1";
877     my $autodir = find_inc $auto;
878    
879 root 1.19 if (defined $autodir && -d $autodir) {
880 root 1.18 # AutoLoader
881     scan_al $auto, $autodir
882     if -f "$autodir/autosplit.ix";
883    
884     # extralibs.ld
885     if (open my $fh, "<:perlio", "$autodir/extralibs.ld") {
886 root 1.19 print "found extralibs for $pm\n"
887     if $VERBOSE >= 6;
888    
889 root 1.18 local $/;
890     $extralibs .= " " . <$fh>;
891     }
892    
893     $pm =~ /([^\/]+).pm$/ or die "$pm: unable to match last component";
894    
895     my $base = $1;
896    
897     # static ext
898     if (-f "$autodir/$base$Config{_a}") {
899 root 1.19 print "found static archive for $pm\n"
900     if $VERBOSE >= 3;
901    
902 root 1.18 push @libs, "$autodir/$base$Config{_a}";
903     push @static_ext, $pm;
904     }
905    
906     # dynamic object
907     die "ERROR: found shared object - can't link statically ($_)\n"
908     if -f "$autodir/$base.$Config{dlext}";
909 root 1.19
910     if ($PACKLIST && open my $fh, "<:perlio", "$autodir/.packlist") {
911     print "found .packlist for $pm\n"
912     if $VERBOSE >= 3;
913    
914     while (<$fh>) {
915     chomp;
916 root 1.31 s/ .*$//; # newer-style .packlists might contain key=value pairs
917 root 1.19
918     # only include certain files (.al, .ix, .pm, .pl)
919     if (/\.(pm|pl|al|ix)$/) {
920     for my $inc (@INC) {
921     # in addition, we only add files that are below some @INC path
922     $inc =~ s/\/*$/\//;
923    
924     if ($inc eq substr $_, 0, length $inc) {
925     my $base = substr $_, length $inc;
926     $pm{$base} = $_;
927    
928     print "+ added .packlist dependency $base\n"
929     if $VERBOSE >= 3;
930     }
931    
932     last;
933     }
934     }
935     }
936     }
937 root 1.18 }
938     }
939     }
940    
941     #############################################################################
942    
943 root 1.19 print "processing bundle files (try more -v power if you get bored waiting here)...\n"
944     if $VERBOSE >= 1;
945    
946 root 1.1 my $data;
947     my @index;
948     my @order = sort {
949     length $a <=> length $b
950     or $a cmp $b
951     } keys %pm;
952    
953     # sorting by name - better compression, but needs more metadata
954     # sorting by length - faster lookup
955     # usually, the metadata overhead beats the loss through compression
956    
957     for my $pm (@order) {
958     my $path = $pm{$pm};
959    
960     128 > length $pm
961 root 1.18 or die "ERROR: $pm: path too long (only 128 octets supported)\n";
962 root 1.1
963     my $src = ref $path
964     ? $$path
965     : do {
966 root 1.7 open my $pm, "<", $path
967 root 1.1 or die "$path: $!";
968    
969     local $/;
970    
971     <$pm>
972     };
973    
974 root 1.18 my $size = length $src;
975    
976 root 1.8 unless ($pmbin{$pm}) { # only do this unless the file is binary
977     if ($pm =~ /^auto\/POSIX\/[^\/]+\.al$/) {
978     if ($src =~ /^ unimpl \"/m) {
979 root 1.22 print "$pm: skipping (raises runtime error only).\n"
980 root 1.19 if $VERBOSE >= 3;
981 root 1.8 next;
982     }
983 root 1.1 }
984    
985 root 1.19 $src = cache +($STRIP eq "ppi" ? "$UNISTRIP,$OPTIMISE_SIZE" : undef), $src, sub {
986 root 1.18 if ($UNISTRIP && $pm =~ /^unicore\/.*\.pl$/) {
987 root 1.19 print "applying unicore stripping $pm\n"
988     if $VERBOSE >= 6;
989    
990 root 1.18 # special stripping for unicore swashes and properties
991     # much more could be done by going binary
992     $src =~ s{
993     (^return\ <<'END';\n) (.*?\n) (END(?:\n|\Z))
994     }{
995     my ($pre, $data, $post) = ($1, $2, $3);
996    
997     for ($data) {
998     s/^([0-9a-fA-F]+)\t([0-9a-fA-F]+)\t/sprintf "%X\t%X", hex $1, hex $2/gem
999     if $OPTIMISE_SIZE;
1000    
1001     # s{
1002     # ^([0-9a-fA-F]+)\t([0-9a-fA-F]*)\t
1003     # }{
1004     # # ww - smaller filesize, UU - compress better
1005     # pack "C0UU",
1006     # hex $1,
1007     # length $2 ? (hex $2) - (hex $1) : 0
1008     # }gemx;
1009 root 1.1
1010 root 1.18 s/#.*\n/\n/mg;
1011     s/\s+\n/\n/mg;
1012     }
1013 root 1.8
1014 root 1.18 "$pre$data$post"
1015     }smex;
1016 root 1.1 }
1017    
1018 root 1.18 if ($STRIP =~ /ppi/i) {
1019     require PPI;
1020    
1021     if (my $ppi = PPI::Document->new (\$src)) {
1022     $ppi->prune ("PPI::Token::Comment");
1023     $ppi->prune ("PPI::Token::Pod");
1024    
1025     # prune END stuff
1026     for (my $last = $ppi->last_element; $last; ) {
1027     my $prev = $last->previous_token;
1028    
1029     if ($last->isa (PPI::Token::Whitespace::)) {
1030     $last->delete;
1031     } elsif ($last->isa (PPI::Statement::End::)) {
1032     $last->delete;
1033     last;
1034     } elsif ($last->isa (PPI::Token::Pod::)) {
1035     $last->delete;
1036     } else {
1037     last;
1038     }
1039    
1040     $last = $prev;
1041     }
1042    
1043     # prune some but not all insignificant whitespace
1044     for my $ws (@{ $ppi->find (PPI::Token::Whitespace::) }) {
1045     my $prev = $ws->previous_token;
1046     my $next = $ws->next_token;
1047    
1048     if (!$prev || !$next) {
1049     $ws->delete;
1050     } else {
1051     if (
1052     $next->isa (PPI::Token::Operator::) && $next->{content} =~ /^(?:,|=|!|!=|==|=>)$/ # no ., because of digits. == float
1053     or $prev->isa (PPI::Token::Operator::) && $prev->{content} =~ /^(?:,|=|\.|!|!=|==|=>)$/
1054     or $prev->isa (PPI::Token::Structure::)
1055     or ($OPTIMISE_SIZE &&
1056     ($prev->isa (PPI::Token::Word::)
1057     && (PPI::Token::Symbol:: eq ref $next
1058     || $next->isa (PPI::Structure::Block::)
1059     || $next->isa (PPI::Structure::List::)
1060     || $next->isa (PPI::Structure::Condition::)))
1061     )
1062     ) {
1063     $ws->delete;
1064     } elsif ($prev->isa (PPI::Token::Whitespace::)) {
1065     $ws->{content} = ' ';
1066     $prev->delete;
1067     } else {
1068     $ws->{content} = ' ';
1069     }
1070     }
1071     }
1072 root 1.1
1073 root 1.18 # prune whitespace around blocks
1074     if ($OPTIMISE_SIZE) {
1075     # these usually decrease size, but decrease compressability more
1076     for my $struct (PPI::Structure::Block::, PPI::Structure::Condition::) {
1077     for my $node (@{ $ppi->find ($struct) }) {
1078     my $n1 = $node->first_token;
1079     my $n2 = $n1->previous_token;
1080     $n1->delete if $n1->isa (PPI::Token::Whitespace::);
1081     $n2->delete if $n2 && $n2->isa (PPI::Token::Whitespace::);
1082     my $n1 = $node->last_token;
1083     my $n2 = $n1->next_token;
1084     $n1->delete if $n1->isa (PPI::Token::Whitespace::);
1085     $n2->delete if $n2 && $n2->isa (PPI::Token::Whitespace::);
1086     }
1087     }
1088    
1089     for my $node (@{ $ppi->find (PPI::Structure::List::) }) {
1090     my $n1 = $node->first_token;
1091     $n1->delete if $n1->isa (PPI::Token::Whitespace::);
1092     my $n1 = $node->last_token;
1093     $n1->delete if $n1->isa (PPI::Token::Whitespace::);
1094     }
1095 root 1.8 }
1096 root 1.1
1097 root 1.18 # reformat qw() lists which often have lots of whitespace
1098     for my $node (@{ $ppi->find (PPI::Token::QuoteLike::Words::) }) {
1099     if ($node->{content} =~ /^qw(.)(.*)(.)$/s) {
1100     my ($a, $qw, $b) = ($1, $2, $3);
1101     $qw =~ s/^\s+//;
1102     $qw =~ s/\s+$//;
1103     $qw =~ s/\s+/ /g;
1104     $node->{content} = "qw$a$qw$b";
1105     }
1106 root 1.8 }
1107 root 1.18
1108     $src = $ppi->serialize;
1109     } else {
1110     warn "WARNING: $pm{$pm}: PPI failed to parse this file\n";
1111 root 1.8 }
1112 root 1.33 } elsif ($STRIP =~ /pod/i && $pm ne "Opcode.pm") { # opcode parses its own pod
1113 root 1.18 require Pod::Strip;
1114 root 1.8
1115 root 1.18 my $stripper = Pod::Strip->new;
1116    
1117     my $out;
1118     $stripper->output_string (\$out);
1119     $stripper->parse_string_document ($src)
1120     or die;
1121     $src = $out;
1122 root 1.1 }
1123    
1124 root 1.18 if ($VERIFY && $pm =~ /\.pm$/ && $pm ne "Opcode.pm") {
1125     if (open my $fh, "-|") {
1126     <$fh>;
1127     } else {
1128     eval "#line 1 \"$pm\"\n$src" or warn "\n\n\n$pm\n\n$src\n$@\n\n\n";
1129     exit 0;
1130 root 1.8 }
1131 root 1.1 }
1132 root 1.8
1133 root 1.18 $src
1134     };
1135 root 1.1
1136 root 1.8 # if ($pm eq "Opcode.pm") {
1137     # open my $fh, ">x" or die; print $fh $src;#d#
1138     # exit 1;
1139     # }
1140 root 1.1 }
1141    
1142 root 1.19 print "adding $pm (original size $size, stored size ", length $src, ")\n"
1143 root 1.1 if $VERBOSE >= 2;
1144    
1145     push @index, ((length $pm) << 25) | length $data;
1146     $data .= $pm . $src;
1147     }
1148    
1149     length $data < 2**25
1150 root 1.19 or die "ERROR: bundle too large (only 32MB supported)\n";
1151 root 1.1
1152     my $varpfx = "bundle_" . substr +(Digest::MD5::md5_hex $data), 0, 16;
1153    
1154     #############################################################################
1155     # output
1156    
1157 root 1.19 print "generating $PREFIX.h... "
1158     if $VERBOSE >= 1;
1159 root 1.1
1160     {
1161     open my $fh, ">", "$PREFIX.h"
1162     or die "$PREFIX.h: $!\n";
1163    
1164     print $fh <<EOF;
1165     /* do not edit, automatically created by mkstaticbundle */
1166 root 1.8
1167 root 1.1 #include <EXTERN.h>
1168     #include <perl.h>
1169     #include <XSUB.h>
1170    
1171     /* public API */
1172     EXTERN_C PerlInterpreter *staticperl;
1173 root 1.7 EXTERN_C void staticperl_xs_init (pTHX);
1174 root 1.1 EXTERN_C void staticperl_init (void);
1175     EXTERN_C void staticperl_cleanup (void);
1176 root 1.8
1177 root 1.1 EOF
1178     }
1179    
1180 root 1.19 print "\n"
1181     if $VERBOSE >= 1;
1182 root 1.1
1183     #############################################################################
1184     # output
1185    
1186 root 1.19 print "generating $PREFIX.c... "
1187     if $VERBOSE >= 1;
1188 root 1.1
1189     open my $fh, ">", "$PREFIX.c"
1190     or die "$PREFIX.c: $!\n";
1191    
1192     print $fh <<EOF;
1193     /* do not edit, automatically created by mkstaticbundle */
1194    
1195     #include "bundle.h"
1196    
1197     /* public API */
1198     PerlInterpreter *staticperl;
1199    
1200     EOF
1201    
1202     #############################################################################
1203     # bundle data
1204    
1205     my $count = @index;
1206    
1207     print $fh <<EOF;
1208     #include "bundle.h"
1209    
1210     /* bundle data */
1211    
1212     static const U32 $varpfx\_count = $count;
1213     static const U32 $varpfx\_index [$count + 1] = {
1214     EOF
1215    
1216     my $col;
1217     for (@index) {
1218     printf $fh "0x%08x,", $_;
1219     print $fh "\n" unless ++$col % 10;
1220    
1221     }
1222     printf $fh "0x%08x\n};\n", (length $data);
1223    
1224     print $fh "static const char $varpfx\_data [] =\n";
1225     dump_string $fh, $data;
1226    
1227 root 1.19 print $fh ";\n\n";
1228 root 1.1
1229     #############################################################################
1230     # bootstrap
1231    
1232     # boot file for staticperl
1233     # this file will be eval'ed at initialisation time
1234    
1235     my $bootstrap = '
1236     BEGIN {
1237     package ' . $PACKAGE . ';
1238    
1239     PerlIO::scalar->bootstrap;
1240    
1241     @INC = sub {
1242     my $data = find "$_[1]"
1243     or return;
1244    
1245     $INC{$_[1]} = $_[1];
1246    
1247     open my $fh, "<", \$data;
1248     $fh
1249     };
1250     }
1251     ';
1252    
1253     $bootstrap .= "require '//boot';"
1254     if exists $pm{"//boot"};
1255    
1256     $bootstrap =~ s/\s+/ /g;
1257     $bootstrap =~ s/(\W) /$1/g;
1258     $bootstrap =~ s/ (\W)/$1/g;
1259    
1260     print $fh "const char bootstrap [] = ";
1261     dump_string $fh, $bootstrap;
1262     print $fh ";\n\n";
1263    
1264     print $fh <<EOF;
1265     /* search all bundles for the given file, using binary search */
1266     XS(find)
1267     {
1268     dXSARGS;
1269    
1270     if (items != 1)
1271     Perl_croak (aTHX_ "Usage: $PACKAGE\::find (\$path)");
1272    
1273     {
1274     STRLEN namelen;
1275     char *name = SvPV (ST (0), namelen);
1276     SV *res = 0;
1277    
1278     int l = 0, r = $varpfx\_count;
1279    
1280     while (l <= r)
1281     {
1282     int m = (l + r) >> 1;
1283     U32 idx = $varpfx\_index [m];
1284     int comp = namelen - (idx >> 25);
1285    
1286     if (!comp)
1287     {
1288     int ofs = idx & 0x1FFFFFFU;
1289     comp = memcmp (name, $varpfx\_data + ofs, namelen);
1290    
1291     if (!comp)
1292     {
1293     /* found */
1294     int ofs2 = $varpfx\_index [m + 1] & 0x1FFFFFFU;
1295    
1296     ofs += namelen;
1297     res = newSVpvn ($varpfx\_data + ofs, ofs2 - ofs);
1298     goto found;
1299     }
1300     }
1301    
1302     if (comp < 0)
1303     r = m - 1;
1304     else
1305     l = m + 1;
1306     }
1307    
1308     XSRETURN (0);
1309    
1310     found:
1311     ST (0) = res;
1312     sv_2mortal (ST (0));
1313     }
1314    
1315     XSRETURN (1);
1316     }
1317    
1318     /* list all files in the bundle */
1319     XS(list)
1320     {
1321     dXSARGS;
1322    
1323     if (items != 0)
1324     Perl_croak (aTHX_ "Usage: $PACKAGE\::list");
1325    
1326     {
1327     int i;
1328    
1329     EXTEND (SP, $varpfx\_count);
1330    
1331     for (i = 0; i < $varpfx\_count; ++i)
1332     {
1333     U32 idx = $varpfx\_index [i];
1334    
1335     PUSHs (newSVpvn ($varpfx\_data + (idx & 0x1FFFFFFU), idx >> 25));
1336     }
1337     }
1338    
1339     XSRETURN ($varpfx\_count);
1340     }
1341    
1342     EOF
1343    
1344     #############################################################################
1345     # xs_init
1346    
1347     print $fh <<EOF;
1348 root 1.7 void
1349     staticperl_xs_init (pTHX)
1350 root 1.1 {
1351     EOF
1352    
1353     @static_ext = ("DynaLoader", sort @static_ext);
1354    
1355     # prototypes
1356     for (@static_ext) {
1357     s/\.pm$//;
1358     (my $cname = $_) =~ s/\//__/g;
1359     print $fh " EXTERN_C void boot_$cname (pTHX_ CV* cv);\n";
1360     }
1361    
1362     print $fh <<EOF;
1363     char *file = __FILE__;
1364     dXSUB_SYS;
1365    
1366     newXSproto ("$PACKAGE\::find", find, file, "\$");
1367     newXSproto ("$PACKAGE\::list", list, file, "");
1368     EOF
1369    
1370     # calls
1371     for (@static_ext) {
1372     s/\.pm$//;
1373    
1374     (my $cname = $_) =~ s/\//__/g;
1375     (my $pname = $_) =~ s/\//::/g;
1376    
1377     my $bootstrap = $pname eq "DynaLoader" ? "boot" : "bootstrap";
1378    
1379     print $fh " newXS (\"$pname\::$bootstrap\", boot_$cname, file);\n";
1380     }
1381    
1382     print $fh <<EOF;
1383     Perl_av_create_and_unshift_one (&PL_preambleav, newSVpv (bootstrap, sizeof (bootstrap) - 1));
1384     }
1385     EOF
1386    
1387     #############################################################################
1388     # optional perl_init/perl_destroy
1389    
1390 root 1.17 if ($APP) {
1391     print $fh <<EOF;
1392    
1393     int
1394     main (int argc, char *argv [])
1395     {
1396     extern char **environ;
1397     int exitstatus;
1398    
1399     static char *args[] = {
1400     "staticperl",
1401     "-e",
1402     "0"
1403     };
1404    
1405     PERL_SYS_INIT3 (&argc, &argv, &environ);
1406     staticperl = perl_alloc ();
1407     perl_construct (staticperl);
1408    
1409     PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
1410    
1411     exitstatus = perl_parse (staticperl, staticperl_xs_init, sizeof (args) / sizeof (*args), args, environ);
1412     if (!exitstatus)
1413     perl_run (staticperl);
1414    
1415     exitstatus = perl_destruct (staticperl);
1416     perl_free (staticperl);
1417     PERL_SYS_TERM ();
1418    
1419     return exitstatus;
1420     }
1421     EOF
1422     } elsif ($PERL) {
1423 root 1.1 print $fh <<EOF;
1424    
1425     int
1426     main (int argc, char *argv [])
1427     {
1428     extern char **environ;
1429     int exitstatus;
1430    
1431     PERL_SYS_INIT3 (&argc, &argv, &environ);
1432     staticperl = perl_alloc ();
1433     perl_construct (staticperl);
1434    
1435     PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
1436    
1437 root 1.7 exitstatus = perl_parse (staticperl, staticperl_xs_init, argc, argv, environ);
1438 root 1.1 if (!exitstatus)
1439     perl_run (staticperl);
1440    
1441     exitstatus = perl_destruct (staticperl);
1442     perl_free (staticperl);
1443     PERL_SYS_TERM ();
1444    
1445     return exitstatus;
1446     }
1447     EOF
1448     } else {
1449     print $fh <<EOF;
1450    
1451     EXTERN_C void
1452     staticperl_init (void)
1453     {
1454     extern char **environ;
1455     int argc = sizeof (args) / sizeof (args [0]);
1456     char **argv = args;
1457    
1458 root 1.17 static char *args[] = {
1459     "staticperl",
1460     "-e",
1461     "0"
1462     };
1463    
1464 root 1.1 PERL_SYS_INIT3 (&argc, &argv, &environ);
1465     staticperl = perl_alloc ();
1466     perl_construct (staticperl);
1467     PL_origalen = 1;
1468     PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
1469 root 1.7 perl_parse (staticperl, staticperl_xs_init, argc, argv, environ);
1470 root 1.1
1471     perl_run (staticperl);
1472     }
1473    
1474     EXTERN_C void
1475     staticperl_cleanup (void)
1476     {
1477     perl_destruct (staticperl);
1478     perl_free (staticperl);
1479     staticperl = 0;
1480     PERL_SYS_TERM ();
1481     }
1482     EOF
1483     }
1484    
1485 root 1.19 print -s "$PREFIX.c", " octets (", (length $data) , " data octets).\n\n"
1486     if $VERBOSE >= 1;
1487 root 1.1
1488     #############################################################################
1489     # libs, cflags
1490    
1491     {
1492 root 1.19 print "generating $PREFIX.ccopts... "
1493     if $VERBOSE >= 1;
1494 root 1.1
1495     my $str = "$Config{ccflags} $Config{optimize} $Config{cppflags} -I$Config{archlibexp}/CORE";
1496     $str =~ s/([\(\)])/\\$1/g;
1497    
1498     open my $fh, ">$PREFIX.ccopts"
1499     or die "$PREFIX.ccopts: $!";
1500     print $fh $str;
1501 root 1.19
1502     print "$str\n\n"
1503     if $VERBOSE >= 1;
1504 root 1.1 }
1505    
1506     {
1507     print "generating $PREFIX.ldopts... ";
1508    
1509 root 1.18 my $str = $STATIC ? "-static " : "";
1510 root 1.1
1511     $str .= "$Config{ccdlflags} $Config{ldflags} @libs $Config{archlibexp}/CORE/$Config{libperl} $Config{perllibs}";
1512    
1513     my %seen;
1514     $str .= " $_" for grep !$seen{$_}++, ($extralibs =~ /(\S+)/g);
1515    
1516 root 1.18 for (@staticlibs) {
1517     $str =~ s/(^|\s) (-l\Q$_\E) ($|\s)/$1-Wl,-Bstatic $2 -Wl,-Bdynamic$3/gx;
1518     }
1519    
1520 root 1.1 $str =~ s/([\(\)])/\\$1/g;
1521    
1522     open my $fh, ">$PREFIX.ldopts"
1523     or die "$PREFIX.ldopts: $!";
1524     print $fh $str;
1525 root 1.19
1526     print "$str\n\n"
1527     if $VERBOSE >= 1;
1528 root 1.1 }
1529    
1530 root 1.17 if ($PERL or defined $APP) {
1531     $APP = "perl" unless defined $APP;
1532    
1533 root 1.19 print "building $APP...\n"
1534     if $VERBOSE >= 1;
1535 root 1.17
1536     system "$Config{cc} \$(cat bundle.ccopts\) -o \Q$APP\E bundle.c \$(cat bundle.ldopts\)";
1537 root 1.1
1538 root 1.19 unlink "$PREFIX.$_"
1539     for qw(ccopts ldopts c h);
1540 root 1.18
1541 root 1.19 print "\n"
1542     if $VERBOSE >= 1;
1543 root 1.1 }
1544    
1545     MKBUNDLE
1546     }
1547    
1548     bundle() {
1549     catmkbundle >"$MKBUNDLE~" || fatal "$MKBUNDLE~: cannot create"
1550     chmod 755 "$MKBUNDLE~" && mv "$MKBUNDLE~" "$MKBUNDLE"
1551 root 1.18 CACHE="$STATICPERL/cache"
1552     mkdir -p "$CACHE"
1553     "$PERL_PREFIX/bin/perl" -- "$MKBUNDLE" --cache "$CACHE" "$@"
1554 root 1.1 }
1555    
1556     if [ $# -gt 0 ]; then
1557     while [ $# -gt 0 ]; do
1558     mkdir -p "$STATICPERL" || fatal "$STATICPERL: cannot create"
1559 root 1.10 mkdir -p "$PERL_PREFIX" || fatal "$PERL_PREFIX: cannot create"
1560 root 1.1
1561     command="${1#--}"; shift
1562     case "$command" in
1563 root 1.19 version )
1564     echo "staticperl version $VERSION"
1565     ;;
1566 root 1.28 fetch | configure | build | install | clean | realclean | distclean)
1567 root 1.27 ( "$command" ) || exit
1568 root 1.1 ;;
1569     instsrc )
1570 root 1.27 ( instsrc "$@" ) || exit
1571 root 1.1 exit
1572     ;;
1573     instcpan )
1574 root 1.27 ( instcpan "$@" ) || exit
1575 root 1.1 exit
1576     ;;
1577     cpan )
1578 root 1.27 ( install ) || exit
1579 root 1.10 "$PERL_PREFIX/bin/cpan" "$@"
1580 root 1.1 exit
1581     ;;
1582     mkbundle )
1583 root 1.27 ( install ) || exit
1584 root 1.1 bundle "$@"
1585     exit
1586     ;;
1587     mkperl )
1588 root 1.27 ( install ) || exit
1589 root 1.1 bundle --perl "$@"
1590     exit
1591     ;;
1592 root 1.17 mkapp )
1593 root 1.27 ( install ) || exit
1594 root 1.17 bundle --app "$@"
1595     exit
1596     ;;
1597 root 1.1 help )
1598     podusage 2
1599     ;;
1600     * )
1601     exec 1>&2
1602     echo
1603     echo "Unknown command: $command"
1604     podusage 0
1605     ;;
1606     esac
1607     done
1608     else
1609     usage
1610     fi
1611    
1612     exit 0
1613    
1614     =head1 NAME
1615    
1616 root 1.7 staticperl - perl, libc, 100 modules, all in one 500kb file
1617 root 1.1
1618     =head1 SYNOPSIS
1619    
1620     staticperl help # print the embedded documentation
1621     staticperl fetch # fetch and unpack perl sources
1622     staticperl configure # fetch and then configure perl
1623     staticperl build # configure and then build perl
1624     staticperl install # build and then install perl
1625     staticperl clean # clean most intermediate files (restart at configure)
1626     staticperl distclean # delete everything installed by this script
1627     staticperl cpan # invoke CPAN shell
1628     staticperl instmod path... # install unpacked modules
1629     staticperl instcpan modulename... # install modules from CPAN
1630     staticperl mkbundle <bundle-args...> # see documentation
1631     staticperl mkperl <bundle-args...> # see documentation
1632 root 1.17 staticperl mkapp appname <bundle-args...> # see documentation
1633 root 1.1
1634     Typical Examples:
1635    
1636     staticperl install # fetch, configure, build and install perl
1637     staticperl cpan # run interactive cpan shell
1638     staticperl mkperl -M '"Config_heavy.pl"' # build a perl that supports -V
1639     staticperl mkperl -MAnyEvent::Impl::Perl -MAnyEvent::HTTPD -MURI -MURI::http
1640     # build a perl with the above modules linked in
1641 root 1.17 staticperl mkapp myapp --boot mainprog mymodules
1642     # build a binary "myapp" from mainprog and mymodules
1643 root 1.1
1644     =head1 DESCRIPTION
1645    
1646 root 1.18 This script helps you to create single-file perl interpreters
1647     or applications, or embedding a perl interpreter in your
1648     applications. Single-file means that it is fully self-contained - no
1649     separate shared objects, no autoload fragments, no .pm or .pl files are
1650     needed. And when linking statically, you can create (or embed) a single
1651     file that contains perl interpreter, libc, all the modules you need, all
1652     the libraries you need and of course your actual program.
1653 root 1.1
1654 root 1.7 With F<uClibc> and F<upx> on x86, you can create a single 500kb binary
1655     that contains perl and 100 modules such as POSIX, AnyEvent, EV, IO::AIO,
1656     Coro and so on. Or any other choice of modules.
1657 root 1.1
1658 root 1.19 To see how this turns out, you can try out smallperl and bigperl, two
1659     pre-built static and compressed perl binaries with many and even more
1660     modules: just follow the links at L<http://staticperl.schmorp.de/>.
1661    
1662 root 1.4 The created files do not need write access to the file system (like PAR
1663 root 1.1 does). In fact, since this script is in many ways similar to PAR::Packer,
1664     here are the differences:
1665    
1666     =over 4
1667    
1668     =item * The generated executables are much smaller than PAR created ones.
1669    
1670     Shared objects and the perl binary contain a lot of extra info, while
1671     the static nature of F<staticperl> allows the linker to remove all
1672     functionality and meta-info not required by the final executable. Even
1673     extensions statically compiled into perl at build time will only be
1674     present in the final executable when needed.
1675    
1676     In addition, F<staticperl> can strip perl sources much more effectively
1677     than PAR.
1678    
1679     =item * The generated executables start much faster.
1680    
1681     There is no need to unpack files, or even to parse Zip archives (which is
1682     slow and memory-consuming business).
1683    
1684     =item * The generated executables don't need a writable filesystem.
1685    
1686     F<staticperl> loads all required files directly from memory. There is no
1687     need to unpack files into a temporary directory.
1688    
1689 root 1.18 =item * More control over included files, more burden.
1690 root 1.1
1691 root 1.4 PAR tries to be maintenance and hassle-free - it tries to include more
1692 root 1.18 files than necessary to make sure everything works out of the box. It
1693     mostly succeeds at this, but he extra files (such as the unicode database)
1694     can take substantial amounts of memory and file size.
1695 root 1.1
1696     With F<staticperl>, the burden is mostly with the developer - only direct
1697     compile-time dependencies and L<AutoLoader> are handled automatically.
1698     This means the modules to include often need to be tweaked manually.
1699    
1700 root 1.18 All this does not preclude more permissive modes to be implemented in
1701     the future, but right now, you have to resolve state hidden dependencies
1702     manually.
1703    
1704 root 1.1 =item * PAR works out of the box, F<staticperl> does not.
1705    
1706     Maintaining your own custom perl build can be a pain in the ass, and while
1707     F<staticperl> tries to make this easy, it still requires a custom perl
1708     build and possibly fiddling with some modules. PAR is likely to produce
1709     results faster.
1710    
1711 root 1.13 Ok, PAR never has worked for me out of the box, and for some people,
1712     F<staticperl> does work out of the box, as they don't count "fiddling with
1713     module use lists" against it, but nevertheless, F<staticperl> is certainly
1714     a bit more difficult to use.
1715    
1716 root 1.1 =back
1717    
1718     =head1 HOW DOES IT WORK?
1719    
1720     Simple: F<staticperl> downloads, compile and installs a perl version of
1721     your choice in F<~/.staticperl>. You can add extra modules either by
1722     letting F<staticperl> install them for you automatically, or by using CPAN
1723     and doing it interactively. This usually takes 5-10 minutes, depending on
1724 root 1.4 the speed of your computer and your internet connection.
1725 root 1.1
1726     It is possible to do program development at this stage, too.
1727    
1728     Afterwards, you create a list of files and modules you want to include,
1729 root 1.4 and then either build a new perl binary (that acts just like a normal perl
1730 root 1.1 except everything is compiled in), or you create bundle files (basically C
1731     sources you can use to embed all files into your project).
1732    
1733 root 1.18 This step is very fast (a few seconds if PPI is not used for stripping, or
1734     the stripped files are in the cache), and can be tweaked and repeated as
1735     often as necessary.
1736 root 1.1
1737     =head1 THE F<STATICPERL> SCRIPT
1738    
1739     This module installs a script called F<staticperl> into your perl
1740 root 1.22 binary directory. The script is fully self-contained, and can be
1741     used without perl (for example, in an uClibc chroot environment). In
1742     fact, it can be extracted from the C<App::Staticperl> distribution
1743     tarball as F<bin/staticperl>, without any installation. The
1744     newest (possibly alpha) version can also be downloaded from
1745     L<http://staticperl.schmorp.de/staticperl>.
1746 root 1.1
1747     F<staticperl> interprets the first argument as a command to execute,
1748     optionally followed by any parameters.
1749    
1750     There are two command categories: the "phase 1" commands which deal with
1751     installing perl and perl modules, and the "phase 2" commands, which deal
1752     with creating binaries and bundle files.
1753    
1754     =head2 PHASE 1 COMMANDS: INSTALLING PERL
1755    
1756     The most important command is F<install>, which does basically
1757     everything. The default is to download and install perl 5.12.2 and a few
1758     modules required by F<staticperl> itself, but all this can (and should) be
1759     changed - see L<CONFIGURATION>, below.
1760    
1761     The command
1762    
1763     staticperl install
1764    
1765 root 1.27 is normally all you need: It installs the perl interpreter in
1766 root 1.1 F<~/.staticperl/perl>. It downloads, configures, builds and installs the
1767     perl interpreter if required.
1768    
1769 root 1.27 Most of the following F<staticperl> subcommands simply run one or more
1770     steps of this sequence.
1771    
1772     If it fails, then most commonly because the compiler options I selected
1773     are not supported by your compiler - either edit the F<staticperl> script
1774     yourself or create F<~/.staticperl> shell script where your set working
1775     C<PERL_CCFLAGS> etc. variables.
1776 root 1.1
1777 root 1.4 To force recompilation or reinstallation, you need to run F<staticperl
1778 root 1.1 distclean> first.
1779    
1780     =over 4
1781    
1782 root 1.19 =item F<staticperl version>
1783    
1784     Prints some info about the version of the F<staticperl> script you are using.
1785    
1786 root 1.1 =item F<staticperl fetch>
1787    
1788     Runs only the download and unpack phase, unless this has already happened.
1789    
1790     =item F<staticperl configure>
1791    
1792     Configures the unpacked perl sources, potentially after downloading them first.
1793    
1794     =item F<staticperl build>
1795    
1796     Builds the configured perl sources, potentially after automatically
1797     configuring them.
1798    
1799     =item F<staticperl install>
1800    
1801 root 1.4 Wipes the perl installation directory (usually F<~/.staticperl/perl>) and
1802     installs the perl distribution, potentially after building it first.
1803 root 1.1
1804     =item F<staticperl cpan> [args...]
1805    
1806 root 1.4 Starts an interactive CPAN shell that you can use to install further
1807     modules. Installs the perl first if necessary, but apart from that,
1808 root 1.1 no magic is involved: you could just as well run it manually via
1809     F<~/.staticperl/perl/bin/cpan>.
1810    
1811     Any additional arguments are simply passed to the F<cpan> command.
1812    
1813     =item F<staticperl instcpan> module...
1814    
1815     Tries to install all the modules given and their dependencies, using CPAN.
1816    
1817     Example:
1818    
1819     staticperl instcpan EV AnyEvent::HTTPD Coro
1820    
1821     =item F<staticperl instsrc> directory...
1822    
1823     In the unlikely case that you have unpacked perl modules around and want
1824 root 1.4 to install from these instead of from CPAN, you can do this using this
1825 root 1.1 command by specifying all the directories with modules in them that you
1826     want to have built.
1827    
1828     =item F<staticperl clean>
1829    
1830 root 1.11 Deletes the perl source directory (and potentially cleans up other
1831     intermediate files). This can be used to clean up files only needed for
1832 root 1.27 building perl, without removing the installed perl interpreter.
1833 root 1.11
1834     At the moment, it doesn't delete downloaded tarballs.
1835 root 1.1
1836 root 1.27 The exact semantics of this command will probably change.
1837    
1838 root 1.1 =item F<staticperl distclean>
1839    
1840     This wipes your complete F<~/.staticperl> directory. Be careful with this,
1841     it nukes your perl download, perl sources, perl distribution and any
1842     installed modules. It is useful if you wish to start over "from scratch"
1843     or when you want to uninstall F<staticperl>.
1844    
1845     =back
1846    
1847     =head2 PHASE 2 COMMANDS: BUILDING PERL BUNDLES
1848    
1849     Building (linking) a new F<perl> binary is handled by a separate
1850     script. To make it easy to use F<staticperl> from a F<chroot>, the script
1851     is embedded into F<staticperl>, which will write it out and call for you
1852     with any arguments you pass:
1853    
1854     staticperl mkbundle mkbundle-args...
1855    
1856     In the oh so unlikely case of something not working here, you
1857 root 1.2 can run the script manually as well (by default it is written to
1858 root 1.1 F<~/.staticperl/mkbundle>).
1859    
1860     F<mkbundle> is a more conventional command and expect the argument
1861 root 1.4 syntax commonly used on UNIX clones. For example, this command builds
1862 root 1.1 a new F<perl> binary and includes F<Config.pm> (for F<perl -V>),
1863     F<AnyEvent::HTTPD>, F<URI> and a custom F<httpd> script (from F<eg/httpd>
1864     in this distribution):
1865    
1866     # first make sure we have perl and the required modules
1867     staticperl instcpan AnyEvent::HTTPD
1868    
1869     # now build the perl
1870     staticperl mkperl -M'"Config_heavy.pl"' -MAnyEvent::Impl::Perl \
1871     -MAnyEvent::HTTPD -MURI::http \
1872     --add 'eg/httpd httpd.pm'
1873    
1874     # finally, invoke it
1875     ./perl -Mhttpd
1876    
1877 root 1.2 As you can see, things are not quite as trivial: the L<Config> module has
1878     a hidden dependency which is not even a perl module (F<Config_heavy.pl>),
1879     L<AnyEvent> needs at least one event loop backend that we have to
1880 root 1.4 specify manually (here L<AnyEvent::Impl::Perl>), and the F<URI> module
1881 root 1.2 (required by L<AnyEvent::HTTPD>) implements various URI schemes as extra
1882     modules - since L<AnyEvent::HTTPD> only needs C<http> URIs, we only need
1883 root 1.4 to include that module. I found out about these dependencies by carefully
1884     watching any error messages about missing modules...
1885 root 1.2
1886 root 1.17 Instead of building a new perl binary, you can also build a standalone
1887     application:
1888    
1889     # build the app
1890     staticperl mkapp app --boot eg/httpd \
1891     -MAnyEvent::Impl::Perl -MAnyEvent::HTTPD -MURI::http
1892    
1893     # run it
1894     ./app
1895    
1896 root 1.29 Here are the three phase 2 commands:
1897    
1898     =over 4
1899    
1900     =item F<staticperl mkbundle> args...
1901    
1902     The "default" bundle command - it interprets the given bundle options and
1903     writes out F<bundle.h>, F<bundle.c>, F<bundle.ccopts> and F<bundle.ldopts>
1904     files, useful for embedding.
1905    
1906     =item F<staticperl mkperl> args...
1907    
1908     Creates a bundle just like F<staticperl mkbundle> (in fact, it's the same
1909     as invoking F<staticperl mkbundle --perl> args...), but then compiles and
1910     links a new perl interpreter that embeds the created bundle, then deletes
1911     all intermediate files.
1912    
1913     =item F<staticperl mkapp> filename args...
1914    
1915     Does the same as F<staticperl mkbundle> (in fact, it's the same as
1916     invoking F<staticperl mkbundle --app> filename args...), but then compiles
1917     and links a new standalone application that simply initialises the perl
1918     interpreter.
1919    
1920     The difference to F<staticperl mkperl> is that the standalone application
1921     does not act like a perl interpreter would - in fact, by default it would
1922     just do nothing and exit immediately, so you should specify some code to
1923     be executed via the F<--boot> option.
1924    
1925     =back
1926    
1927 root 1.2 =head3 OPTION PROCESSING
1928    
1929 root 1.4 All options can be given as arguments on the command line (typically
1930     using long (e.g. C<--verbose>) or short option (e.g. C<-v>) style). Since
1931 root 1.30 specifying a lot of options can make the command line very long and
1932     unwieldy, you can put all long options into a "bundle specification file"
1933     (one option per line, with or without C<--> prefix) and specify this
1934     bundle file instead.
1935 root 1.2
1936 root 1.30 For example, the command given earlier to link a new F<perl> could also
1937     look like this:
1938 root 1.2
1939     staticperl mkperl httpd.bundle
1940    
1941 root 1.30 With all options stored in the F<httpd.bundle> file (one option per line,
1942     everything after the option is an argument):
1943    
1944 root 1.2 use "Config_heavy.pl"
1945     use AnyEvent::Impl::Perl
1946     use AnyEvent::HTTPD
1947     use URI::http
1948     add eg/httpd httpd.pm
1949    
1950     All options that specify modules or files to be added are processed in the
1951 root 1.29 order given on the command line.
1952 root 1.19
1953 root 1.30 =head3 BUNDLE CREATION WORKFLOW / STATICPELR MKBUNDLE OPTIONS
1954 root 1.19
1955 root 1.29 F<staticperl mkbundle> works by first assembling a list of candidate
1956     files and modules to include, then filtering them by include/exclude
1957 root 1.30 patterns. The remaining modules (together with their direct dependencies,
1958     such as link libraries and L<AutoLoader> files) are then converted into
1959     bundle files suitable for embedding. F<staticperl mkbundle> can then
1960     optionally build a new perl interpreter or a standalone application.
1961 root 1.19
1962     =over 4
1963    
1964 root 1.29 =item Step 0: Generic argument processing.
1965 root 1.19
1966 root 1.29 The following options influence F<staticperl mkbundle> itself.
1967 root 1.2
1968     =over 4
1969    
1970 root 1.30 =item C<--verbose> | C<-v>
1971 root 1.2
1972     Increases the verbosity level by one (the default is C<1>).
1973    
1974 root 1.30 =item C<--quiet> | C<-q>
1975 root 1.2
1976     Decreases the verbosity level by one.
1977    
1978 root 1.29 =item any other argument
1979 root 1.2
1980 root 1.29 Any other argument is interpreted as a bundle specification file, which
1981 root 1.30 supports all options (without extra quoting), one option per line, in the
1982     format C<option> or C<option argument>. They will effectively be expanded
1983     and processed as if they were directly written on the command line, in
1984     place of the file name.
1985 root 1.2
1986 root 1.29 =back
1987 root 1.2
1988 root 1.29 =item Step 1: gather candidate files and modules
1989 root 1.2
1990 root 1.29 In this step, modules, perl libraries (F<.pl> files) and other files are
1991     selected for inclusion in the bundle. The relevant options are executed
1992     in order (this makes a difference mostly for C<--eval>, which can rely on
1993     earlier C<--use> options to have been executed).
1994 root 1.2
1995 root 1.29 =over 4
1996 root 1.2
1997 root 1.29 =item C<--use> F<module> | C<-M>F<module>
1998 root 1.17
1999 root 1.29 Include the named module and trace direct dependencies. This is done by
2000 root 1.2 C<require>'ing the module in a subprocess and tracing which other modules
2001 root 1.29 and files it actually loads.
2002 root 1.2
2003     Example: include AnyEvent and AnyEvent::Impl::Perl.
2004    
2005     staticperl mkbundle --use AnyEvent --use AnyEvent::Impl::Perl
2006    
2007 root 1.30 Sometimes you want to load old-style "perl libraries" (F<.pl> files),
2008     or maybe other weirdly named files. To do that, you need to quote
2009     the name in single or double quotes (this is because F<staticperl>
2010     I<literally> just adds the string after the C<require> - which acts
2011     different when confronted with quoted vs. unquoted strings). When given on
2012     the command line, you probably need to quote once more to avoid your shell
2013     interpreting it. Common cases that need this are F<Config_heavy.pl> and
2014     F<utf8_heavy.pl>.
2015 root 1.2
2016     Example: include the required files for F<perl -V> to work in all its
2017     glory (F<Config.pm> is included automatically by this).
2018    
2019     # bourne shell
2020     staticperl mkbundle --use '"Config_heavy.pl"'
2021    
2022     # bundle specification file
2023     use "Config_heavy.pl"
2024    
2025 root 1.30 The C<-M>module syntax is included as a convenience that might be easier
2026     to remember than C<--use> - it's the same switch as perl itself uses
2027     to load modules. Or maybe it confuses people. Time will tell. Or maybe
2028     not. Sigh.
2029 root 1.2
2030 root 1.29 =item C<--eval> "perl code" | C<-e> "perl code"
2031 root 1.2
2032     Sometimes it is easier (or necessary) to specify dependencies using perl
2033     code, or maybe one of the modules you use need a special use statement. In
2034 root 1.29 that case, you can use C<--eval> to execute some perl snippet or set some
2035     variables or whatever you need. All files C<require>'d or C<use>'d while
2036     executing the snippet are included in the final bundle.
2037 root 1.2
2038     Keep in mind that F<mkbundle> will only C<require> the modules named
2039     by the C<--use> option, so do not expect the symbols from modules you
2040 root 1.4 C<--use>'d earlier on the command line to be available.
2041 root 1.2
2042     Example: force L<AnyEvent> to detect a backend and therefore include it
2043     in the final bundle.
2044    
2045     staticperl mkbundle --eval 'use AnyEvent; AnyEvent::detect'
2046    
2047     # or like this
2048 root 1.29 staticperl mkbundle -MAnyEvent --eval 'AnyEvent::detect'
2049 root 1.2
2050     Example: use a separate "bootstrap" script that C<use>'s lots of modules
2051 root 1.29 and also include this in the final bundle, to be executed automatically
2052     when the interpreter is initialised.
2053 root 1.2
2054     staticperl mkbundle --eval 'do "bootstrap"' --boot bootstrap
2055    
2056 root 1.29 =item C<--boot> F<filename>
2057    
2058     Include the given file in the bundle and arrange for it to be
2059     executed (using C<require>) before the main program when the new perl
2060     is initialised. This can be used to modify C<@INC> or do similar
2061     modifications before the perl interpreter executes scripts given on the
2062     command line (or via C<-e>). This works even in an embedded interpreter -
2063     the file will be executed during interpreter initialisation in that case.
2064    
2065     =item C<--incglob> pattern
2066    
2067     This goes through all standard library directories and tries to match any
2068     F<.pm> and F<.pl> files against the extended glob pattern (see below). If
2069     a file matches, it is added. The pattern is matched against the full path
2070     of the file (sans the library directory prefix), e.g. F<Sys/Syslog.pm>.
2071    
2072     This is very useful to include "everything":
2073    
2074     --incglob '*'
2075    
2076     It is also useful for including perl libraries, or trees of those, such as
2077 root 1.30 the unicode database files needed by some perl built-ins, the regex engine
2078 root 1.29 and other modules.
2079    
2080     --incglob '/unicore/**.pl'
2081    
2082     =item C<--add> F<file> | C<--add> "F<file> alias"
2083    
2084     Adds the given (perl) file into the bundle (and optionally call it
2085     "alias"). The F<file> is either an absolute path or a path relative to
2086     the current directory. If an alias is specified, then this is the name it
2087 root 1.30 will use for C<@INC> searches, otherwise the F<file> will be used as the
2088 root 1.29 internal name.
2089    
2090     This switch is used to include extra files into the bundle.
2091    
2092     Example: embed the file F<httpd> in the current directory as F<httpd.pm>
2093     when creating the bundle.
2094    
2095     staticperl mkperl --add "httpd httpd.pm"
2096    
2097     Example: add local files as extra modules in the bundle.
2098    
2099     # specification file
2100     add file1 myfiles/file1.pm
2101     add file2 myfiles/file2.pm
2102     add file3 myfiles/file3.pl
2103    
2104     # then later, in perl, use
2105     use myfiles::file1;
2106     require myfiles::file2;
2107     my $res = do "myfiles/file3.pl";
2108    
2109     =item C<--binadd> F<file> | C<--add> "F<file> alias"
2110    
2111     Just like C<--add>, except that it treats the file as binary and adds it
2112     without any postprocessing (perl files might get stripped to reduce their
2113     size).
2114    
2115     You should probably add a C</> prefix to avoid clashing with embedded perl
2116     files (whose paths do not start with C</>), and/or use a special directory
2117     prefix, such as C</res/name>.
2118    
2119     You can later get a copy of these files by calling C<staticperl::find
2120     "alias">.
2121    
2122     An alternative way to embed binary files is to convert them to perl and
2123     use C<do> to get the contents - this method is a bit cumbersome, but works
2124     both inside and outside of a staticperl bundle:
2125    
2126     # a "binary" file, call it "bindata.pl"
2127     <<'SOME_MARKER'
2128     binary data NOT containing SOME_MARKER
2129     SOME_MARKER
2130    
2131     # load the binary
2132     chomp (my $data = do "bindata.pl");
2133    
2134     =back
2135    
2136     =item Step 2: filter all files using C<--include> and C<--exclude> options.
2137    
2138     After all candidate files and modules are added, they are I<filtered>
2139     by a combination of C<--include> and C<--exclude> patterns (there is an
2140 root 1.30 implicit C<--include *> at the end, so if no filters are specified, all
2141 root 1.29 files are included).
2142    
2143     All that this step does is potentially reduce the number of files that are
2144     to be included - no new files are added during this step.
2145    
2146     =over 4
2147    
2148     =item C<--include> pattern | C<-i> pattern | C<--exclude> pattern | C<-x> pattern
2149    
2150     These specify an include or exclude pattern to be applied to the candidate
2151     file list. An include makes sure that the given files will be part of the
2152     resulting file set, an exclude will exclude remaining files. The patterns
2153     are "extended glob patterns" (see below).
2154    
2155     The patterns are applied "in order" - files included via earlier
2156     C<--include> specifications cannot be removed by any following
2157     C<--exclude>, and likewise, and file excluded by an earlier C<--exclude>
2158     cannot be added by any following C<--include>.
2159    
2160     For example, to include everything except C<Devel> modules, but still
2161     include F<Devel::PPPort>, you could use this:
2162    
2163     --incglob '*' -i '/Devel/PPPort.pm' -x '/Devel/**'
2164 root 1.2
2165 root 1.29 =back
2166    
2167     =item Step 3: add any extra or "hidden" dependencies.
2168    
2169     F<staticperl> currently knows about three extra types of depdendencies
2170     that are added automatically. Only one (F<.packlist> files) is currently
2171     optional and can be influenced, the others are always included:
2172 root 1.2
2173 root 1.29 =over 4
2174    
2175 root 1.31 =item C<--usepacklists>
2176 root 1.19
2177     Read F<.packlist> files for each distribution that happens to match a
2178     module name you specified. Sounds weird, and it is, so expect semantics to
2179     change somehow in the future.
2180    
2181     The idea is that most CPAN distributions have a F<.pm> file that matches
2182     the name of the distribution (which is rather reasonable after all).
2183    
2184     If this switch is enabled, then if any of the F<.pm> files that have been
2185     selected match an install distribution, then all F<.pm>, F<.pl>, F<.al>
2186     and F<.ix> files installed by this distribution are also included.
2187    
2188     For example, using this switch, when the L<URI> module is specified, then
2189     all L<URI> submodules that have been installed via the CPAN distribution
2190     are included as well, so you don't have to manually specify them.
2191    
2192 root 1.29 =item L<AutoLoader> splitfiles
2193    
2194     Some modules use L<AutoLoader> - less commonly (hopefully) used functions
2195     are split into separate F<.al> files, and an index (F<.ix>) file contains
2196     the prototypes.
2197    
2198     Both F<.ix> and F<.al> files will be detected automatically and added to
2199     the bundle.
2200    
2201     =item link libraries (F<.a> files)
2202    
2203     Modules using XS (or any other non-perl language extension compiled at
2204     installation time) will have a static archive (typically F<.a>). These
2205     will automatically be added to the linker options in F<bundle.ldopts>.
2206    
2207     Should F<staticperl> find a dynamic link library (typically F<.so>) it
2208     will warn about it - obviously this shouldn't happen unless you use
2209     F<staticperl> on the wrong perl, or one (probably wrongly) configured to
2210     use dynamic loading.
2211    
2212     =item extra libraries (F<extralibs.ld>)
2213 root 1.18
2214 root 1.29 Some modules need linking against external libraries - these are found in
2215     F<extralibs.ld> and added to F<bundle.ldopts>.
2216 root 1.18
2217 root 1.29 =back
2218    
2219     =item Step 4: write bundle files and optionally link a program
2220    
2221     At this point, the select files will be read, processed (stripped) and
2222     finally the bundle files get written to disk, and F<staticperl mkbundle>
2223     is normally finished. Optionally, it can go a step further and either link
2224     a new F<perl> binary with all selected modules and files inside, or build
2225     a standalone application.
2226    
2227     Both the contents of the bundle files and any extra linking is controlled
2228     by these options:
2229    
2230     =over 4
2231 root 1.18
2232 root 1.29 =item C<--strip> C<none>|C<pod>|C<ppi>
2233 root 1.18
2234 root 1.29 Specify the stripping method applied to reduce the file of the perl
2235     sources included.
2236 root 1.18
2237 root 1.29 The default is C<pod>, which uses the L<Pod::Strip> module to remove all
2238     pod documentation, which is very fast and reduces file size a lot.
2239 root 1.18
2240 root 1.29 The C<ppi> method uses L<PPI> to parse and condense the perl sources. This
2241     saves a lot more than just L<Pod::Strip>, and is generally safer,
2242     but is also a lot slower (some files take almost a minute to strip -
2243     F<staticperl> maintains a cache of stripped files to speed up subsequent
2244     runs for this reason). Note that this method doesn't optimise for raw file
2245     size, but for best compression (that means that the uncompressed file size
2246     is a bit larger, but the files compress better, e.g. with F<upx>).
2247 root 1.2
2248 root 1.29 Last not least, if you need accurate line numbers in error messages,
2249     or in the unlikely case where C<pod> is too slow, or some module gets
2250     mistreated, you can specify C<none> to not mangle included perl sources in
2251     any way.
2252 root 1.2
2253 root 1.30 =item C<--perl>
2254 root 1.2
2255 root 1.29 After writing out the bundle files, try to link a new perl interpreter. It
2256     will be called F<perl> and will be left in the current working
2257     directory. The bundle files will be removed.
2258 root 1.2
2259 root 1.29 This switch is automatically used when F<staticperl> is invoked with the
2260     C<mkperl> command instead of C<mkbundle>.
2261 root 1.2
2262 root 1.29 Example: build a new F<./perl> binary with only L<common::sense> inside -
2263     it will be even smaller than the standard perl interpreter as none of the
2264     modules of the base distribution (such as L<Fcntl>) will be included.
2265 root 1.2
2266 root 1.29 staticperl mkperl -Mcommon::sense
2267 root 1.8
2268 root 1.30 =item C<--app> F<name>
2269 root 1.8
2270 root 1.29 After writing out the bundle files, try to link a new standalone
2271     program. It will be called C<name>, and the bundle files get removed after
2272     linking it.
2273 root 1.8
2274 root 1.29 This switch is automatically used when F<staticperl> is invoked with the
2275     C<mkapp> command instead of C<mkbundle>.
2276 root 1.8
2277 root 1.29 The difference to the (mutually exclusive) C<--perl> option is that the
2278     binary created by this option will not try to act as a perl interpreter -
2279     instead it will simply initialise the perl interpreter, clean it up and
2280     exit.
2281 root 1.18
2282 root 1.29 This means that, by default, it will do nothing but burna few CPU cycles
2283     - for it to do something useful you I<must> add some boot code, e.g. with
2284     the C<--boot> option.
2285 root 1.18
2286 root 1.29 Example: create a standalone perl binary called F<./myexe> that will
2287     execute F<appfile> when it is started.
2288 root 1.18
2289 root 1.29 staticperl mkbundle --app myexe --boot appfile
2290 root 1.18
2291 root 1.30 =item C<--static>
2292 root 1.2
2293 root 1.29 Add C<-static> to F<bundle.ldopts>, which means a fully static (if
2294     supported by the OS) executable will be created. This is not immensely
2295     useful when just creating the bundle files, but is most useful when
2296     linking a binary with the C<--perl> or C<--app> options.
2297    
2298     The default is to link the new binary dynamically (that means all perl
2299     modules are linked statically, but all external libraries are still
2300 root 1.2 referenced dynamically).
2301    
2302     Keep in mind that Solaris doesn't support static linking at all, and
2303 root 1.29 systems based on GNU libc don't really support it in a very usable
2304     fashion either. Try uClibc if you want to create fully statically linked
2305     executables, or try the C<--staticlib> option to link only some libraries
2306 root 1.2 statically.
2307    
2308 root 1.30 =item C<--staticlib> libname
2309 root 1.18
2310     When not linking fully statically, this option allows you to link specific
2311 root 1.30 libraries statically. What it does is simply replace all occurrences of
2312 root 1.18 C<-llibname> with the GCC-specific C<-Wl,-Bstatic -llibname -Wl,-Bdynamic>
2313     option.
2314    
2315     This will have no effect unless the library is actually linked against,
2316     specifically, C<--staticlib> will not link against the named library
2317     unless it would be linked against anyway.
2318    
2319 root 1.30 Example: link libcrypt statically into the final binary.
2320 root 1.18
2321     staticperl mkperl -MIO::AIO --staticlib crypt
2322    
2323 root 1.29 # ldopts might now contain:
2324 root 1.18 # -lm -Wl,-Bstatic -lcrypt -Wl,-Bdynamic -lpthread
2325    
2326 root 1.29 =back
2327 root 1.2
2328     =back
2329    
2330 root 1.18 =head3 EXTENDED GLOB PATTERNS
2331    
2332     Some options of F<staticperl mkbundle> expect an I<extended glob
2333     pattern>. This is neither a normal shell glob nor a regex, but something
2334     in between. The idea has been copied from rsync, and there are the current
2335     matching rules:
2336    
2337     =over 4
2338    
2339     =item Patterns starting with F</> will be a anchored at the root of the library tree.
2340    
2341     That is, F</unicore> will match the F<unicore> directory in C<@INC>, but
2342     nothing inside, and neither any other file or directory called F<unicore>
2343     anywhere else in the hierarchy.
2344    
2345     =item Patterns not starting with F</> will be anchored at the end of the path.
2346    
2347     That is, F<idna.pl> will match any file called F<idna.pl> anywhere in the
2348     hierarchy, but not any directories of the same name.
2349    
2350 root 1.31 =item A F<*> matches anything within a single path component.
2351 root 1.18
2352     That is, F</unicore/*.pl> would match all F<.pl> files directly inside
2353     C</unicore>, not any deeper level F<.pl> files. Or in other words, F<*>
2354     will not match slashes.
2355    
2356     =item A F<**> matches anything.
2357    
2358     That is, F</unicore/**.pl> would match all F<.pl> files under F</unicore>,
2359     no matter how deeply nested they are inside subdirectories.
2360    
2361     =item A F<?> matches a single character within a component.
2362    
2363     That is, F</Encode/??.pm> matches F</Encode/JP.pm>, but not the
2364     hypothetical F</Encode/J/.pm>, as F<?> does not match F</>.
2365    
2366     =back
2367    
2368     =head2 F<STATICPERL> CONFIGURATION AND HOOKS
2369 root 1.2
2370 root 1.19 During (each) startup, F<staticperl> tries to source some shell files to
2371     allow you to fine-tune/override configuration settings.
2372    
2373     In them you can override shell variables, or define shell functions
2374     ("hooks") to be called at specific phases during installation. For
2375     example, you could define a C<postinstall> hook to install additional
2376     modules from CPAN each time you start from scratch.
2377    
2378     If the env variable C<$STATICPERLRC> is set, then F<staticperl> will try
2379     to source the file named with it only. Otherwise, it tries the following
2380     shell files in order:
2381 root 1.2
2382     /etc/staticperlrc
2383     ~/.staticperlrc
2384     $STATICPERL/rc
2385    
2386     Note that the last file is erased during F<staticperl distclean>, so
2387     generally should not be used.
2388    
2389     =head3 CONFIGURATION VARIABLES
2390    
2391     =head4 Variables you I<should> override
2392    
2393     =over 4
2394    
2395     =item C<EMAIL>
2396    
2397     The e-mail address of the person who built this binary. Has no good
2398     default, so should be specified by you.
2399    
2400     =item C<CPAN>
2401    
2402     The URL of the CPAN mirror to use (e.g. L<http://mirror.netcologne.de/cpan/>).
2403    
2404 root 1.6 =item C<EXTRA_MODULES>
2405 root 1.2
2406 root 1.6 Additional modules installed during F<staticperl install>. Here you can
2407     set which modules you want have to installed from CPAN.
2408 root 1.2
2409 root 1.10 Example: I really really need EV, AnyEvent, Coro and AnyEvent::AIO.
2410 root 1.2
2411 root 1.10 EXTRA_MODULES="EV AnyEvent Coro AnyEvent::AIO"
2412 root 1.2
2413 root 1.6 Note that you can also use a C<postinstall> hook to achieve this, and
2414     more.
2415 root 1.2
2416 root 1.10 =back
2417    
2418     =head4 Variables you might I<want> to override
2419    
2420     =over 4
2421    
2422     =item C<STATICPERL>
2423    
2424     The directory where staticperl stores all its files
2425     (default: F<~/.staticperl>).
2426    
2427 root 1.6 =item C<PERL_MM_USE_DEFAULT>, C<EV_EXTRA_DEFS>, ...
2428 root 1.2
2429     Usually set to C<1> to make modules "less inquisitive" during their
2430     installation, you can set any environment variable you want - some modules
2431     (such as L<Coro> or L<EV>) use environment variables for further tweaking.
2432    
2433 root 1.10 =item C<PERL_VERSION>
2434 root 1.6
2435 root 1.10 The perl version to install - default is currently C<5.12.2>, but C<5.8.9>
2436     is also a good choice (5.8.9 is much smaller than 5.12.2, while 5.10.1 is
2437     about as big as 5.12.2).
2438 root 1.2
2439 root 1.10 =item C<PERL_PREFIX>
2440 root 1.2
2441 root 1.6 The prefix where perl gets installed (default: F<$STATICPERL/perl>),
2442     i.e. where the F<bin> and F<lib> subdirectories will end up.
2443 root 1.2
2444 root 1.8 =item C<PERL_CONFIGURE>
2445    
2446     Additional Configure options - these are simply passed to the perl
2447     Configure script. For example, if you wanted to enable dynamic loading,
2448     you could pass C<-Dusedl>. To enable ithreads (Why would you want that
2449     insanity? Don't! Use L<forks> instead!) you would pass C<-Duseithreads>
2450     and so on.
2451    
2452     More commonly, you would either activate 64 bit integer support
2453     (C<-Duse64bitint>), or disable large files support (-Uuselargefiles), to
2454     reduce filesize further.
2455    
2456 root 1.27 =item C<PERL_CC>, C<PERL_CCFLAGS>, C<PERL_OPTIMIZE>, C<PERL_LDFLAGS>, C<PERL_LIBS>
2457 root 1.2
2458 root 1.6 These flags are passed to perl's F<Configure> script, and are generally
2459     optimised for small size (at the cost of performance). Since they also
2460     contain subtle workarounds around various build issues, changing these
2461 root 1.27 usually requires understanding their default values - best look at
2462     the top of the F<staticperl> script for more info on these, and use a
2463     F<~/.staticperlrc> to override them.
2464    
2465     Most of the variables override (or modify) the corresponding F<Configure>
2466     variable, except C<PERL_CCFLAGS>, which gets appended.
2467 root 1.2
2468     =back
2469    
2470 root 1.5 =head4 Variables you probably I<do not want> to override
2471 root 1.2
2472     =over 4
2473    
2474 root 1.26 =item C<MAKE>
2475    
2476     The make command to use - default is C<make>.
2477    
2478 root 1.2 =item C<MKBUNDLE>
2479    
2480     Where F<staticperl> writes the C<mkbundle> command to
2481     (default: F<$STATICPERL/mkbundle>).
2482 root 1.1
2483 root 1.2 =item C<STATICPERL_MODULES>
2484 root 1.1
2485 root 1.2 Additional modules needed by C<mkbundle> - should therefore not be changed
2486     unless you know what you are doing.
2487    
2488     =back
2489    
2490     =head3 OVERRIDABLE HOOKS
2491    
2492     In addition to environment variables, it is possible to provide some
2493     shell functions that are called at specific times. To provide your own
2494 root 1.4 commands, just define the corresponding function.
2495 root 1.2
2496     Example: install extra modules from CPAN and from some directories
2497     at F<staticperl install> time.
2498    
2499     postinstall() {
2500 root 1.5 rm -rf lib/threads* # weg mit Schaden
2501 root 1.2 instcpan IO::AIO EV
2502     instsrc ~/src/AnyEvent
2503     instsrc ~/src/XML-Sablotron-1.0100001
2504 root 1.5 instcpan Anyevent::AIO AnyEvent::HTTPD
2505 root 1.2 }
2506    
2507     =over 4
2508    
2509 root 1.11 =item preconfigure
2510    
2511     Called just before running F<./Configur> in the perl source
2512     directory. Current working directory is the perl source directory.
2513    
2514     This can be used to set any C<PERL_xxx> variables, which might be costly
2515     to compute.
2516    
2517 root 1.2 =item postconfigure
2518    
2519     Called after configuring, but before building perl. Current working
2520     directory is the perl source directory.
2521    
2522 root 1.11 Could be used to tailor/patch config.sh (followed by F<sh Configure -S>)
2523     or do any other modifications.
2524 root 1.2
2525     =item postbuild
2526    
2527     Called after building, but before installing perl. Current working
2528     directory is the perl source directory.
2529    
2530     I have no clue what this could be used for - tell me.
2531    
2532     =item postinstall
2533    
2534     Called after perl and any extra modules have been installed in C<$PREFIX>,
2535     but before setting the "installation O.K." flag.
2536    
2537     The current working directory is C<$PREFIX>, but maybe you should not rely
2538     on that.
2539    
2540     This hook is most useful to customise the installation, by deleting files,
2541     or installing extra modules using the C<instcpan> or C<instsrc> functions.
2542    
2543     The script must return with a zero exit status, or the installation will
2544     fail.
2545 root 1.1
2546 root 1.2 =back
2547 root 1.1
2548 root 1.7 =head1 ANATOMY OF A BUNDLE
2549    
2550     When not building a new perl binary, C<mkbundle> will leave a number of
2551     files in the current working directory, which can be used to embed a perl
2552     interpreter in your program.
2553    
2554     Intimate knowledge of L<perlembed> and preferably some experience with
2555     embedding perl is highly recommended.
2556    
2557     C<mkperl> (or the C<--perl> option) basically does this to link the new
2558     interpreter (it also adds a main program to F<bundle.>):
2559    
2560     $Config{cc} $(cat bundle.ccopts) -o perl bundle.c $(cat bundle.ldopts)
2561    
2562     =over 4
2563    
2564     =item bundle.h
2565    
2566     A header file that contains the prototypes of the few symbols "exported"
2567     by bundle.c, and also exposes the perl headers to the application.
2568    
2569     =over 4
2570    
2571     =item staticperl_init ()
2572    
2573     Initialises the perl interpreter. You can use the normal perl functions
2574     after calling this function, for example, to define extra functions or
2575     to load a .pm file that contains some initialisation code, or the main
2576     program function:
2577    
2578     XS (xsfunction)
2579     {
2580     dXSARGS;
2581    
2582     // now we have items, ST(i) etc.
2583     }
2584    
2585     static void
2586     run_myapp(void)
2587     {
2588     staticperl_init ();
2589     newXSproto ("myapp::xsfunction", xsfunction, __FILE__, "$$;$");
2590     eval_pv ("require myapp::main", 1); // executes "myapp/main.pm"
2591     }
2592    
2593     =item staticperl_xs_init (pTHX)
2594    
2595     Sometimes you need direct control over C<perl_parse> and C<perl_run>, in
2596     which case you do not want to use C<staticperl_init> but call them on your
2597     own.
2598    
2599     Then you need this function - either pass it directly as the C<xs_init>
2600     function to C<perl_parse>, or call it from your own C<xs_init> function.
2601    
2602     =item staticperl_cleanup ()
2603    
2604     In the unlikely case that you want to destroy the perl interpreter, here
2605     is the corresponding function.
2606    
2607     =item PerlInterpreter *staticperl
2608    
2609     The perl interpreter pointer used by staticperl. Not normally so useful,
2610     but there it is.
2611    
2612     =back
2613    
2614     =item bundle.ccopts
2615    
2616     Contains the compiler options required to compile at least F<bundle.c> and
2617     any file that includes F<bundle.h> - you should probably use it in your
2618     C<CFLAGS>.
2619    
2620     =item bundle.ldopts
2621    
2622     The linker options needed to link the final program.
2623    
2624     =back
2625    
2626     =head1 RUNTIME FUNCTIONALITY
2627    
2628     Binaries created with C<mkbundle>/C<mkperl> contain extra functions, which
2629     are required to access the bundled perl sources, but might be useful for
2630     other purposes.
2631    
2632     In addition, for the embedded loading of perl files to work, F<staticperl>
2633     overrides the C<@INC> array.
2634    
2635     =over 4
2636    
2637     =item $file = staticperl::find $path
2638    
2639     Returns the data associated with the given C<$path>
2640     (e.g. C<Digest/MD5.pm>, C<auto/POSIX/autosplit.ix>), which is basically
2641     the UNIX path relative to the perl library directory.
2642    
2643     Returns C<undef> if the file isn't embedded.
2644    
2645 root 1.8 =item @paths = staticperl::list
2646 root 1.7
2647     Returns the list of all paths embedded in this binary.
2648    
2649     =back
2650    
2651 root 1.31 =head1 FULLY STATIC BINARIES - UCLIBC AND BUILDROOT
2652 root 1.8
2653     To make truly static (Linux-) libraries, you might want to have a look at
2654     buildroot (L<http://buildroot.uclibc.org/>).
2655    
2656     Buildroot is primarily meant to set up a cross-compile environment (which
2657     is not so useful as perl doesn't quite like cross compiles), but it can also compile
2658     a chroot environment where you can use F<staticperl>.
2659    
2660     To do so, download buildroot, and enable "Build options => development
2661     files in target filesystem" and optionally "Build options => gcc
2662     optimization level (optimize for size)". At the time of writing, I had
2663     good experiences with GCC 4.4.x but not GCC 4.5.
2664    
2665     To minimise code size, I used C<-pipe -ffunction-sections -fdata-sections
2666     -finline-limit=8 -fno-builtin-strlen -mtune=i386>. The C<-mtune=i386>
2667     doesn't decrease codesize much, but it makes the file much more
2668     compressible.
2669    
2670     If you don't need Coro or threads, you can go with "linuxthreads.old" (or
2671     no thread support). For Coro, it is highly recommended to switch to a
2672     uClibc newer than 0.9.31 (at the time of this writing, I used the 20101201
2673     snapshot) and enable NPTL, otherwise Coro needs to be configured with the
2674     ultra-slow pthreads backend to work around linuxthreads bugs (it also uses
2675     twice the address space needed for stacks).
2676    
2677     If you use C<linuxthreads.old>, then you should also be aware that
2678     uClibc shares C<errno> between all threads when statically linking. See
2679     L<http://lists.uclibc.org/pipermail/uclibc/2010-June/044157.html> for a
2680     workaround (And L<https://bugs.uclibc.org/2089> for discussion).
2681    
2682 root 1.10 C<ccache> support is also recommended, especially if you want
2683     to play around with buildroot options. Enabling the C<miniperl>
2684     package will probably enable all options required for a successful
2685     perl build. F<staticperl> itself additionally needs either C<wget>
2686     (recommended, for CPAN) or C<curl>.
2687 root 1.8
2688     As for shells, busybox should provide all that is needed, but the default
2689     busybox configuration doesn't include F<comm> which is needed by perl -
2690     either make a custom busybox config, or compile coreutils.
2691    
2692     For the latter route, you might find that bash has some bugs that keep
2693     it from working properly in a chroot - either use dash (and link it to
2694     F</bin/sh> inside the chroot) or link busybox to F</bin/sh>, using it's
2695     built-in ash shell.
2696    
2697     Finally, you need F</dev/null> inside the chroot for many scripts to work
2698     - F<cp /dev/null output/target/dev> or bind-mounting your F</dev> will
2699     both provide this.
2700    
2701     After you have compiled and set up your buildroot target, you can copy
2702     F<staticperl> from the C<App::Staticperl> distribution or from your
2703     perl f<bin> directory (if you installed it) into the F<output/target>
2704     filesystem, chroot inside and run it.
2705    
2706 root 1.18 =head1 RECIPES / SPECIFIC MODULES
2707    
2708     This section contains some common(?) recipes and information about
2709     problems with some common modules or perl constructs that require extra
2710     files to be included.
2711    
2712     =head2 MODULES
2713    
2714     =over 4
2715    
2716     =item utf8
2717    
2718     Some functionality in the utf8 module, such as swash handling (used
2719     for unicode character ranges in regexes) is implemented in the
2720     C<"utf8_heavy.pl"> library:
2721    
2722     -M'"utf8_heavy.pl"'
2723    
2724     Many Unicode properties in turn are defined in separate modules,
2725     such as C<"unicore/Heavy.pl"> and more specific data tables such as
2726     C<"unicore/To/Digit.pl"> or C<"unicore/lib/Perl/Word.pl">. These tables
2727     are big (7MB uncompressed, although F<staticperl> contains special
2728     handling for those files), so including them on demand by your application
2729     only might pay off.
2730    
2731     To simply include the whole unicode database, use:
2732    
2733 root 1.32 --incglob '/unicore/**.pl'
2734 root 1.18
2735     =item AnyEvent
2736    
2737     AnyEvent needs a backend implementation that it will load in a delayed
2738     fashion. The L<AnyEvent::Impl::Perl> backend is the default choice
2739     for AnyEvent if it can't find anything else, and is usually a safe
2740     fallback. If you plan to use e.g. L<EV> (L<POE>...), then you need to
2741     include the L<AnyEvent::Impl::EV> (L<AnyEvent::Impl::POE>...) backend as
2742     well.
2743    
2744     If you want to handle IRIs or IDNs (L<AnyEvent::Util> punycode and idn
2745     functions), you also need to include C<"AnyEvent/Util/idna.pl"> and
2746     C<"AnyEvent/Util/uts46data.pl">.
2747    
2748 root 1.31 Or you can use C<--usepacklists> and specify C<-MAnyEvent> to include
2749 root 1.19 everything.
2750    
2751 root 1.18 =item Carp
2752    
2753     Carp had (in older versions of perl) a dependency on L<Carp::Heavy>. As of
2754     perl 5.12.2 (maybe earlier), this dependency no longer exists.
2755    
2756     =item Config
2757    
2758     The F<perl -V> switch (as well as many modules) needs L<Config>, which in
2759     turn might need L<"Config_heavy.pl">. Including the latter gives you
2760     both.
2761    
2762     =item Term::ReadLine::Perl
2763    
2764 root 1.31 Also needs L<Term::ReadLine::readline>, or C<--usepacklists>.
2765 root 1.18
2766     =item URI
2767    
2768     URI implements schemes as separate modules - the generic URL scheme is
2769     implemented in L<URI::_generic>, HTTP is implemented in L<URI::http>. If
2770 root 1.19 you need to use any of these schemes, you should include these manually,
2771 root 1.31 or use C<--usepacklists>.
2772 root 1.18
2773     =back
2774    
2775     =head2 RECIPES
2776    
2777     =over 4
2778    
2779 root 1.31 =item Just link everything in
2780 root 1.18
2781     To link just about everything installed in the perl library into a new
2782 root 1.31 perl, try this (the first time this runs it will take a long time, as a
2783     lot of files need to be parsed):
2784    
2785     staticperl mkperl -v --strip ppi --incglob '*'
2786    
2787     If you don't mind the extra megabytes, this can be a very effective way of
2788     creating bundles without having to worry about forgetting any modules.
2789 root 1.18
2790 root 1.31 You get even more useful variants of this method by first selecting
2791     everything, and then excluding stuff you are reasonable sure not to need -
2792     L<bigperl|http://staticperl.schmorp.de/bigperl.html> uses this approach.
2793 root 1.18
2794 root 1.31 =item Getting rid of netdb functions
2795 root 1.18
2796     The perl core has lots of netdb functions (C<getnetbyname>, C<getgrent>
2797     and so on) that few applications use. You can avoid compiling them in by
2798     putting the following fragment into a C<preconfigure> hook:
2799    
2800     preconfigure() {
2801     for sym in \
2802     d_getgrnam_r d_endgrent d_endgrent_r d_endhent \
2803     d_endhostent_r d_endnent d_endnetent_r d_endpent \
2804     d_endprotoent_r d_endpwent d_endpwent_r d_endsent \
2805     d_endservent_r d_getgrent d_getgrent_r d_getgrgid_r \
2806     d_getgrnam_r d_gethbyaddr d_gethent d_getsbyport \
2807     d_gethostbyaddr_r d_gethostbyname_r d_gethostent_r \
2808     d_getlogin_r d_getnbyaddr d_getnbyname d_getnent \
2809     d_getnetbyaddr_r d_getnetbyname_r d_getnetent_r \
2810     d_getpent d_getpbyname d_getpbynumber d_getprotobyname_r \
2811     d_getprotobynumber_r d_getprotoent_r d_getpwent \
2812     d_getpwent_r d_getpwnam_r d_getpwuid_r d_getsent \
2813     d_getservbyname_r d_getservbyport_r d_getservent_r \
2814     d_getspnam_r d_getsbyname
2815     # d_gethbyname
2816     do
2817     PERL_CONFIGURE="$PERL_CONFIGURE -U$sym"
2818     done
2819     }
2820    
2821 root 1.32 This mostly gains space when linking statically, as the functions will
2822 root 1.22 likely not be linked in. The gain for dynamically-linked binaries is
2823 root 1.18 smaller.
2824    
2825     Also, this leaves C<gethostbyname> in - not only is it actually used
2826     often, the L<Socket> module also exposes it, so leaving it out usually
2827     gains little. Why Socket exposes a C function that is in the core already
2828     is anybody's guess.
2829    
2830     =back
2831    
2832 root 1.1 =head1 AUTHOR
2833    
2834     Marc Lehmann <schmorp@schmorp.de>
2835     http://software.schmorp.de/pkg/staticperl.html
2836