--- App-Staticperl/staticperl.pod 2010/12/09 08:55:52 1.17 +++ App-Staticperl/staticperl.pod 2010/12/13 17:25:17 1.22 @@ -42,6 +42,10 @@ that contains perl and 100 modules such as POSIX, AnyEvent, EV, IO::AIO, Coro and so on. Or any other choice of modules. +To see how this turns out, you can try out smallperl and bigperl, two +pre-built static and compressed perl binaries with many and even more +modules: just follow the links at L. + The created files do not need write access to the file system (like PAR does). In fact, since this script is in many ways similar to PAR::Packer, here are the differences: @@ -113,17 +117,19 @@ except everything is compiled in), or you create bundle files (basically C sources you can use to embed all files into your project). -This step is very fast (a few seconds if PPI is not used for stripping, -more seconds otherwise, as PPI is very slow), and can be tweaked and -repeated as often as necessary. +This step is very fast (a few seconds if PPI is not used for stripping, or +the stripped files are in the cache), and can be tweaked and repeated as +often as necessary. =head1 THE F SCRIPT This module installs a script called F into your perl -binary directory. The script is fully self-contained, and can be used -without perl (for example, in an uClibc chroot environment). In fact, -it can be extracted from the C distribution tarball as -F, without any installation. +binary directory. The script is fully self-contained, and can be +used without perl (for example, in an uClibc chroot environment). In +fact, it can be extracted from the C distribution +tarball as F, without any installation. The +newest (possibly alpha) version can also be downloaded from +L. F interprets the first argument as a command to execute, optionally followed by any parameters. @@ -155,6 +161,10 @@ =over 4 +=item F + +Prints some info about the version of the F script you are using. + =item F Runs only the download and unpack phase, unless this has already happened. @@ -288,6 +298,44 @@ order given on the command line (that affects the C<--use> and C<--eval> options at the moment). +=head3 PACKAGE SELECTION WORKFLOW + +F has a number of options to control package +selection. This section describes how they interact with each other. Also, +since I am still a newbie w.r.t. these issues, maybe future versions of +F will change this, so watch out :) + +The idiom "in order" means "in order that they are specified on the +commandline". If you use a bundle specification file, then the options +will be processed as if they were given in place of the bundle file name. + +=over 4 + +=item 1. apply all C<--use>, C<--eval>, C<--add>, C<--addbin> and +C<--incglob> options, in order. + +In addition, C<--use> and C<--eval> dependencies will be added when the +options are processed. + +=item 2. apply all C<--include> and C<--exclude> options, in order. + +All this step does is potentially reduce the number of files already +selected or found in phase 1. + +=item 3. find all modules (== F<.pm> files), gather their static archives +(F<.a>) and AutoLoader splitfiles (F<.ix> and F<.al> files), find any +extra libraries they need for linking (F) and optionally +evaluate any F<.packlist> files. + +This step is required to link against XS extensions and also adds files +required for L to do it's job. + +=back + +After this, all the files selected for bundling will be read and processed +(stripped), the bundle files will be written, and optionally a new F +or application binary will be linked. + =head3 MKBUNDLE OPTIONS =over 4 @@ -309,11 +357,12 @@ pod documentation, which is very fast and reduces file size a lot. The C method uses L to parse and condense the perl sources. This -saves a lot more than just L, and is generally safer, but -is also a lot slower, so is best used for production builds. Note that -this method doesn't optimise for raw file size, but for best compression -(that means that the uncompressed file size is a bit larger, but the files -compress better, e.g. with F). +saves a lot more than just L, and is generally safer, +but is also a lot slower (some files take almost a minute to strip - +F maintains a cache of stripped files to speed up subsequent +runs for this reason). Note that this method doesn't optimise for raw file +size, but for best compression (that means that the uncompressed file size +is a bit larger, but the files compress better, e.g. with F). Last not least, if you need accurate line numbers in error messages, or in the unlikely case where C is too slow, or some module gets @@ -417,7 +466,41 @@ the perl interpreter executes scripts given on the command line (or via C<-e>). This works even in an embedded interpreter. -=item --add "file" | --add "file alias" +=item --usepacklist + +Read F<.packlist> files for each distribution that happens to match a +module name you specified. Sounds weird, and it is, so expect semantics to +change somehow in the future. + +The idea is that most CPAN distributions have a F<.pm> file that matches +the name of the distribution (which is rather reasonable after all). + +If this switch is enabled, then if any of the F<.pm> files that have been +selected match an install distribution, then all F<.pm>, F<.pl>, F<.al> +and F<.ix> files installed by this distribution are also included. + +For example, using this switch, when the L module is specified, then +all L submodules that have been installed via the CPAN distribution +are included as well, so you don't have to manually specify them. + +=item --incglob pattern + +This goes through all library directories and tries to match any F<.pm> +and F<.pl> files against the extended glob pattern (see below). If a file +matches, it is added. This switch will automatically detect L +files and the required link libraries for XS modules, but it will I +scan the file for dependencies (at the moment). + +This is mainly useful to include "everything": + + --incglob '*' + +Or to include perl libraries, or trees of those, such as the unicode +database files needed by many other modules: + + --incglob '/unicore/**.pl' + +=item --add file | --add "file alias" Adds the given (perl) file into the bundle (and optionally call it "alias"). This is useful to include any custom files into the bundle. @@ -433,7 +516,7 @@ add file2 myfiles/file2 add file3 myfiles/file3 -=item --binadd "file" | --add "file alias" +=item --binadd file | --add "file alias" Just like C<--add>, except that it treats the file as binary and adds it without any processing. @@ -445,6 +528,19 @@ You can later get a copy of these files by calling C. +=item --include pattern | -i pattern | --exclude pattern | -x pattern + +These two options define an include/exclude filter that is used after all +files selected by the other options have been found. Each include/exclude +is applied to all files found so far - an include makes sure that the +given files will be part of the resulting file set, an exclude will +exclude files. The patterns are "extended glob patterns" (see below). + +For example, to include everything, except C modules, but still +include F, you could use this: + + --incglob '*' -i '/Devel/PPPort.pm' -x '/Devel/**' + =item --static When C<--perl> is also given, link statically instead of dynamically. The @@ -458,6 +554,24 @@ executables, or try the C<--staticlibs> option to link only some libraries statically. +=item --staticlib libname + +When not linking fully statically, this option allows you to link specific +libraries statically. What it does is simply replace all occurances of +C<-llibname> with the GCC-specific C<-Wl,-Bstatic -llibname -Wl,-Bdynamic> +option. + +This will have no effect unless the library is actually linked against, +specifically, C<--staticlib> will not link against the named library +unless it would be linked against anyway. + +Example: link libcrypt statically into the binary. + + staticperl mkperl -MIO::AIO --staticlib crypt + + # ldopts might nwo contain: + # -lm -Wl,-Bstatic -lcrypt -Wl,-Bdynamic -lpthread + =item any other argument Any other argument is interpreted as a bundle specification file, which @@ -465,18 +579,62 @@ =back +=head3 EXTENDED GLOB PATTERNS + +Some options of F expect an I. This is neither a normal shell glob nor a regex, but something +in between. The idea has been copied from rsync, and there are the current +matching rules: + +=over 4 + +=item Patterns starting with F will be a anchored at the root of the library tree. + +That is, F will match the F directory in C<@INC>, but +nothing inside, and neither any other file or directory called F +anywhere else in the hierarchy. + +=item Patterns not starting with F will be anchored at the end of the path. + +That is, F will match any file called F anywhere in the +hierarchy, but not any directories of the same name. + +=item A F<*> matches any single component. + +That is, F would match all F<.pl> files directly inside +C, not any deeper level F<.pl> files. Or in other words, F<*> +will not match slashes. + +=item A F<**> matches anything. + +That is, F would match all F<.pl> files under F, +no matter how deeply nested they are inside subdirectories. + +=item A F matches a single character within a component. + +That is, F matches F, but not the +hypothetical F, as F does not match F. + +=back + =head2 F CONFIGURATION AND HOOKS -During (each) startup, F tries to source the following shell -files in order: +During (each) startup, F tries to source some shell files to +allow you to fine-tune/override configuration settings. + +In them you can override shell variables, or define shell functions +("hooks") to be called at specific phases during installation. For +example, you could define a C hook to install additional +modules from CPAN each time you start from scratch. + +If the env variable C<$STATICPERLRC> is set, then F will try +to source the file named with it only. Otherwise, it tries the following +shell files in order: /etc/staticperlrc ~/.staticperlrc $STATICPERL/rc -They can be used to override shell variables, or define functions to be -called at specific phases. - Note that the last file is erased during F, so generally should not be used. @@ -547,7 +705,7 @@ (C<-Duse64bitint>), or disable large files support (-Uuselargefiles), to reduce filesize further. -=item C, C, C, C +=item C, C, C, C, C These flags are passed to perl's F script, and are generally optimised for small size (at the cost of performance). Since they also @@ -803,24 +961,20 @@ Some functionality in the utf8 module, such as swash handling (used for unicode character ranges in regexes) is implemented in the -C<"utf8_heavy.pl"> library. +C<"utf8_heavy.pl"> library: + + -M'"utf8_heavy.pl"' Many Unicode properties in turn are defined in separate modules, such as C<"unicore/Heavy.pl"> and more specific data tables such as -C<"unicore/To/Digit.pl"> or C<"unicore/lib/Perl/Word.pl">. These -tables are big (7MB uncompressed), so including them on demand by your -applciation only might pay off. - -=item Carp +C<"unicore/To/Digit.pl"> or C<"unicore/lib/Perl/Word.pl">. These tables +are big (7MB uncompressed, although F contains special +handling for those files), so including them on demand by your application +only might pay off. -Carp had (in older versions of perl) a dependency on L. As of -perl 5.12.2 (maybe earlier), this dependency no longer exists. +To simply include the whole unicode database, use: -=item Config - -The F switch (as well as many modules) needs L, which in -turn might need L<"Config_heavy.pl">. Including the latter gives you -both. + --incglob '/unicore/*.pl' =item AnyEvent @@ -835,11 +989,30 @@ functions), you also need to include C<"AnyEvent/Util/idna.pl"> and C<"AnyEvent/Util/uts46data.pl">. +Or you can use C<--usepacklist> and specify C<-MAnyEvent> to include +everything. + +=item Carp + +Carp had (in older versions of perl) a dependency on L. As of +perl 5.12.2 (maybe earlier), this dependency no longer exists. + +=item Config + +The F switch (as well as many modules) needs L, which in +turn might need L<"Config_heavy.pl">. Including the latter gives you +both. + +=item Term::ReadLine::Perl + +Also needs L, or C<--usepacklist>. + =item URI URI implements schemes as separate modules - the generic URL scheme is implemented in L, HTTP is implemented in L. If -you need to use any of these schemes, you should include these manually. +you need to use any of these schemes, you should include these manually, +or use C<--usepacklist>. =back @@ -847,6 +1020,13 @@ =over 4 +=item Linking everything in + +To link just about everything installed in the perl library into a new +perl, try this: + + staticperl mkperl --strip ppi --incglob '*' + =item Getting rid of netdb function The perl core has lots of netdb functions (C, C @@ -875,7 +1055,7 @@ } This mostly gains space when linking staticaly, as the functions will -liekly not be linked in. The gain for dynamically-linked binaries is +likely not be linked in. The gain for dynamically-linked binaries is smaller. Also, this leaves C in - not only is it actually used