Creative Commons License
Excepto donde se indique otra cosa, todo el contenido de este lugar está bajo una licencia de Creative Commons.
Taquiones > victor > cestas > Jueves 6 de Septiembre de 2007

Jueves 6 de Septiembre de 2007

Correspondencias entre constructores

Esta es la tabla de correspondencias entre ExtUtils::MakeMaker y Module::Build:

Parámetro MakeMaker Equivalencia en Module::Build
NAME module_name
DISTNAME dist_name
ABSTRACT dist_abstract
AUTHOR dist_author
VERSION dist_version
VERSION_FROM dist_version_from
PREREQ_PM requires
PL_FILES PL_files
PM pm_files
MAN1PODS pod_files
XS xs_files
INC include_dirs
INSTALLDIRS installdirs
DESTDIR destdir
CCFLAGS extra_compiler_flags
EXTRA_META meta_add
SIGN sign
LICENSE license
clean.FILES @add_to_cleanup

Tomado del artículo Still More Perl Lightning Articles, de Phil Crow, Josh McAdams, Steven Schubiger y chromatic.

Como hacer ejecutable un módulo

Aunque ya he visto varias soluciones, ésta es de las más elegantes y seguras que he encontrado. En el mismo artículo citado anteriormente, concretamente en la parte de Josh McAdams, podemos ver un buen ejemplo de cómo conseguir que un módulo pueda ser llamado como ejecutable directamente.

Asumimos que tenemos lo siguiente:

    1 package MyModule;
    2 use strict;
    3 
    4 sub hora {
    5     print localtime(),"\n";
    6 }
    7 1;

Para poder llamarlo directamente hay que hacer algo parecido a ésto:

$ perl -MMyModule -e 'MyModule::hora();'
2028116810742481
$

lo cual es algo engorroso y propenso a errores. Ahora bien, si añadimos cierto código a nuestro módulo podríamos hacer lo siguiente:

    1 #!/usr/bin/perl
    2 
    3 package MyModule;
    4 use strict;
    5 
    6 sub hora {
    7     print localtime(),"\n";
    8 }
    9 
   10 sub run {
   11     hora();
   12 }
   13 
   14 run unless caller;
   15 
   16 1;

y usarlo directamente:

$ perl MyModule.pm 
2028116810742481
$

Es decir, incluímos una función con un nombre muy concreto, run, que será invocada siempre que la función caller no devuelva nada, es decir, siempre que sea una primera ejecución y no desde otro módulo.

Por supuesto siempre es posible crear un enlace simbólico hacia el módulo con un nombre más amigable:

$ ln -s MyModule.pm myhora
$ perl myhora 
$ chmod u+x MyModule.pm
$ ./myhora

aunque esto es un refinamiento que depende mucho del gusto del administrador.

Ah, el módulo incorpora una línea de intérprete (una shebang) al principio para poder usarlo sin anteponer el intérprete.

Razones para usar Module::Build

Michael G Shwern tiene una divertida charla en la que afirma que es conveniente, necesario incluso, pasarse a Module::Build en detrimento de ExtUtils::MakeMaker, a pesar de ser él el que mantiene este último paquete.

Para resumir diré que los principales defectos que tiene ExtUtils::MakeMaker son:

  • Depende de un utilidad externa: make.
  • Los archivos que definen el proyecto son programas shell.
  • Ninguno de los dos, ni make ni el shell, tiene asegurado un nivel siquiera parecido de portabilidad que el propio lenguaje Perl.