日向夏特殊応援部隊

俺様向けメモ

Makefile.PLで決める設定値をテストに渡す

はじめに

d:id:ZIGOROu:20061130:1164840144 の続きです。
komamiya氏の物をもう少し小綺麗に書き直してみました。
komamiya氏ありがトン。

testセクションに指定した環境変数を渡すMYモジュール

package MY;

use strict;
use warnings;

our @INCLUDE_ENV = ();

sub test {
    my ( $self, %attrs ) = @_;

    my $env = join(
        " " => map { sprintf( "%s=\"%s\"" => $_, $ENV{$_} ) }
                                                grep { exists $ENV{$_} } @INCLUDE_ENV
    );
    my $section = $self->SUPER::test(%attrs);

    $section =~ s|(PERL_DL_NONLAZY=1)|$1 $env|g if ($env);

    return $section;
}

1;

@MY::INCLUDE_ENVに渡したい環境変数だけ指定してあげれば、
それらの環境変数がセットされていればmake test時のパラメータとしてセットします。

t/lib/MY.pmとかやって、Makefile.PL中では、

use lib qw(t/lib);
use inc::Module::Install;
use MY;

@MY::INCLUDE_ENV = qw/FOO BAR/;

name('Dummy-Module');
author('Toru Yamaguchi <zigorou@cpan.org>');
version_from('lib/Dummy/Module.pm');
abstract('dummy');
license('perl');

auto_include;
auto_install;

$ENV{FOO} = prompt("Input FOO value: ", "foo");
$ENV{BAR} = prompt("Input BAR value: ", "bar");

WriteAll;

みたいな記述でOKだと思います。
こんな風にして指定したt/lib/MY.pmはMANIFEST.SKIPで予め除外しておくと、
make manifestから一覧から消えるのと、t以下の"モジュール"は、
make install時にインストールされないので、一時的なモジュールならばt以下に置くのが吉。

test_dynamic :: pure_all
        PERL_DL_NONLAZY=1 FOO="foo" BAR="bar" $(FULLPERLRUN) "-MExtUtils::Command::MM" "-e" "test_harness($(TEST_VERBOSE), '
inc', '$(INST_LIB)', '$(INST_ARCHLIB)')" $(TEST_FILES)

testdb_dynamic :: pure_all
        PERL_DL_NONLAZY=1 FOO="foo" BAR="bar" $(FULLPERLRUN) $(TESTDB_SW) "-Iinc" "-I$(INST_LIB)" "-I$(INST_ARCHLIB)" $(TEST
_FILE)

こんな風にMakefileが書き出されます。

モジュール作成中のデバッグ(追記)

$ FOO="foo" BAR="bar" prove -l lib t/01-foo.t

こんな感じでOKです。
よし今からお風呂入ってくる。(ぇ