Hack to fix 'for' scoping under MSVC6

MSVC6 doesn't allow redefinition of iteration variables in 'for'
statements. This ugly hack redefines 'for' as 'if(0);else for' to make
this work. For now, this is applied to all versions of MSVC but it
shouldn't hurt.

Since the macro contains a space character, some additional quoting is
needed. The extra_compiler_flags also have to be passed as an array.

Clean up setting of compiler flags along the way.


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/f7a75583
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/f7a75583
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/f7a75583

Branch: refs/heads/master
Commit: f7a755837747a8db550c3bbd9fca09c253651768
Parents: c899a7f
Author: Nick Wellnhofer <[email protected]>
Authored: Sun Nov 4 01:31:48 2012 +0100
Committer: Nick Wellnhofer <[email protected]>
Committed: Mon Nov 12 21:06:44 2012 +0100

----------------------------------------------------------------------
 .../compiler/perl/buildlib/Clownfish/CFC/Build.pm  |   46 ++++++--------
 .../compiler/perl/lib/Clownfish/CFC/Perl/Build.pm  |    4 +-
 .../perl/lib/Clownfish/CFC/Perl/Build/Charmonic.pm |    4 +-
 perl/buildlib/Lucy/Build.pm                        |    3 +-
 4 files changed, 27 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/f7a75583/clownfish/compiler/perl/buildlib/Clownfish/CFC/Build.pm
----------------------------------------------------------------------
diff --git a/clownfish/compiler/perl/buildlib/Clownfish/CFC/Build.pm 
b/clownfish/compiler/perl/buildlib/Clownfish/CFC/Build.pm
index 9f30796..7e2d3ce 100644
--- a/clownfish/compiler/perl/buildlib/Clownfish/CFC/Build.pm
+++ b/clownfish/compiler/perl/buildlib/Clownfish/CFC/Build.pm
@@ -39,8 +39,7 @@ my $CFC_SOURCE_DIR = catdir( updir(), 'src' );
 
 sub extra_ccflags {
     my $self          = shift;
-    my $extra_ccflags = "-DCFCPERL ";
-    $extra_ccflags .= "$ENV{CFLAGS} " if defined $ENV{CFLAGS};
+    my @extra_ccflags = qw( -DCFCPERL );
 
     my $gcc_version 
         = $ENV{REAL_GCC_VERSION}
@@ -50,39 +49,34 @@ sub extra_ccflags {
         $gcc_version =~ /^(\d+(\.\d+))/
             or die "Invalid GCC version: $gcc_version";
         $gcc_version = $1;
-    }
 
-    if ( defined $ENV{LUCY_DEBUG} ) {
-        if ( defined $gcc_version ) {
-            $extra_ccflags .= "-DLUCY_DEBUG ";
-            $extra_ccflags
-                .= "-DPERL_GCC_PEDANTIC -std=gnu99 -pedantic -Wall ";
-            $extra_ccflags .= "-Wextra " if $gcc_version >= 3.4;    # correct
-            $extra_ccflags .= "-Wno-variadic-macros "
+        # Tell GCC explicitly to run with maximum options.
+        push @extra_ccflags, qw( -std=gnu99 -D_GNU_SOURCE );
+
+        if ( defined $ENV{LUCY_DEBUG} ) {
+            push @extra_ccflags, qw(
+                -DLUCY_DEBUG -DPERL_GCC_PEDANTIC -pedantic -Wall
+            );
+            push @extra_ccflags, qw( -Wextra )
+                if $gcc_version >= 3.4;    # correct
+            push @extra_ccflags, qw( -Wno-variadic-macros )
                 if $gcc_version > 3.4;    # at least not on gcc 3.4
         }
-    }
 
-    if ( $ENV{LUCY_VALGRIND} and defined $gcc_version ) {
-        $extra_ccflags .= "-fno-inline-functions ";
+        if ( $ENV{LUCY_VALGRIND} ) {
+            push @extra_ccflags, qw( -fno-inline-functions );
+        }
     }
 
-    # Compile as C++ under MSVC.  Turn off stupid warnings, too.
+    # Compile as C++ under MSVC.
+    # Turn off stupid warnings, too.
+    # Redefine 'for' to fix broken 'for' scoping under MSVC6.
     if ( $self->config('cc') =~ /^cl\b/ ) {
-        $extra_ccflags .= '/TP -D_CRT_SECURE_NO_WARNINGS ';
-    }
-
-    if ( defined $gcc_version ) {
-        # Tell GCC explicitly to run with maximum options.
-        if ( $extra_ccflags !~ m/-std=/ ) {
-            $extra_ccflags .= "-std=gnu99 ";
-        }
-        if ( $extra_ccflags !~ m/-D_GNU_SOURCE/ ) {
-            $extra_ccflags .= "-D_GNU_SOURCE ";
-        }
+        push @extra_ccflags, qw( -TP -D_CRT_SECURE_NO_WARNINGS );
+        push @extra_ccflags, '-Dfor="if(0);else for"';
     }
 
-    return $extra_ccflags;
+    return \@extra_ccflags;
 }
 
 sub new {

http://git-wip-us.apache.org/repos/asf/lucy/blob/f7a75583/clownfish/compiler/perl/lib/Clownfish/CFC/Perl/Build.pm
----------------------------------------------------------------------
diff --git a/clownfish/compiler/perl/lib/Clownfish/CFC/Perl/Build.pm 
b/clownfish/compiler/perl/lib/Clownfish/CFC/Perl/Build.pm
index 97e85cd..099838f 100644
--- a/clownfish/compiler/perl/lib/Clownfish/CFC/Perl/Build.pm
+++ b/clownfish/compiler/perl/lib/Clownfish/CFC/Perl/Build.pm
@@ -65,8 +65,10 @@ sub new {
     elsif ( $self->config('cc') =~ /^cl\b/ ) {
         # Compile as C++ under MSVC.
         push @$extra_ccflags, qw(
-            /TP -D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS
+            -TP -D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS
         );
+        # Redefine 'for' to fix broken 'for' scoping under MSVC6.
+        push @$extra_ccflags, '-Dfor="if(0);else for"';
     }
     $self->extra_compiler_flags(@$extra_ccflags);
 

http://git-wip-us.apache.org/repos/asf/lucy/blob/f7a75583/clownfish/compiler/perl/lib/Clownfish/CFC/Perl/Build/Charmonic.pm
----------------------------------------------------------------------
diff --git a/clownfish/compiler/perl/lib/Clownfish/CFC/Perl/Build/Charmonic.pm 
b/clownfish/compiler/perl/lib/Clownfish/CFC/Perl/Build/Charmonic.pm
index 21db471..13abca9 100644
--- a/clownfish/compiler/perl/lib/Clownfish/CFC/Perl/Build/Charmonic.pm
+++ b/clownfish/compiler/perl/lib/Clownfish/CFC/Perl/Build/Charmonic.pm
@@ -77,7 +77,7 @@ sub ACTION_charmony {
         '--enable-perl',
         '--',
         $self->config('ccflags'),
-        @{ $self->extra_compiler_flags },
+        map { _quotify($_) } @{ $self->extra_compiler_flags },
     );
     if ( $ENV{CHARM_VALGRIND} ) {
         unshift @command, "valgrind", "--leak-check=yes";
@@ -91,7 +91,7 @@ sub _quotify {
     my $string = shift;
     $string =~ s/\\/\\\\/g;
     $string =~ s/"/\\"/g;
-    return qq|"$string"|;
+    return $string =~ /\s/ ? qq|"$string"| : $string;
 }
 
 1;

http://git-wip-us.apache.org/repos/asf/lucy/blob/f7a75583/perl/buildlib/Lucy/Build.pm
----------------------------------------------------------------------
diff --git a/perl/buildlib/Lucy/Build.pm b/perl/buildlib/Lucy/Build.pm
index 52cf3ff..59dac46 100644
--- a/perl/buildlib/Lucy/Build.pm
+++ b/perl/buildlib/Lucy/Build.pm
@@ -115,9 +115,10 @@ sub ACTION_charmonizer_tests {
         '-I' . rel2abs( getcwd() ),
     );
     $flags =~ s/"/\\"/g;
+    my $defs = $^O =~ /mswin/i ? qq|DEFS="$flags"| : "DEFS=$flags";
     $self->_run_make(
         dir  => $CHARMONIZER_ORIG_DIR,
-        args => [ "DEFS=$flags", "tests" ],
+        args => [ $defs, "tests" ],
     );
 }
 

Reply via email to