Adjust how to clear a shell script env variable
[buildfarm-client.git] / run_build.pl
index 2383c997ffe62c295194ca5ab302c2409214788b..9e68d8d05a9cae8591af780380d07aa3d30e955c 100755 (executable)
@@ -126,7 +126,7 @@ if ($skip_steps =~ /\S/)
 $only_steps ||= "";
 if ($only_steps =~ /\S/)
 {
-    %only_steps = map {$_ => 1} split(/\s+/,$only_steps);
+    %only_steps = map {$_ => 1} split(/(\s+|[:,])/,$only_steps);
 }
 
 # Currently only specifying a branch is actually used.
@@ -194,7 +194,6 @@ if (ref($force_every) eq 'HASH')
     $force_every = $force_every->{$branch} || $force_every->{default};
 }
 
-my $config_opts = $EximBuild::conf{config_opts};
 my $scm = new EximBuild::SCM \%EximBuild::conf;
 
 my $buildport;
@@ -314,7 +313,8 @@ foreach my $oldfile (glob("last*"))
 
 my $branch_root = getcwd();
 
-# make sure we are using GNU make
+# Normally we would require GNU Make, but allow farm
+# configuration to override this
 die "$make is not GNU Make - please fix config file"
   unless check_make();
 
@@ -506,9 +506,11 @@ $steps_completed = "";
 
 my @changed_files;
 my @changed_since_success;
+my $last_config;
 my $last_status;
 my $last_run_snap;
 my $last_success_snap;
+my $current_config;
 my $current_snap;
 my @filtered_files;
 my $savescmlog = "";
@@ -554,11 +556,20 @@ elsif (!$from_source)
     unlink "last.success";
 
     # get the timestamp data
+    $last_config = find_last('config') || 0;
     $last_status = find_last('status') || 0;
     $last_run_snap = find_last('run.snap');
     $last_success_snap = find_last('success.snap');
     $forcerun = 1 unless (defined($last_run_snap));
 
+    # If config file changed, force a rebuild
+    ($current_config) = (stat $orig_dir.'/'.$buildconf)[9];
+    if ($current_config > $last_config)
+    {
+      $last_status = 0;
+      set_last('config',$current_config) unless $nostatus;
+    }
+
     # updated by find_changed to last mtime of any file in the repo
     $current_snap=0;
 
@@ -651,9 +662,9 @@ make();
 
 display_features();
 
-make_test() if (check_optional_step('make_test'));
+make_test() if (check_optional_step('test'));
 
-make_doc() if (check_optional_step('build_docs'));
+make_doc() if (check_optional_step('make-doc'));
 
 ##check_port_is_ok($buildport,'Post');
 
@@ -692,6 +703,7 @@ usage: $0 [options] [branch]
   --test                    = short for --nosend --nostatus --verbose --force
   --skip-steps=list         = skip certain steps
   --only-steps=list         = only do certain steps, not allowed with skip-steps
+                              lists can be comma, colon, or space separated
 
 Default branch is HEAD. Usually only the --config option should be necessary.
 
@@ -755,9 +767,9 @@ sub check_optional_step
         &&grep {$_ eq $wday} @{$oconf->{dow}});
 
     my $last_step = $last_status = find_last("$step") || 0;
-
-    return undef unless ($forcerun ||
-                         time >$last_step + (3600 * $oconf->{min_hours_since}));
+    ## If made it *to* these optional steps, we just run them and reset last time
+    #return undef unless ($forcerun ||
+    #                     time >$last_step + (3600 * $oconf->{min_hours_since}));
     set_last("$step") unless $nostatus;
 
     return 1;
@@ -816,6 +828,12 @@ sub display_features
     
 sub check_make
 {
+    # Allow farm member to configure non-GNU make
+    my $non_gnu_make = $EximBuild::conf{non_gnu_make};
+    if (!defined $non_gnu_make ||
+        (defined $non_gnu_make && $non_gnu_make == 1)) {
+      return 'OK';
+    }
     my @out = `$make -v 2>&1`;
     return undef unless ($? == 0 && grep {/GNU Make/} @out);
     return 'OK';
@@ -999,6 +1017,15 @@ sub make_test
                   ./runtest \$WORKDIR/$exim/src/build-*/exim -CONTINUE $tests_range )2>&1`;
       $status = $? >>8;
       push @makeout, @tmp;
+      # Prepend the failed summary log outputs for ease of reading
+      my $fail_summary = "$exim/test/failed-summary.log";
+      if (-f $fail_summary)
+      {
+        @tmp = `cat $fail_summary`;
+        push @tmp, "\n";
+        unshift @makeout, @tmp;
+        unshift @makeout, "Summary of failed tests:\n";
+      }
     }
     writelog('test',\@makeout);
     print "======== make test logs ===========\n",@makeout
@@ -1057,23 +1084,12 @@ sub make_ecpg_check
 
 sub configure
 {
-
-    my @quoted_opts;
-    foreach my $c_opt (@$config_opts)
-    {
-        if ($c_opt =~ /['"]/)
-        {
-            push(@quoted_opts,$c_opt);
-        }
-        else
-        {
-            push(@quoted_opts,"'$c_opt'");
-        }
-    }
+    return unless step_wanted('configure');
+    print time_str(),"creating configuration ...\n" if $verbose;
 
     my $env = $EximBuild::conf{makefile_set};
     my $add = $EximBuild::conf{makefile_add};
-    my $features = $EximBuild::conf{config_features};
+    my $features = $EximBuild::conf{makefile_regex};
 
     my $envstr = "";
     while (my ($key,$val) = each %$env)
@@ -1130,11 +1146,11 @@ sub configure
         push @confout, @tmp;
         @tmp = `cd $exim && perl -pi -e 's/^EXIM_MONITOR=(.*)/# EXIM_MONITOR=\$1/' $local_conf`;
         push @confout, @tmp;
-        for my $feature ( @$features )
+        for my $regex ( @$features )
         {
             @tmp = `cd $exim
-                    perl -pi -e '$feature' $local_conf 2>&1
-                    echo "Changed feature: $feature" `;
+                    perl -pi -e '$regex' $local_conf 2>&1
+                    echo "Used regex: $regex" `;
             push @confout, @tmp;
         }
         # Add the final build file to the display output
@@ -1143,6 +1159,17 @@ sub configure
                 echo "Contents of Local/Makefile:"
                 egrep '^[^#]' $local_conf `;
         push @confout, @tmp;
+        # Build the config_opts array to send to the server
+        chomp @tmp;
+        my @config_opts = grep s/(?:LOOKUP_|EXPERIMENTAL_|USE_)(\S+)=.*/$1/,
+                          @tmp;
+        push @config_opts, grep s/^(?:EXIM_)(PERL|PYTHON)=.*/$1/,
+                           @tmp;
+        # OpenSSL doesn't have a specific USE flag
+        push @config_opts, grep s/^(TLS_LIBS.*-l(ssl|crypto)).*/OPENSSL/,
+                           @tmp;
+        $EximBuild::conf{config_opts} = \@config_opts;
+        
         # Does not matter what the Exim version is, as long as it is valid.
         my $exim_ver = $EximBuild::conf{exim_test_version} || '4.82';
         `cd $exim