2010-11-18 11 views
1

プロジェクトに応じてインクルードする特定のディレクトリとCライブラリをリストするトップレベルのdefinitions.mkファイルがありますそう。ExtUtils :: MakeMaker外部* .mkを使用し、WriteMakefileのLIBSとINCパラメータに* .mkファイルを定義する

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

私はPerlスクリプトは、これらのライブラリをリンクしますどのMakefileを生成するために、これらのライブラリとのMakeMakerにアクセスできるようにXSを使用しています。私はそのようなのMakefileが生成されたときに、それはこれらの定義に引っ張ることにしたいです。

は、私は今それがないように見えるこの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"}, 
); 

を持って@mobruleから、この

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

を達成したい、この

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

ようWriteMakefileを考えます私が望むものありがとう!

+0

ここに質問がありますか?どの部分に問題がありますか?何を試しましたか? – cjm

+0

さて、それを行う方法があるのか​​不思議です。オンラインのドキュメントを見ると、WriteMakefileのどのパラメータもこれを達成できないため、明らかに見えません。私は、define.mkファイルをMakefile.PLに引き込み、解析することができますが、簡単な方法はありますか? – colekas

答えて

0
あなたの追加の定義が含まれるように post_initializeメソッドをオーバーライド

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

は、これらのように、後の定義(例えばLIBSは、それらを使用することができます)、Makefileの先頭に表示されます。

次の問題は、MakeMakerがLIBSINCパラメータの「無効な」エントリをMakefileに渡すようにすることです。 Windowsでは

私はあなただけ

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

のように、:nosearchを置くことができ、それは(ExtUtils::Liblistにドキュメントを参照してください)を通過すると思います。動作しない、とあなたはinit_othersを上書きするような、より過激な何かをする必要があるかもしれないのUnix-yのシステムの場合:

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

私はこれをテストしていないと、これは完全な実用的なソリューションではないかもしれません。うまくいけば、正しい方向に進むことができます。

+0

post_initializeコードの場合、$ extra_definesを返さないようにしてください – colekas

+0

また、MM :: init_othersサブはMM_Unix :: init_othersでなければなりません。 – colekas

+0

また、INCパラメータは、LIBSパラメータと同じように細かく渡すことができます。 – colekas

関連する問題