summaryrefslogtreecommitdiff
path: root/icu/createmak.pl
diff options
context:
space:
mode:
Diffstat (limited to 'icu/createmak.pl')
-rw-r--r--icu/createmak.pl1097
1 files changed, 0 insertions, 1097 deletions
diff --git a/icu/createmak.pl b/icu/createmak.pl
deleted file mode 100644
index 3786ec1d1069..000000000000
--- a/icu/createmak.pl
+++ /dev/null
@@ -1,1097 +0,0 @@
-:
-eval 'exec perl -wS $0 ${1+"$@"}'
- if 0;
-#*************************************************************************
-#
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# Copyright 2000, 2010 Oracle and/or its affiliates.
-#
-# OpenOffice.org - a multi-platform office productivity suite
-#
-# This file is part of OpenOffice.org.
-#
-# OpenOffice.org is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License version 3
-# only, as published by the Free Software Foundation.
-#
-# OpenOffice.org is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Lesser General Public License version 3 for more details
-# (a copy is included in the LICENSE file that accompanied this code).
-#
-# You should have received a copy of the GNU Lesser General Public License
-# version 3 along with OpenOffice.org. If not, see
-# <http://www.openoffice.org/license.html>
-# for a copy of the LGPLv3 License.
-#
-#*************************************************************************
-#
-use XML::Parser;
-# ------------------------------------------------------------------------
-# Other global stuff
-$is_debug=0;
-my $path = $ENV{'INPATH'} . "/";
-my $quot = '"';
-my %template_hash=();
-my %vcproj_hash=();
-# ------------------------------------------------------------------------
-# Global stuff for parsing the *.vcproj files (XML::Parser)
-#
-my $ConfigurationGlobal = 1; # Release = 1, Debug=0
-my $Configuration = undef;
-my %configelements = ();
-my %files = ();
-my %files2copy = ();
-my %files_special = ();
-my $Release = 1;
- # Release = 1, Debug = 0, undef = 2
-my $file_tmp = ""; # temporary storage for file name
-my $CustomSection = 0;
-# ------------------------------------------------------------------------
-# ------------------------------------------------------------------------
-# e.g. %object_hash with Key = blabla.cpp
-# contains a Hash:
-# Header: "..\\common\\unicode\\utypes.h ..\\common\\unicode\\uset.h"
-# CFlags: Common (set in templates file) or special sequence
-# CDefs: Common (set in templates file) or special sequence
-# ------------------------------------------------------------------------
-my $configfile = shift;
-my $sourcePath = shift;
-if ( !$configfile ) {
- $configfile = "createmak.cfg";
-}
-if ( !$sourcePath ) {
- $inpath = $ENV{"INPATH"};
- $sourcePath = $inpath . "\\misc\\build\\icu\\source";
-}
-$dir = "";
-$header = "";
-$sep = "\\\\";
-
-%project_by_id =();
-%project_by_name = ();
-%project_dependencies = ();
-my @builddeps = prepare_allinone_all_mak(\%project_by_id,\%project_by_name,\%project_dependencies,$sourcePath);
-
-fillTemplateHash($configfile);
-
-create_allinone_all_mak(\@builddeps,\%project_by_id,$sourcePath);
-my @dirs = ();
-foreach $projectname(keys %project_by_name)
-{
- my $dir = $project_by_name{$projectname}[1];
- $dir =~ /\.\.\\(.+)\\(.+)\.vcproj/;
- my $dir1 = $1;
- my $dir2 = $2;
- if ( $dir1 !~ /$dir2$/ ) {
- $dir1 .= "\.$dir2";
- }
- print "$dir1 - $dir2\n" if ($is_debug);
- push @dirs, $dir1;
-}
-
-# set nonpro switch (linking against debug runtime if nonpro=1)
-my $nonpro = ($ENV{"PROEXT"} ne ".pro");
-print "Non Product Build" if ($nonpro);
-
-foreach $dir(@dirs)
-{
- next if ($dir eq "data.makedata"); # very special don't overwrite this file
- # ------------------------------------------------------------------------
- # Reset global stuff for parsing the *.vcproj files (XML::Parser)
- #
- $Configuration = $ConfigurationGlobal; # Release = 1, Debug=0
- %configelements = ();
- %files = ();
- # contains all relevant *.c,*.cpp,*.h,*.rc files
- %files2copy = ();
- %files_special = ();
- $Release = 2;
- # Release = 1, Debug = 0, undef = 2
- $file_tmp = ""; # temporary storage for file name
- $CustomSection = 0;
- # ------------------------------------------------------------------------
-
- my $extra_mak = "";
- ($dir, $extra_mak) = handle_extra_mak_files($dir); # handle e.g. tools/genrb.derb entires
-
- my @mak=(); # Array for make file *.mak
- my %deps=();
- my %object_hash=();
- my %collected_header=();
- my %collect_header_target_hash=();
- my %collect_object_target_hash=();
- my $vcproj_file = "";
- my $resource_file = "";
-
- # $dir : common,i18n,...
- chomp $dir;
- next if ( $dir eq "" );
- my $fullpath = $sourcePath . "\\" . $dir;
- if ( $extra_mak eq "" ) {
- if ($dir =~ /(.+)+\\(.+)$/)
- {
- $vcproj_file = $fullpath ."\\$2.vcproj";
- } else
- {
- $vcproj_file = $fullpath ."\\$dir.vcproj";
- }
- } else
- {
- $vcproj_file = $fullpath . "\\" . $extra_mak . ".vcproj";
- }
-
-
- # Parse the *.vcproj file
- my $parser = new XML::Parser(ErrorContext => 2);
- $parser->setHandlers(Start => \&start_handler,
- Char => \&char_handler);
- $parser->parsefile($vcproj_file);
- if ( $file_tmp ) {
- # save a file which hasn't been saved yet
- $files{ $file_tmp } = 1; # save it now
- $file_tmp = ""; # has been saved now reset it
- }
-
- # is there a resource file?
- foreach $i (keys %files)
- {
- if ($i =~ /\.rc/)
- {
- $resource_file = $i;
- }
- }
- # Fill hash %deps for dependencies for all files in directory ($testdir)
- # %files contains all relevant files from *.vcproj
-
- getAllFilesDeps($fullpath,\%deps,\%files);
- my $includedir = $configelements{"Release"}{"OutputDirectory"}; # e.g. OutputDirectory = ..\..\lib
- $includedir =~ s/lib/include/;
- foreach $file( sort keys %deps)
- {
- $file =~ /(.+)\.(.+)/;
- my $name = $1;
- my $ext = $2;
- next if (!defined $name);
- $object = "\$(INTDIR)\\" . "$name.obj";
- $collect_object_target_hash{$object}=1;
-
- createMakDepSection($dir,$name,$ext,$deps{$file},\@mak,\%files_special);
- }
- my %all_target_hash=();
- foreach $header(sort keys %files2copy)
- {
- my $dir;
- my $file;
- #$pathdepth = "..\\..";
- $file = $header;
- $header =~ s/^\.\\//;
- $inputpath = $file;
- $target = $includedir . "\\" . $header;
- $target =~ /.+\\(.+)\\.+$/;
- $targetpath = $configelements{"Release"}{"CommandLine"};
- chomp $targetpath;
- # set %all_target_hash and @mak
- createCopySection($file,$inputpath,$target,$targetpath,\@mak,\%all_target_hash);
- $collect_header_target_hash{$target}=1;
- }
- my $test = $configelements{"Release"}{"OutputFile"};
- $all_target_hash{$test}=1;
-
- # set name of the *.mak file
- my $mak_file="";
- if ( $extra_mak eq "" ) {
- $mak_file = $vcproj_file;
- $mak_file =~ s/vcproj/mak/;
- } else
- {
- # extra_mak eg. derb, stringperf
- $mak_file = $fullpath . "\\$extra_mak" . "\.mak";
- }
-
- # generate the content of the *.mak file
- # in @mak array
- print "extra_mak=$extra_mak\n" if ($is_debug);
- print "mak_file=$mak_file\n" if ($is_debug);
- open(MAKFILE, ">$mak_file") || die "Can't open $mak_file\n";
- print_all_target($fullpath, \%all_target_hash);
-
- # $extra_mak handles further *.mak files in a directory
- print_flags($dir,$extra_mak,'CFlags',$nonpro); # depends on directory
- print_simple_flag("Rules");
- print_simple_flag("Link");
- print_common_linkflags();
-# print_flags($fullpath,$extra_mak,'LinkFlags'); # depends on directory
-# print_lib32_objs($fullpath,$extra_mak,\%collect_object_target_hash,$resource_file);
- print_flags($dir,$extra_mak,'LinkFlags'); # depends on directory
- print_lib32_objs($dir,$extra_mak,\%collect_object_target_hash,$resource_file);
-
- # write @mak array into the *.mak file
- foreach $line(@mak)
- {
- print MAKFILE $line;
- }
- $|=1;
- print "."; # user entertainment
- $|=0;
-}
-print "\ndone\n";
-exit;
-
-############################################################################
-sub getKey #01.04.2008 09:46
-############################################################################
- {
- my $line = shift;
- $line =~ /\[(.+)\]/;
- return $1;
-} ##getKey
-
-############################################################################
-sub fillTemplateHash #01.04.2008 10:48
-############################################################################
- {
- my $file = shift;
- open (TEMPLATE, "< $file") || die "Can't open template file $file\n";
- my $key = "";
- while ( $line=<TEMPLATE> ) {
- if ( $line =~ /\[.+\]/ ) {
- print $line if ($is_debug);
- if ( $key ne "" ) {
- $template_hash{$key}=[@cmdlines];
- @cmdlines="";
- $key="";
- }
- $key = getKey( $line );
- } else
- {
- push @cmdlines, $line;
- }
- } # while
-} ##fillTemplateHash
-
-############################################################################
-sub createCopySection #01.04.2008 11:37
-############################################################################
- {
- my $header = shift;
- my $inputpath = shift;
- my $target = shift;
- my $targetpath = shift;
- my $ref_make_file = shift; # Array written later to make file *.mak
- my $ref_all_target_hash = shift; # reference to fill all_target_hash;
- if ( $target !~ /\\include/ && $target !~ /\\bin/) {
- return; # $target contains nonsense
- }
- if ( !$targetpath ) {
- # $targetpath is empty! (Due to missing entry in *.vcproj file)
- # Generate $targetpath here from $target
- my $t = $target;
- $t =~ /(.+)\\(.+)$/;
- $targetpath = "copy \"\$(InputPath)\" " . $1;
- chomp $targetpath;
- }
- $targetpath =~ s/\r$//; # remove x0A from EOL if the is one
- my @template = @{$template_hash{"Copy"}};
- my $line = "";
- foreach $line(@template)
- {
- $line =~ s/<HEADER>/$header/g;
- $line =~ s/<INPUTPATH>/$inputpath/g;
- $line =~ s/<TARGET>/$target/g;
- $line =~ s/<TARGETPATH>/$targetpath/;
- push @{$ref_make_file}, $line; # from template
- $$ref_all_target_hash{$target} = 1; # "\"$target\" ";
- # save for target ALL:
- }
-} ##createCopySection
-
-############################################################################
-sub createMakDepSection #01.04.2008 13:36
-############################################################################
- {
- # creates the dependency section in the make file
- my $dir = shift;
- my $source = shift;
- my $extension = shift;
- my $ref_header_list = shift;
- my $ref_make_file = shift; # Array written later to make file *.mak
- my $ref_special_file = shift; # hash for special files (compiler flags, include paths)
- my $header_list = "";
- my $special_flag = 0;
-
- return if ( !defined $source );
- foreach $header(@{$ref_header_list})
- {
- if ( ($header =~ /^\.\.\\.+/) && (-e $header )) {
- $header_list = $header_list . " " . $header; # this header is located in an other directory
- } else
- {
- $header_list = $header_list . " .\\" . $header;
- }
- }
-
- #special handling
- # compile this file with other compiler switches
- my $file = $source . "\." . $extension;
- $dir =~ s/\\/_/;
- my @template = @{$template_hash{"CFlags_$dir"}};
- if ( defined $$ref_special_file{"AdditionalIncludeDirectories"}{$file} ) {
- $special_flag = 1;
- my $includepath = $$ref_special_file{"AdditionalIncludeDirectories"}{$file};
- $includepath =~ s/\;/\/I /g; # subst ; with /I for multiple paths
- $line = "CPP_SWITCH_INCLUDE=/I $includepath\n";
- push @{$ref_make_file}, $line;
- foreach $line(@template)
- {
- if ( $line =~ /CPP_PROJ/)
- {
- $line =~ s/CPP_PROJ=/CPPX_PROJ=/;
- $line =~ s/\$\(CDEFS\)/\$\(CDEFS\) \$\(CPP_SWITCH_INCLUDE\)/; # include $(CPP_SWITCH_INCLUDE)
- push @{$ref_make_file}, $line;
- }
- }
- }
- if ( $$ref_special_file{"DisableLanguageExtensions"}{$file} )
- {
- # FALSE = /Ze
- $special_flag = 1;
- foreach $line(@template)
- {
- if ( $line =~ /CPP_PROJ/)
- {
- $line =~ s/CPP_PROJ=/CPPX_PROJ=/;
- $line =~ s/-Za/-Ze/;
- push @{$ref_make_file}, $line;
- }
- }
- }
-
- @template = @{$template_hash{"Deps"}};
- my $line = "";
- foreach $line(@template)
- {
- $line =~ s/<SOURCEFILE>/$source/g;
- $line =~ s/<EXT>/$extension/g;
- $line =~ s/<HEADER_LIST>/$header_list/g;
- push @{$ref_make_file}, $line;
- }
-
- if ( $special_flag )
- {
- pop @{$ref_make_file}; # remove empty line
- push @{$ref_make_file},"\t\$(CPP) @<<\n";
- push @{$ref_make_file},"\t\$(CPPX_PROJ) \$(SOURCE)\n";
- push @{$ref_make_file},"<<\n\n";
- $special_flag = 0;
- }
-
-} ##createMakDepSection
-
-
-############################################################################
-sub getFilenameFromPath #10.04.2008 13:03
-############################################################################
-{
- my $path = shift;
- $path =~ /.+\\(.+)$/;
- return $1;
-} ##getFilenameFromPath
-
-############################################################################
-sub getAllFilesDeps #08.04.2008 09:39
-############################################################################
-{
- my $path = shift;
- my $ref_deps = shift;
- my $ref_allfiles = shift; # contains all relevant files from *.vcproj
- my %local_header_hash=(); # contains all local header
-
- my @all_files = keys %{$ref_allfiles};
-
- # collect lokal header names in %header_hash
- foreach $file(@all_files)
- {
- if ( $file =~ /.+\.h/ ) {
- chomp $file;
- $local_header_hash{$file} = 1;
- }
- }
-
- foreach $file(@all_files)
- {
- my @header_deps=();
- my $skip = 0;
-
- $file =~ s/^\.\\//; # remove leading .\
-
- # exclude sub directories and several file extensions
- # *.dep,*.h,*.in,*.mak,*.pl,*.txt,*.vcproj.*.rc and origs of patch files (*.*~) and
- # .cvsignore (files beginning with .)
- next if ( (-d "$path$sep$file") || ($file =~ /.+(_|\~|dep|h|in|mak|pl|txt|vcproj|rc)$/) || ($file =~ /^\.+./));
- parse_header_deps($path,$file,\@header_deps,\%local_header_hash);
- handle_dep_to_other_directory($path,$file,\@header_deps,$$ref_vcproj{$file}) if ($$ref_vcproj{$file});
- $$ref_deps{$file}=[@header_deps];
- }
-} ##getAllFilesDeps
-
- ############################################################################
- sub parse_header_deps #14.06.2006 18:04
- ############################################################################
- {
- # get includes from c/cpp file
- # call create_deps(path,file,\$link_obj)
- #
- my $path = shift;
- my $cfile = shift;
- my $ref_header_deps = shift;
- my $ref_local_header_hash = shift;
-
- my $fullpath = $path . $sep . $cfile;
- my $unicodedep="";
- open(IN, "<$fullpath") || die "can't open $fullpath\n";
- while ( $line = <IN> ) {
- next if ($line !~ /^.?\#include.+/); # handle include lines only
- if ($line =~ /.+?\s(.+)/)
- {
- $header = $1;
- if ( ($header !~ /^<.+/) && ($header !~ /.+\.c.+$/) ) {
- # no <stdio> etc. header
- $header =~ s/\s+\/\*.+\*\///; # delete <blanks>/* ... */
- $header =~ s/\s+\/\/.+//; # delete <blanks>//......
- $header =~ s/\//\\/; # subst. / with \
- $header =~ s/^\"/\".\\/;
- $header =~ s/\"//g;
- $header =~ s/\.\\//;
- my $test = $$ref_local_header_hash{$header};
- my $header_fullpath = $path . "\\" . $header;
- if ( $test || (($header =~ /\\/) && (-e $header_fullpath))) {
- push @{$ref_header_deps}, $header;
- }
- }
- }
- }
- } ##parse_header_deps
-
-############################################################################
-sub handle_dep_to_other_directory #16.04.2008 15:11
-############################################################################
-{
- # there has been an additional include directoy detected
- # now try to find out which header (parsed from c/cpp-file)
- # comes from this directory by checking: does it exist there?
- my $path = shift;
- my $file = shift;
- my $ref_header_deps = shift;
- my $path_additional = shift;
- my $search_path = $path . "\\" . $path_additional;
- my $counter = 0;
- foreach $header(@{$ref_header_deps})
- {
- my $full_path = $search_path . "\\" . $header;
- if ( -e "$full_path" )
- {
- $$ref_header_deps[$counter] = $path_additional . "\\" . $header;
- }
- $counter++
- }
-} ##handle_dep_to_other_directory
-
-############################################################################
-sub print_lib32_objs #18.04.2008 12:54
-############################################################################
- {
- # generate Link section
- my $path = shift;
- my $extra_mak = shift;
- my $ref_objecthash = shift;
- my $resource_file = shift;
- # output link objects
- print MAKFILE "LINK32_OBJS= \\\n";
- # print objects
- foreach $object(sort keys %{$ref_objecthash})
- {
- print MAKFILE "\t$object \\\n";
- }
-
- # print *.res if *.rc exists
- if ( $resource_file ne "" ) {
- my $res_file = $resource_file;
- $res_file =~ s/\.rc/\.res/;
- $res_file =~ /(.+)\\(.+)$/;
- $res_file = $2;
- print MAKFILE "\t\$(INTDIR)\\$res_file \\\n";
- }
-
- # add import libs and res files
- print_flags($path,$extra_mak,"AdditionalLinkObjects");
- my $outfile = $configelements{"Release"}{"OutputFile"};
-
- # section for linking
- print_link_template($path,$outfile);
-
- # section for creating res files
- # setting for rsc, res target etc.
- print "resource_file=$resource_file\n" if ($is_debug);
- print_rsc_template($resource_file) if ($resource_file);
- print_simple_flag("Special_extra_uconv") if ($outfile =~ /uconv/);
-} ##print_lib32_objs
-
-############################################################################
-sub print_all_target #26.06.2008 13:27
-############################################################################
- {
- my $path = shift;
- my $ref_all_target_hash = shift;
- my $filename = getFilenameFromPath($path);
- my $outdir = $configelements{"Release"}{"OutputDirectory"};
- print MAKFILE "NULL=\n";
- print MAKFILE "OUTDIR=$outdir\n";
- print MAKFILE "OutDir=$outdir\n";
- print MAKFILE "INTDIR=.\\Release\n\n";
- print MAKFILE "ALL: ";
- foreach $target(sort keys %{$ref_all_target_hash})
- {
- if ( $target =~ /\.exe/ ) {
- my $out = $target;
- $out =~ s/.\\Release/\.\.\\\.\.\\\.\.\\bin/;
- $out =~ s/\$\(OutDir\)/\.\.\\\.\.\\\.\.\\bin/;
- $out =~ s/\//\\/; # convert / to \
- $target = $out;
- }
- print MAKFILE "\"$target\" ";
- }
-
- # Append [Target_<dir>] item e.g. ../../icuxy36.dll
- my $targetkey = "Target_" . $filename;
- my @target = ();
- if ( exists $template_hash{$targetkey} ) {
- @target = @{$template_hash{$targetkey}};
- }
- my $additional_target="";
- foreach $additional_target(@target)
- {
- print MAKFILE $additional_target if ($additional_target ne "");
- }
- print MAKFILE "\n\n";
- print MAKFILE "\"\$(OUTDIR)\" : \n";
- print MAKFILE "\tif not exist \"\$(OUTDIR)/\$(NULL)\" mkdir \"\$(OUTDIR)\"\n\n";
- print MAKFILE "!IF \"\$(OUTDIR)\" != \"\$(INTDIR)\"\n";
- print MAKFILE "\"\$(INTDIR)\" : \n";
- print MAKFILE "\tif not exist \"\$(INTDIR)/\$(NULL)\" mkdir \"\$(INTDIR)\"\n";
- print MAKFILE "!ENDIF\n";
- print MAKFILE "\n\n";
-} ##print_all_target
-
-############################################################################
-sub print_simple_flag #18.04.2008 13:39
-############################################################################
-{
- my $simple_flag = shift;
- my @template = @{$template_hash{$simple_flag}};
- foreach $line(@template)
- {
- print MAKFILE $line;
- }
-} ##print_rules
-
-############################################################################
-sub print_link_template #18.04.2008 13:39
-############################################################################
-{
- my $dir = shift;
- my $outfile = shift;
- my $manifest;
- # set resource id for manifest file
- if ( $outfile =~ /\.exe/ ) {
- $manifest = 1;
- } else
- {
- $manifest = 2;
- }
- my @template = ();
- if ($dir =~ /stubdata/ ) {
- @template = @{$template_hash{"Special_stubdata"}};
- } else
- {
- @template = @{$template_hash{"LinkTemplate"}};
- }
-
- print MAKFILE "\n"; # insert blank line
- foreach $line(@template)
- {
- $line =~ s/<OUTFILE>/$outfile/;
- $line =~ s/<MANIFEST>/$manifest/;
- print MAKFILE $line;
- }
-
- # insert special stuff for
- # extras/uconv/uconv.mak
- if ( $dir =~ /uconv/ ) {
- print_flags($dir,"","Special");
- }
-
- # for *.exe files an additional
- # copy section is required to get
- # the stuff into the global bin directory
- my %dummy = ();
- my @mak = ();
- if( $manifest ==1 )
- {
- # source,inputpath,target,action
- my $out = $outfile;
- $out =~ s/.\\.*Release/\.\.\\\.\.\\\.\.\\bin/;
- $out =~ s/\$\(OutDir\)/\.\.\\\.\.\\\.\.\\bin/;
- $out =~ s/\//\\/; # subst / with \
- $outfile =~ s/\//\\/; # subst / with \
- createCopySection($outfile,$outfile,$out,"copy \"\$(InputPath)\" .\\..\\..\\..\\bin",\@mak,\%dummy);
- foreach $line(@mak)
- {
- print MAKFILE $line;
- }
- }
-} ##print_rules
-
-############################################################################
-sub print_rsc_template #04.11.2008 14:48
-############################################################################
- {
- # print resource compiler setting + resource target
- my $resourcefile = shift;
- # skip this if no res file required
-
- return if (!$resourcefile);
- $resfile = $resourcefile;
- #remove file extension (.res)
- $resfile =~ /(.+)\\(.+)\.(.+)/;
- $resfile = $2;
-
- my @template = @{$template_hash{"RSC_Template"}};
- print MAKFILE "\n"; # insert blank line
- foreach $line(@template)
- {
- $line =~ s/<FILE>/$resourcefile/;
- $line =~ s/<FILEOUT>/$resfile/;
- print MAKFILE $line;
- }
-} ##print_rsc_template
-
-############################################################################
-sub print_flags #18.04.2008 14:19
-############################################################################
-{
- # CFlags, LinkFlags
- my $dir = shift;
- my $extra_mak = shift; # eg. derb.mak, stringperf.mak
- my $flag = shift;
- my $nonpro = shift;
- my @template = ();
- my $switch = "";
- $dir =~ s/\\/_/g if ($dir); # change \ to _
- $switch = "$flag" . "_" . "$dir" if ($dir);
- handle_CFlags() if ($flag eq "CFlags"); # get and print Preprocessor defines
- $switch .= "\." . $extra_mak if ( $extra_mak ne "" ) ;
- if ( exists $template_hash{$switch} ) {
- @template = @{$template_hash{$switch}};
- foreach $line(@template)
- {
- print MAKFILE $line;
- }
- }
-} ##print_flags
-
-############################################################################
-sub handle_CFlags #28.01.2009 11:20
-############################################################################
- {
-
- my $ppdefs = $configelements{"Release"}{"PreprocessorDefinitions"};
- my $ppinc = $configelements{"Release"}{"AdditionalIncludeDirectories"};
- my @template = @{$template_hash{"General_CFlags"}};
- $ppdefs =~ s/;/ -D/g; # subst ; with -D switch
- $ppdefs = "-D" . $ppdefs;
- $ppinc =~ s/(;|,)/ -I/g; # subst ; with -I switch
- $ppinc = "-I" . $ppinc;
- print "ppdefs=$ppdefs\n" if ($is_debug);
- print "ppinc =$ppinc\n" if ($is_debug);
- foreach $line(@template)
- {
- $line =~ s/<AddIncDirs>/$ppinc/;
- $line =~ s/<PreProcDefs>/$ppdefs/;
- print MAKFILE $line;
- }
-} ##handle_CFlags
-
-############################################################################
-sub print_common_linkflags #21.11.2008 11:47
-############################################################################
- {
- my @template = @{$template_hash{"CommonLinkFlags"}};
- my $outfile = $configelements{"Release"}{"OutputFile"};
- my $pdbfile = $configelements{"Release"}{"ProgramDatabaseFile"};
- $pdbfile =~ s/\//\\/; # subst / with \
- $outfile =~ s/\//\\/; # subst / with \
- print "PATH=$path OUTFILE=$outfile\n" if ($is_debug);
- foreach $line(@template)
- {
- $line =~ s/<OUTFILE>/$outfile/;
- $line =~ s/<PDBFILE>/$pdbfile/;
- print MAKFILE $line;
- }
-} ##print_common_linkflags
-
-############################################################################
-sub handle_extra_mak_files #25.08.2008 14:32
-############################################################################
-{
- # extract extra filename for *.mak file
- # e.g input: tools\genrb.derb
- # output: derb
- my $direntry = shift;
- my $out = "";
- my $dir = "";
- if ( $direntry =~ /(.+)\.(.+)$/ ) {
- $dir = $1;
- $out = $2;
- } else
- {
- $dir = $direntry;
- }
- return ($dir,$out);
-} ##handle_extra_mak_files
-
-############################################################################
-sub prepare_allinone_all_mak
-############################################################################
-{
- # Read in allinone.sln
- # Fills hashes and returns an array with build order
- # uses topographical sorting
-
- my $href_project_by_id = shift;
- my $href_project_by_name = shift;
- my $href_project_dependencies = shift;
- my $sourcePath = shift;
-
- my $allslnfile = $sourcePath . "\\allinone\\allinone.sln";
- my @projectdeps;
- my $projectname;
- my $projectpath;
- my $projectid;
-
- # fill hash tables
- open (SLN, "< $allslnfile") || die "Can't open $allslnfile\n";
- while ($line = <SLN>)
- {
- my @project = ();
- if ( $line =~ /^Project\(/ ) {
- @project = split( /,/, $line);
- if ( $#project ) {
- $projectname = "";
- $projectpath = "";
- $projectid = "";
- @projectdeps = ();
- my @subarray = ();
- @subarray = split( /=/, $project[0]);
- $projectname = $subarray[1];
- $projectname =~ s/\"//g; # remove "
- $projectpath = $project[1];
- $projectid = $project[2];
- $projectid =~ s/\"//g; # remove "
- $projectid =~ s/.+\{//g; # remove til {
- $projectid =~ s/\}\n//g; # remove }<CR>
- my @pnp = ($projectname,$projectpath);
- my @pip = ($projectid,$projectpath);
- $$href_project_by_id{$projectid}=[@pnp];
- $$href_project_by_name{$projectname} =[@pip];
- }
- } # $line =~ /^Project\(/
- if ( $line =~ /ProjectSection\(/ ) {
- $psect = 1;
- next;
- }
- if ( $line =~ /EndProjectSection/ ) {
- $psect = 0;
- $$href_project_dependencies{$projectid}=[@projectdeps];
- next;
- }
- if ( $psect ) {
- my @tarray = split(/=/, $line);
- $depends_on_id = $tarray[0];
- $depends_on_id =~ s/.+\{//g;
- $depends_on_id =~ s/\}.+//g;
- print "+$depends_on_id-\n" if ($is_debug);
-
- push @projectdeps, $depends_on_id;
- }
- }
- ########################################
- # sort here and generate build order
- ########################################
- $objektzahl=0;
- %hashindex=();
-
- foreach $projectid(keys %{$href_project_by_id})
- {
- if ( $$href_project_dependencies{$projectid} )
- {
- @deps = @{$$href_project_dependencies{$projectid}};
- } else
- {
- @deps = ();
- }
- for $counter(0..$#deps)
- {
- $v = find_or_create_element($deps[$counter]);
- $n = find_or_create_element($projectid);
- push @{$nachfolgerliste[$v]},$n;
- }
- }
-
- for $n (0..$objektzahl-1)
- {
- $vorgaengerzahl[$n]=0;
- }
- for $v (0..$objektzahl-1)
- {
- for $n (@{$nachfolgerliste[$v]})
- {
- ++$vorgaengerzahl[$n];
- }
- }
-
- @hilfsliste=();
- for $n (0..$objektzahl-1)
- {
- push(@hilfsliste,$n) if ($vorgaengerzahl[$n]==0)
- }
-
- $ausgabe=0;
- @builddep =();
- while (defined($v=pop(@hilfsliste)))
- {
- push @builddep, $name[$v]; # save build order by project_id;
- ++$ausgabe;
- for $n (@{$nachfolgerliste[$v]})
- {
- --$vorgaengerzahl[$n];
- push(@hilfsliste,$n) if ($vorgaengerzahl[$n]==0);
- }
- } # while
- die "Cyclic dependencies found! Stopping now.\n" if $ausgabe<$objektzahl;
- ##############################################################
- # End of sorting stuff
- ##############################################################
-
- return @builddep;
- ###############################################################
- ###########################
- # sub for sorting only
- ###########################
- sub find_or_create_element
- {
- my ($str)=@_;
- my ($idx)=$hashindex{$str};
- if (!defined($idx)) { # new element ...
- $idx=$objektzahl++;
- $hashindex{$str}=$idx;
- $name[$idx]=$str;
- @{$nachfolgerliste[$idx]}=();
- }
- return $idx;
- } # find_or_create_element
-} # prepare_allinone_all_mak
-
-############################################################################
-sub create_allinone_all_mak #09.02.2009 09:22
-############################################################################
-{
- my $ref_buildorder = shift;
- my $href_project_by_id = shift;
- my $sourcePath = shift;
- my $allmakfile = $sourcePath . "\\allinone\\all.mak";
- open (ALLMAK, ">$allmakfile") || die "Can't write to $allmakfile \n";
- print ALLMAK "ALL: ";
- foreach $proj(@{$ref_buildorder})
- {
- print ALLMAK $$href_project_by_id{$proj}[0];
- }
- print ALLMAK "\n\n";
-
- foreach $proj( @{$ref_buildorder} )
- {
- print "$proj $$href_project_by_id{$proj}[0] $$href_project_by_id{$proj}[1]\n";
- my $prjdir = $$href_project_by_id{$proj}[1];
- $prjdir =~ /(.+)\\(.+)$/;
- $prjdir = $1;
- $prjname = $2;
- $prjdir =~ s/^.+\"//;
- $prjname =~ s/\"$//;
- $prjname =~ s/vcproj/mak/;
- $allinonehelpstring = $prjdir;
- $allinonehelpstring =~ s/^\.+\\//; # remove ..\
- my $backcount = "";
- while ($allinonehelpstring=~ /.+\\/g) # counts the occuring \
- {
- $backcount .= "..\\";
- }
- $allinonedir = $backcount . "..\\allinone";
-
- # write all.mak
- $$href_project_by_id{$proj}[0] =~ s/^\s+//;
- if ( $$href_project_by_id{$proj}[0] ne "makedata" )
- {
- my @template = @{$template_hash{"AllInOnePrj"}};
- foreach $line(@template)
- {
- $line =~ s/<PRJ>/$$href_project_by_id{$proj}[0]/;
- $line =~ s/<PRJDIR>/$prjdir/;
- $line =~ s/<PRJMAK>/$prjname/;
- $line =~ s/<ALLINONEDIR>/$allinonedir/;
- print ALLMAK $line;
- }
- } else
- {
- #special code snippet
- print ALLMAK "makedata : \n";
- print ALLMAK " cd \"..\\data\"\n";
- print ALLMAK " nmake /f makedata.mak icumake=\$(MAKEDIR)\\..\\data cfg=Release\n";
- print ALLMAK " cd \"..\\allinone\"\n\n";
- }
- }
- close ALLMAK;
-} ##create_allinone_all_mak
-
-############################################################################
-
-# ------------------------------------------------------------------------
-# XML parser handling
-# ------------------------------------------------------------------------
-
-############################################################################
-sub start_handler
-############################################################################
-{
- my $p = shift; # pointer to parser
- my $el = shift; # element
-
- # Deal with attributes
-
- my $CompilerSection = 0;
- my $LinkerSection = 0;
- my $ConfigSection = ($el eq "Configuration");
-
- while (@_)
- {
- # shift if ( $el eq "FileConfiguration" );
- my $att = shift;
- my $val = shift;
- $CustomSection = 0;
- if ($special_file && defined $att & $att ne "Name")
- {
- print "$special_file - $att - $val\n";
- my @param = ($att,$val);
- $files_special{ $special_file } = [@param]; # files with special compiler switch
- @test = @{$files_special{ $special_file }};
- print "test=@test\n";
- $special_file="";
- }
- if ( $ConfigSection && $att eq "Name" && $val eq "Release|Win32" ) {
- $Release = 1;
- $config = "Release"; # Release
- }
- if ( $ConfigSection && $att eq "Name" && $val eq "Debug|Win32" ) {
- $Release = 0; # Debug
- $config = "Debug";
- }
- if ( $att eq "Name" && $val eq "VCCLCompilerTool" ) {
- $CompilerSection = 1;
- }
- if ( $att eq "Name" && $val eq "VCLinkerTool" ) {
- $LinkerSection = 1;
- }
- if ( $att eq "Name" && $val eq "VCCustomBuildTool" ) {
- $CustomSection = 1;
- }
-
- # For Configuration Infos like compiler defines etc.
- if ( $att eq "PreprocessorDefinitions" && $CompilerSection ) {
- $configelements{$config}{$att} = $val;
- }
- if ( $att eq "AdditionalIncludeDirectories" && $CompilerSection ) {
- #$configelements{$config}{$att} = $val;
- if ( ($file_tmp ne "") && ($val ne "") ) {
- $files{ $file_tmp } = 1; # save it now
- $file_tmp =~ s/^\.\\//; # remove leading .\
- $files_special{"AdditionalIncludeDirectories"}{$file_tmp} = $val;
- print "Include $val: $file_tmp\n" if ($is_debug);
- $file_tmp = ""; # has been saved now reset it
- } else
- {
- $configelements{$config}{$att} = $val;
- }
- }
- if ( ($att eq "DisableLanguageExtensions") && $CompilerSection ) {
- #$configelements{$config}{$att} = $val;
- if ( ($file_tmp ne "") && ($val ne "")) {
- $files{ $file_tmp } = 1; # save it now
- $file_tmp =~ s/^\.\\//; # remove leading .\
- $files_special{"DisableLanguageExtensions"}{$file_tmp} = $val;
- print "-Ze: $file_tmp\n" if ($is_debug);
- $file_tmp = ""; # has been saved now reset it
- }
- }
- if ( $att eq "OutputDirectory" ) {
- $configelements{$config}{$att} = $val;
- }
- if ( $att eq "OutputFile" && $LinkerSection ) {
- $configelements{$config}{$att} = $val;
- }
- if ( $att eq "ProgramDatabaseFile" ) {
- $configelements{$config}{$att} = $val;
- }
- if ( $att eq "ImportLibrary" && $LinkerSection ) {
- $configelements{$config}{$att} = $val;
- }
- if ($att eq "CommandLine") {
- $configelements{$config}{$att} = $val;
- }
- if (($att eq "PreprocessorDefinitions") && $ConfigSection) {
- $configelements{$config}{$att} = $val;
- }
-
- # Is the file in the step before a header
- # which has to be copied into the global
- # include path?
- if ( $file_tmp ne "" )
- {
- $config = "Release";
- if ( ($att eq "CommandLine") && ($el eq "Tool") )
- {
- if ( $file_tmp =~ /.+\.h$/ ) {
- $files2copy{ $file_tmp } = $val; # unicode + layout header to copy
- $file_tmp = ""; # has been saved now reset it
- }
- }
- } # if $file_tmp
-
- # For files
- if ( $att eq "RelativePath" ) {
- if ( $file_tmp ) {
- # no special file (include dir / compiler switch)
- $files{ $file_tmp } = 1; # save it now
- $file_tmp = ""; # has been saved now reset it
- }
- # store temporary the file name
- $file_tmp = $val if ($val !~ /\.mk$/); # no *.mk files
- }
- } # while @_
-} # End start_handler
-
-############################################################################
-sub char_handler
-############################################################################
-{
-} # End char_handler