2010-11-18 16 views
1

LIBS ve INC parametreleri için * .mk dosyası içinde tanımları kullanarak, belirli dizinleri ve C kütüphanelerini projeye bağlı olarak içerecek şekilde listeleyen bir üst düzey tanımlarım var. yani. ExtUtils :: MakeMaker harici * .mk dahil olmak üzere ve WriteMakefile

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

Ben perl komut ben Makefile oluşturulduğunda, bu tanımlayıp çeker o böyle yapmak istiyorum. Bu kütüphaneler bağlayacak Makefile oluşturmak üzere bu kütüphaneler ve MakeMaker erişmesine izin vermek için XS kullanabilirsiniz.

Ben şimdi öyle benziyor bu 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"}, 
); 

sahip @mobrule itibaren bu

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"}, 
); 

ulaşmak istiyoruz bu

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"}, 
); 

gibi WriteMakefile Verilen istediğim. Teşekkürler!

+0

Burada bir soru var mı? Hangi kısımda sorun yaşıyorsun? Ne denedin? – cjm

+0

Peki, bunu yapmanın bir yolu var mı diye merak ediyorum. Belgelere çevrimiçi bakıldığında, WriteMakefile'nin parametrelerinden hiçbirinin bunu başaramayacağı açıkça görülmez. Ben defines.mk dosyasını Makefile.PL içine alıp ayrıştırabilirim ama daha kolay bir yol var mı? – colekas

cevap

0
olarak ek tanımlar dahil post_initialize yöntemini geçersiz kılar

:

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

Bu nedenle daha sonra tanımlar (örneğin LIBS, bunları kullanabilir), Makefiledaki en görünür. Sonraki sorun, MakeMaker'ın LIBS ve INC parametrelerindeki "geçersiz" girişlerin Makefile geçirilmesine izin vermesidir. Windows'ta

Ben sadece

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

gibi bir :nosearch koyabilirsiniz düşünüyorum ve bu geçmesine (ExtUtils::Liblist için docs başvurunuz) olacaktır. çalışmıyor Unix y sistemlerde ve init_others geçersiz kılma gibi daha radikal bir şey yapmak gerekebilir: Bu test değil

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; 
} 

ve bu tam bir çalışma solüsyonu olmayabilir. Umarım doğru yöne gidersiniz (eğer hala bu kadar okuyorsanız).

+0

Post_initialize kodu için, $ extra_defines – colekas

+0

'u iade etmek istemiyorsunuz. Ayrıca MM :: init_others MM_Unix :: init_others olmalıdır. – colekas

+0

Ayrıca, INC parametresini, görünüşe göre sadece LIBS parametresinden iyi geçebilirim. – colekas