On Wed Apr 23 18:40:46 2008, [EMAIL PROTECTED] wrote: > There are five configuration step classes where the class's runstep() > method has an internal subroutine called _handle_mswin32(). These > classes are: > > config/auto//crypto.pm > config/auto//gettext.pm > config/auto//gmp.pm > config/auto//opengl.pm > config/auto//readline.pm > > Attached is an example of this subroutine, in this case, from > auto::readline: >
Please see patch attached. It turned out that config/auto/opengl.pm didn't quite conform to the pattern, so I left it unchanged. Thank you very much. kid51
Index: lib/Parrot/Configure/Step/Methods.pm =================================================================== --- lib/Parrot/Configure/Step/Methods.pm (revision 27160) +++ lib/Parrot/Configure/Step/Methods.pm (working copy) @@ -24,12 +24,10 @@ Since the methods are not part of the public interface, their names should begin with an underscore 'C<_>'. -=head2 Methods +=head1 METHODS -=over 4 +=head2 C<_recheck_settings()> -=item C<_recheck_settings()> - $self->_recheck_settings($conf, $libs, $ccflags, $linkflags, $verbose); Currently used in configuration step classes auto::gmp, auto::readline, @@ -46,7 +44,7 @@ $self->set_result('no'); } -=item C<_handle_darwin_for_fink()> +=head2 C<_handle_darwin_for_fink()> $self->_handle_darwin_for_fink($conf, $libs, $osname, $file); @@ -83,6 +81,21 @@ return 1; } +=head2 C<_handle_darwin_for_macports()> + + $self->_handle_darwin_for_macports($conf, $libs, $osname, $file); + +Currently used in configuration step classes auto::gmp, auto::readline and +auto::opengl. + +Modifies settings for C<linkflags>, C<ldflags> and C<ccflags> in the +Parrot::Configure object's data structure. + +Potentially expandable to cover all BSD-ports systems -- but as yet there has +been no demand. + +=cut + sub _handle_darwin_for_macports { my ($self, $conf, $osname, $file) = @_; if ( $osname =~ /darwin/ ) { @@ -98,8 +111,90 @@ return 1; } +=head2 C<_add_to_libs()> + + $self->_add_to_libs( { + conf => $conf, + osname => $osname, + cc => $cc, + win32_gcc => '-lglut32 -lglu32 -lopengl32', + win32_other => 'readline.lib', + non_win32 => '-lreadline', + } ); + +B<Purpose>: In a number of configuration step classes, the class's +C<runstep()> method adds libraries to the wordspace-delimited string found in +the Parrot::Configure object's C<libs> attribute. In these classes, the +libraries to be added fall into one of three categories: + +=over 4 + +=item * What to do on mswin32 with F<gcc> as the C-compiler? + +=item * What to do on mswin32 with any C-compiler other thann F<gcc>? + +=item * What to do on any operating system other than mswin32? + =back +This method provides a uniform interface to this internal subroutine. + +B<Arguments>: Reference to a hash with the following key-value pairs: + +=over 4 + +=item * C<conf> + +The Parrot::Configure object. Supplied within C<runstep()>. + +=item * C<osname> + +The name of the operating system. Supplied within C<runstep()>. + +=item * C<cc> + +The name of the C-compiler. Supplied within C<runstep()>. + +=item * C<win32_gcc> + +Libraries to be added where OS is mswin32 and C-compiler is F<gcc>. +Wordspace-delimited string. + +=item * C<win32_other> + +Libraries to be added where OS is mswin32 and C-compiler is not F<gcc>. +Wordspace-delimited string. + +=item * C<non_win32> + +Libraries to be added where OS is not mswin32. +Wordspace-delimited string. + +=back + +B<Return Value>: Returns true value upon success. + +=cut + +sub _add_to_libs { + my $self = shift; + my $args = shift; + die "_add_to_libs() takes hashref: $!" unless ref($args) eq 'HASH'; + if ( $args->{osname} =~ /mswin32/i ) { + if ( $args->{cc} =~ /^gcc/i ) { + $args->{conf}->data->add( ' ', libs => $args->{win32_gcc} ); + } + else { + $args->{conf}->data->add( ' ', libs => $args->{win32_other} ); + } + } + else { + $args->{conf}->data->add( ' ', libs => $args->{non_win32} ); + } + return 1; +} + + =head1 SEE ALSO Parrot::Configure::Step. Index: t/steps/auto_readline-01.t =================================================================== --- t/steps/auto_readline-01.t (revision 27160) +++ t/steps/auto_readline-01.t (working copy) @@ -46,22 +46,43 @@ my ($osname, $cc); $osname = 'mswin32'; $cc = 'gcc'; -ok(auto::readline::_handle_mswin32($conf, $osname, $cc), - "_handle_mswin32() returned true value"); +ok($step->_add_to_libs( { + conf => $conf, + osname => $osname, + cc => $cc, + win32_gcc => '-lreadline', + win32_other => 'readline.lib', + non_win32 => '-lreadline', +} ), + "_add_to_libs() returned true value"); like($conf->data->get( 'libs' ), qr/-lreadline/, "'libs' modified as expected"); $osname = 'mswin32'; $cc = 'cc'; -ok(auto::readline::_handle_mswin32($conf, $osname, $cc), - "_handle_mswin32() returned true value"); +ok($step->_add_to_libs( { + conf => $conf, + osname => $osname, + cc => $cc, + win32_gcc => '-lreadline', + win32_other => 'readline.lib', + non_win32 => '-lreadline', +} ), + "_add_to_libs() returned true value"); like($conf->data->get( 'libs' ), qr/readline\.lib/, "'libs' modified as expected"); $osname = 'foobar'; $cc = undef; -ok(auto::readline::_handle_mswin32($conf, $osname, $cc), - "_handle_mswin32() returned true value"); +ok($step->_add_to_libs( { + conf => $conf, + osname => $osname, + cc => $cc, + win32_gcc => '-lreadline', + win32_other => 'readline.lib', + non_win32 => '-lreadline', +} ), + "_add_to_libs() returned true value"); like($conf->data->get( 'libs' ), qr/-lreadline/, "'libs' modified as expected"); Index: t/steps/auto_gmp-02.t =================================================================== --- t/steps/auto_gmp-02.t (revision 27160) +++ t/steps/auto_gmp-02.t (working copy) @@ -43,27 +43,55 @@ ok( $step->description(), "$step_name has description" ); # Mock values for OS and C-compiler -my ($osname, $cc); +my ($osname, $cc, $initial_value); $osname = 'mswin32'; $cc = 'gcc'; -ok(auto::gmp::_handle_mswin32($conf, $osname, $cc), - "_handle_mswin32() returned true value"); +$initial_value = $conf->data->get( 'libs' ); +ok($step->_add_to_libs( { + conf => $conf, + osname => $osname, + cc => $cc, + win32_gcc => '-lgmp', + win32_other => 'gmp.lib', + non_win32 => '-lgmp', +} ), + "_add_to_libs() returned true value"); like($conf->data->get( 'libs' ), qr/-lgmp/, "'libs' modified as expected"); +# Restore value for next test. +$conf->data->set( 'libs' => $initial_value ); $osname = 'mswin32'; $cc = 'cc'; -ok(auto::gmp::_handle_mswin32($conf, $osname, $cc), - "_handle_mswin32() returned true value"); +ok($step->_add_to_libs( { + conf => $conf, + osname => $osname, + cc => $cc, + win32_gcc => '-lgmp', + win32_other => 'gmp.lib', + non_win32 => '-lgmp', +} ), + "_add_to_libs() returned true value"); like($conf->data->get( 'libs' ), qr/gmp\.lib/, "'libs' modified as expected"); +# Restore value for next test. +$conf->data->set( 'libs' => $initial_value ); $osname = 'foobar'; $cc = undef; -ok(auto::gmp::_handle_mswin32($conf, $osname, $cc), +ok($step->_add_to_libs( { + conf => $conf, + osname => $osname, + cc => $cc, + win32_gcc => '-lgmp', + win32_other => 'gmp.lib', + non_win32 => '-lgmp', +} ), "_handle_mswin32() returned true value"); like($conf->data->get( 'libs' ), qr/-lgmp/, "'libs' modified as expected"); +# Restore value for next test. +$conf->data->set( 'libs' => $initial_value ); my ($flagsbefore, $flagsafter); $osname = 'foobar'; Index: t/steps/auto_gettext-02.t =================================================================== --- t/steps/auto_gettext-02.t (revision 27160) +++ t/steps/auto_gettext-02.t (working copy) @@ -5,7 +5,7 @@ use strict; use warnings; -use Test::More tests => 18; +use Test::More tests => 26; use Carp; use lib qw( lib t/configure/testlib ); use_ok('config::init::defaults'); @@ -41,6 +41,73 @@ isa_ok( $step, $step_name ); ok( $step->description(), "$step_name has description" ); +# Mock values for OS and C-compiler +my ($osname, $cc, $initial_value); +$osname = 'mswin32'; +$cc = 'gcc'; +$initial_value = $conf->data->get( 'libs' ); +ok($step->_add_to_libs( { + conf => $conf, + osname => $osname, + cc => $cc, + win32_gcc => '-lintl', + win32_other => 'intl.lib', + non_win32 => defined $conf->data->get('glibc') ? '' : '-lintl', +} ), + "_add_to_libs() returned true value"); +like($conf->data->get( 'libs' ), qr/-lintl/, + "'libs' modified as expected"); +# Restore value for next test. +$conf->data->set( 'libs' => $initial_value ); + +$osname = 'mswin32'; +$cc = 'cc'; +ok($step->_add_to_libs( { + conf => $conf, + osname => $osname, + cc => $cc, + win32_gcc => '-lintl', + win32_other => 'intl.lib', + non_win32 => defined $conf->data->get('glibc') ? '' : '-lintl', +} ), + "_add_to_libs() returned true value"); +like($conf->data->get( 'libs' ), qr/intl.lib/, + "'libs' modified as expected"); +# Restore value for next test. +$conf->data->set( 'libs' => $initial_value ); + +$osname = 'foobar'; +$cc = 'cc'; +$conf->data->set( glibc => 1 ); +ok($step->_add_to_libs( { + conf => $conf, + osname => $osname, + cc => $cc, + win32_gcc => '-lintl', + win32_other => 'intl.lib', + non_win32 => defined $conf->data->get('glibc') ? '' : '-lintl', +} ), + "_add_to_libs() returned true value"); +unlike($conf->data->get( 'libs' ), qr/-lintl/, + "'libs' modified as expected"); +# Restore value for next test. +$conf->data->set( 'libs' => $initial_value ); + +$osname = 'foobar'; +$cc = 'cc'; +$conf->data->set( glibc => undef ); +ok($step->_add_to_libs( { + conf => $conf, + osname => $osname, + cc => $cc, + win32_gcc => '-lintl', + win32_other => 'intl.lib', + non_win32 => defined $conf->data->get('glibc') ? '' : '-lintl', +} ), + "_add_to_libs() returned true value"); +like($conf->data->get( 'libs' ), qr/-lintl/, + "'libs' modified as expected"); + my ($test, $verbose); my $has_gettext; Index: config/auto/gettext.pm =================================================================== --- config/auto/gettext.pm (revision 27160) +++ config/auto/gettext.pm (working copy) @@ -57,7 +57,14 @@ my $osname = $conf->data->get_p5('OSNAME'); - _handle_mswin32($conf, $osname, $cc); + $self->_add_to_libs( { + conf => $conf, + osname => $osname, + cc => $cc, + win32_gcc => '-lintl', + win32_other => 'intl.lib', + non_win32 => defined $conf->data->get('glibc') ? '' : '-lintl', + } ); # On OS X check the presence of the gettext header in the standard # Fink location. @@ -82,24 +89,6 @@ return 1; } -sub _handle_mswin32 { - my ($conf, $osname, $cc) = @_; - if ( $osname =~ /mswin32/i ) { - if ( $cc =~ /^gcc/i ) { - $conf->data->add( ' ', libs => '-lintl' ); - } - else { - $conf->data->add( ' ', libs => 'intl.lib' ); - } - } - else { - # don't need to link with libintl if we have GNU libc - my $linklibs = defined $conf->data->get('glibc') ? '' : '-lintl'; - $conf->data->add( ' ', libs => $linklibs ); - } - return 1; -} - sub _evaluate_cc_run { my $self = shift; my ($test, $verbose) = @_; Index: config/auto/gmp.pm =================================================================== --- config/auto/gmp.pm (revision 27160) +++ config/auto/gmp.pm (working copy) @@ -63,7 +63,14 @@ my $osname = $conf->data->get_p5('OSNAME'); - _handle_mswin32($conf, $osname, $cc); + $self->_add_to_libs( { + conf => $conf, + osname => $osname, + cc => $cc, + win32_gcc => '-lgmp', + win32_other => 'gmp.lib', + non_win32 => '-lgmp', + } ); # On OS X check the presence of the gmp header in the standard # Fink location. @@ -85,22 +92,6 @@ return 1; } -sub _handle_mswin32 { - my ($conf, $osname, $cc) = @_; - if ( $osname =~ /mswin32/i ) { - if ( $cc =~ /^gcc/i ) { - $conf->data->add( ' ', libs => '-lgmp' ); - } - else { - $conf->data->add( ' ', libs => 'gmp.lib' ); - } - } - else { - $conf->data->add( ' ', libs => '-lgmp' ); - } - return 1; -} - sub _evaluate_cc_run { my ($self, $conf, $test, $has_gmp, $verbose) = @_; if ( $test eq $self->{cc_run_expected} ) { Index: config/auto/crypto.pm =================================================================== --- config/auto/crypto.pm (revision 27160) +++ config/auto/crypto.pm (working copy) @@ -52,7 +52,14 @@ my $osname = $conf->data->get_p5('OSNAME'); - _handle_mswin32($conf, $osname, $cc); + $self->_add_to_libs( { + conf => $conf, + osname => $osname, + cc => $cc, + win32_gcc => '-lcrypto', + win32_other => 'libcrypto.lib', + non_win32 => '-lcrypto', + } ); $conf->cc_gen('config/auto/crypto/crypto.in'); eval { $conf->cc_build(); }; @@ -70,22 +77,6 @@ return 1; } -sub _handle_mswin32 { - my ($conf, $osname, $cc) = @_; - if ( $osname =~ /mswin32/i ) { - if ( $cc =~ /^gcc/i ) { - $conf->data->add( ' ', libs => '-lcrypto' ); - } - else { - $conf->data->add( ' ', libs => 'libcrypto.lib' ); - } - } - else { - $conf->data->add( ' ', libs => '-lcrypto' ); - } - return 1; -} - sub _evaluate_cc_run { my $self = shift; my ($conf, $test, $has_crypto, $verbose) = @_; Index: config/auto/readline.pm =================================================================== --- config/auto/readline.pm (revision 27160) +++ config/auto/readline.pm (working copy) @@ -45,7 +45,14 @@ my $osname = $conf->data->get_p5('OSNAME'); - _handle_mswin32($conf, $osname, $cc); + $self->_add_to_libs( { + conf => $conf, + osname => $osname, + cc => $cc, + win32_gcc => '-lreadline', + win32_other => 'readline.lib', + non_win32 => '-lreadline', + } ); # On OS X check the presence of the readline header in the standard # Fink/macports locations. @@ -79,22 +86,6 @@ return 1; } -sub _handle_mswin32 { - my ($conf, $osname, $cc) = @_; - if ( $osname =~ /mswin32/i ) { - if ( $cc =~ /^gcc/i ) { - $conf->data->add( ' ', libs => '-lreadline' ); - } - else { - $conf->data->add( ' ', libs => 'readline.lib' ); - } - } - else { - $conf->data->add( ' ', libs => '-lreadline' ); - } - return 1; -} - sub _handle_ncurses_need { my ($conf, $osname, $cc) = @_; if ( $osname =~ /mswin32/i ) {