diff options
Diffstat (limited to 'solenv/bin/build.pl')
-rwxr-xr-x | solenv/bin/build.pl | 202 |
1 files changed, 102 insertions, 100 deletions
diff --git a/solenv/bin/build.pl b/solenv/bin/build.pl index cc0677220777..5b4d4622754a 100755 --- a/solenv/bin/build.pl +++ b/solenv/bin/build.pl @@ -118,7 +118,7 @@ $pre_custom_job = ''; $custom_job = ''; $post_custom_job = ''; - %LocalDepsHash = (); + %local_deps_hash = (); %PathHash = (); %PlatformHash = (); %AliveDependencies = (); @@ -185,7 +185,7 @@ $setenv_string = ''; # string for configuration of the client environment $ports_string = ''; # string with possible ports for server @server_ports = (); - $html_port; + $html_port = 0; $server_socket_obj = undef; # socket object for server $html_socket_obj = undef; # socket object for server my %clients_jobs = (); @@ -201,7 +201,6 @@ my %module_paths = (); # hash with absolute module paths my %active_modules = (); my $generate_config = 0; - my $add_modules_to_config = 0; my %add_to_config = (); my %remove_from_config = (); my $clear_config = 0; @@ -385,7 +384,7 @@ sub generate_config_file { $removal_message .= "$1 "; } else { push(@config_content_new, $_); - if (defined $add_to_config{$1}) { + if (defined $add_to_config{$1} && !$prepare) { push(@warnings, "Module $1 already activated in $source_config_file\n"); delete $add_to_config{$1}; } @@ -492,11 +491,12 @@ sub start_html_message_trigger { my $rv; my $full_buffer = ''; my %modules_to_rebuild = (); + my $paddr; while ($rv = sysread(HTML_PIPE, $buffer, $buffer_size)) { $full_buffer .= $buffer; }; if (length $full_buffer) { - print "**********Got message $fullbuffer\n"; + print "**********Got message $full_buffer\n"; socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname('tcp')) or die "socket: $!"; if (connect(SOCKET, $paddr)) { $full_buffer .= "\n"; @@ -568,8 +568,8 @@ sub schedule_delete { kill 9, keys %{$module_deps_hash_pids{$projects_deps_hash{$_}}}; handle_dead_children(0); }; - RemoveFromDependencies($_, \%global_deps_hash); - RemoveFromDependencies($_, \%global_deps_hash_backup); + remove_from_dependencies($_, \%global_deps_hash); + remove_from_dependencies($_, \%global_deps_hash_backup); delete $reversed_dependencies{$_}; delete $build_is_finished{$_} if defined $build_is_finished{$_}; delete $modules_with_errors{$_} if defined $modules_with_errors{$_}; @@ -618,6 +618,7 @@ sub schedule_rebuild { # sub get_build_list_path { my $module = shift; + return $build_list_paths{$module} if (defined $build_list_paths{$module}); my @possible_dirs = ($module, $module. '.lnk', $module. '.link'); return $build_list_paths{$module} if (defined $build_list_paths{$module}); foreach (@possible_dirs) { @@ -720,19 +721,17 @@ sub build_all { $modules_types{$initial_module} = 'mod'; }; modules_classify(keys %global_deps_hash); - store_weights(\%global_deps_hash); - prepare_build_from(\%global_deps_hash) if ($build_from); + expand_dependencies (\%global_deps_hash); +# prepare_build_from(\%global_deps_hash) if (scalar keys %incompatibles); prepare_incompatible_build(\%global_deps_hash) if ($incompatible); if ($build_all_cont || $build_since) { - print STDERR "There are active module in $source_config_file. Inactive modules will be skipped.\n"; - push (@warnings, "\nThere are active module in $source_config_file. Inactive modules are skipped.\n\n"); prepare_build_all_cont(\%global_deps_hash); }; if ($generate_config) { %add_to_config = %global_deps_hash; generate_config_file(); exit 0; - } elsif (keys %incompatibles) { + } elsif ($incompatible) { my @missing_modules = (); foreach (keys %global_deps_hash) { push(@missing_modules, $_) if (!defined $active_modules{$_}); @@ -741,8 +740,12 @@ sub build_all { print_error("There are modules:\n@missing_modules\n\nthat should be built, but they are not activated. Please, verify your $source_config_file.\n"); }; }; + foreach my $module (%dead_parents) { + remove_from_dependencies($module, \%global_deps_hash); + delete ($global_deps_hash{$module}) if (defined $global_deps_hash{$module}); + }; + store_weights(\%global_deps_hash); backup_deps_hash(\%global_deps_hash, \%global_deps_hash_backup); - expand_dependencies (\%global_deps_hash_backup); reverse_dependensies(\%global_deps_hash_backup); $modules_number = scalar keys %global_deps_hash; initialize_html_info($_) foreach (keys %global_deps_hash); @@ -757,34 +760,34 @@ sub build_all { if (!defined $dead_parents{$Prj}) { if (scalar keys %broken_build) { print $echo . "Skipping project $Prj because of error(s)\n"; - RemoveFromDependencies($Prj, \%global_deps_hash); + remove_from_dependencies($Prj, \%global_deps_hash); $build_is_finished{$Prj}++; next; }; $PrjDir = $module_paths{$Prj}; - get_module_dep_hash($Prj, \%LocalDepsHash); + get_module_dep_hash($Prj, \%local_deps_hash); my $info_hash = $html_info{$Prj}; - $$info_hash{DIRS} = check_deps_hash(\%LocalDepsHash, $Prj); - $module_by_hash{\%LocalDepsHash} = $Prj; - build_dependent(\%LocalDepsHash); + $$info_hash{DIRS} = check_deps_hash(\%local_deps_hash, $Prj); + $module_by_hash{\%local_deps_hash} = $Prj; + build_dependent(\%local_deps_hash); print $check_error_string; }; - RemoveFromDependencies($Prj, \%global_deps_hash); + remove_from_dependencies($Prj, \%global_deps_hash); $build_is_finished{$Prj}++; }; } else { store_build_list_content($initial_module); - get_module_dep_hash($initial_module, \%LocalDepsHash); + get_module_dep_hash($initial_module, \%local_deps_hash); initialize_html_info($initial_module); my $info_hash = $html_info{$initial_module}; - $$info_hash{DIRS} = check_deps_hash(\%LocalDepsHash, $initial_module); - $module_by_hash{\%LocalDepsHash} = $initial_module; + $$info_hash{DIRS} = check_deps_hash(\%local_deps_hash, $initial_module); + $module_by_hash{\%local_deps_hash} = $initial_module; if ($server_mode) { run_server(); } else { - build_dependent(\%LocalDepsHash); + build_dependent(\%local_deps_hash); }; }; }; @@ -811,43 +814,42 @@ sub initialize_html_info { # Do job # sub dmake_dir { - my ($new_BuildDir, $OldBuildDir, $error_code); - my $BuildDir = shift; - $jobs_hash{$BuildDir}->{START_TIME} = time(); - $jobs_hash{$BuildDir}->{STATUS} = 'building'; - if ($BuildDir =~ /(\s)/o && (!-d $BuildDir)) { - print "\n$BuildDir\n\n" if ($BuildDir =~ /\sdeliver$/o); - $error_code = do_custom_job($BuildDir, \%LocalDepsHash); + my ($new_job_name, $error_code); + my $job_name = shift; + $jobs_hash{$job_name}->{START_TIME} = time(); + $jobs_hash{$job_name}->{STATUS} = 'building'; + if ($job_name =~ /(\s)/o && (!-d $job_name)) { + $error_code = do_custom_job($job_name, \%local_deps_hash); } else { - html_store_job_info(\%LocalDepsHash, $BuildDir); - print_error("$BuildDir not found!!\n") if (!-d $BuildDir); - if (!-d $BuildDir) { - $new_BuildDir = $BuildDir; - $new_BuildDir =~ s/_simple//g; - if ((-d $new_BuildDir)) { - print("\nTrying $new_BuildDir, $BuildDir not found!!\n"); - $BuildDir = $new_BuildDir; + html_store_job_info(\%local_deps_hash, $job_name); + print_error("$job_name not found!!\n") if (!-d $job_name); + if (!-d $job_name) { + $new_job_name = $job_name; + $new_job_name =~ s/_simple//g; + if ((-d $new_job_name)) { + print("\nTrying $new_job_name, $job_name not found!!\n"); + $job_name = $new_job_name; } else { - print_error("\n$BuildDir not found!!\n"); + print_error("\n$job_name not found!!\n"); } } if ($cmd_file) { - print "cd $BuildDir\n"; + print "cd $job_name\n"; print $check_error_string; - print $echo.$BuildDir."\n"; + print $echo.$job_name."\n"; print "$dmake\n"; print $check_error_string; } else { print "\n" if ( ! $show ); - print "Entering $BuildDir\n"; + print "Entering $job_name\n"; }; - RemoveFromDependencies($BuildDir, \%LocalDepsHash) if (!$child); + remove_from_dependencies($job_name, \%local_deps_hash) if (!$child); return if ($cmd_file || $show); - $error_code = run_job($dmake, $BuildDir); - html_store_job_info(\%LocalDepsHash, $BuildDir, $error_code) if (!$child); + $error_code = run_job($dmake, $job_name); + html_store_job_info(\%local_deps_hash, $job_name, $error_code) if (!$child); }; if ($error_code && $ignore) { - push(@ignored_errors, $BuildDir); + push(@ignored_errors, $job_name); $error_code = 0; }; if ($child) { @@ -863,7 +865,7 @@ sub dmake_dir { _exit(0); } elsif ($error_code && ($error_code != -1)) { return $error_code; -# print_error("Error $? occurred while making $BuildDir"); +# print_error("Error $? occurred while making $job_name"); }; }; @@ -1065,7 +1067,7 @@ sub get_deps_hash { foreach my $alias (keys %DeadDependencies) { next if defined $AliveDependencies{$alias}; if (!IsHashNative($alias)) { - RemoveFromDependencies($alias, $dependencies_hash); + remove_from_dependencies($alias, $dependencies_hash); delete $DeadDependencies{$alias}; }; }; @@ -1208,7 +1210,9 @@ sub get_stand_dir { foreach (@possible_build_lists) {# ('build.lst', 'build.xlist'); if (-e $StandDir . '/prj/'.$_) { $initial_module = File::Basename::basename($StandDir); + $build_list_paths{$initial_module} =$StandDir . '/prj/'.$_; $StandDir = File::Basename::dirname($StandDir); + $module_paths{$initial_module} = $StandDir . "/$initial_module"; return $StandDir; } elsif ($StandDir eq $previous_dir) { $ENV{mk_tmp} = ''; @@ -1255,7 +1259,7 @@ sub CheckPlatform { # Remove project to build ahead from dependencies and make an array # of all from given project dependent projects # -sub RemoveFromDependencies { +sub remove_from_dependencies { my ($ExclPrj, $i, $Prj, $Dependencies); $ExclPrj = shift; my $ExclPrj_orig = ''; @@ -1326,7 +1330,7 @@ sub check_deps_hash { CLIENT => '-' }; }; - RemoveFromDependencies($key, \%deps_hash); + remove_from_dependencies($key, \%deps_hash); delete $deps_hash{$key}; $consistent++; }; @@ -1576,7 +1580,6 @@ sub get_options { $arg =~ /^--genconf$/ and $generate_config = 1 and next; if ($arg =~ /^--add$/) { get_list_of_modules(\%add_to_config); - $add_modules_to_config++; next; }; if ($arg =~ /^--remove$/) { @@ -1676,16 +1679,19 @@ sub get_options { }; sub get_module_and_buildlist_paths { - my $source_config = SourceConfig -> new($StandDir); - $source_config_file = $source_config->get_config_file_path(); - $active_modules{$_}++ foreach ($source_config->get_active_modules()); - my %active_modules_copy = %active_modules; - foreach ($source_config->get_all_modules()) { - delete $active_modules_copy{$_} if defined($active_modules_copy{$_}); - $module_paths{$_} = $source_config->get_module_path($_); - $build_list_paths{$_} = $source_config->get_module_build_list($_) - } - $dead_parents{$_}++ foreach (keys %active_modules_copy); + if ($build_all_parents) { + my $source_config = SourceConfig -> new($StandDir); + $source_config_file = $source_config->get_config_file_path(); + $active_modules{$_}++ foreach ($source_config->get_active_modules()); + my %active_modules_copy = %active_modules; + foreach ($source_config->get_all_modules()) { + delete $active_modules_copy{$_} if defined($active_modules_copy{$_}); + next if ($_ eq $initial_module); + $module_paths{$_} = $source_config->get_module_path($_); + $build_list_paths{$_} = $source_config->get_module_build_list($_) + } + $dead_parents{$_}++ foreach (keys %active_modules_copy); + }; }; @@ -1735,7 +1741,7 @@ sub cancel_build { } else { $message_part .= "--all:@broken_modules_names\n"; }; - if ($broken_modules_number) { + if ($broken_modules_number && $build_all_parents) { print "\n"; print $broken_modules_number; print " module(s): "; @@ -1848,7 +1854,7 @@ sub clear_from_child { if (defined $broken_build{$child_nick}) { $error_code = $broken_build{$child_nick}; } else { - RemoveFromDependencies($child_nick, + remove_from_dependencies($child_nick, $folders_hashes{$child_nick}); }; foreach (keys %module_deps_hash_pids) { @@ -2034,12 +2040,12 @@ sub build_actual_queue { delete $$build_queue{$Prj}; next; }; - $started_children =+ build_dependent($projects_deps_hash{$Prj}); + $started_children += build_dependent($projects_deps_hash{$Prj}); if ((!scalar keys %{$projects_deps_hash{$Prj}}) && !$running_children{$projects_deps_hash{$Prj}}) { if (!defined $modules_with_errors{$projects_deps_hash{$Prj}} || $ignore) { - RemoveFromDependencies($Prj, \%global_deps_hash); + remove_from_dependencies($Prj, \%global_deps_hash); $build_is_finished{$Prj}++; delete $$build_queue{$Prj}; $finished_projects++; @@ -2060,10 +2066,8 @@ sub build_actual_queue { sub run_job { my ($job, $path, $registered_name) = @_; my $job_to_do = $job; - if ( $show ) { - print "$job_to_do\n"; - return 0; - } + print "$registered_name\n"; + return 0 if ( $show ); $job_to_do = $deliver_command if ($job eq 'deliver'); $registered_name = $path if (!defined $registered_name); chdir $path; @@ -2095,7 +2099,7 @@ sub do_custom_job { if ($job eq $pre_job) { announce_module($module); # html_store_job_info($dependencies_hash, $job_dir); - RemoveFromDependencies($module_job, $dependencies_hash); + remove_from_dependencies($module_job, $dependencies_hash); } else { $error_code = run_job($job, $module_paths{$module}, $module_job); if ($error_code) { @@ -2108,7 +2112,7 @@ sub do_custom_job { $modules_with_errors{$dependencies_hash}++; $broken_build{$module} = $error_code; } else { - RemoveFromDependencies($module_job, $dependencies_hash); + remove_from_dependencies($module_job, $dependencies_hash); }; }; html_store_job_info($dependencies_hash, $module_job, $error_code); @@ -2349,19 +2353,17 @@ sub fix_permissions { sub prepare_incompatible_build { my ($prj, $deps_hash, @missing_modules); $deps_hash = shift; - foreach (keys %incompatibles) { - my $incomp_prj = $_; - if (!defined $$deps_hash{$_}) { - $incomp_prj .= '.lnk' if ($module_paths{$module} =~ /\.lnk$/); - $incomp_prj .= '.link' if ($module_paths{$module} =~ /\.link$/); + foreach my $module (keys %incompatibles) { + if (!defined $$deps_hash{$module}) { + print_error("The module $initial_module is independent from $module\n"); } - delete $incompatibles{$_}; - $incompatibles{$incomp_prj} = $$deps_hash{$incomp_prj}; - delete $$deps_hash{$incomp_prj}; + delete $incompatibles{$module}; + $incompatibles{$module} = $$deps_hash{$module}; + delete $$deps_hash{$module}; } while ($prj = pick_prj_to_build($deps_hash)) { - RemoveFromDependencies($prj, $deps_hash); - RemoveFromDependencies($prj, \%incompatibles); + remove_from_dependencies($prj, $deps_hash); + remove_from_dependencies($prj, \%incompatibles); }; foreach (keys %incompatibles) { $$deps_hash{$_} = $incompatibles{$_}; @@ -2373,7 +2375,7 @@ sub prepare_incompatible_build { @modules_built = keys %$deps_hash; %add_to_config = %$deps_hash; if ($prepare) { - generate_config_file(); + generate_config_file() if ((!defined $ENV{UPDATER}) || (defined $ENV{CWS_WORK_STAMP})); clear_delivered(); } my $old_output_tree = ''; @@ -2419,16 +2421,16 @@ sub prepare_incompatible_build { # Removes projects which it is not necessary to build # with -with_branches switch # -sub prepare_build_from { - my ($prj, $deps_hash); - $deps_hash = shift; - my %from_deps_hash = (); # hash of dependencies of the -from project - get_parent_deps($build_from_with_branches, \%from_deps_hash); - foreach $prj (keys %from_deps_hash) { - delete $$deps_hash{$prj}; - RemoveFromDependencies($prj, $deps_hash); - }; -}; +#sub prepare_build_from { +# my ($prj, $deps_hash); +# $deps_hash = shift; +# my %from_deps_hash = (); # hash of dependencies of the -from project +# get_parent_deps($build_from_with_branches, \%from_deps_hash); +# foreach $prj (keys %from_deps_hash) { +# delete $$deps_hash{$prj}; +# remove_from_dependencies($prj, $deps_hash); +# }; +#}; # # Removes projects which it is not necessary to build @@ -2445,13 +2447,13 @@ sub prepare_build_all_cont { $orig_prj = $` if ($prj =~ /\.link$/o); if (($border_prj ne $prj) && ($border_prj ne $orig_prj)) { - RemoveFromDependencies($prj, $deps_hash); + remove_from_dependencies($prj, $deps_hash); next; } else { if ($build_all_cont) { $$deps_hash{$prj} = (); } else { - RemoveFromDependencies($prj, $deps_hash); + remove_from_dependencies($prj, $deps_hash); }; return; }; @@ -2605,15 +2607,15 @@ sub clear_delivered { my $undeliver = "$deliver_command $deliver_delete_switches $nul"; # my $current_dir = getcwd(); foreach my $module (sort @modules_built) { - if (!chdir($module_paths{$module})) { - push(@warnings, "Could not remove delivered files from the module $module. Your build can become inconsistent.\n"); - } else { + if (chdir($module_paths{$module})) { print "Removing delivered from module $module\n"; next if ($show); if (system($undeliver)) { $ENV{$_} = $backup_vars{$_} foreach (keys %backup_vars); print_error("Cannot run: $undeliver"); } + } else { + push(@warnings, "Could not remove delivered files from the module $module. Your build can become inconsistent.\n"); }; }; # chdir $current_dir; @@ -3520,9 +3522,9 @@ sub get_job_string { }; } while (!$job_dir); } else { - $dependencies_hash = \%LocalDepsHash; + $dependencies_hash = \%local_deps_hash; do { - $job_dir = pick_prj_to_build(\%LocalDepsHash); + $job_dir = pick_prj_to_build(\%local_deps_hash); if (!$job_dir && !children_number()) { cancel_build() if (scalar keys %broken_build); mp_success_exit(); @@ -3577,7 +3579,7 @@ sub pick_jobdir { if ((!scalar keys %$prj_deps_hash) && !$running_children{$prj_deps_hash}) { if (!defined $modules_with_errors{$prj_deps_hash} || $ignore) { - RemoveFromDependencies($Prj, \%global_deps_hash); + remove_from_dependencies($Prj, \%global_deps_hash); $build_is_finished{$Prj}++; splice (@$build_queue, $i, 1); next; |