summaryrefslogtreecommitdiff
path: root/samwise/PerlSam/Generator/MSVC6.pm
diff options
context:
space:
mode:
Diffstat (limited to 'samwise/PerlSam/Generator/MSVC6.pm')
-rw-r--r--samwise/PerlSam/Generator/MSVC6.pm847
1 files changed, 847 insertions, 0 deletions
diff --git a/samwise/PerlSam/Generator/MSVC6.pm b/samwise/PerlSam/Generator/MSVC6.pm
new file mode 100644
index 00000000000..2d903acae9a
--- /dev/null
+++ b/samwise/PerlSam/Generator/MSVC6.pm
@@ -0,0 +1,847 @@
+# $Id$
+
+package PerlSam::Generator::MSVC6;
+
+use Cwd;
+use Data::Dumper;
+use FileHandle;
+use strict;
+
+###############################################################################
+# Forward Declarations
+
+sub GenerateExeProject (\%);
+sub GenerateDLLProject (\%);
+sub GenerateLIBProject (\%);
+
+sub WorkspaceProject ($$\@);
+
+sub ProjectHeader (\%\@$);
+sub ProjectAllGroups ($\%\@);
+sub ProjectGroup ($$$\%\@);
+sub ProjectSource ($$\%\@);
+sub ProjectFooter ();
+sub ConfigSection (%);
+
+###############################################################################
+# Constructor
+
+sub new (@)
+{
+ my $proto = shift;
+ my $class = ref ($proto) || $proto;
+ my $self = {};
+
+ bless ($self, $class);
+ return $self;
+}
+
+###############################################################################
+# Methods
+
+my %tempdirs = ( 'Win32 Debug' => 'Debug',
+ 'Win32 Release' => 'Release',
+ 'Win32 Static Debug' => 'Debug\Static',
+ 'Win32 Static Release' => 'Release\Static',
+ 'Win32 MFC Debug' => 'Debug\MFC',
+ 'Win32 MFC Release' => 'Release\MFC'
+ );
+
+sub GenerateWorkspace (\%)
+{
+ my $self = shift;
+ my $data = shift;
+
+ # Check to see if we even need to generate a workspace file
+ if (!defined @{$data->{WORKSPACE}->{PROJECTLINKS}->{LIST}}) {
+ return;
+ }
+
+ my $string;
+
+ $string .= <<EOWH;
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+EOWH
+
+ foreach my $project (sort @{$data->{WORKSPACE}->{PROJECTLINKS}->{LIST}}) {
+ my $description = $data->{PROJECTS}->{$project}->{DESCRIPTION};
+
+ if (!defined $data->{PROJECTS}->{$project}->{NAME}) {
+ print STDERR "Error: Cannot find project <$project>\n";
+ next;
+ }
+
+ $string .= WorkspaceProject ($description, $project . ".dsp", @{$data->{PROJECTS}->{$project}->{DEPENDS}});
+
+ if ($data->{PROJECTS}->{$project}->{TYPE} eq "library") {
+ my @empty = ();
+ $string .= WorkspaceProject ($description. " Static" , $project . "_static.dsp", @empty);
+ }
+ }
+ $string .= <<EOWF;
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
+EOWF
+
+ my $file_name;
+
+ if (defined $data->{WORKSPACE}->{NAME}) {
+ $file_name = $data->{WORKSPACE}->{NAME};
+ }
+ else {
+ $file_name = getcwd ();
+
+ if ($file_name =~ m/\/([^\/]*)$/) {
+ $file_name = $1;
+ }
+ }
+
+ $file_name = $file_name . ".dsw";
+
+ print "Creating Workspace: $file_name\n";
+
+ my $file_handle = new FileHandle ($file_name, "w");
+ binmode $file_handle;
+ $string =~ s/\n/\r\n/g;
+ print $file_handle $string;
+}
+
+sub GenerateProjects (\%)
+{
+ my $self = shift;
+ my $data = shift;
+
+ foreach my $name (sort keys %{$data->{PROJECTS}}) {
+ # Expand the IDL files
+
+ PerlSam::Generator::ExpandIDLFiles (%{$data->{PROJECTS}->{$name}});
+
+ # Store the data in easier variables
+
+ my $description = $data->{PROJECTS}->{$name}->{DESCRIPTION};
+ my $target = $data->{PROJECTS}->{$name}->{TARGET};
+ my $type = $data->{PROJECTS}->{$name}->{TYPE};
+ my $export = "";
+ my $include = "";
+
+ if (defined $data->{PROJECTS}->{$name}->{LIBINFO}->{EXPORT}) {
+ $export = $data->{PROJECTS}->{$name}->{LIBINFO}->{EXPORT};
+ }
+
+ if (defined $data->{PROJECTS}->{$name}->{LIBINFO}->{INCLUDE}) {
+ $include = $data->{PROJECTS}->{$name}->{LIBINFO}->{INCLUDE};
+ }
+
+ if (!defined $data->{PROJECTS}->{$name}->{LIBS}) {
+ @{$data->{PROJECTS}->{$name}->{LIBS}} = [];
+ }
+
+ if ($type eq "executable")
+ {
+ my $string = GenerateExeProject (%{$data->{PROJECTS}->{$name}});
+
+ my $file_name = $name . ".dsp";
+
+ print "Creating Project: $file_name\n";
+
+ my $file_handle = new FileHandle ($file_name, "w");
+ binmode $file_handle;
+ $string =~ s/\n/\r\n/g;
+ print $file_handle $string;
+ }
+ elsif ($type eq "library") {
+ my $string;
+ my $file_name;
+ my $file_handle;
+
+ $string = GenerateDLLProject (%{$data->{PROJECTS}->{$name}});
+
+ $file_name = $name . ".dsp";
+
+ print "Creating Project: $file_name\n";
+
+ $file_handle = new FileHandle ($file_name, "w");
+ binmode $file_handle;
+ $string =~ s/\n/\r\n/g;
+ print $file_handle $string;
+ $file_handle->close ();
+
+ my %newdata = %{$data->{PROJECTS}->{$name}};
+
+ %newdata->{DESCRIPTION} .= " Static";
+
+ $string = GenerateLIBProject (%newdata);
+
+ $file_name = $name . "_static.dsp";
+
+ print "Creating Project: $file_name\n";
+
+ $file_handle = new FileHandle ($file_name, "w");
+ binmode $file_handle;
+ $string =~ s/\n/\r\n/g;
+ print $file_handle $string;
+
+ }
+ else {
+ print STDERR "Error: Unrecognized type <$type> for $name\n";
+ next;
+ }
+ }
+}
+
+###############################################################################
+# Internal Methods
+
+sub GenerateExeProject (\%)
+{
+ my $data = shift;
+
+ my @configs = ('Win32 Release', 'Win32 Debug');
+ my $type = 'executable';
+
+ my $string = ProjectHeader (%{$data}, @configs, 0);
+
+ my $libraries = PerlSam::Generator::ExpandLibraries (@{$data->{LIBS}});
+
+ my $debug_link_opts;
+ my $release_link_opts;
+
+ foreach my $lib (split / /, $libraries) {
+ $debug_link_opts .= $lib . "d.lib ";
+ $release_link_opts .= $lib . ".lib ";
+ }
+
+ if ($data->{INSTALL} eq 'yes') {
+ my $bindir = PerlSam::Generator::ConvertPathToRelative ('/bin');
+ $debug_link_opts .= "/out:\"$bindir/$data->{TARGET}.exe\"";
+ $release_link_opts .= "/out:\"$bindir/Release/$data->{TARGET}.exe\"";
+ }
+ else {
+ $debug_link_opts .= "/out:\"$data->{TARGET}.exe\"";
+ $release_link_opts .= "/out:\"$data->{TARGET}.exe\"";
+ }
+
+ $debug_link_opts =~ s/\s$//;
+ $release_link_opts =~ s/\s$//;
+
+ my $cpp_opts = "";
+
+ my $dirs = PerlSam::Generator::ExpandIncludeDirs (@{$data->{LIBS}});
+ my $include_dirs = PerlSam::Generator::ConvertPathToRelative ($dirs);
+ foreach my $dir (split / /, $include_dirs) {
+ $cpp_opts .= "/I \"$dir\" ";
+ }
+
+ $cpp_opts =~ s/ $//;
+
+ $string .= "!IF \"\$(CFG)\" == \"$data->{DESCRIPTION} - Win32 Release\"\n\n";
+ $string .= ConfigSection ({TYPE => $type,
+ OUTPUTDIR => %tempdirs->{'Win32 Release'} . "\\$data->{NAME}",
+ INTERDIR => %tempdirs->{'Win32 Release'} . "\\$data->{NAME}",
+ ADDCPPOPTS => $cpp_opts,
+ ADDLINKOPTS => $release_link_opts});
+ $string .= "!ELSEIF \"\$(CFG)\" == \"$data->{DESCRIPTION} - Win32 Debug\"\n\n";
+ $string .= ConfigSection ({TYPE => $type,
+ OUTPUTDIR => '',
+ INTERDIR => %tempdirs->{'Win32 Debug'} . "\\$data->{NAME}",
+ DEBUG => 1,
+ ADDCPPOPTS => $cpp_opts,
+ ADDLINKOPTS => $debug_link_opts});
+ $string .= "!ENDIF\n\n";
+
+ $string .= "# Begin Target\n\n";
+
+ foreach my $config (@configs) {
+ $string .= "# Name \"$data->{DESCRIPTION} - $config\"\n";
+ }
+
+ $string .= ProjectAllGroups ($data->{DESCRIPTION}, %{$data->{SOURCES}}, @configs);
+ $string .= ProjectFooter ();
+
+ return $string;
+}
+
+sub GenerateDLLProject (\%)
+{
+ my $data = shift;
+
+ my @configs = ('Win32 MFC Release', 'Win32 MFC Debug', 'Win32 Release', 'Win32 Debug');
+ my $type = 'library';
+
+ my $export = "";
+ my $include = "";
+
+ if (defined $data->{LIBINFO}->{EXPORT}) {
+ $export = $data->{LIBINFO}->{EXPORT};
+ }
+
+ if (defined $data->{LIBINFO}->{INCLUDE}) {
+ $include = $data->{LIBINFO}->{INCLUDE};
+ }
+
+ my $string = ProjectHeader (%{$data}, @configs, 0);
+
+ my $libraries = PerlSam::Generator::ExpandLibraries (@{$data->{LIBS}});
+
+ my $mfc_debug_link_opts;
+ my $mfc_release_link_opts;
+ my $debug_link_opts;
+ my $release_link_opts;
+
+ foreach my $lib (split / /, $libraries) {
+ $mfc_debug_link_opts .= $lib . "mfcd.lib ";
+ $mfc_release_link_opts .= $lib . "mfc.lib ";
+ $debug_link_opts .= $lib . "d.lib ";
+ $release_link_opts .= $lib . ".lib ";
+ }
+
+ my $bindir = PerlSam::Generator::ConvertPathToRelative ("/bin") . "/";
+
+ $mfc_debug_link_opts .= "/out:\"$bindir$data->{TARGET}" . "mfcd.dll\" ";
+ $mfc_release_link_opts .= "/out:\"$bindir$data->{TARGET}" . "mfc.dll\" ";
+ $debug_link_opts .= "/out:\"$bindir$data->{TARGET}" . "d.dll\" ";
+ $release_link_opts .= "/out:\"$bindir$data->{TARGET}.dll\" ";
+
+ $mfc_debug_link_opts =~ s/\s$//;
+ $mfc_release_link_opts =~ s/\s$//;
+ $debug_link_opts =~ s/\s$//;
+ $release_link_opts =~ s/\s$//;
+
+ my $cpp_opts = "";
+
+ foreach my $ex (split / /, $export) {
+ $cpp_opts .= "/D \"" . $ex . "_BUILD_DLL\" ";
+ }
+
+ my $include_dirs = PerlSam::Generator::ExpandIncludeDirs (@{$data->{LIBS}});
+ $include_dirs = PerlSam::Generator::ConvertPathToRelative ($include_dirs);
+ foreach my $dir (split / /, $include_dirs) {
+ $cpp_opts .= "/I \"$dir\" ";
+ }
+
+ if ($cpp_opts !~ m/\/I "$include"/) {
+ $cpp_opts .= "/I \"$include\" ";
+ }
+
+ $cpp_opts =~ s/ $//;
+
+ $string .= "!IF \"\$(CFG)\" == \"$data->{DESCRIPTION} - Win32 MFC Release\"\n\n";
+ $string .= ConfigSection ({TYPE => $type,
+ OUTPUTDIR => '',
+ INTERDIR => %tempdirs->{'Win32 MFC Release'} . "\\$data->{NAME}",
+ ADDCPPOPTS => $cpp_opts . " /D ACE_HAS_MFC=1",
+ ADDLINKOPTS => $mfc_release_link_opts});
+ $string .= "!ELSEIF \"\$(CFG)\" == \"$data->{DESCRIPTION} - Win32 MFC Debug\"\n\n";
+ $string .= ConfigSection ({TYPE => $type,
+ OUTPUTDIR => '',
+ INTERDIR => %tempdirs->{'Win32 MFC Debug'} . "\\$data->{NAME}",
+ DEBUG => 1,
+ ADDCPPOPTS => $cpp_opts . " /D ACE_HAS_MFC=1",
+ ADDLINKOPTS => $mfc_debug_link_opts});
+ $string .= "!ELSEIF \"\$(CFG)\" == \"$data->{DESCRIPTION} - Win32 Release\"\n\n";
+ $string .= ConfigSection ({TYPE => $type,
+ OUTPUTDIR => '',
+ INTERDIR => %tempdirs->{'Win32 Release'} . "\\$data->{NAME}",
+ ADDCPPOPTS => $cpp_opts,
+ ADDLINKOPTS => $release_link_opts});
+ $string .= "!ELSEIF \"\$(CFG)\" == \"$data->{DESCRIPTION} - Win32 Debug\"\n\n";
+ $string .= ConfigSection ({TYPE => $type,
+ OUTPUTDIR => '',
+ INTERDIR => %tempdirs->{'Win32 Debug'} . "\\$data->{NAME}",
+ DEBUG => 1,
+ ADDCPPOPTS => $cpp_opts,
+ ADDLINKOPTS => $debug_link_opts});
+ $string .= "!ENDIF\n\n";
+
+ $string .= "# Begin Target\n\n";
+
+ foreach my $config (@configs) {
+ $string .= "# Name \"$data->{DESCRIPTION} - $config\"\n";
+ }
+
+ $string .= ProjectAllGroups ($data->{DESCRIPTION},
+ %{$data->{SOURCES}},
+ @configs);
+ $string .= ProjectFooter ();
+
+ return $string;
+}
+
+sub GenerateLIBProject (\%)
+{
+ my $data = shift;
+
+ my @configs = ('Win32 Static Release', 'Win32 Static Debug');
+ my $type = 'static library';
+ my $include = "";
+ my $namespace = "";
+
+ if (defined $data->{LIBINFO}->{INCLUDE}) {
+ $include = $data->{LIBINFO}->{INCLUDE};
+ }
+
+ if (defined $data->{LIBINFO}->{NAMESPACE}) {
+ $namespace = $data->{LIBINFO}->{NAMESPACE};
+ }
+
+ my $string = ProjectHeader (%{$data}, @configs, 1);
+
+ my $debug_link_opts;
+ my $release_link_opts;
+
+ $debug_link_opts .= "/out:\"$data->{TARGET}sd.lib\" ";
+ $release_link_opts .= "/out:\"$data->{TARGET}s.lib\" ";
+
+ my $cpp_opts = "";
+
+ my $include_dirs = PerlSam::Generator::ExpandIncludeDirs (@{$data->{LIBS}});
+ $include_dirs = PerlSam::Generator::ConvertPathToRelative ($include_dirs);
+
+ foreach my $dir (split / /, $include_dirs) {
+ $cpp_opts .= "/I \"$dir\" ";
+ }
+
+ if ($cpp_opts !~ m/\/I "$include"/) {
+ $cpp_opts .= "/I \"$include\" ";
+ }
+
+ if ($#{$data->{LIBS}} > 0 || $namespace eq "ACE") {
+ $cpp_opts .= "/D \"ACE_AS_STATIC_LIBS\" ";
+ }
+
+ if ($#{$data->{LIBS}} > 0 || $namespace eq "TAO") {
+ $cpp_opts .= "/D \"TAO_AS_STATIC_LIBS\" ";
+ }
+
+ my $export = '';
+ if (defined $data->{LIBINFO}->{EXPORT}) {
+ $export = $data->{LIBINFO}->{EXPORT};
+ }
+ foreach my $ex (split / /, $export) {
+ $cpp_opts .= "/D \"" . $ex . "_HAS_DLL=0\" ";
+ }
+
+ $cpp_opts =~ s/ $//;
+
+ $string .= "!IF \"\$(CFG)\" == \"$data->{DESCRIPTION} - Win32 Static Release\"\n\n";
+ $string .= ConfigSection ({TYPE => $type,
+ OUTPUTDIR => '',
+ INTERDIR => %tempdirs->{'Win32 Release'} . "\\$data->{NAME}",
+ ADDCPPOPTS => $cpp_opts,
+ ADDLINKOPTS => $release_link_opts});
+ $string .= "!ELSEIF \"\$(CFG)\" == \"$data->{DESCRIPTION} - Win32 Static Debug\"\n\n";
+ $string .= ConfigSection ({TYPE => $type,
+ OUTPUTDIR => '',
+ INTERDIR => %tempdirs->{'Win32 Debug'} . "\\$data->{NAME}",
+ DEBUG => 1,
+ ADDCPPOPTS => $cpp_opts,
+ ADDLINKOPTS => $debug_link_opts});
+ $string .= "!ENDIF\n\n";
+
+ $string .= "# Begin Target\n\n";
+
+ foreach my $config (@configs) {
+ $string .= "# Name \"$data->{DESCRIPTION} - $config\"\n";
+ }
+
+ $string .= ProjectAllGroups ($data->{DESCRIPTION},
+ %{$data->{SOURCES}},
+ @configs);
+ $string .= ProjectFooter ();
+
+ return $string;
+}
+
+sub WorkspaceProject ($$\@)
+{
+ my $name = shift;
+ my $file = shift;
+ my $depends = shift;
+ my $string;
+
+ $string .= "###############################################################################\n\n";
+ $string .= "Project: \"$name\"=.\\$file - Package Owner=<4>\n\n";
+ $string .= "Package=<5>\n";
+ $string .= "{{{\n";
+ $string .= "}}}\n\n";
+ $string .= "Package=<4>\n";
+ $string .= "{{{\n";
+
+ foreach my $dep (@{$depends}) {
+ $string .= " Begin Project Dependency\n";
+ $string .= " Project_Dep_Name $dep\n";
+ $string .= " End Project Dependency\n";
+ }
+
+ $string .= "}}}\n\n";
+
+ return $string;
+}
+
+sub ProjectHeader (\%\@$)
+{
+ my $data = shift;
+ my $configs = shift;
+ my $static = shift;
+
+ my $default_config = (reverse @{$configs})[0];
+
+ my $string = "";
+
+ # Standard header. Do not edit? heh heh
+
+ $string .= "# Microsoft Developer Studio Project File - Name=\"$data->{DESCRIPTION}\" - Package Owner=<4>\n";
+ $string .= "# Microsoft Developer Studio Generated Build File, Format Version 6.00\n";
+ $string .= "# ** DO NOT EDIT **\n";
+ $string .= "\n";
+
+ # Pick a target
+
+ $string .= "# TARGTYPE \"Win32 (x86) Dynamic-Link Library\" 0x0102\n" if ($data->{TYPE} eq "library" && !$static);
+ $string .= "# TARGTYPE \"Win32 (x86) Console Application\" 0x0103\n" if ($data->{TYPE} eq "executable");
+ $string .= "# TARGTYPE \"Win32 (x86) Static Library\" 0x0104\n" if ($data->{TYPE} eq "library" && $static);
+ $string .= "\n";
+
+ # Next block of dsp goodness
+
+ $string .= <<EOPH1;
+CFG=$data->{DESCRIPTION} - $default_config
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "$data->{NAME}.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "$data->{NAME}.mak" CFG="$data->{DESCRIPTION} - $default_config"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+EOPH1
+
+ # Now we need to output the list of configs possible
+
+ my $target = "Unknown";
+ $target = "Win32 (x86) Dynamic-Link Library" if ($data->{TYPE} eq "library" && !$static);
+ $target = "Win32 (x86) Console Application" if ($data->{TYPE} eq "executable");
+ $target = "Win32 (x86) Static Library" if ($data->{TYPE} eq "library" && $static);
+
+ foreach my $config (@{$configs}) {
+ $string .= "!MESSAGE \"$data->{DESCRIPTION} - $config\" (based on \"$target\")\n";
+ }
+
+ # More goodness
+
+ $string .= <<EOPH2;
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+EOPH2
+ return $string;
+}
+
+sub ProjectAllGroups ($\%\@)
+{
+ my $description = shift;
+ my $sources = shift;
+ my $configs = shift;
+
+ my $string;
+
+ $string .= ProjectGroup ($description,
+ "Source Files",
+ "cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90",
+ %{$sources},
+ @{$configs});
+ $string .= ProjectGroup ($description,
+ "Header Files",
+ "h;hpp;hxx;hm;fi;fd",
+ %{$sources},
+ @{$configs});
+ $string .= ProjectGroup ($description,
+ "IDL Files",
+ "idl;pidl",
+ %{$sources},
+ @{$configs});
+ $string .= ProjectGroup ($description,
+ "Inline Files",
+ "inl;i",
+ %{$sources},
+ @{$configs});
+ $string .= ProjectGroup ($description,
+ "Resource Files",
+ "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe",
+ %{$sources},
+ @{$configs});
+ return $string;
+}
+
+sub ProjectGroup ($$$\%\@)
+{
+ my $description = shift;
+ my $name = shift;
+ my $filter = shift;
+ my $data = shift;
+ my $configs = shift;
+ my $string;
+
+ $string .= "# Begin Group \"$name\"\n";
+ $string .= "\n";
+ $string .= "# PROP Default_Filter \"$filter\"\n";
+
+ foreach my $source (sort keys %{$data}) {
+ my $ext = "";
+ if ($source =~ m/\.([^\.]*)$/) {
+ $ext = $1;
+ }
+
+ if ($filter =~ m/^$ext;/ ||
+ $filter =~ m/;$ext;/ ||
+ $filter =~ m/;$ext$/ ||
+ $filter =~ m/^$ext$/)
+ {
+ $string .= ProjectSource ($description, $source, %{$data->{$source}}, @{$configs});
+ }
+ }
+ $string .= "# End Group\n";
+ return $string;
+}
+
+sub ProjectSource ($$\%\@)
+{
+ my $description = shift;
+ my $file = shift;
+ my $data = shift;
+ my $configs = shift;
+ my $string;
+
+ $file =~ s/\//\\/g;
+
+ if ($file !~ m/\\/) {
+ $file = ".\\" . $file;
+ }
+
+ $string .= "# Begin Source File\n\nSOURCE=$file\n";
+
+ if (defined $data->{TYPE} && lc ($data->{TYPE}) eq 'template') {
+ $string .= "# PROP Exclude_From_Build 1\n";
+ }
+
+ if ($file =~ m/(.*)\.idl$/) {
+ my $idl = $file;
+ my $idlroot = $1;
+ my $taoidl_opts;
+
+ if ($idlroot =~ m/([^\\]*)$/) {
+ $idlroot = $1;
+ }
+
+ if (defined $data->{OPTS}) {
+ $taoidl_opts = $data->{OPTS};
+ }
+ else {
+ $taoidl_opts = "-Ge 1";
+ }
+
+
+ my $first = 1;
+ foreach my $config (@{$configs}) {
+ my $taoidl_path = PerlSam::Generator::ConvertPathToRelative('/bin/' . %tempdirs->{$config} . '/tao_idl.exe');
+
+ # Special case for Win32 Debug
+ if ($config eq "Win32 Debug") {
+ $taoidl_path = PerlSam::Generator::ConvertPathToRelative('/bin/tao_idl.exe');
+ }
+
+ $taoidl_path =~ s/\//\\/g;
+
+ if ($first) {
+ $first = 0;
+ $string .= "!IF \"\$(CFG)\" == \"$description - $config\"\n\n"
+ }
+ else {
+ $string .= "!ELSEIF \"\$(CFG)\" == \"$description - $config\"\n\n"
+ }
+ $string .= <<EOPS
+USERDEP__IDL_="$taoidl_path"
+
+# Begin Custom Build - Invoking TAO's IDL Compiler on \$(InputPath)
+InputPath=$idl
+InputName=$idlroot
+
+BuildCmds= \\
+ $taoidl_path $taoidl_opts \$(InputName).idl
+
+"\$(InputName)C.h" : \$(SOURCE) "\$(INTDIR)" "\$(OUTDIR)"
+ \$(BuildCmds)
+
+"\$(InputName)C.i" : \$(SOURCE) "\$(INTDIR)" "\$(OUTDIR)"
+ \$(BuildCmds)
+
+"\$(InputName)C.cpp" : \$(SOURCE) "\$(INTDIR)" "\$(OUTDIR)"
+ \$(BuildCmds)
+
+"\$(InputName)S.h" : \$(SOURCE) "\$(INTDIR)" "\$(OUTDIR)"
+ \$(BuildCmds)
+
+"\$(InputName)S.i" : \$(SOURCE) "\$(INTDIR)" "\$(OUTDIR)"
+ \$(BuildCmds)
+
+"\$(InputName)S.cpp" : \$(SOURCE) "\$(INTDIR)" "\$(OUTDIR)"
+ \$(BuildCmds)
+
+"\$(InputName)S_T.h" : \$(SOURCE) "\$(INTDIR)" "\$(OUTDIR)"
+ \$(BuildCmds)
+
+"\$(InputName)S_T.i" : \$(SOURCE) "\$(INTDIR)" "\$(OUTDIR)"
+ \$(BuildCmds)
+
+"\$(InputName)S_T.cpp" : \$(SOURCE) "\$(INTDIR)" "\$(OUTDIR)"
+ \$(BuildCmds)
+# End Custom Build
+
+EOPS
+ }
+
+ $string .= "!ENDIF\n";
+ }
+
+ $string .= "# End Source File\n";
+
+ return $string;
+}
+
+sub ProjectFooter ()
+{
+ return <<EOPF;
+# End Target
+# End Project
+EOPF
+}
+
+sub ConfigSection (%)
+{
+ my $data = shift;
+
+ my $type = $data->{TYPE};
+ $type = "" if (!defined $type);
+
+ my $output_dir = "Output";
+ my $inter_dir = "Output";
+ my $target_dir = "";
+ my $base_cpp_opts = "/nologo /W3 /GX /D \"WIN32\" /D \"_WINDOWS\" /D \"_CONSOLE\" /D \"_MBCS\" /FD /c";
+ my $base_link_opts = "kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386";
+ my $use_debug_libs = 0;
+ my $debug_macro = "NDEBUG";
+ my $other_cpp_opts = "/D \"NDEBUG\" /O2 /MD ";
+ my $link_opts = "/nologo /subsystem:console /machine:I386 ";
+
+ if ($type eq "library") {
+ $base_link_opts = "kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /machine:I386";
+ $link_opts = "/nologo /dll /machine:I386 ";
+ }
+
+ if (defined $data->{DEBUG} && $data->{DEBUG} == 1) {
+ $use_debug_libs = 1;
+ $debug_macro = "_DEBUG";
+ $other_cpp_opts = "/D \"_DEBUG\" /Od /MDd ";
+ $base_cpp_opts .= " /Gm /Zi";
+ $base_link_opts .= " /debug /pdbtype:sept";
+ $link_opts .= "/debug /pdbtype:sept ";
+ }
+
+ if ($type eq "static library") {
+ $base_link_opts = "/nologo ";
+ $link_opts = "/nologo ";
+
+ if (defined $data->{DEBUG} && $data->{DEBUG} == 1) {
+ $other_cpp_opts = "/D \"_DEBUG\" /Od /Gy /MDd ";
+ }
+ else {
+ $other_cpp_opts = "/D \"NDEBUG\" /O1 /MD ";
+ }
+ }
+
+ # Override defaults
+
+ $output_dir = $data->{OUTPUTDIR} if (defined $data->{OUTPUTDIR});
+ $inter_dir = $data->{INTERDIR} if (defined $data->{INTERDIR});
+ $target_dir = $data->{TARGETDIR} if (defined $data->{TARGETDIR});
+ $other_cpp_opts = $data->{CPPOPTS} if (defined $data->{CPPOPTS});
+ $link_opts = $data->{LINKOPTS} if (defined $data->{LINKOPTS});
+
+ $other_cpp_opts .= $data->{ADDCPPOPTS} if (defined $data->{ADDCPPOPTS});
+ $link_opts .= $data->{ADDLINKOPTS} if (defined $data->{ADDLINKOPTS});
+
+ my $string = <<EOCS1;
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries $use_debug_libs
+# PROP BASE Output_Dir "$output_dir"
+# PROP BASE Intermediate_Dir "$inter_dir"
+# PROP BASE Target_Dir "$target_dir"
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries $use_debug_libs
+# PROP Output_Dir "$output_dir"
+# PROP Intermediate_Dir "$inter_dir"
+EOCS1
+
+ $string .= "# PROP Ignore_Export_Lib 0\n" if ($type ne "static library");
+
+ $string .= <<EOCS2;
+# PROP Target_Dir "$target_dir"
+# ADD BASE CPP $base_cpp_opts
+# ADD CPP $base_cpp_opts $other_cpp_opts
+EOCS2
+
+ if ($type ne "static library") {
+ $string .= "# ADD BASE MTL /nologo /D \"$debug_macro\" /mktyplib203 /win32\n";
+ $string .= "# ADD MTL /nologo /D \"$debug_macro\" /mktyplib203 /win32\n";
+ }
+
+ $string .= <<EOCS3;
+# ADD BASE RSC /l 0x409 /d "$debug_macro"
+# ADD RSC /l 0x409 /d "$debug_macro"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+EOCS3
+
+ if ($type eq "static library") {
+ $string .= "LIB32=link.exe -lib\n";
+ $string .= "# ADD BASE LIB32 $base_link_opts\n";
+ $string .= "# ADD LIB32 $link_opts\n";
+ }
+ else {
+ $string .= "LINK32=link.exe\n";
+ $string .= "# ADD BASE LINK32 $base_link_opts\n";
+ $string .= "# ADD LINK32 $link_opts \n";
+ }
+
+ $string .= "\n";
+
+ return $string;
+}
+
+1;