Please try my second attempt at fixing the problem, attached.
kid51
Index: lib/Parrot/Configure/Step/Methods.pm =================================================================== --- lib/Parrot/Configure/Step/Methods.pm (.../trunk) (revision 28442) +++ lib/Parrot/Configure/Step/Methods.pm (.../branches/handledarwin) (revision 28471) @@ -69,13 +69,7 @@ ldflags => "-L$fink_lib_dir", ccflags => "-I$fink_include_dir", ); - foreach my $flag (keys %intended) { - my $flagstr = $conf->data->get($flag); - my @elements = split /\s+/, $flagstr; - my %seen = map {$_, 1} @elements; - $conf->data->add( ' ', $flag => $intended{$flag} ) - unless $seen{$intended{$flag}}; - } + _add_flags_not_yet_seen($conf, \%intended); } } } @@ -100,13 +94,18 @@ sub _handle_darwin_for_macports { my ($self, $conf, $osname, $file) = @_; if ( $osname =~ /darwin/ ) { - my $ports_root = $conf->data->get( 'ports_base_dir' ); - my $ports_lib_dir = $conf->data->get( 'ports_lib_dir' ); - my $ports_include_dir = $conf->data->get( 'ports_include_dir' ); - if ( $ports_include_dir && -f qq{$ports_include_dir/$file} ) { - $conf->data->add( ' ', linkflags => "-L$ports_lib_dir" ); - $conf->data->add( ' ', ldflags => "-L$ports_lib_dir" ); - $conf->data->add( ' ', ccflags => "-I$ports_include_dir" ); +# my $ports_root = $conf->data->get( 'ports_base_dir' ); + my $ports_lib_dir = $conf->data->get( 'ports_lib_dir' ); + my $ports_include_dir = $conf->data->get( 'ports_include_dir' ); + if ( defined $ports_lib_dir && defined $ports_include_dir ) { + if ( -f qq{$ports_include_dir/$file} ) { + my %intended = ( + linkflags => "-L$ports_lib_dir", + ldflags => "-L$ports_lib_dir", + ccflags => "-I$ports_include_dir", + ); + _add_flags_not_yet_seen($conf, \%intended); + } } } return 1; @@ -210,7 +209,18 @@ return 1; } +sub _add_flags_not_yet_seen { + my ($conf, $intended) = @_; + foreach my $flag (keys %{ $intended }) { + my $flagstr = $conf->data->get($flag); + my @elements = split /\s+/, $flagstr; + my %seen = map {$_, 1} @elements; + $conf->data->add( ' ', $flag => $intended->{$flag} ) + unless $seen{$intended->{$flag}}; + } +} + =head1 SEE ALSO Parrot::Configure::Step. Index: t/steps/auto_readline-01.t =================================================================== --- t/steps/auto_readline-01.t (.../trunk) (revision 28442) +++ t/steps/auto_readline-01.t (.../branches/handledarwin) (revision 28471) @@ -5,7 +5,7 @@ use strict; use warnings; -use Test::More qw(no_plan); # tests => 52; +use Test::More tests => 72; use Carp; use Cwd; use File::Spec; @@ -109,12 +109,12 @@ my $cwd = cwd(); { - my $tdir = tempdir( CLEANUP => 1 ); - ok(chdir $tdir, "Able to change to temporary directory"); + my $tdir1 = tempdir( CLEANUP => 1 ); + ok(chdir $tdir1, "Able to change to temporary directory"); ok( (mkdir 'lib'), "Able to make lib directory"); ok( (mkdir 'include'), "Able to make include directory"); - my $libdir = File::Spec->catdir( $tdir, 'lib' ); - my $includedir = File::Spec->catdir( $tdir, 'include' ); + my $libdir = File::Spec->catdir( $tdir1, 'lib' ); + my $includedir = File::Spec->catdir( $tdir1, 'include' ); $conf->data->set('fink_lib_dir' => $libdir); $conf->data->set('fink_include_dir' => $includedir); $osname = 'darwin'; @@ -122,7 +122,8 @@ ok($step->_handle_darwin_for_fink($conf, $osname, 'readline/readline.h'), "handle_darwin_for_fink() returned true value"); $flagsafter = $conf->data->get( 'linkflags' ); - is($flagsbefore, $flagsafter, "No change in linkflags, as expected"); + is($flagsbefore, $flagsafter, + "No change in linkflags, as expected, where Fink lib and include directories exist but readline/readline.h does not"); ok(chdir $cwd, "Able to change back to original directory after testing"); } @@ -149,11 +150,56 @@ $flagsafter = $conf->data->get( 'linkflags' ); isnt($flagsbefore, $flagsafter, "Change in linkflags, as expected"); like($conf->data->get( 'linkflags' ), qr/-L\Q$libdir\E/, - "'linkflags' modified as expected"); + "'linkflags' modified as expected, in case where Fink lib and include dirs exist and readline/readline.h exists"); + $conf->data->set( linkflags => $flagsbefore ); #reset for next test ok(chdir $cwd, "Able to change back to original directory after testing"); } +{ + my $tdir3 = tempdir( CLEANUP => 1 ); + ok(chdir $tdir3, "Able to change to temporary directory"); + ok( (mkdir 'lib'), "Able to make lib directory"); + ok( (mkdir 'include'), "Able to make include directory"); + ok( (mkdir 'include/readline'), "Able to make include/readline directory"); + my $libdir = File::Spec->catdir( $tdir3, 'lib' ); + my $includedir = File::Spec->catdir( $tdir3, 'include' ); + $conf->data->set('fink_lib_dir' => $libdir); + $conf->data->set('fink_include_dir' => undef); + + $osname = 'darwin'; + $flagsbefore = $conf->data->get( 'linkflags' ); + ok($step->_handle_darwin_for_fink($conf, $osname, 'readline/readline.h'), + "handle_darwin_for_fink() returned true value"); + $flagsafter = $conf->data->get( 'linkflags' ); + is($flagsbefore, $flagsafter, + "No change in linkflags, as expected, where Fink include directory does not exist"); + + ok(chdir $cwd, "Able to change back to original directory after testing"); +} + +{ + my $tdir4 = tempdir( CLEANUP => 1 ); + ok(chdir $tdir4, "Able to change to temporary directory"); + ok( (mkdir 'lib'), "Able to make lib directory"); + ok( (mkdir 'include'), "Able to make include directory"); + ok( (mkdir 'include/readline'), "Able to make include/readline directory"); + my $libdir = File::Spec->catdir( $tdir4, 'lib' ); + my $includedir = File::Spec->catdir( $tdir4, 'include' ); + $conf->data->set('fink_lib_dir' => undef ); + $conf->data->set('fink_include_dir' => $includedir ); + + $osname = 'darwin'; + $flagsbefore = $conf->data->get( 'linkflags' ); + ok($step->_handle_darwin_for_fink($conf, $osname, 'readline/readline.h'), + "handle_darwin_for_fink() returned true value"); + $flagsafter = $conf->data->get( 'linkflags' ); + is($flagsbefore, $flagsafter, + "No change in linkflags, as expected, where Fink lib directory does not exist"); + + ok(chdir $cwd, "Able to change back to original directory after testing"); +} + $osname = 'foobar'; $flagsbefore = $conf->data->get( 'linkflags' ); ok($step->_handle_darwin_for_macports($conf, $osname, 'readline/readline.h'), @@ -161,84 +207,108 @@ $flagsafter = $conf->data->get( 'linkflags' ); is($flagsbefore, $flagsafter, "No change in linkflags, as expected"); # Get ready for the next test -$conf->data->set( 'linkflags' => undef ); +$conf->data->set( linkflags => $flagsbefore ); $cwd = cwd(); { - my $tdir3 = File::Spec->canonpath( tempdir( CLEANUP => 1 ) ); - ok(chdir $tdir3, "Able to change to temporary directory"); + my $xtdir1 = File::Spec->canonpath( tempdir( CLEANUP => 1 ) ); + ok(chdir $xtdir1, "Able to change to temporary directory"); ok( (mkdir 'lib'), "Able to make lib directory"); ok( (mkdir 'include'), "Able to make include directory"); - my $libdir = File::Spec->catdir( $tdir3, 'lib' ); - my $includedir = File::Spec->catdir( $tdir3, 'include' ); - $conf->data->set( ports_base_dir => $tdir3 ); + my $libdir = File::Spec->catdir( $xtdir1, 'lib' ); + my $includedir = File::Spec->catdir( $xtdir1, 'include' ); + $conf->data->set( ports_base_dir => $xtdir1 ); $conf->data->set( ports_lib_dir => $libdir ); $conf->data->set( ports_include_dir => $includedir ); ok( (mkdir 'include/readline'), "Able to make include/readline directory"); - my $file = qq{$includedir/readline/readline.h}; - open my $FH, ">", $file or croak "Unable to open $file for writing"; - print $FH qq{Hello Darwin\n}; - close $FH or croak "Unable to close $file after writing"; $osname = 'darwin'; - ok($step->_handle_darwin_for_macports( - $conf, $osname, 'readline/readline.h'), + $flagsbefore = $conf->data->get( 'linkflags' ); + ok($step->_handle_darwin_for_macports($conf, $osname, 'readline/readline.h'), "handle_darwin_for_macports() returned true value"); - like( - File::Spec->canonpath( $conf->data->get( 'linkflags' ) ), - qr/\Q$libdir\E/, - "'linkflags' modified as expected" ); + $flagsafter = $conf->data->get( 'linkflags' ); + is($flagsbefore, $flagsafter, + "No change in linkflags, as expected, where macports lib and include directories exist but readline/readline.h does not"); + chdir $cwd or croak "Unable to change back to original directory"; } $cwd = cwd(); -#{ -# my $tdir3 = File::Spec->canonpath( tempdir( CLEANUP => 1 ) ); -# ok(chdir $tdir3, "Able to change to temporary directory"); -# ok( (mkdir 'lib'), "Able to make lib directory"); -# ok( (mkdir 'include'), "Able to make include directory"); -# my $libdir = File::Spec->catdir( $tdir3, 'lib' ); -# my $includedir = File::Spec->catdir( $tdir3, 'include' ); -# $conf->data->set( ports_base_dir => $tdir3 ); -# $conf->data->set( ports_lib_dir => $libdir ); -# $conf->data->set( ports_include_dir => $includedir ); -# ok( (mkdir 'include/readline'), "Able to make include/readline directory"); -## my $file = qq{$includedir/readline/readline.h}; -# my $file = q{readline/readline.h}; -# $osname = 'darwin'; -# $flagsbefore = $conf->data->get( 'linkflags' ); -#print STDERR "flbefore: $flagsbefore\n"; -# ok($step->_handle_darwin_for_macports( -# $conf, $osname, 'readline/readline.h'), -# "handle_darwin_for_macports() returned true value"); -# $flagsafter = $conf->data->get( 'linkflags' ); -#print STDERR "flafter: $flagsafter\n"; -# is($flagsbefore, $flagsafter, "As expected, no change in 'linkflags'"); -# -# chdir $cwd or croak "Unable to change back to original directory"; -#} +{ + my $xtdir2 = File::Spec->canonpath( tempdir( CLEANUP => 1 ) ); + ok(chdir $xtdir2, "Able to change to temporary directory"); + ok( (mkdir 'lib'), "Able to make lib directory"); + ok( (mkdir 'include'), "Able to make include directory"); + my $libdir = File::Spec->catdir( $xtdir2, 'lib' ); + my $includedir = File::Spec->catdir( $xtdir2, 'include' ); + $conf->data->set( ports_base_dir => $xtdir2 ); + $conf->data->set( ports_lib_dir => $libdir ); + $conf->data->set( ports_include_dir => $includedir ); + ok( (mkdir 'include/readline'), "Able to make include/readline directory"); + my $foo = File::Spec->catfile( $includedir, 'readline', 'readline.h' ); + open my $FH, ">", $foo or croak "Could not open for writing"; + print $FH "Hello world\n"; + close $FH or croak "Could not close after writing"; + $osname = 'darwin'; + $flagsbefore = $conf->data->get( 'linkflags' ); + ok($step->_handle_darwin_for_macports($conf, $osname, 'readline/readline.h'), + "handle_darwin_for_macports() returned true value"); + $flagsafter = $conf->data->get( 'linkflags' ); + isnt($flagsbefore, $flagsafter, "Change in linkflags, as expected"); + like($conf->data->get( 'linkflags' ), qr/-L\Q$libdir\E/, + "'linkflags' modified as expected, in case where macports lib and include dirs exist and readline/readline.h exists"); + $conf->data->set( linkflags => $flagsbefore ); + + chdir $cwd or croak "Unable to change back to original directory"; +} + + $cwd = cwd(); -#{ -# my $tdir4 = File::Spec->canonpath( tempdir( CLEANUP => 1 ) ); -# ok(chdir $tdir4, "Able to change to temporary directory"); -# ok( (mkdir 'lib'), "Able to make lib directory"); -# ok( (mkdir 'include'), "Able to make include directory"); -# my $libdir = File::Spec->catdir( $tdir4, 'lib' ); -# my $includedir = File::Spec->catdir( $tdir4, 'include' ); -# $conf->data->set( ports_base_dir => $tdir4 ); -# $conf->data->set( ports_lib_dir => $libdir ); -# $conf->data->set( ports_include_dir => undef ); -# $osname = 'darwin'; -# $flagsbefore = $conf->data->get( 'linkflags' ); -# ok($step->_handle_darwin_for_macports( -# $conf, $osname, 'readline/readline.h'), -# "handle_darwin_for_macports() returned true value"); -# $flagsafter = $conf->data->get( 'linkflags' ); -# is($flagsbefore, $flagsafter, "As expected, no change in 'linkflags'"); -# -# chdir $cwd or croak "Unable to change back to original directory"; -#} +{ + my $xtdir3 = File::Spec->canonpath( tempdir( CLEANUP => 1 ) ); + ok(chdir $xtdir3, "Able to change to temporary directory"); + ok( (mkdir 'lib'), "Able to make lib directory"); + ok( (mkdir 'include'), "Able to make include directory"); + my $libdir = File::Spec->catdir( $xtdir3, 'lib' ); + my $includedir = File::Spec->catdir( $xtdir3, 'include' ); + $conf->data->set( ports_base_dir => $xtdir3 ); + $conf->data->set( ports_lib_dir => $libdir ); + $conf->data->set( ports_include_dir => undef ); + $osname = 'darwin'; + $flagsbefore = $conf->data->get( 'linkflags' ); + ok($step->_handle_darwin_for_macports($conf, $osname, 'readline/readline.h'), + "handle_darwin_for_macports() returned true value"); + $flagsafter = $conf->data->get( 'linkflags' ); + is($flagsbefore, $flagsafter, + "No change in linkflags, as expected, where Macports include directory does not exist"); + + chdir $cwd or croak "Unable to change back to original directory"; +} + +$cwd = cwd(); +{ + my $xtdir4 = File::Spec->canonpath( tempdir( CLEANUP => 1 ) ); + ok(chdir $xtdir4, "Able to change to temporary directory"); + ok( (mkdir 'lib'), "Able to make lib directory"); + ok( (mkdir 'include'), "Able to make include directory"); + my $libdir = File::Spec->catdir( $xtdir4, 'lib' ); + my $includedir = File::Spec->catdir( $xtdir4, 'include' ); + $conf->data->set( ports_base_dir => $xtdir4 ); + $conf->data->set( ports_lib_dir => undef ); + $conf->data->set( ports_include_dir => $includedir ); + + $osname = 'darwin'; + $flagsbefore = $conf->data->get( 'linkflags' ); + ok($step->_handle_darwin_for_macports($conf, $osname, 'readline/readline.h'), + "handle_darwin_for_macports() returned true value"); + $flagsafter = $conf->data->get( 'linkflags' ); + is($flagsbefore, $flagsafter, + "No change in linkflags, as expected, where Macports lib directory does not exist"); + + chdir $cwd or croak "Unable to change back to original directory"; +} + pass("Completed all tests in $0"); ################### DOCUMENTATION ###################