ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/App-Staticperl/bin/staticperl
Revision: 1.58
Committed: Sat Apr 2 11:00:34 2011 UTC (15 years, 7 months ago) by root
Branch: MAIN
Changes since 1.57: +114 -32 lines
Log Message:
*** empty log message ***

File Contents

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