diff -ru ExtUtils-MakeMaker-snap/lib/ExtUtils/MakeMaker.pm my-ExtUtils-MakeMaker-snap/lib/ExtUtils/MakeMaker.pm
--- ExtUtils-MakeMaker-snap/lib/ExtUtils/MakeMaker.pm	2003-03-05 11:18:46.000000000 +0000
+++ my-ExtUtils-MakeMaker-snap/lib/ExtUtils/MakeMaker.pm	2003-03-19 23:33:46.000000000 +0000
@@ -252,7 +252,7 @@
  pasthru
 
  special_targets
- c_o xs_c xs_o
+ c_o xs_c xs_o xss_cpp xss_o
  top_targets linkext dlsyms dynamic dynamic_bs
  dynamic_lib static static_lib manifypods processPL
  installbin subdirs
@@ -2011,12 +2011,13 @@
 
 =item XS
 
-Hashref of .xs files. MakeMaker will default this.  e.g.
+Hashref of .xs and .xss files. MakeMaker will default this.  e.g.
 
-  {'name_of_file.xs' => 'name_of_file.c'}
+  {'name_of_file.xs' => 'name_of_file.c',
+   'another_file.xss' => 'another_file.cpp' }
 
-The .c files will automatically be included in the list of files
-deleted by a make clean.
+The .c and .cpp files will automatically be included in the list of
+files deleted by a make clean.
 
 =item XSOPT
 
diff -ru ExtUtils-MakeMaker-snap/lib/ExtUtils/MM_Any.pm my-ExtUtils-MakeMaker-snap/lib/ExtUtils/MM_Any.pm
--- ExtUtils-MakeMaker-snap/lib/ExtUtils/MM_Any.pm	2003-03-06 09:20:34.000000000 +0000
+++ my-ExtUtils-MakeMaker-snap/lib/ExtUtils/MM_Any.pm	2003-03-19 23:33:46.000000000 +0000
@@ -312,7 +312,7 @@
 
 sub special_targets {
     my $make_frag = <<'MAKE_FRAG';
-.SUFFIXES: .xs .c .C .cpp .i .s .cxx .cc $(OBJ_EXT)
+.SUFFIXES: .xs .xss .c .C .cpp .i .s .cxx .cc $(OBJ_EXT)
 
 .PHONY: all config static dynamic test linkext manifest
 
diff -ru ExtUtils-MakeMaker-snap/lib/ExtUtils/MM_MacOS.pm my-ExtUtils-MakeMaker-snap/lib/ExtUtils/MM_MacOS.pm
--- ExtUtils-MakeMaker-snap/lib/ExtUtils/MM_MacOS.pm	2003-03-06 09:20:02.000000000 +0000
+++ my-ExtUtils-MakeMaker-snap/lib/ExtUtils/MM_MacOS.pm	2003-03-19 23:33:46.000000000 +0000
@@ -157,7 +157,7 @@
     # We skip many sections for MacOS, but we don't say anything about it in the Makefile
     for (qw/ const_config tool_autosplit
 	    tool_xsubpp tools_other dist macro depend post_constants
-	    pasthru c_o xs_c xs_o top_targets linkext 
+	    pasthru c_o xs_c xs_o xss_cpp xss_o top_targets linkext 
 	    dynamic_bs dynamic_lib static_lib manifypods
 	    installbin subdirs dist_basics dist_core
 	    distdir dist_test dist_ci install force perldepend makefile
@@ -519,7 +519,7 @@
 
 =cut
 
-sub init_dirscan {	# --- File and Directory Lists (.xs .pm .pod etc)
+sub init_dirscan {	# --- File and Directory Lists (.xs .xss .pm .pod etc)
     my($self) = @_;
     my($name, %dir, %xs, %c, %h, %ignore, %pl_files, %manifypods);
     local(%pm); #the sub in find() has to see this hash
@@ -541,6 +541,10 @@
 	    my($c); ($c = $name) =~ s/\.xs$/.c/;
 	    $xs{$name} = $c;
 	    $c{$c} = 1;
+	} elsif ($name =~ /\.xss$/){
+	    my($c); ($c = $name) =~ s/\.xss$/.cpp/;
+	    $xs{$name} = $c;
+	    $c{$c} = 1;
 	} elsif ($name =~ /\.c(p|pp|xx|c)?$/i){  # .c .C .cpp .cxx .cc .cp
 	    $c{$name} = 1
 		unless $name =~ m/perlmain\.c/; # See MAP_TARGET
@@ -757,7 +761,7 @@
 clean :: clean_subdirs
 ');
 
-    my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
+    my(@otherfiles) = values %{$self->{XS}}; # .c/.cpp files from *.xs/*.xss files
     push(@otherfiles, patternify($attribs{FILES})) if $attribs{FILES};
     push @m, "\t\$(RM_RF) @otherfiles\n";
     # See realclean and ext/utils/make_ext for usage of Makefile.old
diff -ru ExtUtils-MakeMaker-snap/lib/ExtUtils/MM_Unix.pm my-ExtUtils-MakeMaker-snap/lib/ExtUtils/MM_Unix.pm
--- ExtUtils-MakeMaker-snap/lib/ExtUtils/MM_Unix.pm	2003-03-05 10:48:47.000000000 +0000
+++ my-ExtUtils-MakeMaker-snap/lib/ExtUtils/MM_Unix.pm	2003-03-20 00:05:44.000000000 +0000
@@ -271,7 +271,7 @@
 clean :: clean_subdirs
 ');
 
-    my(@otherfiles) = values %{$self->{XS}}; # .c files from *.xs files
+    my(@otherfiles) = values %{$self->{XS}}; # .c/.cpp files from *.xs/*.xss files
     if ( $Is_QNX ) {
       my @errfiles = @{$self->{C}};
       for ( @errfiles ) {
@@ -1385,7 +1385,7 @@
 
 =cut
 
-sub init_dirscan {	# --- File and Directory Lists (.xs .pm .pod etc)
+sub init_dirscan {	# --- File and Directory Lists (.xs .xss .pm .pod etc)
     my($self) = @_;
     my($name, %dir, %xs, %c, %h, %ignore, %pl_files, %manifypods);
     local(%pm); #the sub in find() has to see this hash
@@ -1409,6 +1409,10 @@
 	    my($c); ($c = $name) =~ s/\.xs\z/.c/;
 	    $xs{$name} = $c;
 	    $c{$c} = 1;
+	} elsif ($name =~ /\.xss\z/){
+	    my($c); ($c = $name) =~ s/\.xss\z/.cpp/;
+	    $xs{$name} = $c;
+	    $c{$c} = 1;
 	} elsif ($name =~ /\.c(pp|xx|c)?\z/i){  # .c .C .cpp .cxx .cc
 	    $c{$name} = 1
 		unless $name =~ m/perlmain\.c/; # See MAP_TARGET
@@ -4120,6 +4124,8 @@
 
 Defines the suffix rules to compile XS files to C++.
 
+It doesn't work, use XSS files and 'xss_cpp' rule instead.
+
 =cut
 
 sub xs_cpp {
@@ -4131,6 +4137,21 @@
 ';
 }
 
+=item xss_cpp (o)
+
+Defines the suffix rules to compile XSS files to C++.
+
+=cut
+
+sub xss_cpp {
+    my($self) = shift;
+    return '' unless $self->needs_linking();
+    '
+.xss.cpp:
+	$(PERLRUN) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xss > $*.xsc && $(MV) $*.xsc $*.cpp
+';
+}
+
 =item xs_o (o)
 
 Defines suffix rules to go from XS to object files directly. This is
@@ -4148,6 +4169,22 @@
 ';
 }
 
+=item xss_o (o)
+
+Defines suffix rules to go from XSS to object files directly. This is
+only intended for broken make implementations.
+
+=cut
+
+sub xss_o {	# many makes are too dumb to use xss_cpp then cpp_o
+    my($self) = shift;
+    return '' unless $self->needs_linking();
+    '
+.xss$(OBJ_EXT):
+	$(PERLRUN) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xss > $*.xsc && $(MV) $*.xsc $*.cpp
+	$(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.cpp
+';
+}
 
 1;
 
diff -ru ExtUtils-MakeMaker-snap/lib/ExtUtils/MM_VMS.pm my-ExtUtils-MakeMaker-snap/lib/ExtUtils/MM_VMS.pm
--- ExtUtils-MakeMaker-snap/lib/ExtUtils/MM_VMS.pm	2003-03-06 09:18:29.000000000 +0000
+++ my-ExtUtils-MakeMaker-snap/lib/ExtUtils/MM_VMS.pm	2003-03-20 10:52:50.000000000 +0000
@@ -122,7 +122,7 @@
       @pm = map { s/.pm$//; $_ } glob('*.pm');
       if (@pm == 1) { ($defpm = $pm[0]) =~ s/.pm$//; }
       elsif (@pm) {
-        %xs = map { s/.xs$//; ($_,1) } glob('*.xs');
+        %xs = map { s/.xss?$//; ($_,1) } glob('*.xs'), glob('*.xss');
         if (keys %xs) { 
             foreach $pm (@pm) { 
                 $defpm = $pm, last if exists $xs{$pm}; 
@@ -537,7 +537,7 @@
 
     my $make_frag .= <<'MAKE_FRAG';
 .SUFFIXES :
-.SUFFIXES : \$(OBJ_EXT) .c .cpp .cxx .xs
+.SUFFIXES : \$(OBJ_EXT) .c .cpp .cxx .xs .xss
 
 MAKE_FRAG
 
@@ -918,7 +918,22 @@
     return '' unless $self->needs_linking();
     '
 .xs.c :
-	$(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET)
+	$(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET).c
+';
+}
+
+=item xss_cpp (override)
+
+Use MM[SK] macros.
+
+=cut
+
+sub xss_cpp {
+    my($self) = @_;
+    return '' unless $self->needs_linking();
+    '
+.xss.cpp :
+	$(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET).cpp
 ';
 }
 
@@ -938,6 +953,21 @@
 ';
 }
 
+=item xss_o (override)
+
+Use MM[SK] macros, and VMS command line for C++ compiler.
+
+=cut
+
+sub xss_o {	# many makes are too dumb to use xss_cpp then cpp_o
+    my($self) = @_;
+    return '' unless $self->needs_linking();
+    '
+.xss$(OBJ_EXT) :
+	$(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xss >$(MMS$TARGET_NAME).cpp
+	$(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp
+';
+}
 
 =item dlsyms (override)
 
diff -ru ExtUtils-MakeMaker-snap/lib/ExtUtils/MM_Win32.pm my-ExtUtils-MakeMaker-snap/lib/ExtUtils/MM_Win32.pm
--- ExtUtils-MakeMaker-snap/lib/ExtUtils/MM_Win32.pm	2003-03-05 11:19:22.000000000 +0000
+++ my-ExtUtils-MakeMaker-snap/lib/ExtUtils/MM_Win32.pm	2003-03-19 23:02:00.000000000 +0000
@@ -411,6 +411,15 @@
     return ''
 }
 
+=item xss_o (o)
+
+This target is stubbed out.  Not sure why.
+
+=cut
+
+sub xss_o {
+    return ''
+}
 
 =item pasthru (o)
 
diff -ru ExtUtils-MakeMaker-snap/lib/ExtUtils/MM_Win95.pm my-ExtUtils-MakeMaker-snap/lib/ExtUtils/MM_Win95.pm
--- ExtUtils-MakeMaker-snap/lib/ExtUtils/MM_Win95.pm	2002-12-22 03:45:08.000000000 +0000
+++ my-ExtUtils-MakeMaker-snap/lib/ExtUtils/MM_Win95.pm	2003-03-20 10:56:35.000000000 +0000
@@ -116,6 +116,21 @@
 	';
 }
 
+=item xss_cpp
+
+The && problem
+
+=cut
+
+sub xss_cpp {
+    my($self) = shift;
+    return '' unless $self->needs_linking();
+    '
+.xss.cpp:
+	$(PERLRUN) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xss > $*.cpp
+	';
+}
+
 =item xs_o 
 
 The && problem.
@@ -132,6 +147,23 @@
 	';
 }
 
+
+=item xss_o
+
+The && problem.
+
+=cut
+
+sub xss_o {
+    my($self) = shift;
+    return '' unless $self->needs_linking();
+    '
+.xss$(OBJ_EXT):
+	$(PERLRUN) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xss > $*.cpp
+	$(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.cpp
+	';
+}
+
 =item clean_subdirs_target
 
 && and chdir problem.
@@ -219,5 +251,4 @@
 
 =cut
 
-
 1;
diff -ru ExtUtils-MakeMaker-snap/t/MM_Unix.t my-ExtUtils-MakeMaker-snap/t/MM_Unix.t
--- ExtUtils-MakeMaker-snap/t/MM_Unix.t	2003-03-05 10:48:55.000000000 +0000
+++ my-ExtUtils-MakeMaker-snap/t/MM_Unix.t	2003-03-19 22:33:33.000000000 +0000
@@ -18,7 +18,7 @@
         plan skip_all => 'Non-Unix platform';
     }
     else {
-        plan tests => 115;
+        plan tests => 117;
     }
 }
 
@@ -127,6 +127,8 @@
   xs_c
   xs_cpp
   xs_o
+  xss_cpp
+  xss_o
   xsubpp_version 
   / )
   {
diff -ru ExtUtils-MakeMaker-snap/t/MM_VMS.t my-ExtUtils-MakeMaker-snap/t/MM_VMS.t
--- ExtUtils-MakeMaker-snap/t/MM_VMS.t	2003-03-05 10:48:55.000000000 +0000
+++ my-ExtUtils-MakeMaker-snap/t/MM_VMS.t	2003-03-20 11:01:11.000000000 +0000
@@ -35,6 +35,8 @@
                    c_o
                    xs_c
                    xs_o
+                   xss_cpp
+                   xss_o
                    top_targets
                    dlsyms
                    dynamic_lib
