Почему я не могу построить «настоящий» прагматический модуль на Strawberry Perl 5.28.1? - PullRequest
0 голосов
/ 23 января 2019

Я перестраиваю рабочую станцию ​​Windows 10 (64-разрядную) с нуля, и наткнулся на препятствие при создании одного конкретного модуля CPAN: true . Это хорошо зарекомендовавший себя модуль & mdash; последний раз оно обновлялось в 2011 году! & mdash; и я использовал его в течение многих лет на предыдущих версиях Strawberry Perl, вплоть до 5.26 включительно. Я озадачен тем, что происходит не так.

Я строю модуль следующим образом:

C:\Strawberry\cpan\build\true-0.18-0> perl Makefile.PL
Checking if your kit is complete...
Looks good
Generating a gmake-style Makefile
Writing Makefile for true
Writing MYMETA.yml and MYMETA.json
C:\Strawberry\cpan\build\true-0.18-0> gmake
cp lib/true/VERSION.pm blib\lib\true\VERSION.pm
cp lib/true.pm blib\lib\true.pm
Running Mkbootstrap for true ()
"C:\Strawberry\perl\bin\perl.exe" -MExtUtils::Command -e chmod -- 644 "true.bs"
"C:\Strawberry\perl\bin\perl.exe" -MExtUtils::Command::MM -e cp_nonempty -- true.bs blib\arch\auto\true\true.bs 644
"C:\Strawberry\perl\bin\perl.exe" "C:\Strawberry\perl\lib\ExtUtils/xsubpp"  -typemap C:\STRAWB~1\perl\lib\ExtUtils\typemap  true.xs > true.xsc
"C:\Strawberry\perl\bin\perl.exe" -MExtUtils::Command -e mv -- true.xsc true.c
gcc -c  -IC:\Strawberry\perl\site\lib\B\Hooks\OP\Annotation\Install -IC:\Strawberry\perl\vendor\lib\B\Hooks\OP\Check\Install -s -O2 -DWIN32 -DWIN64 -DCONSERVATIVE -D__USE_MINGW_ANSI_STDIO -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -fwrapv -fno-strict-aliasing -mms-bitfields -O3 -Wall -W   -DVERSION=\"0.18\" -DXS_VERSION=\"0.18\"  "-IC:\STRAWB~1\perl\lib\CORE"   true.c
In file included from true.xs:4:0:
true.xs: In function 'true_leave':
C:\STRAWB~1\perl\lib\CORE/perl.h:174:22: warning: unused parameter 'my_perl' [-Wunused-parameter]
#  define pTHX  tTHX my_perl PERL_UNUSED_DECL
^
true.xs:25:24: note: in expansion of macro 'pTHX'
STATIC void true_leave(pTHX) {
^
"C:\Strawberry\perl\bin\perl.exe" -MExtUtils::Mksymlists \
-e "Mksymlists('NAME'=>\"true\", 'DLBASE' => 'true', 'DL_FUNCS' => {  }, 'FUNCLIST' => [], 'IMPORTS' => {  }, 'DL_VARS' => []);"
g++ true.def -o blib\arch\auto\true\true.xs.dll -mdll -s -L"C:\STRAWB~1\perl\lib\CORE" -L"C:\STRAWB~1\c\lib" true.o   "C:\STRAWB~1\perl\lib\CORE\libperl528.a" "C:\Strawberry\perl\site\lib\auto\B\Hooks\OP\Annotation\Annotation.a" "C:\Strawberry\perl\vendor\lib\auto\B\Hooks\OP\Check\Check.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libmoldname.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libkernel32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libuser32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libgdi32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libwinspool.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libcomdlg32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libadvapi32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libshell32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libole32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\liboleaut32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libnetapi32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libuuid.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libws2_32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libmpr.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libwinmm.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libversion.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libodbc32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libodbccp32.a" "C:\STRAWB~1\c\x86_64-w64-mingw32\lib\libcomctl32.a" -Wl,--enable-auto-image-base
"C:\Strawberry\perl\bin\perl.exe" -MExtUtils::Command -e chmod -- 755 blib\arch\auto\true\true.xs.dll
dlltool --def true.def --output-lib blib\arch\auto\true/true.a --dllname true.xs.dll blib\arch\auto\true\true.xs.dll

Я не знаю, является ли предупреждение о pTHX значительным или игнорируемым. Во всяком случае, он генерирует выходной файл true.xs.dll:

C:\Strawberry\cpan\build\true-0.18-0> dir blib\arch\auto\true\true.xs.dll
Volume in drive C is Local SSD Disk
Volume Serial Number is B4E3-5132

Directory of C:\Strawberry\cpan\build\true-0.18-0\blib\arch\auto\true

01/23/2019  09:53            17,920 true.xs.dll
1 File(s)         17,920 bytes
0 Dir(s)  873,458,094,080 bytes free

Но файл непригоден для использования:

C:\Strawberry\cpan\build\true-0.18-0> perl -I blib\arch\auto -Iblib\arch\auto\true -I blib\lib\auto -I blib\lib\ -Mtrue
Can't load 'blib\arch\auto\true/true.xs.dll' for module true: load_file:The specified module could not be found at C:/Strawberry/perl/lib/DynaLoader.pm line 193.
at - line 0.
Compilation failed in require.
BEGIN failed--compilation aborted.

Документация по Dynaloader на самом деле не помогает, но код в Dynaloader.pm возле строки 193 дает подсказку:

# Many dynamic extension loading problems will appear to come from
# this section of code: XYZ failed at line 123 of DynaLoader.pm.
# Often these errors are actually occurring in the initialisation
# C code of the extension XS file. Perl reports the error as being
# in this perl code simply because this was the last perl code
# it executed.

Итак, моя рабочая теория такова, что & ldquo; что-то & rdquo; изменен в последнем Perl, вызывая гниение кода в модуле true. Но в моей теории есть недостаток: по крайней мере один CPAN-тестер успешно построил true (хотя они сделали это с 32-битным Perl).

Я в растерянности. У кого-нибудь есть идеи, которые я могу попробовать?

1 Ответ

0 голосов
/ 25 января 2019

Я не уверен, публиковать ли это как ответ или нет, но это по крайней мере разрешение . Потратив полтора дня на просмотр исходного кода и пробуя различные эксперименты, я сдался, удалил 64-битную версию Strawberry 5.28.1 и установил 32-битную версию Strawberry 5.28.1. Затем true собран, протестирован и установлен как чемпион.

Мое единственное предположение (и это дикое предположение) состоит в том, что какая-то часть процесса каким-то образом находила и взаимодействовала с некоторыми 32-разрядными двоичными файлами в сети & mdash; хотя у меня явно не было PERL5LIB или других установленных в Perl переменных env, и ничего в моем PATH не указывало ни на какие сетевые Perl-компоненты.

Но у меня нет времени исследовать это дальше, и 32-битный Perl достаточно хорош для того, что я делаю. Большое спасибо @Corion и @ikegami за их время и комментарии.

...