vcproj03.pl to HTML.

index -|- end

Generated: Tue Feb 2 17:55:00 2010 from vcproj03.pl 2008/12/05 24.3 KB.

#!/perl -w
# NAME: vcproj03.pl
# AIM: Parse a VCPROJ file - get_xml_source() is the service in sln2dsw.pl
use strict;
use warnings;
use File::Basename;
require 'logfile.pl' or die "Unable to load logfile.pl ...\n";
require 'relative.pl' or die "Unable to load relative.pl ...\n";
# log file stuff
my ($LF);
my $pgmname = $0;
if ($pgmname =~ /\w{1}:\\.*/) {
   my @tmpsp = split(/\\/,$pgmname);
   $pgmname = $tmpsp[-1];
}
my $outfile = "temp.$pgmname.txt";
open_log($outfile);
prt( "$0 ... Hello, World ...\n" );
my $in_file = 'C:\FG\FGRUN\fgrunplib\fgrun.vcproj';
##my $in_file = 'C:\Projects\pcre\pcre4grep\pcre4grep.vcproj';
#my $in_file = 'C:\FG\19\pthreads\pthread.vcproj';
##my $in_file = 'C:\FG\19\OpenAL\OpenAL-Windows\Alu\ALu.vcproj';
##my $in_file = 'C:\FG\19\OpenAL\OpenAL-Windows\OpenAL32\OpenAL32.vcproj';
# Options
my $killfilt = 1;   # kill the filter name and type on </Filter>
my @dsp_base_defs_rel = qw( WIN32 NDEBUG _WINDOWS _MBCS );
my @dsp_base_defs_dbg = qw( WIN32 _DEBUG _WINDOWS _MBCS );
my @dsp_base_libs_rel = qw( kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib 
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib );
my @dsp_base_libs_dbg = qw( kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib 
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib );
# default items for Application (windows and console)
my $def_runtime_rel = '/MT';
my $def_runtime_dbg = '/MTd';
my $def_defines_dbg = '/D "_CRT_SECURE_NO_WARNINGS"';
my $def_defines_rel = '/D "_CRT_SECURE_NO_WARNINGS"';
my $def_libs_rel = 'comctl32.lib Msimg32.lib Winmm.lib';
my $def_libs_dbg = 'comctl32.lib Msimg32.lib Winmm.lib';
# program variables
my $dsp_runtime_dbg = '';
my $dsp_runtime_rel = '';
my $dsp_defines_dbg = '';
my $dsp_defines_rel = '';
my $dsp_libs_rel = '';
my $dsp_libs_dbg = '';
# debug
my $dbg_src1 = 0;
my $dbg_src10 = 1;
my $dbg_src11 = 0;
my $dbg_src12 = 0;
my $dbg_src13 = 0;
my $dbg_src12a = 0;
my $dbg_src14 = 1;
my $dbg_src15 = 1;
my $dbg_src16 = 0;
my $dbg_src2 = 0;
my $dbg_src3 = 0;
my $dbg_src4 = 0;
my $dbg_src5 = 0;
my $dbg_src6 = 0;
my $dbg_src7 = 0;
my $dbg_src8 = 1;
my $dbg_src9 = 0;
my $dbg_srcc = 0;
my $dbg_srcv = 0;
my $dbg11 = 0;
my $act_vcproj = '';
my @warnings = ();
# maybe _WINDOWS => 'Application'
# ie # TARGTYPE "Win32 (x86) Application" 0x0101 in a DSP file
# but then Alu.vcproj only has -
# PreprocessorDefinitions="NDEBUG;WIN32;AL_BUILD_LIBRARY"
my %v8_defines = ( '_CONSOLE' => 'Console Application',
 '_USRDLL' => 'Dynamic-Link Library',
 '_LIB' => 'Static Library' );
my $typelse = 'Application';
my @special_typing = qw( libpng zlib visualc6 );   # make these STATIC LIBRARIES
my $TYP_OPEN = 1;
my $TYP_CLOSE = 2;
my $TYP_OPENCLOSE = 3;
my $TYP_VERSION = 4;
my $v8_cfgexp = '<Configuration\\s+.*Name=\\"(\\S+)\\"\\s';
my $v8_toolexp = '<Tool\\s+.?\\s*Name=\\"(\\S+)\\"\\s';
my $v8_prepexp = '\\s+PreprocessorDefinitions=\\"(\\S+)\\"';
my %v8_apptyp = ();   # application TYPE, per project name
my %v8_depend = ();   # linker addtional dependencies, by configuration
my %v8_link = ();   # compiler definitions, by configuration
##                  relnm full  group      filter          project
##   push(@v8_srcs, [$src, $ff, $filtname, $filttype, 0, 0, $projname] );
my @v8_srcs = ();   # source found in VCPROJ file
###set_all_debugs();
$act_vcproj = $in_file;
get_xml_sources( $in_file );
close_log($outfile,1);
exit(0);
#################################################
#################################################
##### VCPROJ XML PARSING #####
#################################################
sub get_xml_tag {
   my ($lin) = shift;
   my $len = length($lin);
   my $tag = '';
   my $pch = '';
   for (my $t = 0; $t < $len; $t++) {
      my $ch = substr($lin,$t,1);
      if ($ch eq '<') {
         prtw( "WARNING: Second TAG in line! ($lin)\n" ) if (length($tag));
         $tag = '';
         $t++;
         for ( ; $t < $len; $t++) {
            $ch = substr($lin,$t,1);
            if ($ch =~ /\s/) {
               # end of tag
               $t++;
               for ( ; $t < $len; $t++) {
                  $ch = substr($lin,$t,1);
                  if ($ch eq '>') {
                     $tag .= $pch if ($pch eq '/');
                     prtw( "WARNING: Premature CLOSE! ($lin)(1)\n" ) if (($t +1) < $len);
                     last;   # end of TAG
                  }
                  $pch = $ch;   # keep last
               }
               last;
            } elsif ($ch eq '>') {
               prtw( "WARNING: Premature CLOSE! ($lin)(2)\n" ) if (($t +1) < $len);
               last;
            }
            $tag .= $ch;
         }
      }
   }
   return $tag;
}
sub tag_typ_2_stg {
   my ($typ) = shift;
   if ($typ == $TYP_OPEN) {
      return "OPEN";
   } elsif ($typ == $TYP_CLOSE) {
      return "CLOSE";
   } elsif ($typ == $TYP_OPENCLOSE) {
      return "OPENCLOSE";
   } elsif ($typ == $TYP_VERSION) {
      return "VERSION";
   }
   return "UNKNOWN";
}
sub get_tag_typ {
   my ($xt) = shift;
   my $typ = $TYP_OPEN;
   if ($xt =~ /^\//) {
      $typ = $TYP_CLOSE;
   } elsif ($xt =~ /\/$/) {
      $typ = $TYP_OPENCLOSE;
   } elsif ($xt eq '?xml') {
      $typ = $TYP_VERSION;
   }
   ###prt( "For [$xt] returning [$typ] ...\n" );
   return $typ;
}
# get application type
# one of Console Application, Application, static library, dynamic library
sub get_app_type {
   my ($defs) = shift;
   my ($def, $key);
   my @arr = split(';',$defs);
   foreach $def (@arr) {
      foreach $key (keys %v8_defines) {
         if ($def eq $key) {
            return $v8_defines{$key};
         }
      }
   }
   # ok, nothing found - TRY HARDER
   foreach $def (@arr) {
      if ($def =~ /BUILD_LIBRARY/) {
         return $v8_defines{'_LIB'};
      } elsif ($def =~ /STATIC/) {
         return $v8_defines{'_LIB'};
      }
   }
   # UGH - still NOT FOUND - provide overrides for
   foreach $def (@special_typing) {
      if ($act_vcproj =~ /$def/) {
         return $v8_defines{'_LIB'};
      }
   }
   prtw( "Warning: String [$defs] does not give clue to TYPE!!!\n$act_vcproj - return def $typelse ??? CHECK ME\n" );
   return $typelse;
}
# split_space - space_split - like split(/\s/,$txt), but honour double inverted commas
sub space_split {
   my ($txt) = shift;
   my $len = length($txt);
   my ($k, $ch, $tag, $incomm);
   my @arr = ();
   $tag = '';
   $incomm = 0;
   for ($k = 0; $k < $len; $k++) {
      $ch = substr($txt,$k,1);
      if ($incomm) {
         $incomm = 0 if ($ch eq '"');
         $tag .= $ch;
      } elsif ($ch =~ /\s/) {
         push(@arr, $tag) if (length($tag));
         $tag = '';
      } else {
         $tag .= $ch;
         $incomm = 1 if ($ch eq '"');
      }
   }
   push(@arr, $tag) if (length($tag));
   if ($dbg_src13) {
      prt( "space_split (".scalar @arr.") of [$txt]\n" );
      foreach $tag (@arr) {
         prt( " $tag\n" );
      }
   }
   return @arr;
}
sub array_2_hash_on_equals {
   my (@inarr) = @_;
   my %hash = ();
   my ($itm, @arr, $key, $val, $al, $a);
   foreach $itm (@inarr) {
      @arr = split('=',$itm);
      $al = scalar @arr;
      $key = $arr[0];
      $val = '';
      for ($a = 1; $a < $al; $a++) {
         $val .= '=' if length($val);
         $val .= $arr[$a];
      }
      if (defined $hash{$key}) {
         prt( "WARNING: Duplicate KEY: $key ...\n" );
         $hash{$key} .= "@".$val;
      } else {
         $hash{$key} = $val;
      }
   }
   return %hash;
}
# @arr = split_conf( $dsp_defines_dbg );
sub split_conf {
   my ($cc) = shift;
   my $ln = length($cc);
   my @ar = ();
   my $itm = '';
   for (my $p = 0; $p < $ln; $p++) {
      my $ch = substr($cc,$p,1);
      if ($ch eq '"') {
         $p++;
         $itm = '';
         for (; $p < $ln; $p++) {
            $ch = substr($cc,$p,1);
            if ($ch eq '"') {
               last;
            }
            $itm .= $ch;
         }
         push(@ar,$itm) if length($itm);
      }
   }
   return @ar;
}
sub is_in_skip_conf_rel {
   my ($itm) = shift;
   foreach my $tst (@dsp_base_defs_rel) {
      if ($itm eq $tst) {
         return 1;
      }
   }
   return 0;
}
sub is_in_skip_conf_dbg {
   my ($itm) = shift;
   foreach my $tst (@dsp_base_defs_dbg) {
      if ($itm eq $tst) {
         return 1;
      }
   }
   return 0;
}
sub is_in_skip_lib_rel {
   my ($itm) = shift;
   foreach my $tst (@dsp_base_libs_rel) {
      if ($itm =~ /$tst/i) {
         return 1;
      }
   }
   return 0;
}
sub is_in_skip_lib_dbg {
   my ($itm) = shift;
   foreach my $tst (@dsp_base_libs_dbg) {
      if ($itm =~ /$tst/i) {
         return 1;
      }
   }
   return 0;
}
sub set_runtime_dbg { $dsp_runtime_dbg = shift; }
sub set_runtime_rel { $dsp_runtime_rel = shift; }
# get_xml_source
# process the XML project file (*.vcproj) and
# extract the SOURCE file list,
# but do lots MORE than that ...
sub get_xml_sources {
   my ($in) = shift;
   ##my $in_fd = file_dirname($in);
   my ($name,$in_fd,$suffix) = fileparse($in);
   my ($src, $ff, $pline);
   my $stf = '<File\\s+RelativePath=\\"([\\.\\\\\\w-]+)+\\"+(.)+';
   #my $filt = '^<Filter\\s+Name=\\"([\\w\\s]+)\\"\\s+Filter=\\"([\\w;]+)\\"';
   my @lines = ();
   my $line = '';
   my $filtname = '';
   my $filttype = '';
   my $conf = '';
   my $tname = '';
   my $version = '';
   my $projname = '';
   my $srccount = 0;
   my @xmltags = ();
   my $xmltag = '';
   my $tagtyp = 0;
   my $lnnum = 0;
   my $bgn = 0;
   my $end = 0;
   my $ll = 0;
   my $ch = '';
   my $bgnend = '';
   my $inconfigs = 0;
   my $ppdefs = '';
   my $apptype = '';
   my $adddeps = '';
   my @attribs = ();
   my %atthash = ();
   my $ctype = 0;
   my $def = '';
   my ($func, $itm, $ffnr);
   prt( "Loading [$in] file in directory [$in_fd] ...\n" );
   open FH, "<$in" or mydie( "ERROR: Can not open [$in] ... aborting ...\n" );
   @lines = <FH>; # slurp the whole file
   close( FH );
   my $fline = '';
   prt( "Processing ".scalar @lines." lines in $in ...\n" );
   my $hadver = 0;
   foreach $line (@lines) {
      $lnnum++;
      $line = trim_all($line);
      $ll = length($line);
      if ($ll) {
         if (length($fline)) {
            $fline .= ' '.$line;
         } else {
            $ch = substr($line,0,1);
            $fline .= $line;
            if ($ch eq '<') {
               $bgn = $lnnum;
            }
         }
      } else {
         next;
      }
      if ($fline =~ />/) {
         $bgnend = "$bgn-$lnnum";
         $bgn = -1;
         $xmltag = get_xml_tag($fline);
         $tagtyp = get_tag_typ($xmltag);
         prt( "$bgnend: $xmltag ".tag_typ_2_stg($tagtyp). " ($tagtyp)\n" ) if ($dbg_src9);
         if ($fline =~ /<VisualStudioProject\s+/) {
            if ($fline =~ /.+Version="(\d+\.{1}\d+)+".+/ ) {
               $version = $1;
            }
            if ($fline =~ /.+Name="(\w+)".+/) {
               $projname = $1;
            }
            ##prt( "$fline\n" );
            prt( "Project=$projname, v=$version\n" ) if ($dbg_src11);
         } elsif ($fline =~ /$stf/) {
            # <File RelativePath="src\FDM\SP\ACMS.cxx" >
            $src = $1;
            $ff = $in_fd . $src;
            $ffnr = fix_rel_path($ff);
            $itm = "MISSING";
            if (-f $ffnr) {
               $itm = "ok";
               prt( "SRC: [$ffnr] $itm\n" ) if ($dbg_src16);
            } else {
               $itm .= " [$src][$ff] CHECKME!";
               prt( "SRC: [$ffnr] $itm\n" );   # always SHOW MISSING if ($dbg_src16);
            }
            if (is_c_source($src)) {
               prt("SOURCE=[$src]\n") if ($dbg_src1);
               #push(@csrc_array, [$src, $ff, $filtname, $filttype, 0] );
            } elsif (is_h_source($src)) {
               prt("HEADER=[$src]\n") if ($dbg_src2);
               #push(@hsrc_array, [$src, $ff, $filtname, $filttype, 0] );
            } elsif (is_h_special($src)) {
               prt("HEADER=[$src]\n") if ($dbg_src2);
               #push(@hsrc_array, [$src, $ff, $filtname, $filttype, 0] );
            } else {
               prt("OTHER=[$src]\n") if ($dbg_src3);
               #push(@osrc_array, [$src, $ff, $filtname, $filttype, 0] );
            }
            $srccount++;
            #                0    1      2          3          4  5  6
            push(@v8_srcs, [$src, $ffnr, $filtname, $filttype, 0, 0, $projname] );
            prt( "$srccount v8_srcs: $src, $ffnr, $filtname, $filttype, 0, 0, $projname);\n" ) if ($dbg11);
         } elsif ($fline =~ /<Filter\s+(.*)/) {
            # <Filter Name="Source Files" Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
            $filtname = ''; # = NO FILTER NAME, like Source Files
            $filttype = ''; # = NOR FILTER TYPE, like cpp;c;cxx;rc;def;r;odl;idl;hpj;bat
            if ($fline =~ /\s+Name=\"([\w\s]+)\"[\s>]+/) {
               $filtname = $1; # = Source Files
            }
            if ($fline =~ /\s+Filter=\"([\w;,]+)\"[\s>]+/) {
               $filttype = $1; # = cpp;c;cxx;rc;def;r;odl;idl;hpj;bat
            }
            prt("FILTNAME=[$filtname] [$filttype]\n") if ($dbg_src4);
         } elsif ($fline =~ /$v8_cfgexp/ ) {
            ##if ($fline =~ /<Configuration\s+.*Name=\"(\S+)\"\s/ ) {
            $conf = $1;
            prt( "Got configuration $conf\n" ) if ($dbg_src6);
         } elsif ($fline =~ /<Tool\s+(.*)$/ ) {
            #} elsif ($fline =~ /$v8_toolexp/ ) {
            $pline = $1;
            #prt( "Got Tool $pline\n" ) if ($dbg_src7);
            if ($pline =~ /\s*Name=\"*(\w+)\"*/) {
               $tname = $1;
               prt( "Got Tool name $tname ($pline)\n" ) if ($dbg_src7);
               if ($tname eq 'VCCLCompilerTool') {
                  # <Tool
                  # Name="VCCLCompilerTool"
                  # Optimization="0"
                  # AdditionalIncludeDirectories="../lib,../lib/curl_transport,...
                  # PreprocessorDefinitions="_DEBUG;WIN32;_LIB;ABYSS_WIN32;CURL_STATICLIB" 
                  # MinimalRebuild="true" 
                  # BasicRuntimeChecks="3" 
                  # RuntimeLibrary="1" 
                  # PrecompiledHeaderFile=".\Debug\xmlrpccpp/xmlrpccpp.pch" 
                  # AssemblerListingLocation=".\Debug\xmlrpccpp/" 
                  # ObjectFile=".\Debug\xmlrpccpp/" 
                  # ProgramDataBaseFileName=".\Debug\xmlrpccpp/" 
                  # WarningLevel="3" 
                  # SuppressStartupBanner="true" 
                  # DebugInformationFormat="4" />]
                  $ctype = 0;
                  $def = '<UNKNOWN>';
                  if ($conf =~ /^Debug\|/) {
                     $ctype = 1;
                     $def = $dsp_runtime_dbg;
                     $func = \&set_runtime_dbg;
                  } elsif ($conf =~ /^Release\|/) {
                     $ctype = 2;
                     $def = $dsp_runtime_rel;
                     $func = \&set_runtime_rel;
                  }
                  prt( "Is compiler tool ...[$fline] ... $conf ($ctype)\n" ) if ($dbg_src14);
                  @attribs = space_split($fline);
                  %atthash = array_2_hash_on_equals(@attribs);
                  if ($dbg_src15) {
                     prt( "\nShowing ALL \%atthash keys and values ... [$conf]($ctype)\n" );
                     foreach $ppdefs (keys %atthash) {
                        prt( "dbg_src15: [$ppdefs] = [$atthash{$ppdefs}] ...\n" );
                        if ($ppdefs =~ /RuntimeLibrary/i) {
                           prt( "RUNTIME [$ppdefs] = [$atthash{$ppdefs}] ...\n" );
                        }
                     }
                  }
                  if ( defined $atthash{'PreprocessorDefinitions'} ) {
                     $ppdefs = strip_quotes(trim_all($atthash{'PreprocessorDefinitions'}));
                     if ($inconfigs) {
                        $apptype = get_app_type($ppdefs);
                        prt( "Setting DEFS: $conf [$ppdefs] $apptype ($ctype)\n" ) if ($dbg_src8);
                        $v8_link{$conf} = $ppdefs;
                        if (defined $v8_apptyp{$projname}) {
                           if ($v8_apptyp{$projname} ne $apptype) {
                              prtw( "WARNING: ALREADY HAVE $projname with ".$v8_apptyp{$projname}." which is NOT $apptype!!!\n" );
                           }
                        } else {
                           $v8_apptyp{$projname} = $apptype;
                        }
                     } elsif (length($ppdefs)) {
                        prt( "Got DEFS: $conf [$1] OUTSIDE Configurations!\n" ) if ($dbg_src10);
                     }
                  }
                  if ( defined $atthash{'RuntimeLibrary'} ) {
                     $ppdefs = strip_quotes(trim_all($atthash{'RuntimeLibrary'}));
                     $itm = get_runtime_stg($ppdefs);
                     if (($ctype == 1)||($ctype == 2)) {
                        if ($itm eq $def) {
                           prt( "Got RUNTIME value [$ppdefs] ... config=$conf ($ctype) $itm (= $def)\n" );
                        } else {
                           $func->($itm);
                           prt( "Set RUNTIME value [$ppdefs] ... config=$conf ($ctype) $itm (was $def)\n" );
                        }
                     } else {
                        prt( "CHECKME:  RUNTIME value [$ppdefs] ... config=$conf ($ctype) $itm ($def)\n" );
                     }
                  }
                  prt( "Done atthash for $conf ...\n" )  if ($dbg_src15);
               } elsif ($tname eq 'VCLinkerTool') {
                  # <Tool
                  # Name="VCLinkerTool"
                  # AdditionalDependencies="comctl32.lib Msimg32.lib Winmm.lib"
                  # LinkIncremental="1"
                  # GenerateDebugInformation="true"
                  # SubSystem="2"
                  # OptimizeReferences="2"
                  # EnableCOMDATFolding="2"
                  # TargetMachine="1"
                  # />
                  prt( "Is linker tool ...[$fline]\n" ) if ($dbg_src7);
                  @attribs = space_split($fline);
                  %atthash = array_2_hash_on_equals(@attribs);
                  if ($dbg_src12a) {   # DEBUG ONLY
                     prt( "Split of attribs [$fline] ...\n" );
                     foreach $adddeps (@attribs) {
                        prt( " $adddeps\n" );
                     }
                     prt( "Show of HASH ...\n" );
                     foreach $adddeps (keys %atthash) {
                        prt( " $adddeps = ".$atthash{$adddeps}."\n" );
                     }
                  }
                  if (defined $atthash{'AdditionalDependencies'} ) {
                     $adddeps = strip_quotes(trim_all($atthash{'AdditionalDependencies'}));
                     prt( "Setting ADDS: $conf [$adddeps]\n" ) if ($dbg_src12);
                     $v8_depend{$conf} = $adddeps;
                  }
               }
            } else {
               prtw( "WARNING: FAILED Name [$fline]\n" );
            }
         } elsif ($fline =~ /<\/Filter>/) {
            if ($killfilt) {
               $filtname = ''; # = NO FILTER NAME, like Source Files
               $filttype = ''; # = NOR FILTER TYPE, like cpp;c;cxx;rc;def;r;odl;idl;hpj;bat
            }
         } elsif ($fline =~ /<Platforms/) {
            # 8-8: LINE=[<Platforms>]
         } elsif ($fline =~ /<Platform/) {
            # 9-11: LINE=[<Platform Name="Win32" />]
         } elsif ($fline =~ /<ToolFiles/) {
            # 13-13: LINE=[<ToolFiles>]
         } elsif ($fline =~ /<Configurations/) {
            # 15-15: LINE=[<Configurations>]
            $inconfigs = 1;
            prt( "Enter Configurations ... ($fline)\n" ) if ($dbg_src10);
         } elsif ($fline =~ /<References/) {
            # 167-167: LINE=[<References>]
         } elsif ($fline =~ /<Files/) {
            # 169-169: LINE=[<Files>]
         } elsif ($fline =~ /<FileConfiguration/) {
            # 177-179: LINE=[<FileConfiguration Name="Debug|Win32" >]
         } elsif ($fline =~ /<Globals/) {
            # 591-591: LINE=[<Globals>]
         } else {
            if ($tagtyp == $TYP_VERSION) {
               prt("$bgnend: LINE=[$fline]\n") if ($dbg_srcv);
            } elsif ($tagtyp == $TYP_CLOSE) {
               prt("$bgnend: LINE=[$fline]\n") if ($dbg_srcc);
            } else {
               prt("$bgnend: LINE=[$fline]\n") if ($dbg_src5);
            }
         }
         if ($tagtyp == $TYP_OPEN) {
            push(@xmltags,$xmltag);
         } elsif ($tagtyp == $TYP_CLOSE) {
            if (@xmltags) {
               my $tmptag = pop @xmltags;
               $xmltag = substr($xmltag,1);
               if ($tmptag ne $xmltag) {
                  prtw( "WARNING: Closing TAG [$xmltag] not last [$tmptag]! $bgnend\n" );
               }
               if ($xmltag eq 'Configurations') {
                  $inconfigs = 0;
                  prt( "Exit Configurations ... ($fline)\n" ) if ($dbg_src10);
               }
            } else {
               prtw( "WARNING: CLOSE TAG NOT OPEN! [$fline]\n" );
            }
         }
         $fline = '';
      }
   }
   ###prt( "Project: $projname, as $apptype\n" ); # eg 'Project: gshhs, as Console Application'
   my (@att2, @disc, @arr);
   foreach $conf (keys %v8_depend) {
      $ctype = 0;
      if ($conf =~ /^Debug\|/) {
         $ctype = 1;
         $func = \&is_in_skip_lib_dbg;
      } elsif ($conf =~ /^Release\|/) {
         $ctype = 2;
         $func = \&is_in_skip_lib_rel;
      } else {
         $func = \&is_in_skip_lib_rel;
      }
      $ppdefs = $v8_depend{$conf};
      @attribs = split(/ /,$ppdefs);
      @att2 = ();
      @disc = ();
      foreach $itm (@attribs) {
         if ( ! $func->($itm) ) {
            push(@att2,$itm);
         } else {
            push(@disc,$itm);
         }
      }
      prt( "\nLINK:Config: $conf=$ppdefs ... ".scalar @attribs." items\n" );
      prt( "Reduced to ".scalar @att2." items ...Discarding [ @disc ], as already there...\n" );
      if ($ctype == 1) {   # ($conf =~ /^Debug\|/)
         $def = $dsp_libs_dbg;
         @arr = split(/ /,$dsp_libs_dbg);
         @disc = ();
         prt( "Debug VERSION ... $conf ... [ @arr ]\n" );
         foreach $itm (@att2) {
            if (is_in_array( $itm, @arr )) {
               push(@disc,$itm);
            } else {
               $dsp_libs_dbg .= ' '.$itm;
            }
         }
         prt( "Changed $def (\$dsp_libs_dbg) ...\n");
         prt( "To      $dsp_libs_dbg, discarding [ @disc ], as already there ...\n" );
      } elsif ($ctype == 2) {   # $conf =~ /^Release\|/)
         $def = $dsp_libs_rel;
         @arr = split(/ /, $dsp_libs_rel );
         prt( "Release VERSION ... $conf ... @arr\n" );
         foreach $itm (@att2) {
            if (is_in_array( $itm, @arr )) {
               push(@disc,$itm);
            } else {
               $dsp_libs_rel .= ' '.$itm;
            }
         }
         prt( "Changed $def (\$dsp_libs_rel) ...\n" );
         prt( "To      $dsp_libs_rel, discarding [ @disc ], as already there ...\n" );
      } else {
         prt( "CHECKME: VERSION NOT DEBUG OR RELEASE??? ... $conf ...\n" );
      }
   }
   foreach $conf (keys %v8_link) {
      $ctype = 0;
      if ($conf =~ /^Debug\|/) {
         $ctype = 1;
         $func = \&is_in_skip_conf_dbg;
      } elsif ($conf =~ /^Release\|/) {
         $ctype = 2;
         $func = \&is_in_skip_conf_rel;
      } else {
         $func = \&is_in_skip_conf_rel;
      }
      $ppdefs = $v8_link{$conf};
      @attribs = split(/;/,$ppdefs);
      @att2 = ();
      @disc = ();
      foreach $itm (@attribs) {
         if ( ! $func->($itm) ) {
            push(@att2,$itm);
         } else {
            push(@disc,$itm);
         }
      }
      @arr = ();
      prt( "\nDEFS:Config: $conf=$ppdefs ... ".scalar @attribs." items\n" );
      prt( "Reduced to ".scalar @att2." items ...Discarding [ @disc ], as already there...\n" );
      if ($ctype == 1) {   # ($conf =~ /^Debug\|/)
         $def = $dsp_defines_dbg;
         @arr = split_conf( $dsp_defines_dbg );
         @disc = ();
         prt( "Debug VERSION ... $conf ... @arr\n" );
         foreach $itm (@att2) {
            if (is_in_array( $itm, @arr )) {
               push(@disc,$itm);
            } else {
               $dsp_defines_dbg .= ' /D "'.$itm.'"';
            }
         }
         prt( "Changed $def (\$dsp_defines_dbg) ...\n" );
         prt( "To      $dsp_defines_dbg, discarding [ @disc ], as already there ...\n" );
      } elsif ($ctype == 2) {   # $conf =~ /^Release\|/)
         $def = $dsp_defines_rel;
         @arr = split_conf( $dsp_defines_rel );
         prt( "Release VERSION ... $conf ... @arr\n" );
         foreach $itm (@att2) {
            if (is_in_array( $itm, @arr )) {
               push(@disc,$itm);
            } else {
               $dsp_defines_rel .= ' /D "'.$itm.'"';
            }
         }
         prt( "Changed $def (\$dsp_defines_rel) ...\n");
         prt( "To      $dsp_defines_rel, discarding [ @disc ], as already there ...\n" );
      } else {
         prt( "\nCHECKME: VERSION NOT DEBUG NOR RELEASE??? ... $conf ...\n\n" );
      }
   }
   my $new_srcs = scalar @v8_srcs;
   prt( "Project: $projname, as $apptype\n" ); # eg 'Project: gshhs, as Console Application'
   prt( "Got new $new_srcs C/C++ files, header files, and others \n" );
}
######################################################################
### other services
sub strip_quotes {
   my ($ln) = shift;
   if ($ln =~ /^".*"$/) {
      $ln = substr($ln,1,length($ln)-2);
   }
   return $ln;
}
sub prtw {
   my ($wmsg) = shift;
   prt($wmsg);
   push(@warnings,$wmsg);
}
sub show_warnings {
   if (@warnings) {
      prt( "WARNING: Got ".scalar @warnings." warnings messages ...\n" );
      foreach my $wm (@warnings) {
         prt($wm);
      }
   } else {
      prt( "No warning or error messages ...\n" );
   }
}
sub get_runtime_stg {
   my ($rtn) = shift;
   if ($rtn == 0) {
      return "/MT";
   } elsif ($rtn == 1) {
      return "/MTd";
   } elsif ($rtn == 2) {
      return "/MD";
   } elsif ($rtn == 3) {
      return "/MDd";
   }
   return "/MT";
}
sub fix_rel_path {
   my ($path) = shift;
   $path = path_u2d($path);   # ENSURE DOS PATH SEPARATOR (in relative.pl)
   my @a = split(/\\/, $path);
   my $npath = '';
   my $max = scalar @a;
   my @na = ();
   for (my $i = 0; $i < $max; $i++) {
      my $p = $a[$i];
      if ($p eq '.') {
         # ignore this
      } elsif ($p eq '..') {
         if (@na) {
            pop @na;   # discard previous
         } else {
            prtw( "WARNING: Got relative .. without previous!!! path=$path\n" );
         }
      } else {
         push(@na,$p);
      }
   }
   foreach my $pt (@na) {
      $npath .= "\\" if length($npath);
      $npath .= $pt;
   }
   return $npath;
}
### utitlity subs
sub is_c_source {
   my $f = shift;
   if ( ($f =~ /\.c$/i) || ($f =~ /\.cpp$/i) || ($f =~ /\.cxx$/i) ) {
      return 1;
   }
   ##if (!is_h_source($f)) {
   ##   prt( "Item [$f] IS NOT C/C++ SOURCE!\n" );
   ##}
   return 0;
}
sub is_h_special {
   my $f = shift;
   if (($f =~ /osg/i)||($f =~ /OpenThreads/i)||($f =~ /Producer/i)) {
      return 1;
   }
   return 0;
}
sub is_h_source {
   my $f = shift;
   if ( ($f =~ /\.h$/i) || ($f =~ /\.hpp$/i) || ($f =~ /\.hxx$/i) ) {
      return 1;
   }
   ##if (!is_c_source($f)) {
   ##   prt( "Item [$f] IS NOT C/C++ SOURCE!\n" );
   ##}
   return 0;
}
###########################
sub is_in_array {
   my ($itm, @arr) = @_;
   my $max = scalar @arr;
   for (my $k = 0; $k < $max; $k++) {
      if ($arr[$k] eq $itm) {
         return 1;
      }
   }
   return 0;
}
sub is_in_array_nc {
   my ($itm, @arr) = @_;
   foreach my $val (@arr) {
      if ($val =~ /$itm/i) {
         return 1;
      }
   }
   return 0;
}
##################
sub set_all_debugs {
   $dbg_src1 = 1;
   $dbg_src10 = 1;
   $dbg_src11 = 1;
   $dbg_src12 = 1;
   $dbg_src13 = 1;
   $dbg_src12a = 1;
   $dbg_src14 = 1;
   $dbg_src15 = 1;
   $dbg_src16 = 1;
   $dbg_src2 = 1;
   $dbg_src3 = 1;
   $dbg_src4 = 1;
   $dbg_src5 = 1;
   $dbg_src6 = 1;
   $dbg_src7 = 1;
   $dbg_src8 = 1;
   $dbg_src9 = 1;
   $dbg_srcc = 1;
   $dbg_srcv = 1;
   $dbg11 = 1;
}
# eof - vcporj03.pl

index -|- top

checked by tidy  Valid HTML 4.01 Transitional