ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/App-Staticperl/bin/staticperl
Revision: 1.33
Committed: Mon Jan 10 14:12:04 2011 UTC (15 years, 8 months ago) by root
Branch: MAIN
Changes since 1.32: +2 -1 lines
Log Message:
*** empty log message ***

File Contents

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