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