perlwin32
СОДЕРЖАНИЕ
НАЗВАНИЕ
perlwin32 - Perl под Windows
СИНОПСИС
Эти инструкции предназначены для компиляции Perl под Windows 2000 и новее.
ОПИСАНИЕ
Перед началом ознакомьтесь с файлом README, расположенным в корневой директории, куда была распакована дистрибуция Perl. Убедитесь, что вы ознакомились и поняли условия распространения данного программного обеспечения.
Также ознакомьтесь с разделом "ОШИБКИ И ОГРАНИЧЕНИЯ" ниже, чтобы ознакомиться с известными ограничениями этого порта.
Файл INSTALL в корневой директории Perl содержит много информации, которая актуальна только для людей, компилирующих Perl на системах Unix. В частности, вы можете пропустить любую информацию, которая говорит о "Configure".
Вы также можете рассмотреть другой вариант построения perl, который будет работать под Windows: файл README.cygwin, который содержит другой набор правил для компиляции perl для Windows. Этот метод, вероятно, позволит вам создать более совместимый с Unix perl, но вам также потребуется загрузить и использовать различные другие вспомогательные программы для компиляции и выполнения, описанные в этом файле.
Данный набор инструкций предназначен для описания так называемого "родного" порта Perl для платформы Windows. Это включает как 32-битные, так и 64-битные операционные системы Windows. Результирующий Perl не требует дополнительных программ для работы (кроме тех, которые уже включены в вашу операционную систему). В настоящее время этот порт может использовать один из следующих компиляторов на архитектуре Intel x86:
Microsoft Visual C++ version 6.0 or later
Intel C++ Compiler (experimental)
Gcc by mingw.org gcc version 3.4.5 or later
with runtime < 3.21
Gcc by mingw-w64.org gcc version 4.4.3 or later Обратите внимание, что последние два проекта фактически являются конкурирующими, оба предоставляют полную цепочку инструментов GCC для MS Windows:
- http://mingw.org
-
Предоставляет цепочку инструментов GCC, нацеленную на 32-битную платформу Windows.
- http://mingw-w64.org
-
Предоставляет цепочку инструментов GCC, нацеленную как на 64-битную, так и на 32-битную платформы Windows (несмотря на название проекта "mingw-w64", они не ориентированы только на 64-битную платформу). Они предоставляют родные компиляторы GCC и кросс-компиляторы, которые также поддерживаются makefile Perl.
Компиляторы Microsoft Visual C++ также теперь предоставляются бесплатно. Они доступны как "Visual C++ Toolkit 2003" или "Visual C++ 2005-2017 Express [или Community, начиная с 2017] Edition" (а также как часть ".NET Framework SDK") и являются теми же компиляторами, которые поставляются с "Visual C++ .NET 2003 Professional" или "Visual C++ 2005-2017 Professional" соответственно.
Этот порт также может быть скомпилирован на IA64/AMD64 с помощью:
Microsoft Platform SDK Nov 2001 (64-bit compiler and tools)
MinGW64 compiler (gcc version 4.4.3 or later) Windows SDK можно загрузить с http://www.microsoft.com/. Компилятор MinGW64 доступен по адресу http://mingw-w64.org. Последний фактически является кросс-компилятором, нацеленным на Win64. Также есть оптимизированный компилятор (без java или gfortran), подходящий для компиляции Perl, доступный по адресу: http://strawberryperl.com/package/kmx/64_gcctoolchain/
ПРИМЕЧАНИЕ: Если вы используете 32-битный компилятор для компиляции Perl на 64-битной операционной системе Windows, то вы должны установить переменную среды WIN64 в значение "undef". Также оптимизированный компилятор проходит тесты только при определении USE_ITHREADS (вместо undef) и при закомментированной строке CFG *= Debug.
Этот порт полностью поддерживает MakeMaker (набор модулей, используемых для построения расширений для Perl). Поэтому вы сможете собрать и установить большинство расширений, найденных на сайтах CPAN. Смотрите раздел "Рекомендации по использованию Perl под Windows" ниже для общих рекомендаций по этому вопросу.
Настройка Perl под Windows
- Make
-
Для сборки исходного кода вам необходимо использовать программу "make". Если вы используете Visual C++ или инструменты Windows SDK, вы можете использовать nmake, поставляемый с Visual C++ или Windows SDK. Вы также можете использовать dmake или gmake вместо nmake для Visual C++ или Windows SDK. dmake — это программное обеспечение с открытым исходным кодом, но оно не входит в Visual C++ или Windows SDK. Для сборок с использованием gcc необходимы dmake или gmake. nmake не поддерживается для сборок с gcc. Параллельная сборка поддерживается только с dmake и gmake, а не с nmake. При использовании dmake рекомендуется использовать dmake версии 4.13 или новее для параллельной сборки. Более старые версии dmake в параллельном режиме имеют очень высокую загрузку процессора и перегружают диск/файловую систему дублированными вызовами ввода-вывода в агрессивном цикле опроса.
Портированная версия dmake для Windows доступна по адресу:
http://search.cpan.org/dist/dmake/
Скачайте и установите dmake в какой-либо каталог, указанный в переменной PATH.
- Командная оболочка
-
Используйте стандартную командную оболочку "cmd", которая поставляется с Windows. Некоторые версии популярной оболочки 4DOS/NT имеют несовместимости, которые могут вызвать проблемы. Если сборка завершается ошибкой в этой оболочке, попробуйте выполнить сборку снова с использованием командной оболочки cmd.
Убедитесь, что путь к каталогу сборки не содержит пробелов. Обычно сборка работает в этом случае, но некоторые тесты могут завершиться ошибкой.
- Microsoft Visual C++
-
Для сборки будет достаточно nmake, поставляемого с Visual C++. Visual C требует предварительной настройки определённых параметров в консоли перед запуском. Для того, чтобы консольное окно могло запускать компилятор C, необходимо предварительно выполнить файл
vcvars32.batдля компиляции для x86-32 и для x86-64vcvarsall.bat x64илиvcvarsamd64.bat. В типичной установке продукта Microsoft C Compiler эти пакетные файлы уже будут находиться в вашей переменной средыPATH, поэтому вы можете просто набрать их в консоли без указания абсолютного пути. Если вам нужно найти абсолютный путь к пакетному файлу, он обычно находится где-то в каталоге типа C:\Program Files\Microsoft Visual Studio\VC98\Bin. В некоторых более новых продуктах Microsoft C (выпущенных после ~2004 года), установщик поместит ярлык в меню Пуск для запуска нового окна консоли с уже настроенной консолью для вашей целевой архитектуры (x86-32 или x86-64 или IA64). При использовании более новых компиляторов вы также можете использовать более старые пакетные файлы, если пожелаете. - Microsoft Visual C++ 2008-2017 Express/Community Edition
-
Эти бесплатные версии Visual C++ 2008-2017 Professional содержат те же компиляторы и компоновщики, что и полные версии, а также всё необходимое для сборки Perl, без необходимости отдельной загрузки Windows SDK, как это было в предыдущих версиях.
Эти пакеты можно скачать, выполнив поиск в Центре загрузок по адресу http://www.microsoft.com/downloads/search.aspx?displaylang=en. (Попытки предоставить точные ссылки на эти пакеты оказались бесплодными, так как ссылки постоянно меняются.)
Установите Visual C++ 2008-2017 Express/Community, затем настройте свою среду, например:
C:\Program Files\Microsoft Visual Studio 12.0\Common7\Tools\vsvars32.bat(предполагается, что был выбран стандартный путь установки).
Теперь Perl должен собираться с помощью win32/Makefile. Вам необходимо будет отредактировать этот файл, чтобы установить CCTYPE на одно из значений MSVC90-MSVC141.
- Microsoft Visual C++ 2005 Express Edition
-
Эта бесплатная версия Visual C++ 2005 Professional содержит тот же компилятор и компоновщик, что и полная версия, но не содержит всего необходимого для сборки Perl.
Вам также потребуется загрузить "Windows SDK" (требуются компоненты "Core SDK" и "MDAC SDK") для дополнительных заголовочных файлов и библиотек.
Эти пакеты можно скачать, выполнив поиск в Центре загрузок по адресу http://www.microsoft.com/downloads/search.aspx?displaylang=en. (Попытки предоставить точные ссылки на эти пакеты оказались бесплодными, так как ссылки постоянно меняются.)
Постарайтесь получить последнюю версию Windows SDK. Иногда эти пакеты содержат в названии конкретную версию Windows, но фактически работают и на других версиях ОС. Например, "Windows Server 2003 R2 Platform SDK" также работает под Windows XP SP2 и Windows 2000.
Сначала установите Visual C++ 2005, затем Platform SDK. Настройте свою среду следующим образом (предполагается, что были выбраны стандартные пути установки):
SET PlatformSDKDir=C:\Program Files\Microsoft Platform SDK SET PATH=%SystemRoot%\system32;%SystemRoot%;C:\Program Files\Microsoft Visual Studio 8\Common7\IDE;C:\Program Files\Microsoft Visual Studio 8\VC\BIN;C:\Program Files\Microsoft Visual Studio 8\Common7\Tools;C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\bin;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727;C:\Program Files\Microsoft Visual Studio 8\VC\VCPackages;%PlatformSDKDir%\Bin SET INCLUDE=C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE;%PlatformSDKDir%\include SET LIB=C:\Program Files\Microsoft Visual Studio 8\VC\LIB;C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\lib;%PlatformSDKDir%\lib SET LIBPATH=C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727(Возможно, PlatformSDKDir необходимо настроить по-другому в зависимости от используемой версии. Более ранние версии устанавливались в "C:\Program Files\Microsoft SDK", в то время как последние версии устанавливаются в версии-специфические каталоги, такие как "C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2".)
Теперь Perl должен собираться с помощью win32/Makefile. Вам необходимо будет отредактировать этот файл, чтобы установить
CCTYPE = MSVC80а также установить CCHOME, CCINCDIR и CCLIBDIR, как описано в настройке среды выше.
- Microsoft Visual C++ Toolkit 2003
-
Этот бесплатный набор инструментов содержит тот же компилятор и компоновщик, что и Visual C++ .NET 2003 Professional, но не содержит всего необходимого для сборки Perl.
Вам также потребуется загрузить "Platform SDK" (требуются компоненты "Core SDK" и "MDAC SDK") для заголовочных файлов, библиотек и rc.exe, а также ".NET Framework SDK" для дополнительных библиотек и nmake.exe. Обратите внимание, что последний (который также включает бесплатный компилятор и компоновщик) требует предварительной установки ".NET Framework Redistributable". Его можно загрузить и установить отдельно, но он включён в "Visual C++ Toolkit 2003".
Эти пакеты можно скачать, выполнив поиск в Центре загрузок по адресу http://www.microsoft.com/downloads/search.aspx?displaylang=en. (Попытки предоставить точные ссылки на эти пакеты оказались бесплодными, так как ссылки постоянно меняются.)
Постарайтесь получить последнюю версию Windows SDK. Иногда эти пакеты содержат в названии конкретную версию Windows, но фактически работают и на других версиях ОС. Например, "Windows Server 2003 R2 Platform SDK" также работает под Windows XP SP2 и Windows 2000.
Сначала установите Toolkit, затем Platform SDK, затем .NET Framework SDK. Настройте свою среду следующим образом (предполагается, что были выбраны стандартные пути установки):
SET PlatformSDKDir=C:\Program Files\Microsoft Platform SDK SET PATH=%SystemRoot%\system32;%SystemRoot%;C:\Program Files\Microsoft Visual C++ Toolkit 2003\bin;%PlatformSDKDir%\Bin;C:\Program Files\Microsoft.NET\SDK\v1.1\Bin SET INCLUDE=C:\Program Files\Microsoft Visual C++ Toolkit 2003\include;%PlatformSDKDir%\include;C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include SET LIB=C:\Program Files\Microsoft Visual C++ Toolkit 2003\lib;%PlatformSDKDir%\lib;C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\lib(Возможно, PlatformSDKDir необходимо настроить по-другому в зависимости от используемой версии. Более ранние версии устанавливались в "C:\Program Files\Microsoft SDK", в то время как последние версии устанавливаются в версии-специфические каталоги, такие как "C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2".)
Несколько необходимых файлов всё ещё отсутствуют:
-
cvtres.exe необходим для link.exe при использовании файла .res. Он фактически устанавливается .NET Framework SDK, но в каталог вроде:
C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322Скопируйте его оттуда в %PlatformSDKDir%\Bin
-
lib.exe обычно используется для создания библиотек, но link.exe с опцией /lib также работает, поэтому измените win32/config.vc, чтобы использовать её вместо lib.exe:
Измените строку:
ar='lib'на:
ar='link /lib'Также может быть полезно создать пакетный файл lib.bat в C:\Program Files\Microsoft Visual C++ Toolkit 2003\bin содержащий:
@echo off link /lib %*для пользы любых нерадивых модулей расширения C, которые вы можете захотеть скомпилировать позже, которые явно ссылаются на "lib", а не берут значение из $Config{ar}.
-
setargv.obj необходим для сборки perlglob.exe (и perl.exe, если включён параметр USE_SETARGV). Platform SDK предоставляет этот объектный файл в исходном виде в %PlatformSDKDir%\src\crt. Скопируйте setargv.c, cruntime.h и internal.h в какое-нибудь временное место и скомпилируйте setargv.obj с помощью:
cl.exe /c /I. /D_CRTBLD setargv.cЗатем скопируйте setargv.obj в %PlatformSDKDir%\lib
В качестве альтернативы, если вам не нужен perlglob.exe и вам не нужно включать USE_SETARGV, то вы можете безопасно удалить все упоминания $(GLOBEXE) из win32/Makefile, и setargv.obj не потребуется.
Теперь Perl должен собираться с помощью win32/Makefile. Вам необходимо будет отредактировать этот файл, чтобы установить
CCTYPE = MSVC70FREEа также установить CCHOME, CCINCDIR и CCLIBDIR, как описано в настройке среды выше.
-
- Компилятор Microsoft Platform SDK 64-разрядный
-
Для сборки Perl достаточно nmake, поставляемого с Platform SDK. Убедитесь, что вы выполняете сборку в одной из "Среды сборки" оболочек, доступных после установки Platform SDK из меню Пуск.
- GCC
-
Perl можно скомпилировать с помощью gcc из MinGW (версии 3.4.5 или выше) или MinGW64 (версии 4.4.3 или выше). Его можно загрузить здесь:
http://www.mingw.org/ http://www.mingw-w64.org/
Вам также нужен dmake. Смотрите "Make" выше, как его получить.
Обратите внимание, что сборка MinGW в настоящее время требует версию MinGW runtime, более раннюю, чем 3.21 (проверьте __MINGW32_MAJOR_VERSION и __MINGW32_MINOR_VERSION).
Также обратите внимание, что сборка в режиме C++ в настоящее время завершается ошибкой с MinGW 3.4.5 и 4.7.2 или более поздними версиями, а также с MinGW64 64-битными 6.3.0 или более поздними версиями.
- Компилятор Intel C++
-
Добавлена экспериментальная поддержка использования компилятора Intel C++. Отредактируйте win32/Makefile и выберите правильное CCTYPE для Visual C, в который был установлен Intel C. Также раскомментируйте __ICC, чтобы включить поддержку Intel C в Visual C. Для настройки среды сборки из меню Пуск запустите режим IA-32 Visual Studio 20__ или Intel 64 Visual Studio 20__ в зависимости от ситуации. Затем запустите nmake как обычно в этом окне.
Тестировался только компилятор Intel C++ v12.1. Вероятно, и другие версии будут работать. Использование Intel C++ вместо Visual C предоставляет совместимость с C99, которая необходима некоторым модулям CPAN XS, при сохранении совместимости с объектным кодом Visual C и инфраструктурой отладки Visual C в отличие от GCC.
Сборка
-
Убедитесь, что вы находитесь в подкаталоге "win32" в корневом каталоге Perl. В этом каталоге находится файл "Makefile", который будет работать с версиями nmake, поставляемыми с Visual C++ или Windows SDK, а также файл dmake "makefile.mk", который будет работать со всеми поддерживаемыми компиляторами. По умолчанию в файле makefile dmake настроен сборка с использованием MinGW/gcc.
-
Отредактируйте файл makefile.mk (или Makefile, если вы используете nmake) и измените значения INST_DRV и INST_TOP. Вы также можете включить различные флаги сборки. Они объяснены в файлах makefile.
Обратите внимание, что обычно не рекомендуется пытаться собрать Perl с INST_DRV и INST_TOP, установленными в путь, который уже существует из предыдущей сборки. В частности, это может вызвать проблемы с тестом lib/ExtUtils/t/Embed.t, который пытается собрать тестовую программу и может начать сборку против установленного каталога lib/CORE Perl вместо того, который тестируется.
Вы должны убедиться, что CCTYPE установлен правильно, а CCHOME указывает на каталог, куда установлен ваш компилятор.
Если вы собираетесь использовать кросс-компилятор, предоставленный mingw-w64.org, вам нужно будет раскомментировать строку, устанавливающую GCCCROSS в makefile.mk. Делайте это только в случае использования кросс-компилятора, т.е. только если в папке bin нет gcc.exe. (Кросс-компилятор не предоставляет gcc.exe, g++.exe, ar.exe и т.д. Вместо этого все эти исполняемые файлы имеют префикс 'x86_64-w64-mingw32-'.)
Значение по умолчанию для CCHOME в makefile для Visual C++ может быть неверным для некоторых версий. Убедитесь, что значение по умолчанию существует и является корректным.
Возможно, также потребуется закомментировать строку
DELAYLOAD = ...в Makefile, если вы используете VC++ 6.0 без последнего service pack, и компоновщик сообщает об внутренней ошибке.Если вы хотите статически скомпилировать некоторые ядровые расширения в dll Perl, укажите их в макросе STATIC_EXT.
ПРИМЕЧАНИЕ: опция сборки USE_64_BIT_INT не поддерживается компилятором Visual C++ 6.0 32-битной версии.
Внимательно прочтите инструкции в начале файлов makefile.
-
Введите "dmake" (или "nmake", если вы используете этот инструмент сборки).
Это должно собрать все. В частности, это создаст perl.exe, perl528.dll в корневом каталоге Perl и различные другие расширения dll в каталоге lib\auto. Если сборка завершится неудачно по какой-либо причине, убедитесь, что вы правильно выполнили предыдущие шаги.
Чтобы попробовать параллельный режим dmake, введите "dmake -P2", где 2 — максимальное количество параллельных задач, которые вы хотите запустить. Несколько задач в процессе сборки будут выполняться параллельно, но есть точки сериализации, где вы увидите, что только 1 процессор работает на максимуме. Это нормально.
Если вы достаточно опытны в сборке кода C, вот предложение для ускорения сборки Perl и последующей
make test. Постарайтесь держать переменную среды PATH с минимальным количеством папок (помните, что папки вашего компилятора C должны быть в нем).C:\WINDOWS\system32илиC:\WINNT\system32(в зависимости от версии вашей ОС) должны быть первой папкой в PATH, так как "cmd.exe" — это наиболее часто запускаемая программа во время сборки и последующего тестирования.
Тестирование Perl на Windows
Введите "dmake test" (или "nmake test"). Это запустит большую часть тестов из набора тестов (многие тесты будут пропущены).
Не должно быть ошибок в тестах.
Если вы собираетесь с Visual C++ 2013, то три теста могут в настоящее время завершиться неудачей из-за проблем, связанных с летним временем: t/io/fs.t, cpan/HTTP-Tiny/t/110_mirror.t и lib/File/Copy.t. Ошибки вызваны ошибками в CRT в VC++ 2013, которые исправлены в VC++2015 и более поздних версиях, как объясняется Microsoft здесь: https://connect.microsoft.com/VisualStudio/feedback/details/811534/utime-sometimes-fails-to-set-the-correct-file-times-in-visual-c-2013. Пока что, если вам нужны исправленные stat и utime функции, взгляните на распределение CPAN Win32::UTCFileTime.
Если вы собираетесь с определенными версиями (например, 4.8.1) gcc с www.mingw.org, то тест ext/POSIX/t/time.t может завершиться неудачей в тесте 17 из-за известной ошибки в этих сборках gcc: см. http://sourceforge.net/p/mingw/bugs/2152/.
Некоторые тесты могут завершиться неудачей, если вы используете оболочку команд, отличную от стандартной "cmd.exe", или если вы собираетесь из пути, содержащего пробелы. Так что не делайте этого.
Если вы запускаете тесты из окна оболочки emacs, вы можете увидеть ошибки в op/stat.t. В этом случае выполните "dmake test-notty".
Кроме того, вы должны убедиться, что во время make test у вас нет пакетов инструментов GNU в вашем пути: некоторые наборы инструментов, например Unixutils, включают некоторые инструменты (type например), которые перезаписывают Windows-версии и приводят к сбоям тестов. Удалите их из пути во время тестирования, чтобы избежать этих ошибок.
Пожалуйста, сообщите о других ошибках, как описано в разделе "BUGS AND CAVEATS".
Установка Perl на Windows
Введите "dmake install" (или "nmake install"). Это поместит только что собранный Perl и библиотеки в каталог, на который указывает INST_TOP в Makefile. Это также установит документацию pod по адресу $INST_TOP\$INST_VER\lib\pod и HTML-версии этого по адресу $INST_TOP\$INST_VER\lib\pod\html.
Чтобы использовать только что установленный Perl, вам необходимо добавить новую запись в переменную среды PATH: $INST_TOP\bin, например:
set PATH=c:\perl\bin;%PATH% Если вы решили раскомментировать INST_VER и INST_ARCH в файле makefile, то структура установки немного сложнее, и вам нужно будет добавить две новые компоненты PATH: $INST_TOP\$INST_VER\bin и $INST_TOP\$INST_VER\bin\$ARCHNAME, например:
set PATH=c:\perl\5.6.0\bin;c:\perl\5.6.0\bin\MSWin32-x86;%PATH% Рекомендации по использованию Perl на Windows
- Переменные среды
-
Пути установки, заданные вами во время сборки, компилируются в perl, поэтому вам ничего не нужно делать дополнительно, чтобы начать использовать этот perl (кроме добавления его расположения в переменную PATH).
Если вы помещаете расширения в необычные места, вы можете установить PERL5LIB в список путей, разделенных точками с запятой, где perl должен искать библиотеки. Ищите описания других переменных среды, которые вы можете установить в perlrun.
Вы также можете управлять оболочкой, которую perl использует для запуска команд system() и backtick, через PERL5SHELL. См. perlrun.
Perl не зависит от реестра, но он может искать определенные значения по умолчанию, если вы их туда поместите, если только это не отключено во время сборки с помощью USE_NO_REGISTRY. При запуске процесса Perl проверяет, существуют ли
HKEY_CURRENT_USER\Software\PerlиHKEY_LOCAL_MACHINE\Software\Perl. Если ключи существуют, они будут проверяться на протяжении всего выполнения процесса Perl в поисках определенных записей. Записи вHKEY_CURRENT_USER\Software\Perlпереопределяют записи вHKEY_LOCAL_MACHINE\Software\Perl. В ключах может быть установлена одна или несколько из следующих записей (типа REG_SZ или REG_EXPAND_SZ):lib-$] version-specific standard library path to add to @INC lib standard library path to add to @INC sitelib-$] version-specific site library path to add to @INC sitelib site library path to add to @INC vendorlib-$] version-specific vendor library path to add to @INC vendorlib vendor library path to add to @INC PERL* fallback for all %ENV lookups that begin with "PERL"Обратите внимание, что
$]в приведенном выше примере не является буквальным. Подставьте любую версию perl, которую вы хотите учесть в этой записи, например,5.6.0. Пути должны быть разделены точками с запятой, как обычно в Windows. - Глобальный поиск файлов
-
По умолчанию perl обрабатывает глобальный поиск файлов с помощью расширения File::Glob, которое обеспечивает портативный поиск.
Если вы хотите, чтобы perl использовал глобальный поиск, который эмулирует особенности соглашений об именах файлов DOS, вы можете рассмотреть использование File::DosGlob для переопределения внутренней реализации glob(). Подробности см. в File::DosGlob.
- Использование perl из командной строки
-
Если вы привыкли использовать perl из различных командных оболочек, встречающихся в средах UNIX, вас меньше всего порадует то, что предлагает Windows в виде командной оболочки.
Суть понимания среды Windows заключается в том, что командная строка, которую вы вводите, обрабатывается дважды, прежде чем Perl ее увидит. Сначала ваша командная оболочка (обычно CMD.EXE) предварительно обрабатывает командную строку, чтобы обработать перенаправление, расширение переменных среды и местоположение исполняемого файла для запуска. Затем исполняемый файл perl разбивает оставшуюся командную строку на отдельные аргументы, используя библиотеку C Runtime, на которой был построен Perl.
Особо важно отметить, что ни оболочка, ни библиотека C Runtime не выполняют расширения подстановочных символов командных аргументов (поэтому подстановочные символы не нужно заключать в кавычки). Кроме того, поведение цитирования оболочки и библиотеки C Runtime является в лучшем случае примитивным (и может быть несовместимым, если вы используете нестандартную оболочку). Единственный (полезный) символ кавычек — двойная кавычка ("). Ее можно использовать для защиты пробелов и других специальных символов в аргументах.
Документация Windows описывает правила разбора оболочки здесь: http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/cmd.mspx?mfr=true, а правила разбора библиотеки C Runtime здесь: http://msdn.microsoft.com/en-us/library/17w5ykft%28v=VS.100%29.aspx.
Вот некоторые дальнейшие наблюдения, основанные на экспериментах: Библиотека C Runtime разбивает аргументы по пробелам и передает их программам в argc/argv. Двойные кавычки можно использовать для предотвращения разделения аргументов, содержащих пробелы. Вы можете поместить двойную кавычку в аргумент, экранируя ее обратным слешем и поместив весь аргумент в двойные кавычки. Библиотека C Runtime удалит обратный слеш и пару двойных кавычек, окружающих аргумент.
Символы перенаправления файлов "<", ">" и "|" можно заключить в двойные кавычки (хотя есть предположения, что это не всегда верно). Одинарные кавычки не рассматриваются как кавычки оболочкой или библиотекой C Runtime, они не удаляются оболочкой (просто чтобы сделать этот тип цитирования совершенно бесполезным). Также было замечено, что символ «^» ведет себя как символ цитирования, но это, похоже, функция оболочки, и символ «^» не удаляется из командной строки, поэтому Perl его все еще видит (и фаза библиотеки C Runtime не обрабатывает символ «^» как символ цитирования).
Вот несколько примеров использования оболочки «cmd»:
Это выводит две двойные кавычки:
perl -e "print '\"\"' "Это делает то же самое:
perl -e "print \"\\\"\\\"\" "Это выводит «bar» и записывает «foo» в файл «blurch»:
perl -e "print 'foo'; print STDERR 'bar'" > blurchЭто выводит «foo» («bar» исчезает в никуда):
perl -e "print 'foo'; print STDERR 'bar'" 2> nulЭто выводит «bar» и записывает «foo» в файл «blurch»:
perl -e "print 'foo'; print STDERR 'bar'" 1> blurchЭто направляет «foo» в просмоторщик «less» и выводит «bar» на консоль:
perl -e "print 'foo'; print STDERR 'bar'" | lessЭто направляет «foo\nbar\n» в просмоторщик «less»:
perl -le "print 'foo'; print STDERR 'bar'" 2>&1 | lessЭто направляет «foo» в просмоторщик и записывает «bar» в файл «blurch»:
perl -e "print 'foo'; print STDERR 'bar'" 2> blurch | lessВыявление полезности оболочки «command.com» в Windows 9x предоставляется читателю в качестве упражнения :)
Одна из особенно вредных проблем с командной оболочкой 4NT для Windows заключается в том, что она (почти) всегда обрабатывает символ «%» как указание на необходимость расширения переменной среды. В этой оболочке, поэтому, важно всегда удваивать все символы «%», которые вы хотите, чтобы Perl видел (например, для переменных хеша), даже когда они заключены в кавычки.
- Сборка расширений
-
Сеть всеобъемлющих архивов Perl (CPAN) предлагает множество расширений, некоторые из которых требуют компилятора C для сборки. Дополнительную информацию о CPAN см. на http://www.cpan.org/.
Обратите внимание, что не все расширения, доступные в CPAN, могут работать в среде Windows; перед тем как тратить слишком много усилий на портирование модулей, которые не компилируются без проблем, проверьте информацию на http://www.cpantesters.org/.
Большинство расширений (требуют ли они компилятора C или нет) можно собрать, проверить и установить с помощью стандартного заклинания:
perl Makefile.PL $MAKE $MAKE test $MAKE installгде $MAKE — это программа «make», которую вы настроили для использования с perl. Используйте «perl -V:make», чтобы узнать, что это такое. Некоторые расширения могут не предоставлять набор тестов (так что «$MAKE test» может ничего не делать или завершиться сбоем), но большинство серьёзных расширений это делают.
Важно использовать поддерживаемую программу «make» и убедиться, что Config.pm знает о ней. Если у вас нет nmake, вы можете либо получить dmake из указанного ранее места, либо получить старую версию nmake, предположительно доступную по адресу:
http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/nmake15.exe
Другой вариант — использовать написанный на Perl make, доступный из CPAN.
http://www.cpan.org/modules/by-module/Make/
Вы также можете использовать dmake. См. "Make" выше о том, как его получить.
Обратите внимание, что MakeMaker на самом деле генерирует makefiles с разным синтаксисом в зависимости от того, какую программу «make» он считает, что вы используете. Поэтому важно, чтобы одно из следующих значений присутствовало в Config.pm:
make='nmake' # MakeMaker emits nmake syntax make='dmake' # MakeMaker emits dmake syntax any other value # MakeMaker emits generic make syntax (e.g GNU make, or Perl make)Если значение не соответствует программе «make», которую вы хотите использовать, отредактируйте Config.pm, чтобы исправить это.
Если модуль реализует XSUB, вам потребуется один из поддерживаемых компиляторов C. Необходимо убедиться, что вы настроили среду для компилятора для командной компиляции перед запуском
perl Makefile.PLили любого вызова make.Если модуль по какой-либо причине не собирается, тщательно изучите причину сбоя и сообщите об этом автору модуля. Если похоже, что проблема в поддержке сборки расширений, сообщите об этом со всеми подробностями о том, как произошел сбой сборки, используя утилиту perlbug.
- Расширение подстановочных символов командной строки
-
Командные оболочки по умолчанию на операционных системах, являющихся потомками DOS (такими, какими они есть), обычно не расширяют аргументы с подстановочными символами, передаваемые программам. Они считают, что программа должна обрабатывать это. Обычно это достигается связыванием приложения (в нашем случае, perl) с кодом запуска, который обычно предоставляют библиотеки C Runtime. Однако это приводит к несовместимости версий perl (поскольку поведение кода расширения argv отличается в зависимости от компилятора, а на некоторых компиляторах оно даже имеет ошибки). Кроме того, это может стать источником разочарования, если вы используете такой бинарный файл perl с альтернативной оболочкой, которая *расширяет* подстановочные символы.
Вместо этого следующее решение работает довольно хорошо. Преимущества этого решения заключаются в следующем: 1) вы можете начать использовать его сразу; 2) оно более мощное, поскольку правильно обработает шаблон, такой как */*/*.c; 3) вы можете решить, использовать его или нет; и 4) вы можете расширить метод, чтобы добавить любые настраиваемые параметры (или даже совершенно другие типы расширения подстановочных символов).
C:\> copy con c:\perl\lib\Wild.pm # Wild.pm - emulate shell @ARGV expansion on shells that don't use File::DosGlob; @ARGV = map { my @g = File::DosGlob::glob($_) if /[*?]/; @g ? @g : $_; } @ARGV; 1; ^Z C:\> set PERL5OPT=-MWild C:\> perl -le "for (@ARGV) { print }" */*/perl*.c p4view/perl/perl.c p4view/perl/perlio.c p4view/perl/perly.c perl5.005/win32/perlglob.c perl5.005/win32/perllib.c perl5.005/win32/perlglob.c perl5.005/win32/perllib.c perl5.005/win32/perlglob.c perl5.005/win32/perllib.cОбратите внимание, что здесь есть два отдельных шага: 1) вам нужно создать Wild.pm и поместить его в каталог вашей библиотеки perl. 2) Вам нужно установить переменную среды PERL5OPT. Если вы хотите, чтобы расширение argv было значением по умолчанию, просто установите PERL5OPT в вашей среде запуска по умолчанию.
Если вы используете компилятор Visual C, вы можете получить встроенное в бинарный файл perl расширение подстановочных символов командной строки библиотеки C Runtime. Результирующий бинарный файл всегда будет расширять нецитированные командные строки, что может не быть желательным, если вы используете оболочку, которая делает это за вас. Выполняемое расширение также несколько менее мощное, чем предлагаемый выше подход.
- Примечания по 64-разрядной Windows
-
Windows .NET Server поддерживает модель данных LLP64 на архитектуре Intel Itanium.
Модель данных LLP64 отличается от модели данных LP64, которая является нормой на 64-разрядных платформах Unix. В первом случае
intиlongявляются 32-разрядными типами данных, а указатели имеют ширину 64 бита. Кроме того, существует отдельный целочисленный тип шириной 64 бита,__int64. В противоположность этому, модель данных LP64, которая широко распространена на платформах Unix, предоставляетintв качестве 32-разрядного типа, в то время как типlongи указатели имеют 64-битную точность. Обратите внимание, что обе модели обеспечивают 64 бита адресации.64-разрядная Windows, работающая на Itanium, способна транспарентно запускать 32-разрядные x86-бинарные файлы. Это означает, что вы можете использовать 32-разрядную сборку Perl на 64-разрядной системе. Учитывая это, зачем создавать 64-разрядную сборку Perl? Вот некоторые причины:
-
64-разрядное приложение нативно будет работать намного эффективнее на оборудовании Itanium.
-
Нет ограничения в 2 ГБ на размер процесса.
-
Perl автоматически поддерживает большие файлы, когда создается в 64-разрядной Windows.
-
Встраивание Perl в 64-разрядное приложение.
-
Запуск скриптов Perl
Скрипты Perl в UNIX используют строку "#!" (также известную как "shebang") для указания операционной системе, что она должна выполнить файл с помощью perl. Windows не имеет аналогичного средства для указания произвольных файлов как исполняемых.
Вместо этого все доступные методы выполнения текстовых файлов в Windows зависят от расширения файла. Существует три метода использования этого для выполнения скриптов perl:
-
Существует механизм, называемый «ассоциациями расширений файлов». Он может быть изменён с помощью двух команд «assoc» и «ftype», которые входят в стандартный набор Windows. Введите «ftype /?» для полного примера того, как настроить это для скриптов Perl (Вы что? Вы думали, Windows не поддерживает Perl? :).
-
Поскольку ассоциации файлов не работают везде, и, как сообщается, есть ошибки в работе ассоциаций файлов, может быть использован старый метод обертывания скрипта Perl, чтобы он выглядел как обычный пакетный файл для ОС. Процесс установки делает доступным скрипт «pl2bat.bat», который можно использовать для обертывания скриптов Perl в пакетные файлы. Например:
pl2bat foo.plсоздаст файл «FOO.BAT». Обратите внимание, что «pl2bat» удаляет любой суффикс .pl и добавляет суффикс .bat к генерируемому файлу.
Если вы используете командную оболочку 4DOS/NT или подобную ей, обратите внимание, что «pl2bat» использует переменную «%*» в сгенерированном пакетном файле для ссылки на все аргументы командной строки, поэтому вам может потребоваться убедиться, что эта конструкция работает в пакетных файлах. На момент написания этого документа пользователям 4DOS/NT потребуется оператор «ParameterChar = *» в файле 4NT.INI или потребуется выполнить «setdos /p*» в файле запуска 4DOS/NT, чтобы это работало.
-
Использование «pl2bat» имеет несколько проблем: имя файла меняется, поэтому скрипты, которые полагаются на
$0для определения того, что им нужно сделать, могут не работать должным образом; выполнение «pl2bat» дублирует содержимое исходного скрипта, поэтому этот процесс может быть трудоёмким, если исходные файлы часто обновляются. Другой подход, который избегает обеих проблем, возможен.Доступен скрипт «runperl.bat», который можно скопировать в любой файл (вместе с суффиксом .bat). Например, если вы назовёте его «foo.bat», он запустит файл «foo» при выполнении. Поскольку вы можете запускать пакетные файлы в платформах Windows, просто набрав имя (без расширения), это фактически запускает файл «foo», когда вы набираете либо «foo», либо «foo.bat». С этим методом «foo.bat» может даже находиться в другом месте, чем файл «foo», если «foo» доступен где-то в переменной PATH. Если ваши скрипты находятся на файловой системе, которая поддерживает символические ссылки, вы можете даже избежать копирования «runperl.bat».
Отступление: скопируйте «runperl.bat» в «runperl» и введите «runperl». Объясните наблюдаемое поведение или отсутствие такового. :) Подсказка: "gnidnats llits er'uoy fi ,"lrepnur" eteled :tniH
Разные вещи
Установлен полный набор документации HTML, поэтому вы должны иметь возможность использовать её, если у вас установлен веб-браузер на вашей системе.
perldoc также является полезным инструментом для просмотра информации, содержащейся в документации, особенно в сочетании с просмотрщиком, таким как less (в недавних версиях которого есть поддержка Windows). Возможно, вам придётся установить переменную среды PAGER, чтобы использовать определённый просмотрщик. «perldoc -f foo» выведет информацию об операторе Perl «foo».
Частая ошибка при использовании этого порта с графической библиотекой, такой как Tk , заключается в предположении, что обычное поведение Perl по открытию окна командной строки исчезнет. Это не так. Если вы хотите запустить копию perl без открытия окна командной строки, используйте исполняемый файл wperl, созданный во время процесса установки. Использование точно такое же, как и обычное perl в Windows, за исключением того, что такие параметры, как -h не работают (так как им нужно окно командной строки для вывода).
Если вы обнаружите ошибки в Perl, вы можете запустить perlbug для создания отчёта об ошибке (вам может потребоваться отправить его вручную, если perlbug не может найти программу-почтовый клиент на вашей системе).
ОШИБКИ И ЗАМЕЧАНИЯ
Norton AntiVirus мешает процессу сборки, особенно если он настроен на «Автозащита, Все файлы, при открытии». В отличие от крупных приложений, процесс сборки Perl открывает и изменяет множество файлов. Проверка каждого файла антивирусом значительно замедляет процесс сборки. Хуже того, при PERLIO=stdio процесс сборки завершается с необычными сообщениями, так как программа проверки вирусов взаимодействует некорректно с миниperl.exe при записи конфигурационных файлов (похоже, она либо перехватывает часть записанных файлов и считает их подозрительными, либо программа проверки вирусов «блокирует» их таким образом, что miniperl не может обновить их). Сборка завершается
set PERLIO=perlio но это может быть просто удача. Другие программы проверки вирусов могут иметь аналогичные проблемы.
Расширение оболочки Git GUI для Windows, такое как TortoiseGit, значительно замедлит процесс сборки, а впоследствии и make test , поскольку каждый файл проверяется на наличие статуса git как только он создан и/или изменён. TortoiseGit не приводит к ошибкам тестирования или сборки в отличие от описанного выше антивирусного ПО, но приводит к аналогичному замедлению. Рекомендуется использовать диспетчер задач для поиска фоновых процессов, использующих высокую загрузку ЦП во время процесса сборки.
Некоторые встроенные функции не работают точно так, как документировано в perlfunc, а некоторые вообще не реализованы. Чтобы избежать неожиданностей, особенно если у вас был предыдущий опыт работы с Perl в других операционных системах или если вы собираетесь писать код, который будет портативным в других средах, см. perlport для достаточно определённого списка этих отличий.
Не все расширения, доступные из CPAN, могут быть правильно скомпилированы или работать в среде Windows. См. "Создание расширений".
Большинство socket() связанных вызовов поддерживаются, но они могут не вести себя так же, как в системах Unix. См. perlport для полного списка.
Обработка сигналов может не вести себя так же, как в системах Unix (где она, мягко говоря, не идеально «ведет себя» :). Например, вызов die() или exit() из обработчиков сигналов вызовет исключение, поскольку большинство реализаций signal() в Windows сильно ограничены. Таким образом, сигналы могут работать только для простых вещей, таких как установка флаговой переменной в обработчике. Использование сигналов в этом порте в настоящее время следует считать неподдерживаемым.
Пожалуйста, отправляйте подробные описания любых проблем и решений, которые вы можете найти, на <perlbug@perl.org>, а также вывод, полученный от perl -V.
ПРИЗНАТЕЛЬНОСТИ
Использование верблюда в контексте Perl является торговой маркой O'Reilly и Associates, Inc. Используется с разрешения.
АВТОРЫ
- Gary Ng <71564.1743@CompuServe.COM>
- Gurusamy Sarathy <gsar@activestate.com>
- Nick Ing-Simmons <nick@ing-simmons.net>
- Jan Dubois <jand@activestate.com>
- Steve Hay <steve.m.hay@googlemail.com>
Этот документ поддерживается Jan Dubois.
См. также
История
Этот порт был первоначально внесён Gary Ng примерно в версии 5.003_24 и позаимствован из порта Hip Communications, который был доступен в то время. С тех пор различные люди внесли множество разнообразных изменений.
Поддержка GCC/mingw32 была добавлена в версии 5.005 (Nick Ing-Simmons).
Поддержка PERL_OBJECT была добавлена в версии 5.005 (ActiveState Tool Corp).
Поддержка эмуляции fork() была добавлена в версии 5.6 (ActiveState Tool Corp).
Поддержка Win9x была добавлена в версии 5.6 (Benjamin Stuhl).
Поддержка 64-битных систем Windows была добавлена в версии 5.8 (ActiveState Corp).
Последнее обновление: 23 мая 2018
© 1993–2020 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.28.3/perlwin32