scan-build: factor out setting of environment variables.

llvm-svn: 161343
This commit is contained in:
Ted Kremenek 2012-08-06 20:19:19 +00:00
parent c6c7133ed6
commit b9ddbd3daa
1 changed files with 58 additions and 33 deletions

View File

@ -868,16 +868,43 @@ sub AddIfNotPresent {
}
}
sub SetEnv {
my $Options = shift @_;
foreach my $opt ('CC', 'CXX', 'CLANG', 'CLANG_CXX',
'CCC_ANALYZER_ANALYSIS', 'CCC_ANALYZER_PLUGINS') {
die "$opt is undefined\n" if (!defined $opt);
$ENV{$opt} = $Options->{$opt};
}
foreach my $opt ('CCC_ANALYZER_STORE_MODEL',
'CCC_ANALYZER_PLUGINS',
'CCC_ANALYZER_INTERNAL_STATS',
'CCC_ANALYZER_OUTPUT_FORMAT') {
my $x = $Options->{$opt};
if (defined $x) { $ENV{$opt} = $x }
}
my $Verbose = $Options->{'VERBOSE'};
if ($Verbose >= 2) {
$ENV{'CCC_ANALYZER_VERBOSE'} = 1;
}
if ($Verbose >= 3) {
$ENV{'CCC_ANALYZER_LOG'} = 1;
}
}
sub RunXcodebuild {
my $Args = shift;
my $IgnoreErrors = shift;
my $CCAnalyzer = shift;
my $CXXAnalyzer = shift;
my $Options = shift;
if ($IgnoreErrors) {
AddIfNotPresent($Args,"-PBXBuildsContinueAfterErrors=YES");
}
# Default to old behavior where we insert a bogus compiler.
SetEnv($Options);
# Check if using iPhone SDK 3.0 (simulator). If so the compiler being
# used should be gcc-4.2.
if (!defined $ENV{"CCC_CC"}) {
@ -885,7 +912,7 @@ sub RunXcodebuild {
if ($Args->[$i] eq "-sdk" && $i + 1 < scalar(@$Args)) {
if (@$Args[$i+1] =~ /^iphonesimulator3/) {
$ENV{"CCC_CC"} = "gcc-4.2";
$ENV{"CCC_CXX"} = "g++-4.2";
$ENV{"CCC_CXX"} = "g++-4.2";
}
}
}
@ -902,13 +929,13 @@ sub RunXcodebuild {
return (system(@$Args) >> 8);
}
sub RunBuildCommand {
sub RunBuildCommand {
my $Args = shift;
my $IgnoreErrors = shift;
my $Cmd = $Args->[0];
my $CCAnalyzer = shift;
my $CXXAnalyzer = shift;
my $Options = shift;
# Get only the part of the command after the last '/'.
if ($Cmd =~ /\/([^\/]+)$/) {
@ -916,9 +943,12 @@ sub RunBuildCommand {
}
if ($Cmd eq "xcodebuild") {
return RunXcodebuild($Args, $IgnoreErrors, $CCAnalyzer, $CXXAnalyzer);
return RunXcodebuild($Args, $IgnoreErrors, $CCAnalyzer, $CXXAnalyzer, $Options);
}
# Setup the environment.
SetEnv($Options);
if ($Cmd =~ /(.*\/?gcc[^\/]*$)/ or
$Cmd =~ /(.*\/?cc[^\/]*$)/ or
$Cmd =~ /(.*\/?llvm-gcc[^\/]*$)/ or
@ -1432,47 +1462,42 @@ if (!defined $ClangSB || ! -x $ClangSB) {
Diag("Using 'clang' from path: $Clang\n");
}
# Set the appropriate environment variables.
SetHtmlEnv(\@ARGV, $HtmlDir);
$ENV{'CC'} = $Cmd;
$ENV{'CXX'} = $CmdCXX;
$ENV{'CLANG'} = $Clang;
$ENV{'CLANG_CXX'} = $ClangCXX;
if ($Verbose >= 2) {
$ENV{'CCC_ANALYZER_VERBOSE'} = 1;
}
if ($Verbose >= 3) {
$ENV{'CCC_ANALYZER_LOG'} = 1;
}
if ($AnalyzeHeaders) {
push @AnalysesToRun,"-analyzer-opt-analyze-headers";
}
if ($AnalyzerStats) {
push @AnalysesToRun, '-analyzer-checker', 'debug.Stats';
}
if ($MaxLoop > 0) {
push @AnalysesToRun, '-analyzer-max-loop ' . $MaxLoop;
}
if ($AnalyzeHeaders) { push @AnalysesToRun,"-analyzer-opt-analyze-headers"; }
if ($AnalyzerStats) { push @AnalysesToRun, '-analyzer-checker=debug.Stats'; }
if ($MaxLoop > 0) { push @AnalysesToRun, '-analyzer-max-loop=$MaxLoop'; }
$ENV{'CCC_ANALYZER_ANALYSIS'} = join ' ',@AnalysesToRun;
$ENV{'CCC_ANALYZER_PLUGINS'} = join ' ',@PluginsToLoad;
# Delay setting up other environment variables in case we can do true
# interposition.
my $CCC_ANALYZER_ANALYSIS = join ' ',@AnalysesToRun;
my $CCC_ANALYZER_PLUGINS = join ' ',@PluginsToLoad;
my %Options = (
'CC' => $Cmd,
'CXX' => $CmdCXX,
'CLANG' => $Clang,
'CLANG_CXX' => $ClangCXX,
'VERBOSE' => $Verbose,
'CCC_ANALYZER_ANALYSIS' => $CCC_ANALYZER_ANALYSIS,
'CCC_ANALYZER_PLUGINS' => $CCC_ANALYZER_PLUGINS,
'OUTPUT_DIR' => $HtmlDir
);
if (defined $StoreModel) {
$ENV{'CCC_ANALYZER_STORE_MODEL'} = $StoreModel;
$Options{'CCC_ANALYZER_STORE_MODEL'} = $StoreModel;
}
if (defined $ConstraintsModel) {
$ENV{'CCC_ANALYZER_CONSTRAINTS_MODEL'} = $ConstraintsModel;
$Options{'CCC_ANALYZER_CONSTRAINTS_MODEL'} = $ConstraintsModel;
}
if (defined $InternalStats) {
$ENV{'CCC_ANALYZER_INTERNAL_STATS'} = 1;
$Options{'CCC_ANALYZER_INTERNAL_STATS'} = 1;
}
if (defined $OutputFormat) {
$ENV{'CCC_ANALYZER_OUTPUT_FORMAT'} = $OutputFormat;
$Options{'CCC_ANALYZER_OUTPUT_FORMAT'} = $OutputFormat;
}
# Run the build.
my $ExitStatus = RunBuildCommand(\@ARGV, $IgnoreErrors, $Cmd, $CmdCXX);
my $ExitStatus = RunBuildCommand(\@ARGV, $IgnoreErrors, $Cmd, $CmdCXX,
\%Options);
if (defined $OutputFormat) {
if ($OutputFormat =~ /plist/) {