From 63876d3bac5a7471a7987da25a93c13a2534a644 Mon Sep 17 00:00:00 2001 From: Andrew Dunstan Date: Tue, 3 Jan 2012 08:44:26 -0500 Subject: Support for building with MS Visual Studio 2010. Brar Piening, reviewed by Craig Ringer. --- src/tools/msvc/MSBuildProject.pm | 388 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 388 insertions(+) create mode 100644 src/tools/msvc/MSBuildProject.pm (limited to 'src/tools/msvc/MSBuildProject.pm') diff --git a/src/tools/msvc/MSBuildProject.pm b/src/tools/msvc/MSBuildProject.pm new file mode 100644 index 00000000000..fcce9ebb68d --- /dev/null +++ b/src/tools/msvc/MSBuildProject.pm @@ -0,0 +1,388 @@ +package MSBuildProject; + +# +# Package that encapsulates a MSBuild (Visual C++ 2010) project file +# +# src/tools/msvc/MSBuildProject.pm +# + +use Carp; +use strict; +use warnings; +use base qw(Project); + +sub _new +{ + my $classname = shift; + my $self = $classname->SUPER::_new(@_); + bless($self, $classname); + + $self->{filenameExtension} = '.vcxproj'; + + return $self; +} + +sub WriteHeader +{ + my ($self, $f) = @_; + + print $f < + + +EOF + $self->WriteConfigurationHeader($f, 'Debug'); + $self->WriteConfigurationHeader($f, 'Release'); + print $f < + + $self->{guid} + + +EOF + $self->WriteConfigurationPropertyGroup($f, 'Release',{ wholeopt=>'false' }); + $self->WriteConfigurationPropertyGroup($f, 'Debug',{ wholeopt=>'false' }); + print $f < + + +EOF + $self->WritePropertySheetsPropertyGroup($f, 'Release'); + $self->WritePropertySheetsPropertyGroup($f, 'Debug'); + print $f < + + <_ProjectFileVersion>10.0.30319.1 +EOF + $self->WriteAdditionalProperties($f, 'Debug'); + $self->WriteAdditionalProperties($f, 'Release'); + print $f < +EOF + $self->WriteItemDefinitionGroup( + $f, 'Debug', + { + defs=>'_DEBUG;DEBUG=1;', + opt=>'Disabled', + strpool=>'false', + runtime=>'MultiThreadedDebugDLL' + } + ); + $self->WriteItemDefinitionGroup($f, 'Release', + { defs=>'', opt=>'Full', strpool=>'true', runtime=>'MultiThreadedDLL' }); +} + +sub AddDefine +{ + my ($self, $def) = @_; + + $self->{defines} .= $def . ';'; +} + +sub WriteReferences +{ + my ($self, $f) = @_; + + my @references = @{$self->{references}}; + + if (scalar(@references)) + { + print $f < +EOF + foreach my $ref (@references) + { + print $f < + $ref->{guid} + +EOF + } + print $f < +EOF + } +} + +sub WriteFiles +{ + my ($self, $f) = @_; + print $f < +EOF + my @grammarFiles = (); + my @resourceFiles = (); + my %uniquefiles; + foreach my $fileNameWithPath (sort keys %{ $self->{files} }) + { + confess "Bad format filename '$fileNameWithPath'\n" + unless ($fileNameWithPath =~ /^(.*)\\([^\\]+)\.[r]?[cyl]$/); + my $dir = $1; + my $fileName = $2; + if ($fileNameWithPath =~ /\.y$/ or $fileNameWithPath =~ /\.l$/) + { + push @grammarFiles, $fileNameWithPath; + } + elsif ($fileNameWithPath =~ /\.rc$/) + { + push @resourceFiles, $fileNameWithPath; + } + elsif (defined($uniquefiles{$fileName})) + { + + # File already exists, so fake a new name + my $obj = $dir; + $obj =~ s/\\/_/g; + + print $f < + .\\debug\\$self->{name}\\${obj}_$fileName.obj + .\\release\\$self->{name}\\${obj}_$fileName.obj + +EOF + } + else + { + $uniquefiles{$fileName} = 1; + print $f < +EOF + } + + } + print $f < +EOF + if (scalar(@grammarFiles)) + { + print $f < +EOF + foreach my $grammarFile (@grammarFiles) + { + (my $outputFile = $grammarFile) =~ s/\.(y|l)$/.c/; + if ($grammarFile =~ /\.y$/) + { + $outputFile =~ s{^src\\pl\\plpgsql\\src\\gram.c$}{src\\pl\\plpgsql\\src\\pl_gram.c}; + print $f < + Running bison on $grammarFile + perl "src\\tools\\msvc\\pgbison.pl" "$grammarFile" + %(AdditionalInputs) + $outputFile;%(Outputs) + Running bison on $grammarFile + perl "src\\tools\\msvc\\pgbison.pl" "$grammarFile" + %(AdditionalInputs) + $outputFile;%(Outputs) + +EOF + } + else #if ($grammarFile =~ /\.l$/) + { + print $f < + Running flex on $grammarFile + perl "src\\tools\\msvc\\pgflex.pl" "$grammarFile" + %(AdditionalInputs) + $outputFile;%(Outputs) + Running flex on $grammarFile + perl "src\\tools\\msvc\\pgflex.pl" "$grammarFile" + %(AdditionalInputs) + $outputFile;%(Outputs) + +EOF + } + } + print $f < +EOF + } + if (scalar(@resourceFiles)) + { + print $f < +EOF + foreach my $rcFile (@resourceFiles) + { + print $f < +EOF + } + print $f < +EOF + } +} + +sub WriteConfigurationHeader +{ + my ($self, $f, $cfgname) = @_; + print $f < + $cfgname + $self->{platform} + +EOF +} + +sub WriteConfigurationPropertyGroup +{ + my ($self, $f, $cfgname, $p) = @_; + my $cfgtype = + ($self->{type} eq "exe") + ?'Application' + :($self->{type} eq "dll"?'DynamicLibrary':'StaticLibrary'); + + print $f < + $cfgtype + false + MultiByte + $p->{wholeopt} + +EOF +} + +sub WritePropertySheetsPropertyGroup +{ + my ($self, $f, $cfgname) = @_; + print $f < + + +EOF +} + +sub WriteAdditionalProperties +{ + my ($self, $f, $cfgname) = @_; + print $f <.\\$cfgname\\$self->{name}\\ + .\\$cfgname\\$self->{name}\\ + false +EOF +} + +sub WriteItemDefinitionGroup +{ + my ($self, $f, $cfgname, $p) = @_; + my $cfgtype = + ($self->{type} eq "exe") + ?'Application' + :($self->{type} eq "dll"?'DynamicLibrary':'StaticLibrary'); + my $libs = $self->GetAdditionalLinkerDependencies($cfgname, ';'); + + my $targetmachine = $self->{platform} eq 'Win32' ? 'MachineX86' : 'MachineX64'; + + my $includes = $self->{includes}; + unless ($includes eq '' or $includes =~ /;$/) + { + $includes .= ';'; + } + print $f < + + $p->{opt} + $self->{prefixincludes}src/include;src/include/port/win32;src/include/port/win32_msvc;$includes\%(AdditionalIncludeDirectories) + WIN32;_WINDOWS;__WINDOWS__;__WIN32__;EXEC_BACKEND;WIN32_STACK_RLIMIT=4194304;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE$self->{defines}$p->{defs}\%(PreprocessorDefinitions) + $p->{strpool} + $p->{runtime} + $self->{disablewarnings};\%(DisableSpecificWarnings) + /MP \%(AdditionalOptions) + + + .\\$cfgname\\$self->{name}\\ + .\\$cfgname\\$self->{name}\\ + .\\$cfgname\\$self->{name}\\ + false + Level3 + true + ProgramDatabase + Default + + + .\\$cfgname\\$self->{name}\\$self->{name}.$self->{type} + $libs;\%(AdditionalDependencies) + true + \%(AdditionalLibraryDirectories) + libc;\%(IgnoreSpecificDefaultLibraries) + 4194304 + true + .\\$cfgname\\$self->{name}\\$self->{name}.pdb + false + .\\$cfgname\\$self->{name}\\$self->{name}.map + Console + $targetmachine +EOF + if ($self->{disablelinkerwarnings}) + { + print $f +" /ignore:$self->{disablelinkerwarnings} \%(AdditionalOptions)\n"; + } + if ($self->{implib}) + { + my $l = $self->{implib}; + $l =~ s/__CFGNAME__/$cfgname/g; + print $f " $l\n"; + } + if ($self->{def}) + { + my $d = $self->{def}; + $d =~ s/__CFGNAME__/$cfgname/g; + print $f " $d\n"; + } + print $f < + + src\\include;\%(AdditionalIncludeDirectories) + +EOF + if ($self->{builddef}) + { + print $f < + Generate DEF file + perl src\\tools\\msvc\\gendef.pl $cfgname\\$self->{name} $self->{platform} + +EOF + } + print $f < +EOF +} + +sub Footer +{ + my ($self, $f) = @_; + $self->WriteReferences($f); + + print $f < + + + +EOF +} + +package VC2010Project; + +# +# Package that encapsulates a Visual C++ 2010 project file +# + +use strict; +use warnings; +use base qw(MSBuildProject); + +sub new +{ + my $classname = shift; + my $self = $classname->SUPER::_new(@_); + bless($self, $classname); + + $self->{vcver} = '10.00'; + + return $self; +} + +1; -- cgit v1.2.3