perlctrl - Convert Perl program into an ActiveX control
perlctrl [options] perlscript
perlctrl [options] project
perlctrl
perlctrl --help
perlctrl --version
The PerlCtrl utility converts a Perl program into an ActiveX control. This utility combines a Perl program, all of the required Perl modules and a modified Perl interpreter into one binary unit. When the resulting control is run, it searches for modules within itself before searching the filesystem.
Most commonly, PerlCtrl is invoked with the name of the Perl program that you want converted as an argument. This produces a working control. Some of the options described below make it possible to control which modules are included and how the generated control behaves.
The generated control must also be registered with the operating system. This is accomplished using the regsvr32.exe utility.
If PerlCtrl is invoked without arguments, the graphical interface is
displayed. If invoked with the --version or --help option, it will print
the corresponding message and exit.
The following command-line options are supported. Options can be abbreviated for uniqueness (shortened only to the point that they are still distinct from other options).
@, then PerlCtrl
replaces each one of these with the arguments parsed from the corresponding
file.
perlctrl mycontrol.pl --add IO::Socket --add XML::Parser::Expat
...would include IO::Socket and XML::Parser in your control.
The --add option supports the following wildcard notations: --add
Module::* includes Module::Foo, but neither Module itself nor
Module::Foo::Bar. --add Module::** includes Module::Foo and
Module::Foo::Bar, but not Module. --add Module:: works the same as
--add Module;Module::**, including all of Module, Module::Foo and
Module::Foo::Bar. Note that you may have to quote the * character to
prevent wildcard expansion by your command shell.
PerlCtrl::get_bound_file() and
PerlCtrl::extract_bound_file() functions. Separate multiple filenames with
semicolons. This option can be repeated.
Additional options can be specified after the filename, within brackets and separated by commas:
name[option1,option2,...]
Valid options are:
data. If neither file nor data is specified, then the
bound name is used as the filesystem name as well.
file.
TEMP directory upon control start. It
is deleted when the control terminates. The extraction directory is added to
the PATH environment variable. It is also added to the front of @INC.
extract
option or the PerlCtrl::extract_bound_file() function. File permissions must
be specified as an octal number (0555 by default); PerlCtrl implicitly calls
chmod() after extracting the file to make sure it ends up with the right
permission bits. The mode= prefix is optional.
Examples:
--bind PerlEz.dll[file=\perl\bin\PerlEz.dll,extract]
--bind data.txt[text,0777]
Note: Files bound using the extract suboption of --bind or extracted
via PerlCtrl::extract_bound_file() are written to a a per-process temporary
directory and are automatically deleted when the process ends. This occurs
regardless of whether the --clean option is used.
--lib, but it searches for a MakeMaker-like blib directory
structure starting in libpath and working back up to five levels of '..'. If
found, it adds both the lib and the arch part of the blib structure to
the module search path.
Put() method of the parameter to
change the caller's value of the argument. However, simple assignment to the
parameter variable is not propagated back to the caller.
The special port name ':komodo' provides support for remote debugging with
the ActiveState Komodo IDE (version 1.2 and later,
http://www.ActiveState.com/Komodo). Komodo uses a custom version of
perl5db.pl. The path to this file must be made available to the control
either via the PERL5LIB environment variable (for dependent controls) or via
the --lib PerlCtrl command-line option (for freestanding controls). For
example:
perlctrl --lib /path-to/komodo-1.2/perl/site/lib ...
Refer to the Komodo Remote Debugging documentation for additional information.
Modules loaded from the directories specified with a --lib or --blib
option are still included. This allows you to selectively include only some
non-standard modules in your PerlCtrl generated control.
If the argument for --exe ends with .app (i.e. is a Mac OS X
application), the --gui option is implied.
Multiple modules can be separated by whitespace or semi-colons. The special
value all will make PerlCtrl explain all files it includes.
--dependent option to
built a non-freestanding control.
perlctrl --help FUNCTIONS
perlctrl --help bind
The filename given must be an .ico, .dll or .exe filename. For
.dll and .exe files, the name can be followed by a comma and the icon
number. The first icon in the file is ,0, the second ,1, etc. If the
icon number is not provided, then ,0 is assumed. Separated multiple
filenames with semicolons. This option can be repeated.
All values are taken as strings except FileVersion and ProductVersion,
which must be in the form 'W.X.Y.Z' (where W, X, Y, and Z are numbers in the
range 0-65535. X, Y, and Z are optional and default to 0).
PATH environment variable. This option can be repeated.
PerlCtrl will automatically add architecture and version specific
subdirectories the same way the Perl -I option and the Perl lib pragma
do.
The content of the PERL5LIB environment variable is automatically added via
an implicit --lib option.
--runlib option because
the default runlib location is the directory where the application is stored.
--gui option on OS X changes this to
<Application>.app/Contents/MacOS/.
The --norunlib option can be used to specify that no runlib directory should
be used.
The runlib directory is also used to locate shared library files specified
using the --use option.
The fully qualified path to the runlib directory is stored in the
$PerlCtrl::RUNLIB variable.
This option is being used to create a shared library that can be referenced by
other applications with the --use option.
The --shared option must be used to grant other programs access to modules
bundled in the current executable.
If no --script option is specified, the argument to PerlCtrl is assumed
to be the input script filename. Thus
perlctrl mycontrol.pl
...is equivalent to:
perlctrl --script mycontrol.pl
The "private" mode allows applications built with the same PDK license to access any bundled modules. This means that part of the license serial number is encoded in the generated executable. The accessing application must then also be built using the "private" sharing mode to enable serial number matching.
Shared libraries built with the "public" sharing mode can be accessed by all executables built by the PDK without restriction.
%TypeLib template to STDOUT. This also includes 3 new GUIDs that
are used by COM to uniquely identify the control. Do not cut and paste this
section from an old control.
perlctrl --template > mycontrol.pl
Note: PerlCtrl does not automatically create this directory; it must exist before the control is run.
Multiple modules can be separated by whitespace or a semicolon. This option can be repeated.
The --trim option supports the following wildcard notations: --trim
Module::* excludes Module::Foo, but neither Module itself nor
Module::Foo::Bar. --trim Module::** excludes Module::Foo and
Module::Foo::Bar, but not Module. --trim Module:: works the same as
--trim Module;Module::**, excluding all of Module, Module::Foo and
Module::Foo::Bar. Note that you may have to quote the * character to
prevent wildcard expansion by your command shell.
If a command explicitly adds and removes modules at the same time, modules
added with --add will not be removed by --trim. The one exception to
this rule is that modules added by the wildcard form of --add can be
individually removed by using the non-wildcard form of --trim. For example
--add Module::* --trim Module::Bar will bundle Module::Foo but not
Module::Bar.
attributes
Errno
File::Glob
PerlIO
PerlIO::scalar
Tie::Hash::NamedCapture
You can also use the --trim option to exclude these modules on a one-by-one
basis.
The libname argument can be specified using a full path name. At runtime,
the library is located in the runtime library directory specified by the
--runlib option. If the library cannot be found, the executable will not
run.
If the shared library has been built as a "private" shared library, the
application that is using it must be built with the "private" --shared
option too.
Separte multiple libnames with semicolons. The option can be repeated.
Output lines prefixed with +++ are modules that were included. Lines
prefixed with --- are dependent modules that were not included.
The --verbose option automatically enables --warnings as well.
The following functions are made available to the control created by
PerlCtrl. They are available via the PerlApp:: namespace in addition to
PerlCtrl::, to simplify sharing modules between PerlApp applications and
PerlCtrl controls.
my $datafile = "data.txt";
my $filename = PerlCtrl::extract_bound_file($datafile);
die "$datafile not bound to control\n" unless defined $filename;
open(my $fh, $filename) or die "Can't open $datafile($filename)\n";
If the file is not bound, no file is created and extract_bound_file()
returns undef.
extract_bound_file() always writes files in binmode. Therefore files
bound with the [text] option are extracted with \n and not \r\n line
endings.
--bind
command-line option. Returns the whole file as a single string in scalar
context or separate lines in list context, in which case lines are always split
on newline (i.e. $/ is not considered).
foreach my $line (PerlCtrl::get_bound_file("data.txt")) {
# ... process $line ...
}
If the file is not bound, get_bound_file() returns undef in scalar
context or the empty list in list context.
The following registry functions are only available inside PerlCtrl. They
are not included in PerlApp or PerlSvc. Therefore they are only available
via the PerlCtrl:: namespace.
undef on failure.
The following root keys are predefined: PerlCtrl::HKEY_CLASSES_ROOT,
PerlCtrl::HKEY_CURRENT_USER and PerlCtrl::HKEY_LOCAL_MACHINE.
undef on failure.
undef. Returns a boolean value indicating success
or failure of the operation.
PerlCtrl defines the following constants for the TYPE argument:
PerlCtrl::REG_SZ, PerlCtrl::REG_EXPAND_SZ, PerlCtrl::REG_BINARY and
PerlCtrl::REG_DWORD.
The following predefined variables are available to the control created by PerlCtrl.
All PerlCtrl:: variables documented here are also available via the
PerlApp:: namespace
$PerlCtrl::BUILD variable contains the PerlCtrl build number.
$PerlCtrl::PERL5LIB variable contains the value of the PERL5LIB
environment variable. If that does not exist, it contains the value of the
PERLLIB environment variable. If that one does not exists either,
$PerlCtrl::PERL5LIB is undef.
$PerlCtrl::RUNLIB variable contains the fully qualified path name to the
runtime library directory specified by the --runlib option. If the
--norunlib option is used, this variable is undef.
$PerlCtrl::TOOL variable contains the string: "PerlCtrl", indicating
that the currently running executable has been produced by the PerlCtrl
tool.
$PerlCtrl::VERSION variable contains the PerlCtrl version number:
"major.minor.release", but not including the build number.
When the control built with PerlCtrl runs, it extracts its dynamic object
files in the pdk-username subdirectory of the temporary directory. The
temporary directory is located using the TEMP environment variable. It is
also possible to hardcode the location with the --tmpdir command-line
option.
If the control was built using the --clean option, PerlCtrl also appends the
process id to the username when creating the temporary directory (e.g.,
pdk-username-1234). This avoids race conditions during cleanup. Unless the
--clean option is used, extracted files are left behind when the control
terminates. They are reused by later incarnations of the same control (or by
other PDK-created executables).
PerlCtrl uses the PERLCTRL_OPT environment variable to set default
command-line options. PerlCtrl treats these options as if they were
specified at the beginning of every PerlCtrl command line. Note: Perl must
be in your PATH if you want to use PERLCTRL_OPT.
PerlCtrl creates temporary files in the directory specified by the TEMP
environment variable.
All directories specified in the PERL5LIB environment variable are treated
as if they had been specified with the --lib command-line option. Therefore
modules located in PERL5LIB directories will be included even in dependent
controls. If PERL5LIB is not set, PerlCtrl will use the value of
PERLLIB instead (just like regular Perl).
PerlCtrl will pipe the output of perlctrl --help through the program
specified in the PAGER environment variable if STDOUT is a terminal.
The following environment variables are not visible to the control built with
PerlCtrl: PERL5LIB, PERLLIB, PERL5OPT, PERL5DB and
PERL5SHELL.
The temporary extraction directory is automatically added to the PATH
environment variable when a file is bound using the [extract] option.
When PerlCtrl can't locate a module that seems to be used or required by the control, it produces an error message:
VMS\Stdio.pm:
warn: Can't locate VMS\Stdio.pm
refby: C:\perl\lib\File\Temp.pm
In general, PerlCtrl cannot determine whether a module is absolutely needed at runtime. For the error message above, looking at the source code of the File::Temp module reveals that the VMS::Stdio module is only used on the VMS platform:
require VMS::Stdio if $^O eq 'VMS';
It is therefore safe to ignore the error. PerlCtrl includes a number of platform-specific rules telling it that certain dependencies are likely not required. In those cases, the error messages are downgraded to a warning. In all other cases it is the responsibility of the user to verify if the module is needed or not. PerlCtrl still generates a valid executable, even while this error message is displayed.
It is possible to suppress the error/warning message by explicitly excluding
the missing module with the --trim option:
--trim VMS::Stdio
Windows uses case-insensitive filesystems. It is often possible to misspell a module name and still have Perl load the correct file. For example:
use Win32::Eventlog;
...loads the Win32::EventLog module, but it does not import any
symbols from it: Perl tries to call the
Win32::Eventlog->import() method, which doesn't exist, and
gives up. PerlCtrl on Windows generates an error when
the file name and the module name cases don't match:
Win32\Eventlog.pm:
error: Case mismatch between module and file name
file: C:\perl\site\lib\Win32\EventLog.pm
auto\Win32\Eventlog\Eventlog.dll:
error: Case mismatch between module and file name
file: C:\perl\site\lib\auto\Win32\EventLog\EventLog.dll
It is important to either correct the wrong spelling in the program or rename the file on disk to the correct name as PerlCtrl internally uses a case-sensitive file name lookup and otherwise does not load the file at runtime.
PerlCtrl sometimes needs to include additional module-specific data files.
When the module is installed both into the standard Perl library tree and into
an additional location added either via the --lib option or PERL5LIB
environment variable, the data file will be found twice (but only included
once). The same problem can happen when the standard Perl library directories
are specified again using --lib or PERL5LIB. The error message should
display both the original and the duplicate filenames:
Tk\srcfile.xpm:
error: Skipping duplicate file D:\perl\site\lib\Tk\srcfile.xpm
file: C:\perl\site\lib\Tk\srcfile.xpm
Please make sure that you don't include modules from a library created for a different version of Perl unless you are sure that it is binary compatible.
This section answers some frequently asked questions about PerlCtrl.
The first thing PerlCtrl needs to do is to determine which modules and
external files the converted script depends upon. The PerlCtrl program
starts out by scanning the source code of the script. When it finds occurrences
of use, do or require, it tries to locate the corresponding module and
then parse the source of that module. This continues as long as PerlCtrl
finds new modules to examine.
PerlCtrl does not try to run the script. It will not automatically determine which modules might be loaded by a statement such as:
require $module;
In cases like this, try listing additional modules to traverse with the
--add option.
The PerlCtrl program has some built-in heuristics for major Perl modules
that determine additional modules at runtime, like DBI, LWP, Tk.
PerlCtrl anticipates which additional modules are required so that they are
available in freestanding executables.
PerlCtrl then decides which modules to include in the generated control.
Normally, all located modules are included. This also includes the dynamic
object files (.so/.dll) and AutoLoader files (.al) that go with the located
modules. If the --dependent option is used, only modules located under the
directories given by the --lib option are included.
Finally, the control is built with all the modules compressed (unless the
--nocompress option is used) and included. When the control runs it arranges
for any use, do and require statements to look for and extract the
corresponding modules in itself.
It can check for the $PerlCtrl::VERSION variable. It will be set to the
version number of PerlCtrl that was used to build the executable.
It will always have the value: perl. The $^X is a special variable that
normally contains the filename of the Perl interpreter that is executing the
script. It is sometimes used in calls to system or exec to invoke perl from
within the script.
No. PerlCtrl does not support modules using source filters (e.g. Switch, Filter::Util, and Filter::cpp). See perlfilter in the ActivePerl documentation or 'perldoc perlfilter' for more information on source filters in perl.
Visit http://www.ActiveState.com/Products/Perl_Dev_Kit/ to obtain a license for PDK 8.1.
The control built with PerlCtrl running with an evaluation license expires
when the evaluation license times out. Use the --version option to view the
time limit of your current license.
perl(1)
PerlCtrl is part of the Perl Dev Kit. More information available at http://www.activestate.com/perl_dev_kit
This manpage documents PerlCtrl version 8.1.0 (build 291424)
Copyright (C) 1998-2009 ActiveState Software Inc. All rights reserved.