2010-11-18 17 views
1

J'ai un haut niveau définit.mk fichier qui répertorie certains répertoires et C bibliothèques à inclure en fonction du projet comme alors.ExtUtils :: MakeMaker y compris externe * .mk et en utilisant définit dans * fichier .mk pour les paramètres LIBS et INC dans WriteMakefile

KERNEL_LIB = -lkdev 
DRIVER_LIB = -ldriver -lutil -linit $(KERNEL_LIB) 
DRIVER_INCLUDE = -I../../include 

J'utilise XS pour permettre aux scripts Perl d'accéder à ces bibliothèques et MakeMaker pour générer le Makefile qui reliera ces bibliothèques. Je veux faire de telle sorte que lorsque le Makefile est généré, il tire dans ces définit.

donné une WriteMakefile comme celui-ci

WriteMakefile( 
    NAME    => 'generic_scripts', 
    VERSION_FROM  => 'generic_scripts.pm', 
    LIBS    => ['-L/usr/local/app/lib -lkdev -lpthread -lrt -ldriver -lutil -linit'], 
    DEFINE   => '', 
    INC    => '-I../../include', 
    clean    => {FILES=>"*.o"}, 
); 

Je veux atteindre cet

WriteMakefile( 
    NAME    => 'generic_scripts', 
    VERSION_FROM  => 'generic_scripts.pm', 
    LIBS    => ['-L/usr/local/dx/lib $(KERNEL_LIB) -lpthread -lrt $(DRIVER_LIB)'], 
    DEFINE   => '', 
    INC    => '$(DRIVER_INCLUDE)', 
    clean    => {FILES=>"*.o"}, 
); 

De @mobrule J'ai maintenant ce Makefile.PL

use 5.008008; 
use ExtUtils::MakeMaker; 
use ExtUtils::MM_Unix; 
use ExtUtils::MM; 

sub MY::post_initialize { 
    open my $defs, '<', 'defines.mk'; 
    my $extra_defines = join '', <$defs>; 
    close $defs; 
    return $extra_defines; 
} 

sub MM::init_others { 
    my $self = shift; 
    $self->ExtUtils::MM_Unix::init_others(@_); 

    $self->{EXTRALIBS} = '-L/usr/local/app/lib $(DRIVER_LIB) -lpthread -lrt'; 
    $self->{BSLOADLIBS} = $self->{LDLOADLIBS} = $self->{EXTRALIBS}; 
} 

WriteMakefile(
    NAME    => 'generic_scripts', 
    VERSION_FROM  => 'generic_scripts.pm', 
    DEFINE   => '', 
    INC    => '$(DRIVER_INCLUDE)', 
    clean    => {FILES=>"*.o"}, 
); 

qui ressemble comme il le fait ce que je veux. Merci!

+0

Avez-vous une question ici? Quelle partie avez-vous des problèmes avec? Qu'avez-vous essayé? – cjm

+0

Eh bien, je suis juste curieux de savoir s'il y a un moyen de le faire? En regardant la documentation en ligne, cela ne semble pas évident car aucun des paramètres de WriteMakefile ne peut y parvenir. Je suppose que je peux tirer dans le fichier defines.mk dans Makefile.PL et l'analyser, mais est-il un moyen plus facile? – colekas

Répondre

0

substituez la méthode post_initialize pour inclure vos définitions supplémentaires:

sub MY::post_initialize { 
    open my $defs, '<', 'defines.mk'; 
    my $extra_defines = join '', <$defs>; 
    close $defs; 
    return $extra_defines; 
} 

Ceux-ci apparaissent en haut du makefile, plus tard les définitions (par exemple LIBS, peuvent les utiliser).

Le prochain problème est que MakeMaker laisse passer les entrées "invalides" dans les paramètres LIBS et INC au Makefile.

Sous Windows, je pense que vous pouvez simplement mettre un :nosearch, comme

LIBS => ['-lm', ':nosearch $(OTHER_LIBS)'] 

et il passera par (consulter la documentation à ExtUtils::Liblist). Sur les systèmes Unix-y qui ne fonctionne pas, et vous devrez peut-être faire quelque chose de plus radical comme remplaçant init_others:

sub MM::init_others {  # MM package is a subclass of ExtUtils::MM_Unix and will 
          # get called instead of ExtUtils::MM_Unix::init_others 
    my $self = shift; 
    $self->SUPER::init_others(@_); # invoke ExtUtils::MM_Unix::init_others 

    # now repair the attributes that ExtUtils::MM_Any::init_others didn't set 
    $self->{EXTRALIBS} = '-lkdev $(KERNEL_LIB) -lrt $(DRIVER_LIB)'; 
    $self->{BSLOADLIBS} = $self->{LDLOADLIBS} = $self->{EXTRALIBS}; 
    1; 
} 

Je n'ai pas testé et cela pourrait ne pas être une solution de travail complète. J'espère que cela vous aidera à aller dans la bonne direction (si vous lisez toujours aussi loin).

+0

Pour le code post_initialize, ne voulez-vous pas renvoyer $ extra_defines? – colekas

+0

Aussi MM :: init_others devrait-il être MM_Unix :: init_others .. right? – colekas

+0

En outre, je peux passer le paramètre INC apparemment bien, c'est juste le paramètre LIBS. – colekas