home *** CD-ROM | disk | FTP | other *** search
Text File | 2000-03-15 | 49.3 KB | 1,602 lines |
- If you read this file _as_is_, just ignore the funny characters you
- see. It is written in the POD format (see perlpod manpage) which is
- specially designed to be readable as is.
-
- =head1 NAME
-
- perlos2 - Perl under OS/2, DOS, Win0.3*, Win0.95 and WinNT.
-
- =head1 SYNOPSIS
-
- One can read this document in the following formats:
-
- man perlos2
- view perl perlos2
- explorer perlos2.html
- info perlos2
-
- to list some (not all may be available simultaneously), or it may
- be read I<as is>: either as F<README.os2>, or F<pod/perlos2.pod>.
-
- To read the F<.INF> version of documentation (B<very> recommended)
- outside of OS/2, one needs an IBM's reader (may be available on IBM
- ftp sites (?) (URL anyone?)) or shipped with PC DOS 7.0 and IBM's
- Visual Age C++ 3.5.
-
- A copy of a Win* viewer is contained in the "Just add OS/2 Warp" package
-
- ftp://ftp.software.ibm.com/ps/products/os2/tools/jaow/jaow.zip
-
- in F<?:\JUST_ADD\view.exe>. This gives one an access to EMX's
- F<.INF> docs as well (text form is available in F</emx/doc> in
- EMX's distribution).
-
- Note that if you have F<lynx.exe> installed, you can follow WWW links
- from this document in F<.INF> format. If you have EMX docs installed
- correctly, you can follow library links (you need to have C<view emxbook>
- working by setting C<EMXBOOK> environment variable as it is described
- in EMX docs).
-
- =cut
-
- Contents
-
- perlos2 - Perl under OS/2, DOS, Win0.3*, Win0.95 and WinNT.
-
- NAME
- SYNOPSIS
- DESCRIPTION
- - Target
- - Other OSes
- - Prerequisites
- - Starting Perl programs under OS/2 (and DOS and...)
- - Starting OS/2 (and DOS) programs under Perl
- Frequently asked questions
- - I cannot run external programs
- - I cannot embed perl into my program, or use perl.dll from my program.
- - `` and pipe-open do not work under DOS.
- - Cannot start find.exe "pattern" file
- INSTALLATION
- - Automatic binary installation
- - Manual binary installation
- - Warning
- Accessing documentation
- - OS/2 .INF file
- - Plain text
- - Manpages
- - HTML
- - GNU info files
- - .PDF files
- - LaTeX docs
- BUILD
- - Prerequisites
- - Getting perl source
- - Application of the patches
- - Hand-editing
- - Making
- - Testing
- - Installing the built perl
- - a.out-style build
- Build FAQ
- - Some / became \ in pdksh.
- - 'errno' - unresolved external
- - Problems with tr
- - Some problem (forget which ;-)
- - Library ... not found
- - Segfault in make
- Specific (mis)features of EMX port
- - setpriority, getpriority
- - system()
- - extproc on the first line
- - Additional modules:
- - Prebuilt methods:
- - Misfeatures
- - Modifications
- Perl flavors
- - perl.exe
- - perl_.exe
- - perl__.exe
- - perl___.exe
- - Why strange names?
- - Why dynamic linking?
- - Why chimera build?
- ENVIRONMENT
- - PERLLIB_PREFIX
- - PERL_BADLANG
- - PERL_BADFREE
- - PERL_SH_DIR
- - TMP or TEMP
- Evolution
- - Priorities
- - DLL name mangling
- - Threading
- - Calls to external programs
- - Memory allocation
- - Threads
- AUTHOR
- SEE ALSO
-
- =head1 DESCRIPTION
-
- =head2 Target
-
- The target is to make OS/2 the best supported platform for
- using/building/developing Perl and I<Perl applications>, as well as
- make Perl the best language to use under OS/2. The secondary target is
- to try to make this work under DOS and Win* as well (but not B<too> hard).
-
- The current state is quite close to this target. Known limitations:
-
- =over 5
-
- =item *
-
- Some *nix programs use fork() a lot, but currently fork() is not
- supported after I<use>ing dynamically loaded extensions.
-
- =item *
-
- You need a separate perl executable F<perl__.exe> (see L<perl__.exe>)
- to use PM code in your application (like the forthcoming Perl/Tk).
-
- =item *
-
- There is no simple way to access WPS objects. The only way I know
- is via C<OS2::REXX> extension (see L<OS2::REXX>), and we do not have access to
- convenience methods of Object-REXX. (Is it possible at all? I know
- of no Object-REXX API.)
-
- =back
-
- Please keep this list up-to-date by informing me about other items.
-
- =head2 Other OSes
-
- Since OS/2 port of perl uses a remarkable EMX environment, it can
- run (and build extensions, and - possibly - be build itself) under any
- environment which can run EMX. The current list is DOS,
- DOS-inside-OS/2, Win0.3*, Win0.95 and WinNT. Out of many perl flavors,
- only one works, see L<"perl_.exe">.
-
- Note that not all features of Perl are available under these
- environments. This depends on the features the I<extender> - most
- probably RSX - decided to implement.
-
- Cf. L<Prerequisites>.
-
- =head2 Prerequisites
-
- =over 6
-
- =item EMX
-
- EMX runtime is required (may be substituted by RSX). Note that
- it is possible to make F<perl_.exe> to run under DOS without any
- external support by binding F<emx.exe>/F<rsx.exe> to it, see L<emxbind>. Note
- that under DOS for best results one should use RSX runtime, which
- has much more functions working (like C<fork>, C<popen> and so on). In
- fact RSX is required if there is no VCPI present. Note the
- RSX requires DPMI.
-
- Only the latest runtime is supported, currently C<0.9c>. Perl may run
- under earlier versions of EMX, but this is not tested.
-
- One can get different parts of EMX from, say
-
- ftp://ftp.cdrom.com/pub/os2/emx09c/
- ftp://hobbes.nmsu.edu/os2/unix/emx09c/
-
- The runtime component should have the name F<emxrt.zip>.
-
- B<NOTE>. It is enough to have F<emx.exe>/F<rsx.exe> on your path. One
- does not need to specify them explicitly (though this
-
- emx perl_.exe -de 0
-
- will work as well.)
-
- =item RSX
-
- To run Perl on DPMI platforms one needs RSX runtime. This is
- needed under DOS-inside-OS/2, Win0.3*, Win0.95 and WinNT (see
- L<"Other OSes">). RSX would not work with VCPI
- only, as EMX would, it requires DMPI.
-
- Having RSX and the latest F<sh.exe> one gets a fully functional
- B<*nix>-ish environment under DOS, say, C<fork>, C<``> and
- pipe-C<open> work. In fact, MakeMaker works (for static build), so one
- can have Perl development environment under DOS.
-
- One can get RSX from, say
-
- ftp://ftp.cdrom.com/pub/os2/emx09c/contrib
- ftp://ftp.uni-bielefeld.de/pub/systems/msdos/misc
- ftp://ftp.leo.org/pub/comp/os/os2/leo/devtools/emx+gcc/contrib
-
- Contact the author on C<rainer@mathematik.uni-bielefeld.de>.
-
- The latest F<sh.exe> with DOS hooks is available at
-
- ftp://ftp.math.ohio-state.edu/pub/users/ilya/os2/sh_dos.zip
-
- =item HPFS
-
- Perl does not care about file systems, but to install the whole perl
- library intact one needs a file system which supports long file names.
-
- Note that if you do not plan to build the perl itself, it may be
- possible to fool EMX to truncate file names. This is not supported,
- read EMX docs to see how to do it.
-
- =item pdksh
-
- To start external programs with complicated command lines (like with
- pipes in between, and/or quoting of arguments), Perl uses an external
- shell. With EMX port such shell should be named <sh.exe>, and located
- either in the wired-in-during-compile locations (usually F<F:/bin>),
- or in configurable location (see L<"PERL_SH_DIR">).
-
- For best results use EMX pdksh. The soon-to-be-available standard
- binary (5.2.12?) runs under DOS (with L<RSX>) as well, meanwhile use
- the binary from
-
- ftp://ftp.math.ohio-state.edu/pub/users/ilya/os2/sh_dos.zip
-
- =back
-
- =head2 Starting Perl programs under OS/2 (and DOS and...)
-
- Start your Perl program F<foo.pl> with arguments C<arg1 arg2 arg3> the
- same way as on any other platform, by
-
- perl foo.pl arg1 arg2 arg3
-
- If you want to specify perl options C<-my_opts> to the perl itself (as
- opposed to to your program), use
-
- perl -my_opts foo.pl arg1 arg2 arg3
-
- Alternately, if you use OS/2-ish shell, like CMD or 4os2, put
- the following at the start of your perl script:
-
- extproc perl -S -my_opts
-
- rename your program to F<foo.cmd>, and start it by typing
-
- foo arg1 arg2 arg3
-
- Note that because of stupid OS/2 limitations the full path of the perl
- script is not available when you use C<extproc>, thus you are forced to
- use C<-S> perl switch, and your script should be on path. As a plus
- side, if you know a full path to your script, you may still start it
- with
-
- perl ../../blah/foo.cmd arg1 arg2 arg3
-
- (note that the argument C<-my_opts> is taken care of by the C<extproc> line
- in your script, see L<C<extproc> on the first line>).
-
- To understand what the above I<magic> does, read perl docs about C<-S>
- switch - see L<perlrun>, and cmdref about C<extproc>:
-
- view perl perlrun
- man perlrun
- view cmdref extproc
- help extproc
-
- or whatever method you prefer.
-
- There are also endless possibilities to use I<executable extensions> of
- 4os2, I<associations> of WPS and so on... However, if you use
- *nixish shell (like F<sh.exe> supplied in the binary distribution),
- you need to follow the syntax specified in L<perlrun/"Switches">.
-
- Note that B<-S> switch enables a search with additional extensions
- F<.cmd>, F<.btm>, F<.bat>, F<.pl> as well.
-
- =head2 Starting OS/2 (and DOS) programs under Perl
-
- This is what system() (see L<perlfunc/system>), C<``> (see
- L<perlop/"I/O Operators">), and I<open pipe> (see L<perlfunc/open>)
- are for. (Avoid exec() (see L<perlfunc/exec>) unless you know what you
- do).
-
- Note however that to use some of these operators you need to have a
- sh-syntax shell installed (see L<"Pdksh">,
- L<"Frequently asked questions">), and perl should be able to find it
- (see L<"PERL_SH_DIR">).
-
- The cases when the shell is used are:
-
- =over
-
- =item 1
-
- One-argument system() (see L<perlfunc/system>), exec() (see L<perlfunc/exec>)
- with redirection or shell meta-characters;
-
- =item 2
-
- Pipe-open (see L<perlfunc/open>) with the command which contains redirection
- or shell meta-characters;
-
- =item 3
-
- Backticks C<``> (see L<perlop/"I/O Operators">) with the command which contains
- redirection or shell meta-characters;
-
- =item 4
-
- If the executable called by system()/exec()/pipe-open()/C<``> is a script
- with the "magic" C<#!> line or C<extproc> line which specifies shell;
-
- =item 5
-
- If the executable called by system()/exec()/pipe-open()/C<``> is a script
- without "magic" line, and C<$ENV{EXECSHELL}> is set to shell;
-
- =item 6
-
- If the executable called by system()/exec()/pipe-open()/C<``> is not
- found;
-
- =item 7
-
- For globbing (see L<perlfunc/glob>, L<perlop/"I/O Operators">).
-
- =back
-
- For the sake of speed for a common case, in the above algorithms
- backslashes in the command name are not considered as shell metacharacters.
-
- Perl starts scripts which begin with cookies
- C<extproc> or C<#!> directly, without an intervention of shell. Perl uses the
- same algorithm to find the executable as F<pdksh>: if the path
- on C<#!> line does not work, and contains C</>, then the executable
- is searched in F<.> and on C<PATH>. To find arguments for these scripts
- Perl uses a different algorithm than F<pdksh>: up to 3 arguments are
- recognized, and trailing whitespace is stripped.
-
- If a script
- does not contain such a cooky, then to avoid calling F<sh.exe>, Perl uses
- the same algorithm as F<pdksh>: if C<$ENV{EXECSHELL}> is set, the
- script is given as the first argument to this command, if not set, then
- C<$ENV{COMSPEC} /c> is used (or a hardwired guess if C<$ENV{COMSPEC}> is
- not set).
-
- If starting scripts directly, Perl will use exactly the same algorithm as for
- the search of script given by B<-S> command-line option: it will look in
- the current directory, then on components of C<$ENV{PATH}> using the
- following order of appended extensions: no extension, F<.cmd>, F<.btm>,
- F<.bat>, F<.pl>.
-
- Note that Perl will start to look for scripts only if OS/2 cannot start the
- specified application, thus C<system 'blah'> will not look for a script if
- there is an executable file F<blah.exe> I<anywhere> on C<PATH>.
-
- Note also that executable files on OS/2 can have an arbitrary extension,
- but F<.exe> will be automatically appended if no dot is present in the name.
- The workaround as as simple as that: since F<blah.> and F<blah> denote the
- same file, to start an executable residing in file F<n:/bin/blah> (no
- extension) give an argument C<n:/bin/blah.> to system().
-
- The last note is that currently it is not straightforward to start PM
- programs from VIO (=text-mode) Perl process and visa versa. Either ensure
- that shell will be used, as in C<system 'cmd /c epm'>, or start it using
- optional arguments to system() documented in C<OS2::Process> module. This
- is considered a bug and should be fixed soon.
-
-
- =head1 Frequently asked questions
-
- =head2 I cannot run external programs
-
- =over 4
-
- =item
-
- Did you run your programs with C<-w> switch? See
- L<Starting OS/2 (and DOS) programs under Perl>.
-
- =item
-
- Do you try to run I<internal> shell commands, like C<`copy a b`>
- (internal for F<cmd.exe>), or C<`glob a*b`> (internal for ksh)? You
- need to specify your shell explicitly, like C<`cmd /c copy a b`>,
- since Perl cannot deduce which commands are internal to your shell.
-
- =back
-
- =head2 I cannot embed perl into my program, or use F<perl.dll> from my
- program.
-
- =over 4
-
- =item Is your program EMX-compiled with C<-Zmt -Zcrtdll>?
-
- If not, you need to build a stand-alone DLL for perl. Contact me, I
- did it once. Sockets would not work, as a lot of other stuff.
-
- =item Did you use L<ExtUtils::Embed>?
-
- I had reports it does not work. Somebody would need to fix it.
-
- =back
-
- =head2 C<``> and pipe-C<open> do not work under DOS.
-
- This may a variant of just L<"I cannot run external programs">, or a
- deeper problem. Basically: you I<need> RSX (see L<"Prerequisites">)
- for these commands to work, and you may need a port of F<sh.exe> which
- understands command arguments. One of such ports is listed in
- L<"Prerequisites"> under RSX. Do not forget to set variable
- C<L<"PERL_SH_DIR">> as well.
-
- DPMI is required for RSX.
-
- =head2 Cannot start C<find.exe "pattern" file>
-
- Use one of
-
- system 'cmd', '/c', 'find "pattern" file';
- `cmd /c 'find "pattern" file'`
-
- This would start F<find.exe> via F<cmd.exe> via C<sh.exe> via
- C<perl.exe>, but this is a price to pay if you want to use
- non-conforming program. In fact F<find.exe> cannot be started at all
- using C library API only. Otherwise the following command-lines were
- equivalent:
-
- find "pattern" file
- find pattern file
-
- =head1 INSTALLATION
-
- =head2 Automatic binary installation
-
- The most convenient way of installing perl is via perl installer
- F<install.exe>. Just follow the instructions, and 99% of the
- installation blues would go away.
-
- Note however, that you need to have F<unzip.exe> on your path, and
- EMX environment I<running>. The latter means that if you just
- installed EMX, and made all the needed changes to F<Config.sys>,
- you may need to reboot in between. Check EMX runtime by running
-
- emxrev
-
- A folder is created on your desktop which contains some useful
- objects.
-
- B<Things not taken care of by automatic binary installation:>
-
- =over 15
-
- =item C<PERL_BADLANG>
-
- may be needed if you change your codepage I<after> perl installation,
- and the new value is not supported by EMX. See L<"PERL_BADLANG">.
-
- =item C<PERL_BADFREE>
-
- see L<"PERL_BADFREE">.
-
- =item F<Config.pm>
-
- This file resides somewhere deep in the location you installed your
- perl library, find it out by
-
- perl -MConfig -le "print $INC{'Config.pm'}"
-
- While most important values in this file I<are> updated by the binary
- installer, some of them may need to be hand-edited. I know no such
- data, please keep me informed if you find one.
-
- =back
-
- B<NOTE>. Because of a typo the binary installer of 5.00305
- would install a variable C<PERL_SHPATH> into F<Config.sys>. Please
- remove this variable and put C<L<PERL_SH_DIR>> instead.
-
- =head2 Manual binary installation
-
- As of version 5.00305, OS/2 perl binary distribution comes split
- into 11 components. Unfortunately, to enable configurable binary
- installation, the file paths in the zip files are not absolute, but
- relative to some directory.
-
- Note that the extraction with the stored paths is still necessary
- (default with unzip, specify C<-d> to pkunzip). However, you
- need to know where to extract the files. You need also to manually
- change entries in F<Config.sys> to reflect where did you put the
- files. Note that if you have some primitive unzipper (like
- pkunzip), you may get a lot of warnings/errors during
- unzipping. Upgrade to C<(w)unzip>.
-
- Below is the sample of what to do to reproduce the configuration on my
- machine:
-
- =over 3
-
- =item Perl VIO and PM executables (dynamically linked)
-
- unzip perl_exc.zip *.exe *.ico -d f:/emx.add/bin
- unzip perl_exc.zip *.dll -d f:/emx.add/dll
-
- (have the directories with C<*.exe> on PATH, and C<*.dll> on
- LIBPATH);
-
- =item Perl_ VIO executable (statically linked)
-
- unzip perl_aou.zip -d f:/emx.add/bin
-
- (have the directory on PATH);
-
- =item Executables for Perl utilities
-
- unzip perl_utl.zip -d f:/emx.add/bin
-
- (have the directory on PATH);
-
- =item Main Perl library
-
- unzip perl_mlb.zip -d f:/perllib/lib
-
- If this directory is preserved, you do not need to change
- anything. However, for perl to find it if it is changed, you need to
- C<set PERLLIB_PREFIX> in F<Config.sys>, see L<"PERLLIB_PREFIX">.
-
- =item Additional Perl modules
-
- unzip perl_ste.zip -d f:/perllib/lib/site_perl
-
- If you do not change this directory, do nothing. Otherwise put this
- directory and subdirectory F<./os2> in C<PERLLIB> or C<PERL5LIB>
- variable. Do not use C<PERL5LIB> unless you have it set already. See
- L<perl/"ENVIRONMENT">.
-
- =item Tools to compile Perl modules
-
- unzip perl_blb.zip -d f:/perllib/lib
-
- If this directory is preserved, you do not need to change
- anything. However, for perl to find it if it is changed, you need to
- C<set PERLLIB_PREFIX> in F<Config.sys>, see L<"PERLLIB_PREFIX">.
-
- =item Manpages for Perl and utilities
-
- unzip perl_man.zip -d f:/perllib/man
-
- This directory should better be on C<MANPATH>. You need to have a
- working man to access these files.
-
- =item Manpages for Perl modules
-
- unzip perl_mam.zip -d f:/perllib/man
-
- This directory should better be on C<MANPATH>. You need to have a
- working man to access these files.
-
- =item Source for Perl documentation
-
- unzip perl_pod.zip -d f:/perllib/lib
-
- This is used by by C<perldoc> program (see L<perldoc>), and may be used to
- generate HTML documentation usable by WWW browsers, and
- documentation in zillions of other formats: C<info>, C<LaTeX>,
- C<Acrobat>, C<FrameMaker> and so on.
-
- =item Perl manual in F<.INF> format
-
- unzip perl_inf.zip -d d:/os2/book
-
- This directory should better be on C<BOOKSHELF>.
-
- =item Pdksh
-
- unzip perl_sh.zip -d f:/bin
-
- This is used by perl to run external commands which explicitly
- require shell, like the commands using I<redirection> and I<shell
- metacharacters>. It is also used instead of explicit F</bin/sh>.
-
- Set C<PERL_SH_DIR> (see L<"PERL_SH_DIR">) if you move F<sh.exe> from
- the above location.
-
- B<Note.> It may be possible to use some other sh-compatible shell
- (I<not tested>).
-
- =back
-
- After you installed the components you needed and updated the
- F<Config.sys> correspondingly, you need to hand-edit
- F<Config.pm>. This file resides somewhere deep in the location you
- installed your perl library, find it out by
-
- perl -MConfig -le "print $INC{'Config.pm'}"
-
- You need to correct all the entries which look like file paths (they
- currently start with C<f:/>).
-
- =head2 B<Warning>
-
- The automatic and manual perl installation leave precompiled paths
- inside perl executables. While these paths are overwriteable (see
- L<"PERLLIB_PREFIX">, L<"PERL_SH_DIR">), one may get better results by
- binary editing of paths inside the executables/DLLs.
-
- =head1 Accessing documentation
-
- Depending on how you built/installed perl you may have (otherwise
- identical) Perl documentation in the following formats:
-
- =head2 OS/2 F<.INF> file
-
- Most probably the most convenient form. Under OS/2 view it as
-
- view perl
- view perl perlfunc
- view perl less
- view perl ExtUtils::MakeMaker
-
- (currently the last two may hit a wrong location, but this may improve
- soon). Under Win* see L<"SYNOPSIS">.
-
- If you want to build the docs yourself, and have I<OS/2 toolkit>, run
-
- pod2ipf > perl.ipf
-
- in F</perllib/lib/pod> directory, then
-
- ipfc /inf perl.ipf
-
- (Expect a lot of errors during the both steps.) Now move it on your
- BOOKSHELF path.
-
- =head2 Plain text
-
- If you have perl documentation in the source form, perl utilities
- installed, and GNU groff installed, you may use
-
- perldoc perlfunc
- perldoc less
- perldoc ExtUtils::MakeMaker
-
- to access the perl documentation in the text form (note that you may get
- better results using perl manpages).
-
- Alternately, try running pod2text on F<.pod> files.
-
- =head2 Manpages
-
- If you have man installed on your system, and you installed perl
- manpages, use something like this:
-
- man perlfunc
- man 3 less
- man ExtUtils.MakeMaker
-
- to access documentation for different components of Perl. Start with
-
- man perl
-
- Note that dot (F<.>) is used as a package separator for documentation
- for packages, and as usual, sometimes you need to give the section - C<3>
- above - to avoid shadowing by the I<less(1) manpage>.
-
- Make sure that the directory B<above> the directory with manpages is
- on our C<MANPATH>, like this
-
- set MANPATH=c:/man;f:/perllib/man
-
- =head2 HTML
-
- If you have some WWW browser available, installed the Perl
- documentation in the source form, and Perl utilities, you can build
- HTML docs. Cd to directory with F<.pod> files, and do like this
-
- cd f:/perllib/lib/pod
- pod2html
-
- After this you can direct your browser the file F<perl.html> in this
- directory, and go ahead with reading docs, like this:
-
- explore file:///f:/perllib/lib/pod/perl.html
-
- Alternatively you may be able to get these docs prebuilt from CPAN.
-
- =head2 GNU C<info> files
-
- Users of Emacs would appreciate it very much, especially with
- C<CPerl> mode loaded. You need to get latest C<pod2info> from C<CPAN>,
- or, alternately, prebuilt info pages.
-
- =head2 F<.PDF> files
-
- for C<Acrobat> are available on CPAN (for slightly old version of
- perl).
-
- =head2 C<LaTeX> docs
-
- can be constructed using C<pod2latex>.
-
- =head1 BUILD
-
- Here we discuss how to build Perl under OS/2. There is an alternative
- (but maybe older) view on L<http://www.shadow.net/~troc/os2perl.html>.
-
- =head2 Prerequisites
-
- You need to have the latest EMX development environment, the full
- GNU tool suite (gawk renamed to awk, and GNU F<find.exe>
- earlier on path than the OS/2 F<find.exe>, same with F<sort.exe>, to
- check use
-
- find --version
- sort --version
-
- ). You need the latest version of F<pdksh> installed as F<sh.exe>.
-
- Check that you have B<BSD> libraries and headers installed, and -
- optionally - Berkeley DB headers and libraries, and crypt.
-
- Possible locations to get this from are
-
- ftp://hobbes.nmsu.edu/os2/unix/
- ftp://ftp.cdrom.com/pub/os2/unix/
- ftp://ftp.cdrom.com/pub/os2/dev32/
- ftp://ftp.cdrom.com/pub/os2/emx09c/
-
- It is reported that the following archives contain enough utils to
- build perl: gnufutil.zip, gnusutil.zip, gnututil.zip, gnused.zip,
- gnupatch.zip, gnuawk.zip, gnumake.zip and ksh527rt.zip. Note that
- all these utilities are known to be available from LEO:
-
- ftp://ftp.leo.org/pub/comp/os/os2/leo/gnu
-
- Make sure that no copies or perl are currently running. Later steps
- of the build may fail since an older version of perl.dll loaded into
- memory may be found.
-
- Also make sure that you have F</tmp> directory on the current drive,
- and F<.> directory in your C<LIBPATH>. One may try to correct the
- latter condition by
-
- set BEGINLIBPATH .
-
- if you use something like F<CMD.EXE> or latest versions of F<4os2.exe>.
-
- Make sure your gcc is good for C<-Zomf> linking: run C<omflibs>
- script in F</emx/lib> directory.
-
- Check that you have link386 installed. It comes standard with OS/2,
- but may be not installed due to customization. If typing
-
- link386
-
- shows you do not have it, do I<Selective install>, and choose C<Link
- object modules> in I<Optional system utilities/More>. If you get into
- link386, press C<Ctrl-C>.
-
- =head2 Getting perl source
-
- You need to fetch the latest perl source (including developers
- releases). With some probability it is located in
-
- http://www.perl.com/CPAN/src/5.0
- http://www.perl.com/CPAN/src/5.0/unsupported
-
- If not, you may need to dig in the indices to find it in the directory
- of the current maintainer.
-
- Quick cycle of developers release may break the OS/2 build time to
- time, looking into
-
- http://www.perl.com/CPAN/ports/os2/ilyaz/
-
- may indicate the latest release which was publicly released by the
- maintainer. Note that the release may include some additional patches
- to apply to the current source of perl.
-
- Extract it like this
-
- tar vzxf perl5.00409.tar.gz
-
- You may see a message about errors while extracting F<Configure>. This is
- because there is a conflict with a similarly-named file F<configure>.
-
- Change to the directory of extraction.
-
- =head2 Application of the patches
-
- You need to apply the patches in F<./os2/diff.*> like this:
-
- gnupatch -p0 < os2\diff.configure
-
- You may also need to apply the patches supplied with the binary
- distribution of perl.
-
- Note also that the F<db.lib> and F<db.a> from the EMX distribution
- are not suitable for multi-threaded compile (note that currently perl
- is not multithread-safe, but is compiled as multithreaded for
- compatibility with XFree86-OS/2). Get a corrected one from
-
- ftp://ftp.math.ohio-state.edu/pub/users/ilya/os2/db_mt.zip
-
- To make C<-p> filetest work, one may also need to apply the following patch
- to EMX headers:
-
- --- /emx/include/sys/stat.h.orig Thu May 23 13:48:16 1996
- +++ /emx/include/sys/stat.h Sun Jul 12 14:11:32 1998
- @@ -53,7 +53,7 @@ struct stat
- #endif
-
- #if !defined (S_IFMT)
- -#define S_IFMT 0160000 /* Mask for file type */
- +#define S_IFMT 0170000 /* Mask for file type */
- #define S_IFIFO 0010000 /* Pipe */
- #define S_IFCHR 0020000 /* Character device */
- #define S_IFDIR 0040000 /* Directory */
-
-
- =head2 Hand-editing
-
- You may look into the file F<./hints/os2.sh> and correct anything
- wrong you find there. I do not expect it is needed anywhere.
-
- =head2 Making
-
- sh Configure -des -D prefix=f:/perllib
-
- C<prefix> means: where to install the resulting perl library. Giving
- correct prefix you may avoid the need to specify C<PERLLIB_PREFIX>,
- see L<"PERLLIB_PREFIX">.
-
- I<Ignore the message about missing C<ln>, and about C<-c> option to
- tr>. In fact if you can trace where the latter spurious warning
- comes from, please inform me.
-
- Now
-
- make
-
- At some moment the built may die, reporting a I<version mismatch> or
- I<unable to run F<perl>>. This means that most of the build has been
- finished, and it is the time to move the constructed F<perl.dll> to
- some I<absolute> location in LIBPATH. After this is done the build
- should finish without a lot of fuss. I<One can avoid the interruption
- if one has the correct prebuilt version of F<perl.dll> on LIBPATH, but
- probably this is not needed anymore, since F<miniperl.exe> is linked
- statically now.>
-
- Warnings which are safe to ignore: I<mkfifo() redefined> inside
- F<POSIX.c>.
-
- =head2 Testing
-
- If you haven't yet moved perl.dll onto LIBPATH, do it now (alternatively, if
- you have a previous perl installation you'd rather not disrupt until this one
- is installed, copy perl.dll to the t directory).
-
- Now run
-
- make test
-
- All tests should succeed (with some of them skipped). Note that on one
- of the systems I see intermittent failures of F<io/pipe.t> subtest 9.
- Any help to track what happens with this test is appreciated.
-
- Some tests may generate extra messages similar to
-
- =over 4
-
- =item A lot of C<bad free>
-
- in database tests related to Berkeley DB. This is a confirmed bug of
- DB. You may disable this warnings, see L<"PERL_BADFREE">.
-
- There is not much we can do with it (but apparently it does not cause
- any real error with data).
-
- =item Process terminated by SIGTERM/SIGINT
-
- This is a standard message issued by OS/2 applications. *nix
- applications die in silence. It is considered a feature. One can
- easily disable this by appropriate sighandlers.
-
- However the test engine bleeds these message to screen in unexpected
- moments. Two messages of this kind I<should> be present during
- testing.
-
- =back
-
- Two F<lib/io_*> tests may generate popups (system error C<SYS3175>),
- but should succeed anyway. This is due to a bug of EMX related to
- fork()ing with dynamically loaded libraries.
-
- I submitted a patch to EMX which makes it possible to fork() with EMX
- dynamic libraries loaded, which makes F<lib/io*> tests pass without
- skipping offended tests. This means that soon the number of skipped tests
- may decrease yet more.
-
- To get finer test reports, call
-
- perl t/harness
-
- The report with F<io/pipe.t> failing may look like this:
-
- Failed Test Status Wstat Total Fail Failed List of failed
- ------------------------------------------------------------
- io/pipe.t 12 1 8.33% 9
- 7 tests skipped, plus 56 subtests skipped.
- Failed 1/195 test scripts, 99.49% okay. 1/6542 subtests failed, 99.98% okay.
-
- The reasons for most important skipped tests are:
-
- =over 8
-
- =item F<op/fs.t>
-
- =over 4
-
- =item 18
-
- Checks C<atime> and C<mtime> of C<stat()> - unfortunately, HPFS
- provides only 2sec time granularity (for compatibility with FAT?).
-
- =item 25
-
- Checks C<truncate()> on a filehandle just opened for write - I do not
- know why this should or should not work.
-
- =back
-
- =item F<lib/io_pipe.t>
-
- Checks C<IO::Pipe> module. Some feature of EMX - test fork()s with
- dynamic extension loaded - unsupported now.
-
- =item F<lib/io_sock.t>
-
- Checks C<IO::Socket> module. Some feature of EMX - test fork()s
- with dynamic extension loaded - unsupported now.
-
- =item F<op/stat.t>
-
- Checks C<stat()>. Tests:
-
- =over 4
-
- =item 4
-
- Checks C<atime> and C<mtime> of C<stat()> - unfortunately, HPFS
- provides only 2sec time granularity (for compatibility with FAT?).
-
- =back
-
- =item F<lib/io_udp.t>
-
- It never terminates, apparently some bug in storing the last socket from
- which we obtained a message.
-
- =back
-
- =head2 Installing the built perl
-
- If you haven't yet moved perl.dll onto LIBPATH, do it now.
-
- Run
-
- make install
-
- It would put the generated files into needed locations. Manually put
- F<perl.exe>, F<perl__.exe> and F<perl___.exe> to a location on your
- PATH, F<perl.dll> to a location on your LIBPATH.
-
- Run
-
- make cmdscripts INSTALLCMDDIR=d:/ir/on/path
-
- to convert perl utilities to F<.cmd> files and put them on
- PATH. You need to put F<.EXE>-utilities on path manually. They are
- installed in C<$prefix/bin>, here C<$prefix> is what you gave to
- F<Configure>, see L<Making>.
-
- =head2 C<a.out>-style build
-
- Proceed as above, but make F<perl_.exe> (see L<"perl_.exe">) by
-
- make perl_
-
- test and install by
-
- make aout_test
- make aout_install
-
- Manually put F<perl_.exe> to a location on your PATH.
-
- Since C<perl_> has the extensions prebuilt, it does not suffer from
- the I<dynamic extensions + fork()> syndrome, thus the failing tests
- look like
-
- Failed Test Status Wstat Total Fail Failed List of failed
- ---------------------------------------------------------------
- io/fs.t 26 11 42.31% 2-5, 7-11, 18, 25
- op/stat.t 56 5 8.93% 3-4, 20, 35, 39
- Failed 2/118 test scripts, 98.31% okay. 16/2445 subtests failed, 99.35% okay.
-
- B<Note.> The build process for C<perl_> I<does not know> about all the
- dependencies, so you should make sure that anything is up-to-date,
- say, by doing
-
- make perl.dll
-
- first.
-
- =head1 Build FAQ
-
- =head2 Some C</> became C<\> in pdksh.
-
- You have a very old pdksh. See L<Prerequisites>.
-
- =head2 C<'errno'> - unresolved external
-
- You do not have MT-safe F<db.lib>. See L<Prerequisites>.
-
- =head2 Problems with tr or sed
-
- reported with very old version of tr and sed.
-
- =head2 Some problem (forget which ;-)
-
- You have an older version of F<perl.dll> on your LIBPATH, which
- broke the build of extensions.
-
- =head2 Library ... not found
-
- You did not run C<omflibs>. See L<Prerequisites>.
-
- =head2 Segfault in make
-
- You use an old version of GNU make. See L<Prerequisites>.
-
- =head1 Specific (mis)features of OS/2 port
-
- =head2 C<setpriority>, C<getpriority>
-
- Note that these functions are compatible with *nix, not with the older
- ports of '94 - 95. The priorities are absolute, go from 32 to -95,
- lower is quicker. 0 is the default priority.
-
- =head2 C<system()>
-
- Multi-argument form of C<system()> allows an additional numeric
- argument. The meaning of this argument is described in
- L<OS2::Process>.
-
- =head2 C<extproc> on the first line
-
- If the first chars of a script are C<"extproc ">, this line is treated
- as C<#!>-line, thus all the switches on this line are processed (twice
- if script was started via cmd.exe).
-
- =head2 Additional modules:
-
- L<OS2::Process>, L<OS2::REXX>, L<OS2::PrfDB>, L<OS2::ExtAttr>. These
- modules provide access to additional numeric argument for C<system>
- and to the list of the running processes,
- to DLLs having functions with REXX signature and to REXX runtime, to
- OS/2 databases in the F<.INI> format, and to Extended Attributes.
-
- Two additional extensions by Andreas Kaiser, C<OS2::UPM>, and
- C<OS2::FTP>, are included into my ftp directory, mirrored on CPAN.
-
- =head2 Prebuilt methods:
-
- =over 4
-
- =item C<File::Copy::syscopy>
-
- used by C<File::Copy::copy>, see L<File::Copy>.
-
- =item C<DynaLoader::mod2fname>
-
- used by C<DynaLoader> for DLL name mangling.
-
- =item C<Cwd::current_drive()>
-
- Self explanatory.
-
- =item C<Cwd::sys_chdir(name)>
-
- leaves drive as it is.
-
- =item C<Cwd::change_drive(name)>
-
-
- =item C<Cwd::sys_is_absolute(name)>
-
- means has drive letter and is_rooted.
-
- =item C<Cwd::sys_is_rooted(name)>
-
- means has leading C<[/\\]> (maybe after a drive-letter:).
-
- =item C<Cwd::sys_is_relative(name)>
-
- means changes with current dir.
-
- =item C<Cwd::sys_cwd(name)>
-
- Interface to cwd from EMX. Used by C<Cwd::cwd>.
-
- =item C<Cwd::sys_abspath(name, dir)>
-
- Really really odious function to implement. Returns absolute name of
- file which would have C<name> if CWD were C<dir>. C<Dir> defaults to the
- current dir.
-
- =item C<Cwd::extLibpath([type])>
-
- Get current value of extended library search path. If C<type> is
- present and I<true>, works with END_LIBPATH, otherwise with
- C<BEGIN_LIBPATH>.
-
- =item C<Cwd::extLibpath_set( path [, type ] )>
-
- Set current value of extended library search path. If C<type> is
- present and I<true>, works with END_LIBPATH, otherwise with
- C<BEGIN_LIBPATH>.
-
- =back
-
- (Note that some of these may be moved to different libraries -
- eventually).
-
-
- =head2 Misfeatures
-
- =over 4
-
- =item
-
- Since L<flock(3)> is present in EMX, but is not functional, it is
- emulated by perl. To disable the emulations, set environment variable
- C<USE_PERL_FLOCK=0>.
-
- =item
-
- Here is the list of things which may be "broken" on
- EMX (from EMX docs):
-
- =over
-
- =item *
-
- The functions L<recvmsg(3)>, L<sendmsg(3)>, and L<socketpair(3)> are not
- implemented.
-
- =item *
-
- L<sock_init(3)> is not required and not implemented.
-
- =item *
-
- L<flock(3)> is not yet implemented (dummy function). (Perl has a workaround.)
-
- =item *
-
- L<kill(3)>: Special treatment of PID=0, PID=1 and PID=-1 is not implemented.
-
- =item *
-
- L<waitpid(3)>:
-
- WUNTRACED
- Not implemented.
- waitpid() is not implemented for negative values of PID.
-
- =back
-
- Note that C<kill -9> does not work with the current version of EMX.
-
- =item
-
- Since F<sh.exe> is used for globing (see L<perlfunc/glob>), the bugs
- of F<sh.exe> plague perl as well.
-
- In particular, uppercase letters do not work in C<[...]>-patterns with
- the current pdksh.
-
- =back
-
- =head2 Modifications
-
- Perl modifies some standard C library calls in the following ways:
-
- =over 9
-
- =item C<popen>
-
- C<my_popen> uses F<sh.exe> if shell is required, cf. L<"PERL_SH_DIR">.
-
- =item C<tmpnam>
-
- is created using C<TMP> or C<TEMP> environment variable, via
- C<tempnam>.
-
- =item C<tmpfile>
-
- If the current directory is not writable, file is created using modified
- C<tmpnam>, so there may be a race condition.
-
- =item C<ctermid>
-
- a dummy implementation.
-
- =item C<stat>
-
- C<os2_stat> special-cases F</dev/tty> and F</dev/con>.
-
- =item C<flock>
-
- Since L<flock(3)> is present in EMX, but is not functional, it is
- emulated by perl. To disable the emulations, set environment variable
- C<USE_PERL_FLOCK=0>.
-
- =back
-
- =head1 Perl flavors
-
- Because of idiosyncrasies of OS/2 one cannot have all the eggs in the
- same basket (though EMX environment tries hard to overcome this
- limitations, so the situation may somehow improve). There are 4
- executables for Perl provided by the distribution:
-
- =head2 F<perl.exe>
-
- The main workhorse. This is a chimera executable: it is compiled as an
- C<a.out>-style executable, but is linked with C<omf>-style dynamic
- library F<perl.dll>, and with dynamic CRT DLL. This executable is a
- VIO application.
-
- It can load perl dynamic extensions, and it can fork(). Unfortunately,
- with the current version of EMX it cannot fork() with dynamic
- extensions loaded (may be fixed by patches to EMX).
-
- B<Note.> Keep in mind that fork() is needed to open a pipe to yourself.
-
- =head2 F<perl_.exe>
-
- This is a statically linked C<a.out>-style executable. It can fork(),
- but cannot load dynamic Perl extensions. The supplied executable has a
- lot of extensions prebuilt, thus there are situations when it can
- perform tasks not possible using F<perl.exe>, like fork()ing when
- having some standard extension loaded. This executable is a VIO
- application.
-
- B<Note.> A better behaviour could be obtained from C<perl.exe> if it
- were statically linked with standard I<Perl extensions>, but
- dynamically linked with the I<Perl DLL> and CRT DLL. Then it would
- be able to fork() with standard extensions, I<and> would be able to
- dynamically load arbitrary extensions. Some changes to Makefiles and
- hint files should be necessary to achieve this.
-
- I<This is also the only executable with does not require OS/2.> The
- friends locked into C<M$> world would appreciate the fact that this
- executable runs under DOS, Win0.3*, Win0.95 and WinNT with an
- appropriate extender. See L<"Other OSes">.
-
- =head2 F<perl__.exe>
-
- This is the same executable as F<perl___.exe>, but it is a PM
- application.
-
- B<Note.> Usually STDIN, STDERR, and STDOUT of a PM
- application are redirected to C<nul>. However, it is possible to see
- them if you start C<perl__.exe> from a PM program which emulates a
- console window, like I<Shell mode> of Emacs or EPM. Thus it I<is
- possible> to use Perl debugger (see L<perldebug>) to debug your PM
- application.
-
- This flavor is required if you load extensions which use PM, like
- the forthcoming C<Perl/Tk>.
-
- =head2 F<perl___.exe>
-
- This is an C<omf>-style executable which is dynamically linked to
- F<perl.dll> and CRT DLL. I know no advantages of this executable
- over C<perl.exe>, but it cannot fork() at all. Well, one advantage is
- that the build process is not so convoluted as with C<perl.exe>.
-
- It is a VIO application.
-
- =head2 Why strange names?
-
- Since Perl processes the C<#!>-line (cf.
- L<perlrun/DESCRIPTION>, L<perlrun/Switches>,
- L<perldiag/"Not a perl script">,
- L<perldiag/"No Perl script found in input">), it should know when a
- program I<is a Perl>. There is some naming convention which allows
- Perl to distinguish correct lines from wrong ones. The above names are
- almost the only names allowed by this convention which do not contain
- digits (which have absolutely different semantics).
-
- =head2 Why dynamic linking?
-
- Well, having several executables dynamically linked to the same huge
- library has its advantages, but this would not substantiate the
- additional work to make it compile. The reason is stupid-but-quick
- "hard" dynamic linking used by OS/2.
-
- The address tables of DLLs are patched only once, when they are
- loaded. The addresses of entry points into DLLs are guaranteed to be
- the same for all programs which use the same DLL, which reduces the
- amount of runtime patching - once DLL is loaded, its code is
- read-only.
-
- While this allows some performance advantages, this makes life
- terrible for developers, since the above scheme makes it impossible
- for a DLL to be resolved to a symbol in the .EXE file, since this
- would need a DLL to have different relocations tables for the
- executables which use it.
-
- However, a Perl extension is forced to use some symbols from the perl
- executable, say to know how to find the arguments provided on the perl
- internal evaluation stack. The solution is that the main code of
- interpreter should be contained in a DLL, and the F<.EXE> file just loads
- this DLL into memory and supplies command-arguments.
-
- This I<greatly> increases the load time for the application (as well as
- the number of problems during compilation). Since interpreter is in a DLL,
- the CRT is basically forced to reside in a DLL as well (otherwise
- extensions would not be able to use CRT).
-
- =head2 Why chimera build?
-
- Current EMX environment does not allow DLLs compiled using Unixish
- C<a.out> format to export symbols for data. This forces C<omf>-style
- compile of F<perl.dll>.
-
- Current EMX environment does not allow F<.EXE> files compiled in
- C<omf> format to fork(). fork() is needed for exactly three Perl
- operations:
-
- =over 4
-
- =item explicit fork()
-
- in the script, and
-
- =item open FH, "|-"
-
- =item open FH, "-|"
-
- opening pipes to itself.
-
- =back
-
- While these operations are not questions of life and death, a lot of
- useful scripts use them. This forces C<a.out>-style compile of
- F<perl.exe>.
-
-
- =head1 ENVIRONMENT
-
- Here we list environment variables with are either OS/2- and DOS- and
- Win*-specific, or are more important under OS/2 than under other OSes.
-
- =head2 C<PERLLIB_PREFIX>
-
- Specific for EMX port. Should have the form
-
- path1;path2
-
- or
-
- path1 path2
-
- If the beginning of some prebuilt path matches F<path1>, it is
- substituted with F<path2>.
-
- Should be used if the perl library is moved from the default
- location in preference to C<PERL(5)LIB>, since this would not leave wrong
- entries in @INC. Say, if the compiled version of perl looks for @INC
- in F<f:/perllib/lib>, and you want to install the library in
- F<h:/opt/gnu>, do
-
- set PERLLIB_PREFIX=f:/perllib/lib;h:/opt/gnu
-
- =head2 C<PERL_BADLANG>
-
- If 1, perl ignores setlocale() failing. May be useful with some
- strange I<locale>s.
-
- =head2 C<PERL_BADFREE>
-
- If 1, perl would not warn of in case of unwarranted free(). May be
- useful in conjunction with the module DB_File, since Berkeley DB
- memory handling code is buggy.
-
- =head2 C<PERL_SH_DIR>
-
- Specific for EMX port. Gives the directory part of the location for
- F<sh.exe>.
-
- =head2 C<USE_PERL_FLOCK>
-
- Specific for EMX port. Since L<flock(3)> is present in EMX, but is not
- functional, it is emulated by perl. To disable the emulations, set
- environment variable C<USE_PERL_FLOCK=0>.
-
- =head2 C<TMP> or C<TEMP>
-
- Specific for EMX port. Used as storage place for temporary files, most
- notably C<-e> scripts.
-
- =head1 Evolution
-
- Here we list major changes which could make you by surprise.
-
- =head2 Priorities
-
- C<setpriority> and C<getpriority> are not compatible with earlier
- ports by Andreas Kaiser. See C<"setpriority, getpriority">.
-
- =head2 DLL name mangling
-
- With the release 5.003_01 the dynamically loadable libraries
- should be rebuilt. In particular, DLLs are now created with the names
- which contain a checksum, thus allowing workaround for OS/2 scheme of
- caching DLLs.
-
- =head2 Threading
-
- As of release 5.003_01 perl is linked to multithreaded CRT
- DLL. If perl itself is not compiled multithread-enabled, so will not be perl
- malloc(). However, extensions may use multiple thread on their own
- risk.
-
- Needed to compile C<Perl/Tk> for XFree86-OS/2 out-of-the-box.
-
- =head2 Calls to external programs
-
- Due to a popular demand the perl external program calling has been
- changed wrt Andreas Kaiser's port. I<If> perl needs to call an
- external program I<via shell>, the F<f:/bin/sh.exe> will be called, or
- whatever is the override, see L<"PERL_SH_DIR">.
-
- Thus means that you need to get some copy of a F<sh.exe> as well (I
- use one from pdksh). The drive F<F:> above is set up automatically during
- the build to a correct value on the builder machine, but is
- overridable at runtime,
-
- B<Reasons:> a consensus on C<perl5-porters> was that perl should use
- one non-overridable shell per platform. The obvious choices for OS/2
- are F<cmd.exe> and F<sh.exe>. Having perl build itself would be impossible
- with F<cmd.exe> as a shell, thus I picked up C<sh.exe>. Thus assures almost
- 100% compatibility with the scripts coming from *nix. As an added benefit
- this works as well under DOS if you use DOS-enabled port of pdksh
- (see L<"Prerequisites">).
-
- B<Disadvantages:> currently F<sh.exe> of pdksh calls external programs
- via fork()/exec(), and there is I<no> functioning exec() on
- OS/2. exec() is emulated by EMX by asyncroneous call while the caller
- waits for child completion (to pretend that the C<pid> did not change). This
- means that 1 I<extra> copy of F<sh.exe> is made active via fork()/exec(),
- which may lead to some resources taken from the system (even if we do
- not count extra work needed for fork()ing).
-
- Note that this a lesser issue now when we do not spawn F<sh.exe>
- unless needed (metachars found).
-
- One can always start F<cmd.exe> explicitly via
-
- system 'cmd', '/c', 'mycmd', 'arg1', 'arg2', ...
-
- If you need to use F<cmd.exe>, and do not want to hand-edit thousands of your
- scripts, the long-term solution proposed on p5-p is to have a directive
-
- use OS2::Cmd;
-
- which will override system(), exec(), C<``>, and
- C<open(,'...|')>. With current perl you may override only system(),
- readpipe() - the explicit version of C<``>, and maybe exec(). The code
- will substitute the one-argument call to system() by
- C<CORE::system('cmd.exe', '/c', shift)>.
-
- If you have some working code for C<OS2::Cmd>, please send it to me,
- I will include it into distribution. I have no need for such a module, so
- cannot test it.
-
- For the details of the current situation with calling external programs,
- see L<Starting OS/2 (and DOS) programs under Perl>.
-
- =over
-
- =item
-
- External scripts may be called by name. Perl will try the same extensions
- as when processing B<-S> command-line switch.
-
- =back
-
- =head2 Memory allocation
-
- Perl uses its own malloc() under OS/2 - interpreters are usually malloc-bound
- for speed, but perl is not, since its malloc is lightning-fast.
- Perl-memory-usage-tuned benchmarks show that Perl's malloc is 5 times quickier
- than EMX one. I do not have convincing data about memory footpring, but
- a (pretty random) benchmark showed that Perl one is 5% better.
-
- Combination of perl's malloc() and rigid DLL name resolution creates
- a special problem with library functions which expect their return value to
- be free()d by system's free(). To facilitate extensions which need to call
- such functions, system memory-allocation functions are still available with
- the prefix C<emx_> added. (Currently only DLL perl has this, it should
- propagate to F<perl_.exe> shortly.)
-
- =head2 Threads
-
- One can build perl with thread support enabled by providing C<-D usethreads>
- option to F<Configure>. Currently OS/2 support of threads is very
- preliminary.
-
- Most notable problems:
-
- =over
-
- =item C<COND_WAIT>
-
- may have a race condition. Needs a reimplementation (in terms of chaining
- waiting threads, with linker list stored in per-thread structure?).
-
- =item F<os2.c>
-
- has a couple of static variables used in OS/2-specific functions. (Need to be
- moved to per-thread structure, or serialized?)
-
- =back
-
- Note that these problems should not discourage experimenting, since they
- have a low probability of affecting small programs.
-
- =cut
-
- OS/2 extensions
- ~~~~~~~~~~~~~~~
- I include 3 extensions by Andreas Kaiser, OS2::REXX, OS2::UPM, and OS2::FTP,
- into my ftp directory, mirrored on CPAN. I made
- some minor changes needed to compile them by standard tools. I cannot
- test UPM and FTP, so I will appreciate your feedback. Other extensions
- there are OS2::ExtAttr, OS2::PrfDB for tied access to EAs and .INI
- files - and maybe some other extensions at the time you read it.
-
- Note that OS2 perl defines 2 pseudo-extension functions
- OS2::Copy::copy and DynaLoader::mod2fname (many more now, see
- L<Prebuilt methods>).
-
- The -R switch of older perl is deprecated. If you need to call a REXX code
- which needs access to variables, include the call into a REXX compartment
- created by
- REXX_call {...block...};
-
- Two new functions are supported by REXX code,
- REXX_eval 'string';
- REXX_eval_with 'string', REXX_function_name => \&perl_sub_reference;
-
- If you have some other extensions you want to share, send the code to
- me. At least two are available: tied access to EA's, and tied access
- to system databases.
-
- =head1 AUTHOR
-
- Ilya Zakharevich, ilya@math.ohio-state.edu
-
- =head1 SEE ALSO
-
- perl(1).
-
- =cut
-
-