1# vim: syntax=pod 2 3If you read this file _as_is_, just ignore the funny characters you 4see. It is written in the POD format (see pod/perlpod.pod) which is 5specially designed to be readable as is. 6 7=head1 NAME 8 9perlwin32 - Perl under Windows 10 11=head1 SYNOPSIS 12 13These are instructions for building Perl under Windows 7 and later. 14 15=head1 DESCRIPTION 16 17Before you start, you should glance through the README file 18found in the top-level directory to which the Perl distribution 19was extracted. Make sure you read and understand the terms under 20which this software is being distributed. 21 22Also make sure you read L</BUGS AND CAVEATS> below for the 23known limitations of this port. 24 25The INSTALL file in the perl top-level has much information that is 26only relevant to people building Perl on Unix-like systems. In 27particular, you can safely ignore any information that talks about 28"Configure". 29 30You may also want to look at one other option for building a perl that 31will work on Windows: the README.cygwin file, which give a different 32set of rules to build a perl for Windows. This method will probably 33enable you to build a more Unix-compatible perl, but you will also 34need to download and use various other build-time and run-time support 35software described in that file. 36 37This set of instructions is meant to describe a so-called "native" 38port of Perl to the Windows platform. This includes both 32-bit and 3964-bit Windows operating systems. The resulting Perl requires no 40additional software to run (other than what came with your operating 41system). Currently, this port is capable of using one of the 42following compilers on the Intel x86 and x86_64 architectures: 43 44 Microsoft Visual C++ version 12.0 or later 45 Intel C++ Compiler (experimental) 46 Gcc by mingw.org gcc version 3.4.5-5.3.0 47 Gcc by mingw-w64.org gcc version 4.4.3 or later 48 49Note that the last two of these are actually competing projects both 50delivering complete gcc toolchain for MS Windows: 51 52=over 4 53 54=item L<https://osdn.net/projects/mingw/> 55 56Delivers gcc toolchain building 32-bit executables (which can be used both 32 and 64 bit Windows platforms) 57 58=item L<https://mingw-w64.org> 59 60Delivers gcc toolchain targeting both 64-bit Windows and 32-bit Windows 61platforms (despite the project name "mingw-w64" they are not only 64-bit 62oriented). They deliver the native gcc compilers and cross-compilers 63that are also supported by perl's makefile. 64 65=back 66 67The Microsoft Visual C++ compilers are also now being given away free. They 68are available as "Visual C++ 2013-2022 Community Edition" and are the same 69compilers that ship with "Visual C++ 2013-2022 Professional". 70 71Visual C++ 2013 is capable of B<targeting> XP and Windows Server 2003 but the 72build host requirement is Windows 7/Windows Server 2012. For more details see 73https://docs.microsoft.com/en-us/visualstudio/productinfo/vs2013-compatibility-vs 74and 75https://docs.microsoft.com/en-us/visualstudio/productinfo/vs2013-sysrequirements-vs 76 77The MinGW64 compiler is available at L<https://mingw-w64.org>. 78The latter is actually a cross-compiler targeting Win64. There's also a trimmed 79down compiler (no java, or gfortran) suitable for building perl available at: 80L<https://strawberryperl.com/package/kmx/64_gcctoolchain/> 81 82NOTE: If you're using a 32-bit compiler to build perl on a 64-bit Windows 83operating system, then you should set the WIN64 environment variable to "undef". 84Also, the trimmed down compiler only passes tests when USE_ITHREADS *= define 85(as opposed to undef) and when the CFG *= Debug line is commented out. 86 87This port fully supports MakeMaker (the set of modules that 88is used to build extensions to perl). Therefore, you should be 89able to build and install most extensions found in the CPAN sites. 90See L</Usage Hints for Perl on Windows> below for general hints about this. 91 92=head2 Setting Up Perl on Windows 93 94=over 4 95 96=item Make 97 98You need a "make" program to build the sources. If you are using 99Visual C++, you can use nmake supplied with Visual C++. 100You may also use gmake instead of nmake. Builds using gcc need 101gmake. nmake is not supported for gcc builds. Parallel building is only 102supported with gmake, not nmake. 103 104=item Command Shell 105 106Use the default "cmd" shell that comes with Windows. Some versions of the 107popular 4DOS/NT shell have incompatibilities that may cause you trouble. 108If the build fails under that shell, try building again with the cmd 109shell. 110 111Make sure the path to the build directory does not contain spaces. The 112build usually works in this circumstance, but some tests will fail. 113 114=item Microsoft Visual C++ 115 116The nmake that comes with Visual C++ will suffice for building. Visual C++ 117requires that certain things be set up in the console before Visual C++ will 118successfully run. To make a console box be able to run the C compiler, you will 119need to beforehand, run C<vcvarsall.bat x86> to compile for x86-32 and for 120x86-64 C<vcvarsall.bat amd64>. On a typical install of a Microsoft C++ 121compiler product, these batch files will already be in your C<PATH> 122environment variable so you may just type them without an absolute path into 123your console. If you need to find the absolute path to the batch file, it is 124usually found somewhere like 125C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC. 126With some newer Microsoft C products (released after ~2004), the installer will 127put a shortcut in the start menu to launch a new console window with the 128console already set up for your target architecture (x86-32 or x86-64 or IA64). 129With the newer compilers, you may also use the older batch files if you choose 130so. 131 132=item Microsoft Visual C++ 2013-2022 Community Edition 133 134These free versions of Visual C++ 2013-2022 Professional contain the same 135compilers and linkers that ship with the full versions, and also contain 136everything necessary to build Perl. 137 138These packages can be downloaded from L<https://visualstudio.microsoft.com/>. 139 140Install Visual C++ 2013-2022 Community, then setup your environment 141using, e.g. 142 143F<C:\Program Files\Microsoft Visual Studio 12.0\Common7\Tools\vsvars32.bat> 144 145(assuming the default installation location was chosen). 146 147Perl should now build using the F<win32/Makefile>. You will need to edit that 148file to set C<CCTYPE> to one of C<MSVC120>-C<MSVC143> first. 149 150=item Microsoft C++ Build Tools 151 152There's also a standalone (IDE-less) version of the build tools mentioned 153above containing the MSVC compiler available for download from 154L<https://visualstudio.microsoft.com/visual-cpp-build-tools/>. 155 156This is also referred to as I<Build Tools for Visual Studio>. 157 158=item GCC 159 160Perl can be compiled with gcc from MinGW (version 3.4.5 or later) or from 161MinGW64 (version 4.4.3 or later). It can be downloaded here: 162 163L<https://osdn.net/projects/mingw/> 164L<https://www.mingw-w64.org/> 165 166You also need gmake. Usually it comes with MinGW but its executable may have 167a different name, such as mingw32-make.exe. 168 169Note that the MinGW build currently fails with version 6.3.0 or later. 170 171Note also that the C++ mode build currently fails with MinGW 3.4.5 and 4.7.2 172or later, and with MinGW64 64-bit 6.3.0 or later. 173 174=item Intel C++ Compiler 175 176Experimental support for using Intel C++ Compiler has been added. Edit 177F<win32/Makefile> and pick the correct C<CCTYPE> for the Visual C that Intel C 178was installed into. Also uncomment C<__ICC> to enable Intel C on Visual C support. 179To set up the build environment, from the Start Menu run 180IA-32 Visual Studio 20__ mode or Intel 64 Visual Studio 20__ mode as 181appropriate. Then run C<nmake> as usual in that prompt box. 182 183Only Intel C++ Compiler v12.1 has been tested. Other versions probably will 184work. Using Intel C++ Compiler instead of Visual C has the benefit of C99 185compatibility which is needed by some CPAN XS modules, while maintaining 186compatibility with Visual C object code and Visual C debugging infrastructure 187unlike GCC. 188 189=back 190 191=head2 Building 192 193=over 4 194 195=item * 196 197Make sure you are in the F<win32> subdirectory under the perl toplevel. 198This directory contains a F<Makefile> that will work with 199versions of C<nmake> that come with Visual C++, and 200a GNU make F<GNUmakefile> that will work for all supported compilers. 201The defaults in the C<gmake> makefile are set up to build with MinGW/gcc. 202 203=item * 204 205Edit the F<GNUmakefile> (or F<Makefile>, if you're using F<nmake>) and change 206the values of I<INST_DRV> and C<INST_TOP>. You can also enable various build 207flags. These are explained in the makefiles. 208 209Note that it is generally not a good idea to try to build a C<perl> with 210C<INST_DRV> and C<INST_TOP> set to a path that already exists from a previous 211build. In particular, this may cause problems with the 212F<lib/ExtUtils/t/Embed.t> test, which attempts to build a test program and 213may end up building against the installed C<perl>'s F<lib/CORE> directory 214rather than the one being tested. 215 216You will have to make sure that C<CCTYPE> is set correctly and that 217C<CCHOME> points to wherever you installed your compiler. For GCC this 218should be the directory that contains the F<bin>, F<include> and 219F<lib> directories. 220 221If building with the cross-compiler provided by 222mingw-w64.org you'll need to uncomment the line that sets 223C<GCCCROSS> in the F<GNUmakefile>. Do this only if it's the cross-compiler, 224ie. only if the F<bin> folder doesn't contain a F<gcc.exe>. (The cross-compiler 225does not provide a F<gcc.exe>, F<g++.exe>, F<ar.exe>, etc. Instead, all of these 226executables are prefixed with C<x86_64-w64-mingw32->.) 227 228The default value for C<CCHOME> in the makefiles for Visual C++ 229may not be correct for some versions. Make sure the default exists 230and is valid. 231 232If you want build some core extensions statically into C<perl>'s DLL, 233specify them in the C<STATIC_EXT> macro. 234 235Be sure to read the instructions near the top of the makefiles carefully. 236 237=item * 238 239Type C<gmake> (or C<nmake> if you are using that version of C<make>). 240 241This should build everything. Specifically, it will create F<perl.exe>, 242F<perl538.dll> at the perl toplevel, and various other extension DLL's 243under the F<lib\auto> directory. If the build fails for any reason, make 244sure you have done the previous steps correctly. 245 246To try C<gmake>'s parallel mode, type C<gmake -j2> where C<2> is the maximum number 247of parallel jobs you want to run. A number of things in the build process will 248run in parallel, but there are serialization points where you will see just 1 249CPU maxed out. This is normal. 250 251If you are advanced enough with building C code, here is a suggestion to speed 252up building C<perl>, and the later C<make test>. Try to keep your C<PATH> environment 253variable with the least number of folders possible (remember to keep your C 254compiler's folders there). F<C:\WINDOWS\system32> or F<C:\WINNT\system32> 255depending on your OS version should be first folder in C<PATH>, since C<cmd.exe> 256is the most commonly launched program during the build and later testing. 257 258=back 259 260=head2 Testing Perl on Windows 261 262Type "gmake test" (or "nmake test"). This will run most 263of the tests from the testsuite (many tests will be skipped). 264 265There should be no test failures. 266 267If you build with Visual C++ 2013 then three tests currently may fail with 268Daylight Saving Time related problems: F<t/io/fs.t>, 269F<cpan/HTTP-Tiny/t/110_mirror.t> and F<lib/File/Copy.t>. The failures are 270caused by bugs in the CRT in VC++ 2013 which are fixed in VC++2015 and 271later, as explained by Microsoft here: 272L<https://connect.microsoft.com/VisualStudio/feedback/details/811534/utime-sometimes-fails-to-set-the-correct-file-times-in-visual-c-2013>. In the meantime, 273if you need fixed C<stat> and C<utime> functions then have a look at the 274CPAN distribution Win32::UTCFileTime. 275 276If you build with Visual C++ 2015 or later then F<ext/XS-APItest/t/locale.t> 277may crash (after all its tests have passed). This is due to a regression in the 278Universal CRT introduced in the Windows 10 April 2018 Update, and will be fixed 279in the May 2019 Update, as explained here: L<https://developercommunity.visualstudio.com/content/problem/519486/setlocalelc-numeric-iso-latin-16-fails-then-succee.html>. 280 281If you build with certain versions (e.g. 4.8.1) of gcc from mingw then 282F<ext/POSIX/t/time.t> may fail test 17 due to a known bug in those gcc builds: 283see L<https://sourceforge.net/p/mingw/bugs/2152/>. 284 285Some test failures may occur if you use a command shell other than the 286native "cmd.exe", or if you are building from a path that contains 287spaces. So don't do that. 288 289If you are running the tests from a emacs shell window, you may see 290failures in op/stat.t. Run "gmake test-notty" in that case. 291 292Furthermore, you should make sure that during C<make test> you do not 293have any GNU tool packages in your path: some toolkits like Unixutils 294include some tools (C<type> for instance) which override the Windows 295ones and makes tests fail. Remove them from your path while testing to 296avoid these errors. 297 298To see the output of specific failing tests run the harness from the t 299directory: 300 301 # assuming you're starting from the win32 directory 302 cd ..\win32 303 .\perl harness <list of tests> 304 305Please report any other failures as described under L</BUGS AND CAVEATS>. 306 307=head2 Installation of Perl on Windows 308 309Type "gmake install" ("nmake install"). This will 310put the newly built perl and the libraries under whatever C<INST_TOP> 311points to in the Makefile. It will also install the pod documentation 312under C<$INST_TOP\$INST_VER\lib\pod> and HTML versions of the same 313under C<$INST_TOP\$INST_VER\lib\pod\html>. 314 315To use the Perl you just installed you will need to add a new entry to 316your PATH environment variable: C<$INST_TOP\bin>, e.g. 317 318 set PATH=c:\perl\bin;%PATH% 319 320If you opted to uncomment C<INST_VER> and C<INST_ARCH> in the makefile 321then the installation structure is a little more complicated and you will 322need to add two new PATH components instead: C<$INST_TOP\$INST_VER\bin> and 323C<$INST_TOP\$INST_VER\bin\$ARCHNAME>, e.g. 324 325 set PATH=c:\perl\5.6.0\bin;c:\perl\5.6.0\bin\MSWin32-x86;%PATH% 326 327=head2 Usage Hints for Perl on Windows 328 329=over 4 330 331=item Environment Variables 332 333The installation paths that you set during the build get compiled 334into perl, so you don't have to do anything additional to start 335using that perl (except add its location to your PATH variable). 336 337If you put extensions in unusual places, you can set PERL5LIB 338to a list of paths separated by semicolons where you want perl 339to look for libraries. Look for descriptions of other environment 340variables you can set in L<perlrun>. 341 342You can also control the shell that perl uses to run system() and 343backtick commands via PERL5SHELL. See L<perlrun>. 344 345Perl does not depend on the registry, but it can look up certain default 346values if you choose to put them there unless disabled at build time with 347USE_NO_REGISTRY. On Perl process start Perl checks if 348C<HKEY_CURRENT_USER\Software\Perl> and C<HKEY_LOCAL_MACHINE\Software\Perl> 349exist. If the keys exists, they will be checked for remainder of the Perl 350process's run life for certain entries. Entries in 351C<HKEY_CURRENT_USER\Software\Perl> override entries in 352C<HKEY_LOCAL_MACHINE\Software\Perl>. One or more of the following entries 353(of type REG_SZ or REG_EXPAND_SZ) may be set in the keys: 354 355 lib-$] version-specific standard library path to add to @INC 356 lib standard library path to add to @INC 357 sitelib-$] version-specific site library path to add to @INC 358 sitelib site library path to add to @INC 359 vendorlib-$] version-specific vendor library path to add to @INC 360 vendorlib vendor library path to add to @INC 361 PERL* fallback for all %ENV lookups that begin with "PERL" 362 363Note the C<$]> in the above is not literal. Substitute whatever version 364of perl you want to honor that entry, e.g. C<5.6.0>. Paths must be 365separated with semicolons, as usual on Windows. 366 367=item File Globbing 368 369By default, perl handles file globbing using the File::Glob extension, 370which provides portable globbing. 371 372If you want perl to use globbing that emulates the quirks of DOS 373filename conventions, you might want to consider using File::DosGlob 374to override the internal glob() implementation. See L<File::DosGlob> for 375details. 376 377=item Using perl from the command line 378 379If you are accustomed to using perl from various command-line 380shells found in UNIX environments, you will be less than pleased 381with what Windows offers by way of a command shell. 382 383The crucial thing to understand about the Windows environment is that 384the command line you type in is processed twice before Perl sees it. 385First, your command shell (usually CMD.EXE) preprocesses the command 386line, to handle redirection, environment variable expansion, and 387location of the executable to run. Then, the perl executable splits 388the remaining command line into individual arguments, using the 389C runtime library upon which Perl was built. 390 391It is particularly important to note that neither the shell nor the C 392runtime do any wildcard expansions of command-line arguments (so 393wildcards need not be quoted). Also, the quoting behaviours of the 394shell and the C runtime are rudimentary at best (and may, if you are 395using a non-standard shell, be inconsistent). The only (useful) quote 396character is the double quote ("). It can be used to protect spaces 397and other special characters in arguments. 398 399The Windows documentation describes the shell parsing rules here: 400L<https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/cmd> 401and the C runtime parsing rules here: 402L<https://msdn.microsoft.com/en-us/library/17w5ykft%28v=VS.100%29.aspx>. 403 404Here are some further observations based on experiments: The C runtime 405breaks arguments at spaces and passes them to programs in argc/argv. 406Double quotes can be used to prevent arguments with spaces in them from 407being split up. You can put a double quote in an argument by escaping 408it with a backslash and enclosing the whole argument within double quotes. 409The backslash and the pair of double quotes surrounding the argument will 410be stripped by the C runtime. 411 412The file redirection characters "E<lt>", "E<gt>", and "|" can be quoted by 413double quotes (although there are suggestions that this may not always 414be true). Single quotes are not treated as quotes by the shell or 415the C runtime, they don't get stripped by the shell (just to make 416this type of quoting completely useless). The caret "^" has also 417been observed to behave as a quoting character, but this appears 418to be a shell feature, and the caret is not stripped from the command 419line, so Perl still sees it (and the C runtime phase does not treat 420the caret as a quote character). 421 422Here are some examples of usage of the "cmd" shell: 423 424This prints two doublequotes: 425 426 perl -e "print '\"\"' " 427 428This does the same: 429 430 perl -e "print \"\\\"\\\"\" " 431 432This prints "bar" and writes "foo" to the file "blurch": 433 434 perl -e "print 'foo'; print STDERR 'bar'" > blurch 435 436This prints "foo" ("bar" disappears into nowhereland): 437 438 perl -e "print 'foo'; print STDERR 'bar'" 2> nul 439 440This prints "bar" and writes "foo" into the file "blurch": 441 442 perl -e "print 'foo'; print STDERR 'bar'" 1> blurch 443 444This pipes "foo" to the "less" pager and prints "bar" on the console: 445 446 perl -e "print 'foo'; print STDERR 'bar'" | less 447 448This pipes "foo\nbar\n" to the less pager: 449 450 perl -le "print 'foo'; print STDERR 'bar'" 2>&1 | less 451 452This pipes "foo" to the pager and writes "bar" in the file "blurch": 453 454 perl -e "print 'foo'; print STDERR 'bar'" 2> blurch | less 455 456 457Discovering the usefulness of the "command.com" shell on Windows 9x 458is left as an exercise to the reader :) 459 460One particularly pernicious problem with the 4NT command shell for 461Windows is that it (nearly) always treats a % character as indicating 462that environment variable expansion is needed. Under this shell, it is 463therefore important to always double any % characters which you want 464Perl to see (for example, for hash variables), even when they are 465quoted. 466 467=item Building Extensions 468 469The Comprehensive Perl Archive Network (CPAN) offers a wealth 470of extensions, some of which require a C compiler to build. 471Look in L<https://www.cpan.org/> for more information on CPAN. 472 473Note that not all of the extensions available from CPAN may work 474in the Windows environment; you should check the information at 475L<https://www.cpantesters.org/> before investing too much effort into 476porting modules that don't readily build. 477 478Most extensions (whether they require a C compiler or not) can 479be built, tested and installed with the standard mantra: 480 481 perl Makefile.PL 482 $MAKE 483 $MAKE test 484 $MAKE install 485 486where $MAKE is whatever 'make' program you have configured perl to 487use. Use "perl -V:make" to find out what this is. Some extensions 488may not provide a testsuite (so "$MAKE test" may not do anything or 489fail), but most serious ones do. 490 491It is important that you use a supported 'make' program, and 492ensure Config.pm knows about it. 493 494Note that MakeMaker actually emits makefiles with different syntax 495depending on what 'make' it thinks you are using. Therefore, it is 496important that one of the following values appears in Config.pm: 497 498 make='nmake' # MakeMaker emits nmake syntax 499 any other value # MakeMaker emits generic make syntax 500 (e.g GNU make, or Perl make) 501 502If the value doesn't match the 'make' program you want to use, 503edit Config.pm to fix it. 504 505If a module implements XSUBs, you will need one of the supported 506C compilers. You must make sure you have set up the environment for 507the compiler for command-line compilation before running C<perl Makefile.PL> 508or any invocation of make. 509 510If a module does not build for some reason, look carefully for 511why it failed, and report problems to the module author. If 512it looks like the extension building support is at fault, report 513that with full details of how the build failed using the GitHub 514issue tracker at L<https://github.com/Perl/perl5/issues>. 515 516=item Command-line Wildcard Expansion 517 518The default command shells on DOS descendant operating systems (such 519as they are) usually do not expand wildcard arguments supplied to 520programs. They consider it the application's job to handle that. 521This is commonly achieved by linking the application (in our case, 522perl) with startup code that the C runtime libraries usually provide. 523However, doing that results in incompatible perl versions (since the 524behavior of the argv expansion code differs depending on the 525compiler, and it is even buggy on some compilers). Besides, it may 526be a source of frustration if you use such a perl binary with an 527alternate shell that *does* expand wildcards. 528 529Instead, the following solution works rather well. The nice things 530about it are 1) you can start using it right away; 2) it is more 531powerful, because it will do the right thing with a pattern like 532*/*/*.c; 3) you can decide whether you do/don't want to use it; and 5334) you can extend the method to add any customizations (or even 534entirely different kinds of wildcard expansion). 535 536 C:\> copy con c:\perl\lib\Wild.pm 537 # Wild.pm - emulate shell @ARGV expansion on shells that don't 538 use File::DosGlob; 539 @ARGV = map { 540 my @g = File::DosGlob::glob($_) if /[*?]/; 541 @g ? @g : $_; 542 } @ARGV; 543 1; 544 ^Z 545 C:\> set PERL5OPT=-MWild 546 C:\> perl -le "for (@ARGV) { print }" */*/perl*.c 547 p4view/perl/perl.c 548 p4view/perl/perlio.c 549 p4view/perl/perly.c 550 perl5.005/win32/perlglob.c 551 perl5.005/win32/perllib.c 552 perl5.005/win32/perlglob.c 553 perl5.005/win32/perllib.c 554 perl5.005/win32/perlglob.c 555 perl5.005/win32/perllib.c 556 557Note there are two distinct steps there: 1) You'll have to create 558Wild.pm and put it in your perl lib directory. 2) You'll need to 559set the PERL5OPT environment variable. If you want argv expansion 560to be the default, just set PERL5OPT in your default startup 561environment. 562 563If you are using the Visual C compiler, you can get the C runtime's 564command line wildcard expansion built into perl binary. The resulting 565binary will always expand unquoted command lines, which may not be 566what you want if you use a shell that does that for you. The expansion 567done is also somewhat less powerful than the approach suggested above. 568 569=item Notes on 64-bit Windows 570 571Windows .NET Server supports the LLP64 data model on the Intel Itanium 572architecture. 573 574The LLP64 data model is different from the LP64 data model that is the 575norm on 64-bit Unix platforms. In the former, C<int> and C<long> are 576both 32-bit data types, while pointers are 64 bits wide. In addition, 577there is a separate 64-bit wide integral type, C<__int64>. In contrast, 578the LP64 data model that is pervasive on Unix platforms provides C<int> 579as the 32-bit type, while both the C<long> type and pointers are of 58064-bit precision. Note that both models provide for 64-bits of 581addressability. 582 58364-bit Windows running on Itanium is capable of running 32-bit x86 584binaries transparently. This means that you could use a 32-bit build 585of Perl on a 64-bit system. Given this, why would one want to build 586a 64-bit build of Perl? Here are some reasons why you would bother: 587 588=over 589 590=item * 591 592A 64-bit native application will run much more efficiently on 593Itanium hardware. 594 595=item * 596 597There is no 2GB limit on process size. 598 599=item * 600 601Perl automatically provides large file support when built under 60264-bit Windows. 603 604=item * 605 606Embedding Perl inside a 64-bit application. 607 608=back 609 610=back 611 612=head2 Running Perl Scripts 613 614Perl scripts on UNIX use the "#!" (a.k.a "shebang") line to 615indicate to the OS that it should execute the file using perl. 616Windows has no comparable means to indicate arbitrary files are 617executables. 618 619Instead, all available methods to execute plain text files on 620Windows rely on the file "extension". There are three methods 621to use this to execute perl scripts: 622 623=over 8 624 625=item 1 626 627There is a facility called "file extension associations". This can be 628manipulated via the two commands "assoc" and "ftype" that come 629standard with Windows. Type "ftype /?" for a complete example of how 630to set this up for perl scripts (Say what? You thought Windows 631wasn't perl-ready? :). 632 633=item 2 634 635Since file associations don't work everywhere, and there are 636reportedly bugs with file associations where it does work, the 637old method of wrapping the perl script to make it look like a 638regular batch file to the OS, may be used. The install process 639makes available the "pl2bat.bat" script which can be used to wrap 640perl scripts into batch files. For example: 641 642 pl2bat foo.pl 643 644will create the file "FOO.BAT". Note "pl2bat" strips any 645.pl suffix and adds a .bat suffix to the generated file. 646 647If you use the 4DOS/NT or similar command shell, note that 648"pl2bat" uses the "%*" variable in the generated batch file to 649refer to all the command line arguments, so you may need to make 650sure that construct works in batch files. As of this writing, 6514DOS/NT users will need a "ParameterChar = *" statement in their 6524NT.INI file or will need to execute "setdos /p*" in the 4DOS/NT 653startup file to enable this to work. 654 655=item 3 656 657Using "pl2bat" has a few problems: the file name gets changed, 658so scripts that rely on C<$0> to find what they must do may not 659run properly; running "pl2bat" replicates the contents of the 660original script, and so this process can be maintenance intensive 661if the originals get updated often. A different approach that 662avoids both problems is possible. 663 664A script called "runperl.bat" is available that can be copied 665to any filename (along with the .bat suffix). For example, 666if you call it "foo.bat", it will run the file "foo" when it is 667executed. Since you can run batch files on Windows platforms simply 668by typing the name (without the extension), this effectively 669runs the file "foo", when you type either "foo" or "foo.bat". 670With this method, "foo.bat" can even be in a different location 671than the file "foo", as long as "foo" is available somewhere on 672the PATH. If your scripts are on a filesystem that allows symbolic 673links, you can even avoid copying "runperl.bat". 674 675Here's a diversion: copy "runperl.bat" to "runperl", and type 676"runperl". Explain the observed behavior, or lack thereof. :) 677Hint: .gnidnats llits er'uoy fi ,"lrepnur" eteled :tniH 678 679=back 680 681=head2 Miscellaneous Things 682 683A full set of HTML documentation is installed, so you should be 684able to use it if you have a web browser installed on your 685system. 686 687C<perldoc> is also a useful tool for browsing information contained 688in the documentation, especially in conjunction with a pager 689like C<less> (recent versions of which have Windows support). You may 690have to set the PAGER environment variable to use a specific pager. 691"perldoc -f foo" will print information about the perl operator 692"foo". 693 694One common mistake when using this port with a GUI library like C<Tk> 695is assuming that Perl's normal behavior of opening a command-line 696window will go away. This isn't the case. If you want to start a copy 697of C<perl> without opening a command-line window, use the C<wperl> 698executable built during the installation process. Usage is exactly 699the same as normal C<perl> on Windows, except that options like C<-h> 700don't work (since they need a command-line window to print to). 701 702If you find bugs in perl, you can report them to 703L<https://github.com/Perl/perl5/issues>. 704 705=head1 BUGS AND CAVEATS 706 707Norton AntiVirus interferes with the build process, particularly if 708set to "AutoProtect, All Files, when Opened". Unlike large applications 709the perl build process opens and modifies a lot of files. Having the 710AntiVirus scan each and every one slows build the process significantly. 711Worse, with PERLIO=stdio the build process fails with peculiar messages 712as the virus checker interacts badly with miniperl.exe writing configure 713files (it seems to either catch file part written and treat it as suspicious, 714or virus checker may have it "locked" in a way which inhibits miniperl 715updating it). The build does complete with 716 717 set PERLIO=perlio 718 719but that may be just luck. Other AntiVirus software may have similar issues. 720 721A git GUI shell extension for Windows such as TortoiseGit will cause the build 722and later C<make test> to run much slower since every file is checked for its 723git status as soon as it is created and/or modified. TortoiseGit doesn't cause 724any test failures or build problems unlike the antivirus software described 725above, but it does cause similar slowness. It is suggested to use Task Manager 726to look for background processes which use high CPU amounts during the building 727process. 728 729Some of the built-in functions do not act exactly as documented in 730L<perlfunc>, and a few are not implemented at all. To avoid 731surprises, particularly if you have had prior exposure to Perl 732in other operating environments or if you intend to write code 733that will be portable to other environments, see L<perlport> 734for a reasonably definitive list of these differences. 735 736Not all extensions available from CPAN may build or work properly 737in the Windows environment. See L</"Building Extensions">. 738 739Most C<socket()> related calls are supported, but they may not 740behave as on Unix platforms. See L<perlport> for the full list. 741 742Signal handling may not behave as on Unix platforms (where it 743doesn't exactly "behave", either :). For instance, calling C<die()> 744or C<exit()> from signal handlers will cause an exception, since most 745implementations of C<signal()> on Windows are severely crippled. 746Thus, signals may work only for simple things like setting a flag 747variable in the handler. Using signals under this port should 748currently be considered unsupported. 749 750Please report detailed descriptions of any problems and solutions that 751you may find at E<lt>L<https://github.com/Perl/perl5/issues>E<gt>, 752along with the output produced by C<perl -V>. 753 754=head1 ACKNOWLEDGEMENTS 755 756The use of a camel with the topic of Perl is a trademark 757of O'Reilly and Associates, Inc. Used with permission. 758 759=head1 AUTHORS 760 761=over 4 762 763=item Gary Ng E<lt>71564.1743@CompuServe.COME<gt> 764 765=item Gurusamy Sarathy E<lt>gsar@activestate.comE<gt> 766 767=item Nick Ing-Simmons E<lt>nick@ing-simmons.netE<gt> 768 769=item Jan Dubois E<lt>jand@activestate.comE<gt> 770 771=item Steve Hay E<lt>steve.m.hay@googlemail.comE<gt> 772 773=back 774 775This document is maintained by Jan Dubois. 776 777=head1 SEE ALSO 778 779L<perl> 780 781=head1 HISTORY 782 783This port was originally contributed by Gary Ng around 5.003_24, 784and borrowed from the Hip Communications port that was available 785at the time. Various people have made numerous and sundry hacks 786since then. 787 788GCC/mingw32 support was added in 5.005 (Nick Ing-Simmons). 789 790Support for PERL_OBJECT was added in 5.005 (ActiveState Tool Corp). 791 792Support for fork() emulation was added in 5.6 (ActiveState Tool Corp). 793 794Win9x support was added in 5.6 (Benjamin Stuhl). 795 796Support for 64-bit Windows added in 5.8 (ActiveState Corp). 797 798Last updated: 06 October 2021 799 800=cut 801