# New Ticket Created by Philip Taylor
# Please include the string: [perl #29315]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org:80/rt3/Ticket/Display.html?id=29315 >
Some changes so that "perl Configure.pl --cc=icl" correctly uses
the Intel C++ Compiler under Windows:
config/gen/icu.pl is just updated to think that icl and icl.exe are
MSVC; it'll do the ICU compilation with the MS compiler, but the
resultant library is compatible with the Intel compiler.
config/init/hints/mswin32.pl handles icl similarly to cl, but with
a different cc ('icl') and ld ('xilink') and ar ('xilib'), and also
adds libircmt.lib to the library list.
Also, cc_exe_out was '-Fe' for MSVC, which is the correct flag for
the C compiler ([i]cl.exe), except it's passed to the linker
([xi]link.exe) instead and so needs to be '-out:'. (With -Fe it just
ignores the option and decides on a filename by itself, which
apparently just happens to be correct.)
icl doesn't like the emptiness of:
const struct {
INTVAL func_nr;
INTVAL left, right;
funcptr_t func_ptr;
} _temp_mmd_init[] = {
/* N/Y */
};
(complaining "error: incomplete type is not allowed") in
classes/float.c and classes/mmd_default.c. I altered
lib/Parrot/Pmc2c.pm to avoid printing that code (and the later loop
which initialises all 0 elements) if it had decided on using "/* N/Y
*/".
With those changes, it all compiles and passes the tests (and still
works in MSVC).
[All done with version 8.0.048 of the Intel compiler, and MSVC 7.1]
--
Philip Taylor
[EMAIL PROTECTED]
Index: parrot/config/gen/icu.pl
===================================================================
RCS file: /cvs/public/parrot/config/gen/icu.pl,v
retrieving revision 1.10
diff -u -b -r1.10 icu.pl
--- parrot/config/gen/icu.pl 21 Apr 2004 09:10:59 -0000 1.10
+++ parrot/config/gen/icu.pl 2 May 2004 20:42:58 -0000
@@ -74,9 +74,9 @@
# print "\n";
- # MS VC++ requires special treatment.
+ # MS VC++ and Intel C++ (on Windows) require special treatment.
my ($cc) = Configure::Data->get(qw(cc));
- my $is_msvc = grep { $cc eq $_ } ( qw(cl cl.exe) );
+ my $is_msvc = grep { $cc eq $_ } ( qw(cl cl.exe icl icl.exe) );
if ($is_msvc && -e 'icu\source\allinone\allinone.dsw') {
# We build from MS VC++ Project Files. If these do not have Win32 line endings,
it will
# not accept them. Thus we need to ensure they do.
Index: parrot/config/init/hints/mswin32.pl
===================================================================
RCS file: /cvs/public/parrot/config/init/hints/mswin32.pl,v
retrieving revision 1.19
diff -u -b -r1.19 mswin32.pl
--- parrot/config/init/hints/mswin32.pl 27 Apr 2004 08:09:38 -0000 1.19
+++ parrot/config/init/hints/mswin32.pl 2 May 2004 20:42:59 -0000
@@ -10,6 +10,7 @@
$cc = $args{cc} if defined $args{cc};
my $is_msvc = grep { $cc eq $_ } ( qw(cl cl.exe) );
+ my $is_intel = grep { $cc eq $_ } ( qw(icl icl.exe) );
my $is_mingw = grep { $cc eq $_ } ( qw(gcc gcc.exe) );
my $is_bcc = grep { $cc eq $_ } ( qw(bcc32 bcc32.exe) );
@@ -36,7 +37,7 @@
a => '.lib',
o => '.obj',
cc_o_out => '-Fo',
- cc_exe_out => '-Fe',
+ cc_exe_out => '-out:',
cc_ldflags => '/link',
cc_debug => '-Zi', #ZI messes with __LINE__
ld_debug => '-debug',
@@ -63,7 +64,43 @@
Configure::Data->set('linkflags', $linkflags);
}
}
- if( $is_bcc ) {
+ elsif( $is_intel ) {
+ Configure::Data->set(
+ so => '.dll',
+ a => '.lib',
+ o => '.obj',
+ cc_o_out => '-Fo',
+ cc_exe_out => '-out:',
+ cc_ldflags => '/link',
+ cc_debug => '-Zi', #ZI messes with __LINE__
+ libs => "$libs libircmt.lib",
+ ld => 'xilink',
+ ld_debug => '-debug',
+ ld_shared => '-dll',
+ ld_shared_flags=> '-def:libparrot.def',
+ ld_out => '-out:',
+ ldflags => '-nologo',
+ blib_lib_libparrot_a => 'blib/lib/libparrot_s$(A)',
+ cp => 'copy',
+ ar => 'xilib',
+ ar_flags => '',
+ ar_out => '-out:',
+ slash => '\\',
+ ccflags => $ccflags,
+ ccwarn => ''
+ );
+ # 'link' needs to be xilink.exe, not icl.exe.
+ # This makes 'link' and 'ld' the same.
+ Configure::Data->set('link', Configure::Data->get('ld'));
+
+ # We can't use -opt: and -debug together.
+ if (Configure::Data->get('ld_debug') =~ /-debug/) {
+ my $linkflags = Configure::Data->get('linkflags');
+ $linkflags =~ s/-opt:\S+//;
+ Configure::Data->set('linkflags', $linkflags);
+ }
+ }
+ elsif( $is_bcc ) {
Configure::Data->set(
o => '.obj',
a => '.lib',
Index: parrot/lib/Parrot/Pmc2c.pm
===================================================================
RCS file: /cvs/public/parrot/lib/Parrot/Pmc2c.pm,v
retrieving revision 1.19
diff -u -b -r1.19 Pmc2c.pm
--- parrot/lib/Parrot/Pmc2c.pm 1 May 2004 13:05:23 -0000 1.19
+++ parrot/lib/Parrot/Pmc2c.pm 2 May 2004 20:43:51 -0000
@@ -573,9 +573,10 @@
NULL, /* isa_str */
NULL, /* extra data */
$methlist
-EOC
- $cout .= <<"EOC";
};
+EOC
+
+ $cout .= <<"EOC" if $mmd_list ne '/* N/Y */';
const struct {
INTVAL func_nr;
@@ -584,7 +585,8 @@
} _temp_mmd_init[] = {
$mmd_list
};
-
+EOC
+ $cout .= <<"EOC";
int i;
/*
@@ -605,6 +607,8 @@
Parrot_base_vtables[entry] =
Parrot_clone_vtable(interp, &temp_base_vtable);
}
+EOC
+ $cout .= <<"EOC" if $mmd_list ne '/* N/Y */';
/*
* register mmds
*/
@@ -616,6 +620,8 @@
_temp_mmd_init[i].right,
_temp_mmd_init[i].func_ptr);
}
+EOC
+ $cout .= <<"EOC";
$class_init_code
} /* Parrot_${classname}_class_init */
EOC