nmake falla al construir el módulo Perl

Estoy tratando de construir Win32 :: Daemon por mi mismo. La razón por la que no uso CPAN es porque quiero profundizar en el funcionamiento de los módulos de Perl. Al final, espero encontrar una solución para otro problema al ver que esto funciona (no es importante aquí).

Vería 3 opciones para construir el módulo: cygwin, mingw, compilador de microsoft (cl)

En MinGW informa que no es compatible (simple si está en Makefile.PL) que se expande a más errores una vez que modifico la verificación para que coincida con MinGW En Cygwin se queja tchar.h que, como descubrí, es un encabezado de Windows (MinGW lo tiene).

Pero mi objetivo real de todos modos es construirlo con el compilador de MS, por lo que si bien cualquier compilación que no requiera ninguna librería especial (como lo haría con cygwin, supongo) requerirá más.

Así que ahora aquí va mi salida nmake de ejecutar solo name /f Makefile:

NMAKE : fatal error U1073: "C:/Program" could not be created.
Stop.

Traduje aproximadamente el mensaje de error del alemán, pero la declaración es simple. Lo que veo aquí parece ser un problema de ruta (probablemente los espacios). También me doy cuenta de la barra diagonal. El Makefile fue creado por el Makefile.PL script (estoy usando Active Perl v5.12.1):

use strict;
use warnings;

use Config qw(%Config);
use ExtUtils::MakeMaker;

unless ($^O eq "MSWin32" || $^O eq "cygwin") {
    die "OS unsupported\n";
}

require Win32;

my %param = (
    NAME          => 'Win32::Daemon',
    VERSION_FROM  => 'Daemon.pm',
    DEFINE        => '-DPERL_NO_GET_CONTEXT',
    OBJECT        => 'CCallbackList$(OBJ_EXT) CCallbackTimer$(OBJ_EXT) Constant$(OBJ_EXT) CWinStation$(OBJ_EXT) Daemon$(OBJ_EXT) ServiceThread$(OBJ_EXT)',
    XS            => { 'Daemon.xs' => 'Daemon.cpp' },
);
$param{INC} .= ' -EHsc' if $Config{'cc'} =~ /^cl/i;
$param{NO_META} = 1 if eval "$ExtUtils::MakeMaker::VERSION" >= 6.10_03;
WriteMakefile(%param);

sub MY::xs_c {
    '
.xs.cpp:
    $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >xstmp.c && $(MV) xstmp.c $*.cpp
';
}

No sé mucho sobre MakeMaker, pero no veo nada aquí que pueda arreglar y esperaría que se reduzca a arreglar el Makefile mismo a mano. Intenté un par de cosas como citar pero nada ayudó.

La cosa es que estoy acostumbrado a problemas como este cuando construyo en Windows, pero normalmente esto es para herramientas que fueron creadas para Unix. Este es explícitamente SOLO Windows, por lo que espero que funcione de inmediato. Entonces me imagino que I estoy haciendo algo mal

¿Alguna ayuda sobre dónde encontrar la solución? Gracias por adelantado.

Editar/Agregar: probé esto en otra máquina Win7 con Active Perl 5.16.x y funcionó de maravilla. Miré la salida diferente de esta máquina y la actual que falla cuando se ejecuta perl Makefile.PL y recibo el siguiente resultado:

... Detected uninstalled Perl.  Trying to continue.
Unable to find a perl 5 (by these names: C:\Program Files\Perl64\bin\perl.exe perl.exe perl5.exe perl5.12.1.exe miniperl.exe, in these dirs: . [...] C:\Program Files\Perl64\site\bin C:\Program Files\Perl64\bin [...])
Have \progra~1\perl64\lib
Want \temp\perl---please-run-the-install-script---\lib
Writing Makefile for Win32::Daemon

Trunqué la salida. Ahora, por favor, que alguien me explique: ¿Por qué puedo correr perl Makefile.PL or perl -v pero no encuentra mi Perl en el directorio exacto en el que se encuentra? Lo reinstale pero no funciono...

preguntado el 22 de mayo de 12 a las 11:05

¿Qué distribución de Perl estás usando? -

¿Puedes encontrar la ocurrencia de C:/Program en el Makefile? (Supongo que esto es en realidad C:/Program Files). Saber de dónde vino esto podría darte algo más que puedas rastrear. -

puede haber problemas para escapar de las cadenas que se utilizan en el Makefile, es posible que deba generar el archivo MAKE con Makefile.PL y luego editarlo para escapar de las cadenas correctamente. nmake y dmake pueden interpretar los Makefiles de manera diferente, por lo que MakeMaker tiene dificultades para hacerlo bien. -

Estoy usando Active Perl v5.12.1. La ruta está en el archivo MAKE, sí. Entonces, ¿cómo escapo? ¿Por qué tiene barras diagonales? -

Parece que te arrinconaste a ti mismo debido a malas suposiciones, y tenemos que retroceder un par de pasos en lugar de solo tratar los síntomas. ¿Ha instalado manualmente una cadena de herramientas del compilador? En caso afirmativo, ¿de quién fueron las instrucciones que usó? De lo contrario, confirme que obtuvo la cadena de herramientas instalando el MinGW y dmake PPM. -

1 Respuestas

Bien, finalmente parece que resolví esto después de horas de búsqueda. El problema radica en múltiples temas.

El primer comando de "perl desinstalado" no tiene ningún sentido, pero puede solucionarlo proporcionando perl Makefile.PL PERL_SRC="C\:Program Files\Perl64". Aviso: Esto no funcionó en un shell de comandos para mí, tuve que usar powershell, porque no trataría el camino correctamente. Tal vez necesites hacer malabarismos con esto un poco. Nota:: Al final lo arreglé instalando el Active Perl original, no el proporcionado por mi instalador (distribución de software de la empresa)

Ahora a la cuestión de no encontrar perl: Este es un problema con espacios en la ruta. Arreglé esto (aparentemente) creando un enlace simbólico sin espacios. Ahora perl Makefile.PL no arroja ningún error, pero nmake -f "Makefile" fallido. Así que la solución realmente fue: ¡No tenga espacios en su ruta de Perl! Esto apesta y, francamente, en 2012 ya no debería ser un problema, pero aquí tienes.

Gracias por todo el esfuerzo que todos pusieron, esto fue difícil de resolver.

Respondido 05 Jul 12, 14:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.