summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Schlemmer <azarah@gentoo.org>2002-09-16 22:24:36 +0000
committerMartin Schlemmer <azarah@gentoo.org>2002-09-16 22:24:36 +0000
commitbd9f5867a9e141796c403adceefa5b567f2bb7b6 (patch)
treeaf13b90e4a85e722088ec249e3408a33cb1464c8 /app-office
parentfixor (diff)
downloadgentoo-2-bd9f5867a9e141796c403adceefa5b567f2bb7b6.tar.gz
gentoo-2-bd9f5867a9e141796c403adceefa5b567f2bb7b6.tar.bz2
gentoo-2-bd9f5867a9e141796c403adceefa5b567f2bb7b6.zip
fixor
Diffstat (limited to 'app-office')
-rw-r--r--app-office/openoffice/files/1.0.1/openoffice-1.0.1-parallel-build.patch908
1 files changed, 908 insertions, 0 deletions
diff --git a/app-office/openoffice/files/1.0.1/openoffice-1.0.1-parallel-build.patch b/app-office/openoffice/files/1.0.1/openoffice-1.0.1-parallel-build.patch
new file mode 100644
index 000000000000..febeb479afc0
--- /dev/null
+++ b/app-office/openoffice/files/1.0.1/openoffice-1.0.1-parallel-build.patch
@@ -0,0 +1,908 @@
+Index: oo_cvs/solenv/bin/build.pl
+===================================================================
+RCS file: /cvs/oo/tools/solenv/bin/build.pl,v
+retrieving revision 1.41
+retrieving revision 1.61
+diff -u -3 -p -u -r1.41 -r1.61
+--- oo_cvs/solenv/bin/build.pl 2002/01/10 17:18:59 1.41
++++ oo_cvs/solenv/bin/build.pl 2002/07/05 12:54:19 1.61
+@@ -1,13 +1,13 @@
+ :
+-eval 'exec perl -wS $0 ${1+"$@"}'
++eval 'exec perl -S $0 ${1+"$@"}'
+ if 0;
+ #*************************************************************************
+ #
+ # $RCSfile: build.pl,v $
+ #
+-# $Revision: 1.41 $
++# $Revision: 1.61 $
+ #
+-# last change: $Author: vg $ $Date: 2002/01/10 17:18:59 $
++# last change: $Author: vg $ $Date: 2002/07/05 12:54:19 $
+ #
+ # The Contents of this file are made available subject to the terms of
+ # either of the following licenses
+@@ -67,61 +67,115 @@ eval 'exec perl -wS $0 ${1+"$@"}'
+ # build - build entire project
+ #
+
++use Config;
++use POSIX;
+ use Cwd;
+
+ #### script id #####
+
+ ( $script_name = $0 ) =~ s/^.*\b(\w+)\.pl$/$1/;
+
+-$id_str = ' $Revision: 1.41 $ ';
++$id_str = ' $Revision: 1.61 $ ';
+ $id_str =~ /Revision:\s+(\S+)\s+\$/
+ ? ($script_rev = $1) : ($script_rev = "-");
+
+ print "$script_name -- version: $script_rev\n";
+
++if ($ENV{GUI} eq 'UNX') {
++ use Cwd 'chdir';
++};
++
+ #########################
+ # #
+ # Globale Variablen #
+ # #
+ #########################
+ $QuantityToBuild = 0;
++# delete $pid when not needed
++%projects_deps_hash = (); # hash of undependent projects,
++ # that could be built now
++%broken_build = (); # hash of hashes of the modules,
++ # where build was broken (error occurred)
++%folders_hashes = ();
++%running_children = ();
++$dependencies_hash = 0;
++$handler_set = 0;
++$cmd_file = '';
+ $BuildAllParents = 0;
+ $show = 0;
+ $deliver = 0;
+ %LocalDepsHash = ();
+-%DepsArchive = ();
+ %BuildQueue = ();
+ %PathHash = ();
+ %PlatformHash = ();
+-%DeadDependencies = ();
+ %AliveDependencies = ();
+ %ParentDepsHash = (); # hash of dependencies of the current project
+ @UnresolvedParents = ();
+ @dmake_args = ();
+ %DeadParents = ();
+ $CurrentPrj = '';
++$no_projects = 0;
++$only_dependent = 0;
+ $StandDir = &get_stand_dir();
+ $build_from = '';
+ $build_from_opt = '';
+ $build_since = '';
++$dlv_switch = '';
++$child = 0;
++%processes_hash = ();
++%module_annonced = ();
++
+ &get_options;
++
++$deliver_commando = $ENV{DELIVER};
++$deliver_commando .= ' '. $dlv_switch if ($dlv_switch);
+ $ENV{mk_tmp}++;
+ %prj_platform = ();
+-
++$check_error_string = '';
++$dmake = '';
++$echo = '';
++$new_line = "\n";
+ #### main ####
+
+-$dmake = &GetDmakeCommando();
++&get_commands();
++unlink ($cmd_file);
++if ($cmd_file) {
++ if (open (CMD_FILE, ">>$cmd_file")) {
++ select CMD_FILE;
++ $echo = 'echo ';
++ $new_line = $echo."\"\"\n";
++ print "\@$echo off\npushd\n" if ($ENV{GUI} ne 'UNX');
++ } else {
++ &print_error ("Cannot open file $cmd_file");
++ };
++} elsif ($show) {
++ select STDERR;
++};
++
++print $new_line;
++
+ &BuildAll();
+ @TotenEltern = keys %DeadParents;
+ if ($#TotenEltern != -1) {
+ my ($DeadPrj);
+- print "\nWARNING! Project(s):\n\n";
++ print $new_line.$new_line;
++ print $echo."WARNING! Project(s):\n";
+ foreach $DeadPrj (@TotenEltern) {
+- print "$DeadPrj\n";
++ print $echo."$DeadPrj\n";
+ };
+- print "\nnot found and couldn't be built. Correct build.lsts.\n";
++ print $new_line;
++ print $echo."not found and couldn't be built. Correct build.lsts.\n";
++ print $new_line;
++};
++if (($ENV{GUI} ne 'UNX') && $cmd_file) {
++ print "popd\n";
+ };
+ $ENV{mk_tmp} = '';
++if ($cmd_file) {
++ close CMD_FILE;
++ print STDOUT "Script $cmd_file generated\n";
++};
++exit(0);
+
+ #########################
+ # #
+@@ -171,6 +225,10 @@ sub BuildAll {
+ if ($build_from) {
+ &remove_extra_prjs(\%ParentDepsHash);
+ };
++ if ($QuantityToBuild) {
++ &build_multiprocessing;
++ return;
++ };
+ while ($Prj = &PickPrjToBuild(\%ParentDepsHash)) {
+ if ($build_from_opt) {
+ if ($build_from_opt ne $Prj) {
+@@ -189,56 +247,62 @@ sub BuildAll {
+ };
+ next;
+ };
+- print "\n=============\n";
+- print "Building project $Prj\n";
+- print "=============\n";
++ print $new_line;
++ print $echo. "=============\n";
++ print $echo. "Building project $Prj\n";
++ print $echo. "=============\n";
+ $PrjDir = &CorrectPath($StandDir.$Prj);
+- if ($ENV{GUI} eq "UNX") {
+- use Cwd 'chdir';
++ &get_deps_hash($PrjDir, \%LocalDepsHash);
++ &BuildDependent(\%LocalDepsHash);
++ if ($cmd_file) {
++ print "$deliver_commando\n";
++ } else {
++ system ("$deliver_commando") if (!$show && ($Prj ne $CurrentPrj));
+ };
+- chdir $PrjDir;
+- cwd();
+- &BuildPrj($PrjDir) if (!$deliver);
+- system ("$ENV{DELIVER}") if (!$show);
++ print $check_error_string;
+ &RemoveFromDependencies($Prj, \%ParentDepsHash);
++ $no_projects = 0;
+ };
+ } else {
+- &BuildPrj('.');
++ &get_deps_hash('.', \%LocalDepsHash);
++ &BuildDependent(\%LocalDepsHash);
+ };
+ };
+
+ #
+ # Start build given project
+ #
+-sub MakeDir {
+- my ($DirToBuild, $BuildDir, $error);
+- $DirToBuild = shift;
+- $BuildDir = &CorrectPath($StandDir.$PathHash{$DirToBuild});
+- if ($ENV{GUI} eq 'UNX') {
+- use Cwd 'chdir';
+- };
+- if (chdir ($BuildDir)) {
+- print "$BuildDir\n";
++sub dmake_dir {
++ my ($folder_nick, $BuildDir);
++ $folder_nick = shift;
++ $BuildDir = &CorrectPath($StandDir . $PathHash{$folder_nick});
++ &print_error("\n$BuildDir not found!!\n") if (!(-d $BuildDir));
++ if ($cmd_file) {
++ print "cd $BuildDir\n";
++ print $check_error_string;
++ print $echo.$BuildDir."\n";
++ print "$dmake\n";
++ print $check_error_string;
+ } else {
+- &print_error("\n$BuildDir not found!!\n");
+- exit (1);
++ print "$BuildDir\n";
+ };
+- cwd();
+- if (!$show) {
+- $error = system ("$dmake");
+- if (!$error) {
+- &RemoveFromDependencies($DirToBuild, \%LocalDepsHash);
+- } else {
+- &print_error("Error $error occurred while making $BuildDir");
+- $ENV{mk_tmp} = '';
+- exit(1);
++ &RemoveFromDependencies($folder_nick, \%LocalDepsHash) if (!$child);
++ if (!$cmd_file && !$show) {
++ chdir $BuildDir;
++ cwd();
++ system ("$dmake");
++ if ($? && ($? != -1) && (!$child)) {
++ &print_error("Error $? occurred while making $BuildDir");
+ };
+- } else {
+- &RemoveFromDependencies($DirToBuild, \%LocalDepsHash);
+ };
++ if ($child) {
++ my $oldfh = select STDERR;
++ $| = 1;
++ _exit($? >> 8) if ($? && ($? != -1));
++ _exit(0);
++ };
+ };
+
+-
+ #
+ # Get string (list) of parent projects to build
+ #
+@@ -246,10 +310,8 @@ sub GetParentsString {
+ my ($PrjDir);
+ $PrjDir = shift;
+ $PrjDir = '.' if ($PrjDir eq $CurrentPrj);
+- if (!open (PrjBuildFile, $PrjDir.'/prj/build.lst')) {
+- return '';
+- };
+- while (<PrjBuildFile>) {
++ return '' if (!open (BUILD_LST, $PrjDir.'/prj/build.lst'));
++ while (<BUILD_LST>) {
+ if ($_ =~ /#/) {
+ if ($`) {
+ $_ = $`;
+@@ -259,11 +321,11 @@ sub GetParentsString {
+ };
+ s/\r\n//;
+ if ($_ =~ /\:+\s+/) {
+- close PrjBuildFile;
++ close BUILD_LST;
+ return $';
+ };
+ };
+- close PrjBuildFile;
++ close BUILD_LST;
+ return 'NULL';
+ };
+
+@@ -272,37 +334,45 @@ sub GetParentsString {
+ #
+ sub get_prj_platform {
+ my ($prj_alias, $line);
+- while(<PrjBuildFile>) {
++ while(<BUILD_LST>) {
+ s/\r\n//;
+ $line++;
+ if ($_ =~ /nmake/) {
+ if ($' =~ /\s+-\s+(\w+)[,\S+]*\s+(\S+)/ ) {
+ my $platform = $1;
+ my $alias = $2;
+- if ($alias eq 'NULL') {
+- &print_error ("There is no correct alias set in the line $line!");
+- exit (1);
+- };
++ &print_error ("There is no correct alias set in the line $line!") if ($alias eq 'NULL');
+ &mark_platform($alias, $platform);
+ } else {
+ &print_error("Misspelling in line: \n$_");
+- exit(1);
+ };
+ };
+ };
+- seek(PrjBuildFile, 0, 0);
++ seek(BUILD_LST, 0, 0);
+ };
+
+ #
+ # Getting hashes of all internal dependencies and additional
+ # infos for given project
+ #
+-sub BuildPrj {
++sub get_deps_hash {
+ my ($dummy, $PrjToBuild);
++ %DeadDependencies = ();
+ $PrjToBuild = shift;
+- open (PrjBuildFile, 'prj/build.lst');
++ my $dependencies_hash = shift;
++ chdir $PrjToBuild;
++ cwd();
++ if ($deliver) {
++ if ($cmd_file) {
++ print "$deliver_commando\n";
++ } else {
++ system ("$deliver_commando") if (!$show);
++ };
++ return;
++ };
++ open (BUILD_LST, 'prj/build.lst');
+ &get_prj_platform;
+- while (<PrjBuildFile>) {
++ while (<BUILD_LST>) {
+ if ($_ =~ /#/) {
+ if ($`) {
+ $_ = $`;
+@@ -331,22 +401,20 @@ sub BuildPrj {
+ };
+ $PlatformHash{$DirAlias}++;
+ $Dependencies = $';
+- @Array = GetDependenciesArray($Dependencies);
+- $LocalDepsHash{$DirAlias} = [@Array];
++ @Array = &GetDependenciesArray($Dependencies);
++ $$dependencies_hash{$DirAlias} = [@Array];
+ $BuildQueue{$DirAlias}++;
+ $PathHash{$DirAlias} = $Dir;
+ };
+ };
+- close PrjBuildFile;
+- %DepsArchive = %LocalDepsHash;
++ close BUILD_LST;
+ foreach $Dir (keys %DeadDependencies) {
+ next if defined $AliveDependencies{$Dir};
+ if (!&IsHashNative($Dir)) {
+- &RemoveFromDependencies($Dir, \%LocalDepsHash);
++ &RemoveFromDependencies($Dir, $dependencies_hash);
+ delete $DeadDependencies{$Dir};
+ };
+ };
+- &BuildDependent();
+ };
+
+ #
+@@ -361,33 +429,40 @@ sub mark_platform {
+ };
+ };
+
+-
+ #
+ # Convert path from abstract (with '\' and/or '/' delimiters)
+ # to system-independent
+ #
+ sub CorrectPath {
+ $_ = shift;
+- s/\\/\//g;
++ if (($ENV{GUI} ne 'UNX') && $cmd_file) {
++ s/\//\\/g;
++ } else {;
++ s/\\/\//g;
++ };
+ return $_;
+ };
+
+
+ #
+-# Get platform-dependent dmake commando
++# Get platform-dependent commands
+ #
+-sub GetDmakeCommando {
+- my ($dmake, $arg);
+-
++sub get_commands {
++ my $arg = '';
+ # Setting alias for dmake
+ $dmake = 'dmake';
+ while ($arg = pop(@dmake_args)) {
+ $dmake .= ' '.$arg;
+ };
+- return $dmake;
++ if ($cmd_file) {
++ if ($ENV{GUI} eq 'UNX') {
++ $check_error_string = "if \"\$?\" != \"0\" exit\n";
++ } else {
++ $check_error_string = "if \"\%?\" != \"0\" quit\n";
++ };
++ };
+ };
+
+-
+ #
+ # Procedure prooves if current dir is a root dir of the drive
+ #
+@@ -408,7 +483,6 @@ sub IsRootDir {
+ };
+ };
+
+-
+ #
+ # Procedure retrieves list of projects to be built from build.lst
+ #
+@@ -420,33 +494,21 @@ sub get_stand_dir {
+ my ($StandDir);
+ do {
+ $StandDir = cwd();
+- if (open(PrjBuildFile, 'prj/build.lst')) {
++ if (open(BUILD_LST, 'prj/build.lst')) {
+ $StandDir =~ /(\w+$)/;
+ $StandDir = $`;
+ $CurrentPrj = $1;
+- close(PrjBuildFile);
++ close(BUILD_LST);
+ return $StandDir;
+ } elsif (&IsRootDir($StandDir)) {
+ $ENV{mk_tmp} = '';
+ &print_error ('Found no project to build');
+- exit (1);
+ };
+ }
+ while (chdir '..');
+ };
+
+ #
+-# Build the entire project according to queue of dependencies
+-#
+-sub BuildDependent {
+- my ($Dir);
+- while ($Dir = &PickPrjToBuild(\%LocalDepsHash)) {
+- &MakeDir($Dir);
+- $Dir = '';
+- };
+-};
+-
+-#
+ # Removes projects which it is not necessary to build
+ #
+ sub remove_extra_prjs {
+@@ -467,11 +529,11 @@ sub PickPrjToBuild {
+ my ($Prj, $DepsHash);
+ $DepsHash = shift;
+ $Prj = &FindIndepPrj($DepsHash);
+- delete $$DepsHash{$Prj};
++ delete $$DepsHash{$Prj} if (defined $$DepsHash{$Prj});
++ #print "$Prj removed from dependencies hash\n";
+ return $Prj;
+ };
+
+-
+ #
+ # Make a decision if the project should be built on this platform
+ #
+@@ -487,7 +549,7 @@ sub CheckPlatform {
+ return 1;
+ } elsif (($ENV{GUI} eq 'UNX') && ($Platform eq 'u')) {
+ return 1;
+- } elsif (($ENV{GUI} eq 'MACOSX') && ($Platform eq 'm')) {
++ } elsif (($ENV{GUI} eq 'MAC') && ($Platform eq 'm')) {
+ return 1;
+ } elsif (($ENV{GUI} eq 'OS2') && ($Platform eq 'p')) {
+ return 1;
+@@ -495,7 +557,6 @@ sub CheckPlatform {
+ return 0;
+ };
+
+-
+ #
+ # Remove project to build ahead from dependencies and make an array
+ # of all from given project dependent projects
+@@ -515,12 +576,13 @@ sub RemoveFromDependencies {
+ };
+ };
+
+-
+ #
+ # Find undependent project
+ #
+ sub FindIndepPrj {
+ my ($Prj, @Prjs, @PrjDeps, $Dependencies, $i);
++ my $children = &children_number;
++ return '' if ($children && ($children >= $QuantityToBuild));
+ $Dependencies = shift;
+ @Prjs = keys %$Dependencies;
+ if ($#Prjs != -1) {
+@@ -528,21 +590,19 @@ sub FindIndepPrj {
+ if (&IsHashNative($Prj)) {
+ next;
+ };
+- if (!(defined $$Dependencies{$Prj})) {
+- return $Prj;
+- };
+ @PrjDeps = @{$$Dependencies{$Prj}};
+- if ($#PrjDeps == -1) {
+- return $Prj;
+- };
++ return $Prj if ($#PrjDeps == -1);
+ };
+ # If there are only dependent projects in hash - generate error
+- return '' if ($build_from);
++ return '' if ($BuildAllParents);
++ if ($children) {
++ $only_dependent = 1;
++ return '';
++ };
+ print STDERR "\nError: projects";
+- DeadPrjLoop:
+ foreach $Prj (keys %$Dependencies) {
+- if (IsHashNative($Prj)) {
+- next DeadPrjLoop;
++ if (&IsHashNative($Prj)) {
++ next;
+ };
+ $i = 0;
+ print STDERR "\n$Prj depends on:";
+@@ -551,12 +611,12 @@ sub FindIndepPrj {
+ };
+ };
+ &print_error ("\nhave dead or circular dependencies\n");
+- $ENV{mk_tmp} = '';
+- exit (1);
+- };
++ } else {
++ $no_projects = 1;
++ return '';
++ };
+ };
+
+-
+ #
+ # Check if given entry is HASH-native, that is not a user-defined data
+ #
+@@ -570,7 +630,6 @@ sub IsHashNative {
+ };
+ };
+
+-
+ #
+ # Getting array of dependencies from the string given
+ #
+@@ -581,10 +640,7 @@ sub GetDependenciesArray {
+ $string = $DepString;
+ $prj = shift;
+ while (!($DepString =~ /^NULL/)) {
+- if (!$DepString) {
+- &print_error("Project $prj has wrong written dependencies string:\n $string");
+- exit (1);
+- };
++ &print_error("Project $prj has wrong written dependencies string:\n $string") if (!$DepString);
+ $DepString =~ /(\S+)\s*/;
+ $ParentPrj = $1;
+ $DepString = $';
+@@ -593,17 +649,13 @@ sub GetDependenciesArray {
+ if (($prj_platform{$ParentPrj} ne $1) &&
+ ($prj_platform{$ParentPrj} ne 'all')) {
+ &print_error ("$ParentPrj\.$1 is a wrong dependency identifier!\nCheck if it is platform dependent");
+- exit (1);
+ };
+- if (&CheckPlatform($1)) {
+- $AliveDependencies{$ParentPrj}++;
+- }
++ $AliveDependencies{$ParentPrj}++ if (&CheckPlatform($1));
+ push(@Dependencies, $ParentPrj);
+ } else {
+ if ((exists($prj_platform{$ParentPrj})) &&
+ ($prj_platform{$ParentPrj} ne 'all') ) {
+ &print_error("$ParentPrj is a wrong used dependency identifier!\nCheck if it is platform dependent");
+- exit (1);
+ };
+ push(@Dependencies, $ParentPrj);
+ };
+@@ -624,59 +676,284 @@ sub GetDirectoryList {
+ return @DirectoryList;
+ };
+
++sub print_error {
++ my $message = shift;
++ print STDERR "\nERROR: $message\n";
++ $ENV{mk_tmp} = '';
++ close CMD_FILE if ($cmd_file);
++ unlink ($cmd_file);
++ exit(1) if (!$child);
++};
++
++sub usage {
++ print STDERR "\nbuild\n";
++ print STDERR "Syntax: build [--help|-all|-from|-from_opt|since prj_name|-file file_name|-PP processes|-dlv[_switch] dlvswitch] \n";
++ print STDERR "Example: build -from sfx2\n";
++ print STDERR " - build all projects including current one from sfx2\n";
++ print STDERR "Example: build -from_opt sfx2\n";
++ print STDERR " - the same as -from, but skip all projects that could have been built (no secure way, use ONLY when -all or -from is already been run and there no external dependencies\' changes occurred)\n";
++ print STDERR "Keys: -all - build all projects from very beginning till current one\n";
++ print STDERR " -from - build all projects beginning from the specified till current one\n";
++ print STDERR " -from_opt - build all projects beginning from the specified till current one (optimized version)\n";
++ print STDERR " -since - build all projects beginning from the specified till current one (optimized version, skips specified project)\n";
++ print STDERR " -show - show what is going to be built\n";
++ print STDERR " -file - generate command file file_name\n";
++ print STDERR " -deliver - only deliver, no build (usable for \'-all\' and \'-from\' keys)\n";
++ print STDERR " -PP - start multiprocessing build, with number of processes passed (UNIXes only)\n";
++ print STDERR " -dlv[_switch] - use deliver with the switch specified\n";
++ print STDERR " --help - print help info\n";
++ print STDERR "Default: - build current project\n";
++ print STDERR "Keys that are not listed above would be passed to dmake\n";
++};
++
+ #
+ # Get all options passed
+ #
+ sub get_options {
+ my $arg;
+- #&usage() && exit(0) if ($#ARGV == -1);
+- #$QuantityToBuild
+ while ($arg = shift @ARGV) {
+- $arg =~ /^PP$/ and $QuantityToBuild = shift @ARGV and next;
++ $arg =~ /^-PP$/ and $QuantityToBuild = shift @ARGV and next;
++ $arg =~ /^-PP(\d+)$/ and $QuantityToBuild = $1 and next;
+ $arg =~ /^-all$/ and $BuildAllParents = 1 and next;
+ $arg =~ /^-show$/ and $show = 1 and next;
+ $arg =~ /^-deliver$/ and $deliver = 1 and next;
++ $arg =~ /^-dlv_switch$/ and $dlv_switch = &get_switch_options and next;
++ $arg =~ /^-dlv$/ and $dlv_switch = &get_switch_options and next;
++ $arg =~ /^-file$/ and $cmd_file = shift @ARGV and next;
+ $arg =~ /^-from$/ and $BuildAllParents = 1
+ and $build_from = shift @ARGV and next;
+ $arg =~ /^-from_opt$/ and $BuildAllParents = 1
+ and $build_from_opt = shift @ARGV and next;
+
+- $arg =~ /^-since$/ and $BuildAllParents = 1
++ $arg =~ /^-since$/ and $BuildAllParents = 1
+ and $build_since = shift @ARGV and next;
+- $arg =~ /^-help$/ and &usage and exit(0);
++ $arg =~ /^--help$/ and &usage and exit(0);
+ push (@dmake_args, $arg);
+- };
+- if ($build_from && $build_from_opt) {
+- &print_error('Switches -from an -from_opt collision');
+- exit(1);
+ };
++ &print_error('Switches -from and -from_opt collision') if ($build_from && $build_from_opt);
+
+- if ($build_from && $build_since) {
+- &print_error('Switches -from an -since collision');
+- exit(1);
+- };
++ &print_error('Switches -from and -since collision') if ($build_from && $build_since);
+ @ARGV = @dmake_args;
++ $cmd_file = '' if ($show);
++ if (($ENV{GUI} eq 'WNT') && $QuantityToBuild) {
++ $QuantityToBuild = 0;
++ &print_error('-PP switch is unusable under windows!\n');
++ };
+ };
+
+-sub print_error {
+- my $message = shift;
+- print STDERR "\nERROR: $message\n";
++#
++# get all options without '-'
++#
++sub get_switch_options {
++ my $string = '';
++ my $option = '';
++ while ($option = shift @ARGV) {
++ if (!($option =~ /^-/)) {
++ $string .= '-' . $option;
++ $string .= ' ';
++ } else {
++ unshift(@ARGV, $option);
++ last;
++ };
++ };
++ $string =~ s/\s$//;
++ return $string;
+ };
+
+-sub usage {
+- print STDERR "\nbuild\n";
+- print STDERR "Syntax: build [-help|-all|-from|-from_opt|since prj_name] \n";
+- print STDERR "Example: build -from sfx2\n";
+- print STDERR " - build all projects including current one from sfx2\n";
+- print STDERR "Example: build -from_opt sfx2\n";
+- print STDERR " - the same as -from, but skip all projects that could have been built (no secure way, use ONLY when -all or -from is already been run and there no external dependensies\' changes occurred)\n";
+- print STDERR "Keys: -all - build all projects from very beginning till current one\n";
+- print STDERR " -from - build all projects beginning from the specified till current one\n";
+- print STDERR " -from_opt - build all projects beginning from the specified till current one (optimized version)\n";
+- print STDERR " -since - build all projects beginning from the specified till current one (optimized version, skips specified project)\n";
+- print STDERR " -show - show what is gonna be built\n";
+- print STDERR " -deliver - only deliver, no build (usable for \'-all\' and \'-from\' keys)\n";
+- print STDERR " -help - print help info\n";
+- print STDERR "Default: - build current project\n";
+- print STDERR "Keys that are not listed above would be passed to dmake\n";
++#
++# cancel build when one of children has error exit code
++#
++sub cancel_build {
++ while (&children_number) {sleep(1)};
++ print STDERR "\n";
++ foreach (keys %broken_build) {
++ print STDERR "ERROR: error $_ occurred while making ", $broken_build{$_}, "\n";
++ };
++ exit(1);
++};
++
++#
++# Function for storing error in multiprocessing AllParents build
++#
++sub store_error {
++ my ($pid, $error_code) = @_;
++ my $child_nick = $processes_hash{$pid};
++ $broken_build {$error_code} = &CorrectPath($StandDir . $PathHash{$child_nick});
+ };
++
++#
++# child handler (clears (or stores info about) the terminated child)
++#
++sub handle_dead_child {
++ my $pid = 0;
++ foreach (keys %processes_hash) {
++ if (($pid = waitpid($_, &WNOHANG)) > 0) {
++ &store_error($pid, $?) if ($?);
++ &clear_from_child($pid);
++ };
++ };
++};
++
++sub clear_from_child {
++ my $pid = shift;
++ my $child_nick = $processes_hash{$pid};
++ &RemoveFromDependencies($child_nick,
++ $folders_hashes{$child_nick});
++ $running_children{$folders_hashes{$child_nick}}--;
++ delete $processes_hash{$pid};
++ $only_dependent = 0;
++};
++
++#
++# Register signal handler & unblock SIGALRM
++#
++sub register_signal_handler {
++ $sigaction = POSIX::SigAction->new('main::handle_dead_child');
++ sigaction(SIGCHLD, $sigaction);
++ $handler_set = 1;
++};
++
++#
++# Build the entire project according to queue of dependencies
++#
++sub BuildDependent {
++ $dependencies_hash = shift;
++ my $pid = 0;
++ my $child_nick = '';
++ while ($child_nick = &PickPrjToBuild($dependencies_hash)) {
++ if (($QuantityToBuild) ) { # multyprocessing not for $BuildAllParents (-all etc)!!
++ &register_signal_handler if (!$handler_set);
++ do {
++ # start current child & all
++ # that could be started now
++ &start_child($child_nick) if ($child_nick);
++ sleep if (&children_number() >= $QuantityToBuild);
++ $child_nick = &PickPrjToBuild($dependencies_hash);
++ if ($only_dependent) {
++ return if ($BuildAllParents);
++ sleep;
++ };
++ } while (!$no_projects);
++ return if ($BuildAllParents);
++ while (&children_number()) {
++ sleep(5);
++ };
++ print STDERR "Multiprocessing build is finished\n";
++ } else {
++ &dmake_dir($child_nick);
++ };
++ $child_nick = '';
++ };
++};
++
++sub children_number {
++ return scalar (keys %processes_hash);
++};
++
++sub start_child {
++ &cancel_build if (scalar keys %broken_build);
++ my $child_nick = shift;
++ my $pid;
++ if ($pid = fork) { # parent
++ $processes_hash{$pid} = $child_nick;
++ print 'Running processes: ', &children_number(), "\n";
++ $folders_hashes{$child_nick} = $dependencies_hash;
++ $running_children{$dependencies_hash}++;
++ sleep(1) if ($BuildAllParents);
++ } elsif (defined $pid) { # child
++ $child = 1;
++ #print "$child_nick\n";
++ &dmake_dir($child_nick);
++ };
++};
++
++#
++# Build everything that should be built multiprocessing version
++#
++sub build_multiprocessing {
++ my $Prj;
++ my @build_queue = (); # array, containing queue of projects
++ # to build
++ do {
++ while ($Prj = &PickPrjToBuild(\%ParentDepsHash)) {
++ if ($build_from_opt) {
++ if ($build_from_opt ne $Prj) {
++ &RemoveFromDependencies($Prj, \%ParentDepsHash);
++ next;
++ } else {
++ $build_from_opt = '';
++ };
++ };
++ if ($build_since) {
++ if ($build_since ne $Prj) {
++ &RemoveFromDependencies($Prj, \%ParentDepsHash);
++ } else {
++ &RemoveFromDependencies($Prj, \%ParentDepsHash);
++ $build_since = '';
++ };
++ next;
++ };
++ push @build_queue, $Prj;
++ $projects_deps_hash{$Prj} = {};
++ &get_deps_hash(&CorrectPath($StandDir.$Prj), $projects_deps_hash{$Prj});
++ };
++ sleep(1) if (!$Prj);
++ &build_actual_queue(\@build_queue);
++ } while (scalar (keys %ParentDepsHash));
++ while (&children_number()) {
++ sleep(5);
++ };
++ &cancel_build if (scalar keys %broken_build);
++ print STDERR "Multiprocessing build is finished\n";
++ exit(0);
++};
++
++#
++# Here the built queue is built as long as possible
++#
++sub build_actual_queue {
++ my $build_queue = shift;
++ my $i = 0;
++ do {
++ while ($i <= (scalar(@$build_queue) - 1)) {
++ &cancel_build if (scalar keys %broken_build);
++ $Prj = $$build_queue[$i];
++ &annonce_module($Prj) if (!(defined $module_annonced{$Prj}));
++ $only_dependent = 0;
++ $no_projects = 0;
++ &BuildDependent($projects_deps_hash{$Prj});
++ if ($no_projects && ($running_children{$projects_deps_hash{$Prj}} == 0)) {
++ chdir(&CorrectPath($StandDir.$Prj));
++ system ("$deliver_commando") if (!$show && ($Prj ne $CurrentPrj));
++ delete $projects_deps_hash{$Prj};
++ &RemoveFromDependencies($Prj, \%ParentDepsHash);
++ splice (@$build_queue, $i, 1);
++ next;
++ };
++ $i++;
++ };
++ $i = 0;
++ } while (!&are_all_dependent($build_queue));
++};
++
++#
++# Print announcement for module just started
++#
++sub annonce_module {
++ my $Prj = shift;
++ print $echo. "=============\n";
++ print $echo. "Building project $Prj\n";
++ print $echo. "=============\n";
++ $module_annonced{$Prj}++;
++};
++
++sub are_all_dependent {
++ my $build_queue = shift;
++ my $folder = '';
++ foreach my $prj (@$build_queue) {
++ $folder = &FindIndepPrj($projects_deps_hash{$prj});
++ return '' if ($folder);
++ };
++ return '1';
++};
++