ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/App-Staticperl/staticperl.pod
(Generate patch)

Comparing App-Staticperl/staticperl.pod (file contents):
Revision 1.39 by root, Sat Apr 2 11:00:34 2011 UTC vs.
Revision 1.67 by root, Fri Aug 4 03:58:52 2023 UTC

1=head1 NAME 1=head1 NAME
2 2
3staticperl - perl, libc, 100 modules, all in one 500kb file 3staticperl - perl, libc, 100 modules, all in one standalone 500kb file
4 4
5=head1 SYNOPSIS 5=head1 SYNOPSIS
6 6
7 staticperl help # print the embedded documentation 7 staticperl help # print the embedded documentation
8 staticperl fetch # fetch and unpack perl sources 8 staticperl fetch # fetch and unpack perl sources
11 staticperl install # build and then install perl 11 staticperl install # build and then install perl
12 staticperl clean # clean most intermediate files (restart at configure) 12 staticperl clean # clean most intermediate files (restart at configure)
13 staticperl distclean # delete everything installed by this script 13 staticperl distclean # delete everything installed by this script
14 staticperl perl ... # invoke the perlinterpreter 14 staticperl perl ... # invoke the perlinterpreter
15 staticperl cpan # invoke CPAN shell 15 staticperl cpan # invoke CPAN shell
16 staticperl instmod path... # install unpacked modules 16 staticperl instsrc path... # install unpacked modules
17 staticperl instcpan modulename... # install modules from CPAN 17 staticperl instcpan modulename... # install modules from CPAN
18 staticperl mkbundle <bundle-args...> # see documentation 18 staticperl mkbundle <bundle-args...> # see documentation
19 staticperl mkperl <bundle-args...> # see documentation 19 staticperl mkperl <bundle-args...> # see documentation
20 staticperl mkapp appname <bundle-args...> # see documentation 20 staticperl mkapp appname <bundle-args...> # see documentation
21 21
39file that contains perl interpreter, libc, all the modules you need, all 39file that contains perl interpreter, libc, all the modules you need, all
40the libraries you need and of course your actual program. 40the libraries you need and of course your actual program.
41 41
42With F<uClibc> and F<upx> on x86, you can create a single 500kb binary 42With F<uClibc> and F<upx> on x86, you can create a single 500kb binary
43that contains perl and 100 modules such as POSIX, AnyEvent, EV, IO::AIO, 43that contains perl and 100 modules such as POSIX, AnyEvent, EV, IO::AIO,
44Coro and so on. Or any other choice of modules. 44Coro and so on. Or any other choice of modules (and some other size :).
45 45
46To see how this turns out, you can try out smallperl and bigperl, two 46To see how this turns out, you can try out smallperl and bigperl, two
47pre-built static and compressed perl binaries with many and even more 47pre-built static and compressed perl binaries with many and even more
48modules: just follow the links at L<http://staticperl.schmorp.de/>. 48modules: just follow the links at L<http://staticperl.schmorp.de/>.
49 49
84With F<staticperl>, the burden is mostly with the developer - only direct 84With F<staticperl>, the burden is mostly with the developer - only direct
85compile-time dependencies and L<AutoLoader> are handled automatically. 85compile-time dependencies and L<AutoLoader> are handled automatically.
86This means the modules to include often need to be tweaked manually. 86This means the modules to include often need to be tweaked manually.
87 87
88All this does not preclude more permissive modes to be implemented in 88All this does not preclude more permissive modes to be implemented in
89the future, but right now, you have to resolve state hidden dependencies 89the future, but right now, you have to resolve hidden dependencies
90manually. 90manually.
91 91
92=item * PAR works out of the box, F<staticperl> does not. 92=item * PAR works out of the box, F<staticperl> does not.
93 93
94Maintaining your own custom perl build can be a pain in the ass, and while 94Maintaining your own custom perl build can be a pain in the ass, and while
124 124
125=head1 THE F<STATICPERL> SCRIPT 125=head1 THE F<STATICPERL> SCRIPT
126 126
127This module installs a script called F<staticperl> into your perl 127This module installs a script called F<staticperl> into your perl
128binary directory. The script is fully self-contained, and can be 128binary directory. The script is fully self-contained, and can be
129used without perl (for example, in an uClibc chroot environment). In 129used without perl (for example, in an uClibc/dietlibc/musl chroot
130fact, it can be extracted from the C<App::Staticperl> distribution 130environment). In fact, it can be extracted from the C<App::Staticperl>
131tarball as F<bin/staticperl>, without any installation. The 131distribution tarball as F<bin/staticperl>, without any installation. The
132newest (possibly alpha) version can also be downloaded from 132newest (possibly alpha) version can also be downloaded from
133L<http://staticperl.schmorp.de/staticperl>. 133L<http://staticperl.schmorp.de/staticperl>.
134 134
135F<staticperl> interprets the first argument as a command to execute, 135F<staticperl> interprets the first argument as a command to execute,
136optionally followed by any parameters. 136optionally followed by any parameters.
189Wipes the perl installation directory (usually F<~/.staticperl/perl>) and 189Wipes the perl installation directory (usually F<~/.staticperl/perl>) and
190installs the perl distribution, potentially after building it first. 190installs the perl distribution, potentially after building it first.
191 191
192=item F<staticperl perl> [args...] 192=item F<staticperl perl> [args...]
193 193
194Invokes the compiled perl interpreter with the given args. Basically the 194Invokes the compiled perl interpreter with the given
195same as starting perl directly (usually via F<~/.staticperl/bin/perl>), 195arguments. Basically the same as starting perl directly (usually via
196but beats typing the path sometimes. 196F<~/.staticperl/bin/perl>), but beats typing the path sometimes.
197 197
198Example: check that the Gtk2 module is installed and loadable. 198Example: check that the Gtk2 module is installed and loadable.
199 199
200 staticperl perl -MGtk2 -e0 200 staticperl perl -MGtk2 -e0
201 201
202=item F<staticperl cpan> [args...] 202=item F<staticperl cpan> [args...]
203 203
204Starts an interactive CPAN shell that you can use to install further 204Starts an interactive CPAN shell that you can use to install further
205modules. Installs the perl first if necessary, but apart from that, 205modules. Installs the perl first if necessary, but apart from that,
206no magic is involved: you could just as well run it manually via 206no magic is involved: you could just as well run it manually via
207F<~/.staticperl/perl/bin/cpan>. 207F<~/.staticperl/perl/bin/cpan>, except that F<staticperl> additionally
208sets the environment variable C<$PERL> to the path of the perl
209interpreter, which is handy in subshells.
208 210
209Any additional arguments are simply passed to the F<cpan> command. 211Any additional arguments are simply passed to the F<cpan> command.
210 212
211=item F<staticperl instcpan> module... 213=item F<staticperl instcpan> module...
212 214
346 add eg/httpd httpd.pm 348 add eg/httpd httpd.pm
347 349
348All options that specify modules or files to be added are processed in the 350All options that specify modules or files to be added are processed in the
349order given on the command line. 351order given on the command line.
350 352
351=head3 BUNDLE CREATION WORKFLOW / STATICPELR MKBUNDLE OPTIONS 353=head3 BUNDLE CREATION WORKFLOW / STATICPERL MKBUNDLE OPTIONS
352 354
353F<staticperl mkbundle> works by first assembling a list of candidate 355F<staticperl mkbundle> works by first assembling a list of candidate
354files and modules to include, then filtering them by include/exclude 356files and modules to include, then filtering them by include/exclude
355patterns. The remaining modules (together with their direct dependencies, 357patterns. The remaining modules (together with their direct dependencies,
356such as link libraries and L<AutoLoader> files) are then converted into 358such as link libraries and L<AutoLoader> files) are then converted into
541 # then later, in perl, use 543 # then later, in perl, use
542 use myfiles::file1; 544 use myfiles::file1;
543 require myfiles::file2; 545 require myfiles::file2;
544 my $res = do "myfiles/file3.pl"; 546 my $res = do "myfiles/file3.pl";
545 547
546=item C<--binadd> F<file> | C<--add> "F<file> alias" 548=item C<--addbin> F<file> | C<--addbin> "F<file> alias"
547 549
548Just like C<--add>, except that it treats the file as binary and adds it 550Just like C<--add>, except that it treats the file as binary and adds it
549without any postprocessing (perl files might get stripped to reduce their 551without any post-processing (perl files might get stripped to reduce their
550size). 552size).
551 553
552If you specify an alias you should probably add a C<&> prefix to avoid 554If you specify an alias you should probably add a C</> prefix to avoid
553clashing with embedded perl files (whose paths never start with C<&>), 555clashing with embedded perl files (whose paths never start with C</>),
554and/or use a special directory prefix, such as C<&res/name>. 556and/or use a special directory prefix, such as C</res/name>.
555 557
556You can later get a copy of these files by calling C<staticperl::find 558You can later get a copy of these files by calling C<static::find
557"alias">. 559"alias">.
558 560
559An alternative way to embed binary files is to convert them to perl and 561An alternative way to embed binary files is to convert them to perl and
560use C<do> to get the contents - this method is a bit cumbersome, but works 562use C<do> to get the contents - this method is a bit cumbersome, but works
561both inside and outside of a staticperl bundle: 563both inside and outside of a staticperl bundle, without extra ado:
562 564
563 # a "binary" file, call it "bindata.pl" 565 # a "binary" file, call it "bindata.pl"
564 <<'SOME_MARKER' 566 <<'SOME_MARKER'
565 binary data NOT containing SOME_MARKER 567 binary data NOT containing SOME_MARKER
566 SOME_MARKER 568 SOME_MARKER
567 569
568 # load the binary 570 # load the binary
569 chomp (my $data = do "bindata.pl"); 571 chomp (my $data = do "bindata.pl");
572
573=item C<--allow-dynamic>
574
575By default, when F<mkbundle> hits a dynamic perl extension (e.g. a F<.so>
576or F<.dll> file), it will stop with a fatal error.
577
578When this option is enabled, F<mkbundle> packages the shared
579object into the bundle instead, with a prefix of F<!>
580(e.g. F<!auto/List/Util/Util.so>). What you do with that is currently up
581to you, F<staticperl> has no special support for this at the moment, apart
582from working around the lack of availability of F<PerlIO::scalar> while
583bootstrapping, at a speed cost.
584
585One way to deal with this is to write all files starting with F<!> into
586some directory and then C<unshift> that path onto C<@INC>.
587
588(TODO for future self: write and insert a suitable example here, if
589somebody requests it).
570 590
571=back 591=back
572 592
573=item Step 2: filter all files using C<--include> and C<--exclude> options. 593=item Step 2: filter all files using C<--include> and C<--exclude> options.
574 594
685Last not least, if you need accurate line numbers in error messages, 705Last not least, if you need accurate line numbers in error messages,
686or in the unlikely case where C<pod> is too slow, or some module gets 706or in the unlikely case where C<pod> is too slow, or some module gets
687mistreated, you can specify C<none> to not mangle included perl sources in 707mistreated, you can specify C<none> to not mangle included perl sources in
688any way. 708any way.
689 709
710=item C<--compress> C<none>|C<lzf>
711
712Compress each included library file with C<lzf> (default), or do not
713compress (C<none>). LZF compression typically halves the size of the
714included library data at almost no overhead, but is counterproductive if
715you are using another compression solution such as C<UPX>, so it can be
716disabled.
717
690=item C<--perl> 718=item C<--perl>
691 719
692After writing out the bundle files, try to link a new perl interpreter. It 720After writing out the bundle files, try to link a new perl interpreter. It
693will be called F<perl> and will be left in the current working 721will be called F<perl> and will be left in the current working
694directory. The bundle files will be removed. 722directory. The bundle files will be removed.
727 755
728=item C<--ignore-env> 756=item C<--ignore-env>
729 757
730Generates extra code to unset some environment variables before 758Generates extra code to unset some environment variables before
731initialising/running perl. Perl supports a lot of environment variables 759initialising/running perl. Perl supports a lot of environment variables
732that might alter execution in ways that might be undesirablre for 760that might alter execution in ways that might be undesirable for
733standalone applications, and this option removes those known to cause 761standalone applications, and this option removes those known to cause
734trouble. 762trouble.
735 763
736Specifically, these are removed: 764Specifically, these are removed:
737 765
738C<PERL_HASH_SEED_DEBUG> and C<PERL_DEBUG_MSTATS> can cause underaible 766C<PERL_HASH_SEED_DEBUG> and C<PERL_DEBUG_MSTATS> can cause undesirable
739output, C<PERL5OPT>, C<PERL_DESTRUCT_LEVEL>, C<PERL_HASH_SEED> and 767output, C<PERL5OPT>, C<PERL_DESTRUCT_LEVEL>, C<PERL_HASH_SEED> and
740C<PERL_SIGNALS> can alter execution significantly, and C<PERL_UNICODE>, 768C<PERL_SIGNALS> can alter execution significantly, and C<PERL_UNICODE>,
741C<PERLIO_DEBUG> and C<PERLIO> can affect input and output. 769C<PERLIO_DEBUG> and C<PERLIO> can affect input and output.
742 770
743The variables C<PERL_LIB> and C<PERL5_LIB> are always ignored because the 771The variables C<PERL_LIB> and C<PERL5_LIB> are always ignored because the
758The default is to link the new binary dynamically (that means all perl 786The default is to link the new binary dynamically (that means all perl
759modules are linked statically, but all external libraries are still 787modules are linked statically, but all external libraries are still
760referenced dynamically). 788referenced dynamically).
761 789
762Keep in mind that Solaris doesn't support static linking at all, and 790Keep in mind that Solaris doesn't support static linking at all, and
763systems based on GNU libc don't really support it in a very usable 791systems based on GNU libc don't really support it in a very usable fashion
764fashion either. Try uClibc if you want to create fully statically linked 792either. Try dietlibc or musl if you want to create fully statically linked
765executables, or try the C<--staticlib> option to link only some libraries 793executables, or try the C<--staticlib> option to link only some libraries
766statically. 794statically.
767 795
768=item C<--staticlib> libname 796=item C<--staticlib> libname
769 797
781 staticperl mkperl -MIO::AIO --staticlib crypt 809 staticperl mkperl -MIO::AIO --staticlib crypt
782 810
783 # ldopts might now contain: 811 # ldopts might now contain:
784 # -lm -Wl,-Bstatic -lcrypt -Wl,-Bdynamic -lpthread 812 # -lm -Wl,-Bstatic -lcrypt -Wl,-Bdynamic -lpthread
785 813
814=item C<--extra-cflags> string
815
816Specifies extra compiler flags, used when compiling the bundle file. The
817flags are appended to all the existing flags, so can be sued to override
818settings.
819
820=item C<--extra-ldflags> string
821
822Specifies extra linker flags, used when linking the bundle.
823
824=item C<--extra-libs> string
825
826Extra linker flags, appended at the end when linking. The difference to
827C<--extra-ldflags> is that the ldflags are appended to the flags, before
828the objects and libraries, and the extra libs are added at the end.
829
786=back 830=back
787 831
788=back 832=back
789 833
790=head3 EXTENDED GLOB PATTERNS 834=head3 EXTENDED GLOB PATTERNS
833In them you can override shell variables, or define shell functions 877In them you can override shell variables, or define shell functions
834("hooks") to be called at specific phases during installation. For 878("hooks") to be called at specific phases during installation. For
835example, you could define a C<postinstall> hook to install additional 879example, you could define a C<postinstall> hook to install additional
836modules from CPAN each time you start from scratch. 880modules from CPAN each time you start from scratch.
837 881
838If the env variable C<$STATICPERLRC> is set, then F<staticperl> will try 882If the environment variable C<$STATICPERLRC> is set, then F<staticperl>
839to source the file named with it only. Otherwise, it tries the following 883will try to source the file named with it only. Otherwise, it tries the
840shell files in order: 884following shell files in order:
841 885
842 /etc/staticperlrc 886 /etc/staticperlrc
843 ~/.staticperlrc 887 ~/.staticperlrc
844 $STATICPERL/rc 888 $STATICPERL/rc
845 889
882=item C<STATICPERL> 926=item C<STATICPERL>
883 927
884The directory where staticperl stores all its files 928The directory where staticperl stores all its files
885(default: F<~/.staticperl>). 929(default: F<~/.staticperl>).
886 930
931=item C<DLCACHE>
932
933The path to a directory (will be created if it doesn't exist) where
934downloaded perl sources are being cached, to avoid downloading them
935again. The default is empty, which means there is no cache.
936
937=item C<PERL_VERSION>
938
939The perl version to install - C<5.12.5> is a good choice for small builds,
940but C<5.8.9> is also a good choice (5.8.9 is much smaller than 5.12.5), if
941it builds on your system.
942
943You can also set this variable to the absolute URL of a tarball (F<.tar>,
944F<.tar.gz>, F<.tar.bz2>, F<.tar.lzma> or F<.tar.xz>), or to the absolute
945path of an unpacked perl source tree, which will be copied.
946
947The default is currently
948F<http://stableperl.schmorp.de/dist/latest.tar.gz>, i.e. the latest
949stableperl release.
950
887=item C<PERL_MM_USE_DEFAULT>, C<EV_EXTRA_DEFS>, ... 951=item C<PERL_MM_USE_DEFAULT>, C<EV_EXTRA_DEFS>, ...
888 952
889Usually set to C<1> to make modules "less inquisitive" during their 953Usually set to C<1> to make modules "less inquisitive" during their
890installation, you can set any environment variable you want - some modules 954installation. You can set (and export!) any environment variable you want
891(such as L<Coro> or L<EV>) use environment variables for further tweaking. 955- some modules (such as L<Coro> or L<EV>) use environment variables for
892 956further tweaking.
893=item C<PERL_VERSION>
894
895The perl version to install - default is currently C<5.12.3>, but C<5.8.9>
896is also a good choice (5.8.9 is much smaller than 5.12.3, while 5.10.1 is
897about as big as 5.12.3).
898 957
899=item C<PERL_PREFIX> 958=item C<PERL_PREFIX>
900 959
901The prefix where perl gets installed (default: F<$STATICPERL/perl>), 960The directory where perl gets installed (default: F<$STATICPERL/perl>),
902i.e. where the F<bin> and F<lib> subdirectories will end up. 961i.e. where the F<bin> and F<lib> subdirectories will end up. Previous
962contents will be removed on installation.
903 963
904=item C<PERL_CONFIGURE> 964=item C<PERL_CONFIGURE>
905 965
906Additional Configure options - these are simply passed to the perl 966Additional Configure options - these are simply passed to the perl
907Configure script. For example, if you wanted to enable dynamic loading, 967Configure script. For example, if you wanted to enable dynamic loading,
908you could pass C<-Dusedl>. To enable ithreads (Why would you want that 968you could pass C<-Dusedl>. To enable ithreads (Why would you want that
909insanity? Don't! Use L<forks> instead!) you would pass C<-Duseithreads> 969insanity? Don't! Use L<Coro> or L<forks> instead!) you would pass
910and so on. 970C<-Duseithreads> and so on.
911 971
912More commonly, you would either activate 64 bit integer support 972More commonly, you would either activate 64 bit integer support
913(C<-Duse64bitint>), or disable large files support (-Uuselargefiles), to 973(C<-Duse64bitint>), or disable large files support (C<-Uuselargefiles>),
914reduce filesize further. 974to reduce file size further.
915 975
916=item C<PERL_CC>, C<PERL_CCFLAGS>, C<PERL_OPTIMIZE>, C<PERL_LDFLAGS>, C<PERL_LIBS> 976=item C<PERL_CC>, C<PERL_CCFLAGS>, C<PERL_OPTIMIZE>, C<PERL_LDFLAGS>, C<PERL_LIBS>
917 977
918These flags are passed to perl's F<Configure> script, and are generally 978These flags are passed to perl's F<Configure> script, and are generally
919optimised for small size (at the cost of performance). Since they also 979optimised for small size (at the cost of performance). Since they also
922the top of the F<staticperl> script for more info on these, and use a 982the top of the F<staticperl> script for more info on these, and use a
923F<~/.staticperlrc> to override them. 983F<~/.staticperlrc> to override them.
924 984
925Most of the variables override (or modify) the corresponding F<Configure> 985Most of the variables override (or modify) the corresponding F<Configure>
926variable, except C<PERL_CCFLAGS>, which gets appended. 986variable, except C<PERL_CCFLAGS>, which gets appended.
987
988The default for C<PERL_OPTIMIZE> is C<-Os> (assuming gcc or compatible
989compilers), and for C<PERL_LIBS> is C<-lm -lcrypt>, which should be good
990for most (but not all) systems.
991
992For other compilers or more customised optimisation settings, you need to
993adjust these, e.g. in your F<~/.staticperlrc>.
994
995With gcc on x86 and amd64, you can often get more space-savings by using:
996
997 -Os -ffunction-sections -fdata-sections -finline-limit=8 -mpush-args
998 -mno-inline-stringops-dynamically -mno-align-stringops
999
1000And on x86 and pentium3 and newer (basically everything you might ever
1001want to run on), adding these is even better for space-savings (use
1002C<-mtune=core2> or something newer for much faster code, too):
1003
1004 -fomit-frame-pointer -march=pentium3 -mtune=i386
927 1005
928=back 1006=back
929 1007
930=head4 Variables you probably I<do not want> to override 1008=head4 Variables you probably I<do not want> to override
931 1009
996Called after building, but before installing perl. Current working 1074Called after building, but before installing perl. Current working
997directory is the perl source directory. 1075directory is the perl source directory.
998 1076
999I have no clue what this could be used for - tell me. 1077I have no clue what this could be used for - tell me.
1000 1078
1079=item postcpanconfig
1080
1081Called just after CPAN has been configured, but before it has been used to
1082install anything. You can further change the configuration like this:
1083
1084 "$PERL_PREFIX"/bin/perl -MCPAN::MyConfig -MCPAN -e '
1085 CPAN::Shell->o (conf => urllist => push => "'"$CPAN"'");
1086 ' || fatal "error while initialising CPAN in postcpanconfig"
1087
1001=item postinstall 1088=item postinstall
1002 1089
1003Called after perl and any extra modules have been installed in C<$PREFIX>, 1090Called after perl and any extra modules have been installed in C<$PREFIX>,
1004but before setting the "installation O.K." flag. 1091but before setting the "installation O.K." flag.
1005 1092
1057 staticperl_init (0); 1144 staticperl_init (0);
1058 newXSproto ("myapp::xsfunction", xsfunction, __FILE__, "$$;$"); 1145 newXSproto ("myapp::xsfunction", xsfunction, __FILE__, "$$;$");
1059 eval_pv ("require myapp::main", 1); // executes "myapp/main.pm" 1146 eval_pv ("require myapp::main", 1); // executes "myapp/main.pm"
1060 } 1147 }
1061 1148
1062When your bootcode already wants to access some XS functions at 1149When your boot code already wants to access some XS functions at compile
1063compiletime, then you need to supply an C<xs_init> function pointer that 1150time, then you need to supply an C<xs_init> function pointer that is
1064is called as soon as perl is initialised enough to define XS functions, 1151called as soon as perl is initialised enough to define XS functions, but
1065but before the preamble code is executed: 1152before the preamble code is executed:
1066 1153
1067 static void 1154 static void
1068 xs_init (pTHX) 1155 xs_init (pTHX)
1069 { 1156 {
1070 newXSproto ("myapp::xsfunction", xsfunction, __FILE__, "$$;$"); 1157 newXSproto ("myapp::xsfunction", xsfunction, __FILE__, "$$;$");
1110 1197
1111=back 1198=back
1112 1199
1113=head1 RUNTIME FUNCTIONALITY 1200=head1 RUNTIME FUNCTIONALITY
1114 1201
1115Binaries created with C<mkbundle>/C<mkperl> contain extra functions, which 1202Binaries created with C<mkbundle>/C<mkperl> contain extra functionality,
1116are required to access the bundled perl sources, but might be useful for 1203mostly related to the extra files bundled in the binary (the virtual
1117other purposes. 1204filesystem). All of this data is statically compiled into the binary, and
1205accessing means copying it from a read-only section of your binary. Data
1206pages in this way are usually freed by the operating system, as they aren't
1207used more then once.
1208
1209=head2 VIRTUAL FILESYSTEM
1210
1211Every bundle has a virtual filesystem. The only information stored in it
1212is the path and contents of each file that was bundled.
1213
1214=head3 LAYOUT
1215
1216Any paths starting with an ampersand (F<&>) or exclamation mark (F<!>) are
1217reserved by F<staticperl>. They must only be used as described in this
1218section.
1219
1220=over 4
1221
1222=item !
1223
1224All files that typically cannot be loaded from memory (such as dynamic
1225objects or shared libraries), but have to reside in the filesystem, are
1226prefixed with F<!>. Typically these files get written out to some
1227(semi-)temporary directory shortly after program startup, or before being
1228used.
1229
1230=item !boot
1231
1232The bootstrap file, if specified during bundling.
1233
1234=item !auto/
1235
1236Shared objects or dlls corresponding to dynamically-linked perl extensions
1237are stored with an F<!auto/> prefix.
1238
1239=item !lib/
1240
1241External shared libraries are stored in this directory.
1242
1243=item any letter
1244
1245Any path starting with a letter is a perl library file. For example,
1246F<Coro/AIO.pm> corresponds to the file loaded by C<use Coro::AIO>, and
1247F<Coro/jit.pl> corresponds to C<require "Coro/jit.pl">.
1248
1249Obviously, module names shouldn't start with any other characters than
1250letters :)
1251
1252=back
1253
1254=head3 FUNCTIONS
1255
1256=over 4
1257
1258=item $file = static::find $path
1259
1260Returns the data associated with the given C<$path>
1261(e.g. C<Digest/MD5.pm>, C<auto/POSIX/autosplit.ix>).
1262
1263Returns C<undef> if the file isn't embedded.
1264
1265=item @paths = static::list
1266
1267Returns the list of all paths embedded in this binary.
1268
1269=back
1270
1271=head2 EXTRA FEATURES
1118 1272
1119In addition, for the embedded loading of perl files to work, F<staticperl> 1273In addition, for the embedded loading of perl files to work, F<staticperl>
1120overrides the C<@INC> array. 1274overrides the C<@INC> array.
1121 1275
1122=over 4 1276=head1 FULLY STATIC BINARIES - ALPINE LINUX
1123 1277
1124=item $file = staticperl::find $path 1278This section once contained a way to build fully static (including
1279uClibc) binaries with buildroot. Unfortunately, buildroot no longer
1280supports a compiler, so I recommend using alpine linux instead
1281(L<http://alpinelinux.org/>). Get yourself a VM (e.g. with qemu), run an
1282older alpine linux verison in it (e.g. 2.4), copy staticperl inside and
1283use it.
1125 1284
1126Returns the data associated with the given C<$path> 1285The reason you might want an older alpine linux is that uClibc can be
1127(e.g. C<Digest/MD5.pm>, C<auto/POSIX/autosplit.ix>), which is basically 1286quite dependent on kernel versions, so the newest version of alpine linux
1128the UNIX path relative to the perl library directory. 1287might need a newer kernel then you might want for, if you plan to run your
1129 1288binaries on on other kernels.
1130Returns C<undef> if the file isn't embedded.
1131
1132=item @paths = staticperl::list
1133
1134Returns the list of all paths embedded in this binary.
1135
1136=back
1137
1138=head1 FULLY STATIC BINARIES - UCLIBC AND BUILDROOT
1139
1140To make truly static (Linux-) libraries, you might want to have a look at
1141buildroot (L<http://buildroot.uclibc.org/>).
1142
1143Buildroot is primarily meant to set up a cross-compile environment (which
1144is not so useful as perl doesn't quite like cross compiles), but it can also compile
1145a chroot environment where you can use F<staticperl>.
1146
1147To do so, download buildroot, and enable "Build options => development
1148files in target filesystem" and optionally "Build options => gcc
1149optimization level (optimize for size)". At the time of writing, I had
1150good experiences with GCC 4.4.x but not GCC 4.5.
1151
1152To minimise code size, I used C<-pipe -ffunction-sections -fdata-sections
1153-finline-limit=8 -fno-builtin-strlen -mtune=i386>. The C<-mtune=i386>
1154doesn't decrease codesize much, but it makes the file much more
1155compressible.
1156
1157If you don't need Coro or threads, you can go with "linuxthreads.old" (or
1158no thread support). For Coro, it is highly recommended to switch to a
1159uClibc newer than 0.9.31 (at the time of this writing, I used the 20101201
1160snapshot) and enable NPTL, otherwise Coro needs to be configured with the
1161ultra-slow pthreads backend to work around linuxthreads bugs (it also uses
1162twice the address space needed for stacks).
1163
1164If you use C<linuxthreads.old>, then you should also be aware that
1165uClibc shares C<errno> between all threads when statically linking. See
1166L<http://lists.uclibc.org/pipermail/uclibc/2010-June/044157.html> for a
1167workaround (And L<https://bugs.uclibc.org/2089> for discussion).
1168
1169C<ccache> support is also recommended, especially if you want
1170to play around with buildroot options. Enabling the C<miniperl>
1171package will probably enable all options required for a successful
1172perl build. F<staticperl> itself additionally needs either C<wget>
1173(recommended, for CPAN) or C<curl>.
1174
1175As for shells, busybox should provide all that is needed, but the default
1176busybox configuration doesn't include F<comm> which is needed by perl -
1177either make a custom busybox config, or compile coreutils.
1178
1179For the latter route, you might find that bash has some bugs that keep
1180it from working properly in a chroot - either use dash (and link it to
1181F</bin/sh> inside the chroot) or link busybox to F</bin/sh>, using it's
1182built-in ash shell.
1183
1184Finally, you need F</dev/null> inside the chroot for many scripts to work
1185- F<cp /dev/null output/target/dev> or bind-mounting your F</dev> will
1186both provide this.
1187
1188After you have compiled and set up your buildroot target, you can copy
1189F<staticperl> from the C<App::Staticperl> distribution or from your
1190perl f<bin> directory (if you installed it) into the F<output/target>
1191filesystem, chroot inside and run it.
1192 1289
1193=head1 RECIPES / SPECIFIC MODULES 1290=head1 RECIPES / SPECIFIC MODULES
1194 1291
1195This section contains some common(?) recipes and information about 1292This section contains some common(?) recipes and information about
1196problems with some common modules or perl constructs that require extra 1293problems with some common modules or perl constructs that require extra
1200 1297
1201=over 4 1298=over 4
1202 1299
1203=item utf8 1300=item utf8
1204 1301
1205Some functionality in the utf8 module, such as swash handling (used 1302Some functionality in the C<utf8> module, such as swash handling
1206for unicode character ranges in regexes) is implemented in the 1303(used for unicode character ranges in regexes) is implemented in the
1207C<"utf8_heavy.pl"> library: 1304C<utf8_heavy.pl> library:
1208 1305
1209 -Mutf8_heavy.pl 1306 -Mutf8_heavy.pl
1210 1307
1211Many Unicode properties in turn are defined in separate modules, 1308Many Unicode properties in turn are defined in separate modules,
1212such as C<"unicore/Heavy.pl"> and more specific data tables such as 1309such as C<unicore/Heavy.pl> and more specific data tables such as
1213C<"unicore/To/Digit.pl"> or C<"unicore/lib/Perl/Word.pl">. These tables 1310C<unicore/To/Digit.pl> or C<unicore/lib/Perl/Word.pl>. These tables
1214are big (7MB uncompressed, although F<staticperl> contains special 1311are big (7MB uncompressed, although F<staticperl> contains special
1215handling for those files), so including them on demand by your application 1312handling for those files), so including them only on demand in your
1216only might pay off. 1313application might pay off.
1217 1314
1218To simply include the whole unicode database, use: 1315To simply include the whole unicode database, use:
1219 1316
1220 --incglob '/unicore/**.pl' 1317 --incglob '/unicore/**.pl'
1221 1318
1258C<MAN3PODS> to be empty via the C<PERL_MM_OPT> environment variable. 1355C<MAN3PODS> to be empty via the C<PERL_MM_OPT> environment variable.
1259 1356
1260=item Gtk2 1357=item Gtk2
1261 1358
1262See Pango, same problems, same solution. 1359See Pango, same problems, same solution.
1360
1361=item Net::SSLeay
1362
1363This module hasn't been significantly updated since OpenSSL is called
1364OpenSSL, and fails to properly link against dependent libraries, most
1365commonly, it forgets to specify C<-ldl> when linking.
1366
1367On GNU/Linux systems this usually goes undetected, as perl usually links
1368against C<-ldl> itself and OpenSSL just happens to pick it up that way, by
1369chance.
1370
1371For static builds, you either have to configure C<-ldl> manually, or you
1372can use the following snippet in your C<postinstall> hook which patches
1373Net::SSLeay after installation, which happens to work most of the time:
1374
1375 postinstall() {
1376 # first install it
1377 instcpan Net::SSLeay
1378 # then add -ldl for future linking
1379 chmod u+w "$PERL_PREFIX"/lib/auto/Net/SSLeay/extralibs.ld
1380 echo " -ldl" >>"$PERL_PREFIX"/lib/auto/Net/SSLeay/extralibs.ld
1381 }
1263 1382
1264=item Pango 1383=item Pango
1265 1384
1266In addition to the C<MAN3PODS> problem in Glib, Pango also routes around 1385In addition to the C<MAN3PODS> problem in Glib, Pango also routes around
1267L<ExtUtils::MakeMaker> by compiling its files on its own. F<staticperl> 1386L<ExtUtils::MakeMaker> by compiling its files on its own. F<staticperl>
1335gains little. Why Socket exposes a C function that is in the core already 1454gains little. Why Socket exposes a C function that is in the core already
1336is anybody's guess. 1455is anybody's guess.
1337 1456
1338=back 1457=back
1339 1458
1459=head1 ADDITIONAL RESOURCES
1460
1461Some guy has made a repository on github
1462(L<https://github.com/gh0stwizard/staticperl-modules>) with some modules
1463patched to build with staticperl.
1464
1340=head1 AUTHOR 1465=head1 AUTHOR
1341 1466
1342 Marc Lehmann <schmorp@schmorp.de> 1467 Marc Lehmann <schmorp@schmorp.de>
1343 http://software.schmorp.de/pkg/staticperl.html 1468 http://software.schmorp.de/pkg/staticperl.html
1469

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines