[analyzer] Improved behavior if Clang was not found, part II

- scan-build help: display 'Could not query Clang for the list of available checkers.' + the reason why it happened so if clang was not found.
- display requested/forced help in case of --use-analyzer=Xcode.

llvm-svn: 247828
This commit is contained in:
Anton Yartsev 2015-09-16 18:12:15 +00:00
parent 5e61cfdb9e
commit c647a6df72

View File

@ -1100,6 +1100,7 @@ sub RunBuildCommand {
sub DisplayHelp {
my $ArgClangNotFoundErrMsg = shift;
print <<ENDTEXT;
USAGE: $Prog [options] <build command> [build options]
@ -1348,6 +1349,12 @@ ENDTEXT
}
close PS;
}
else {
print " *** Could not query Clang for the list of available checkers.\n";
if (defined $ArgClangNotFoundErrMsg) {
print " *** Reason: $ArgClangNotFoundErrMsg\n";
}
}
print <<ENDTEXT
@ -1392,6 +1399,45 @@ sub ShellEscape {
return $arg;
}
##----------------------------------------------------------------------------##
# FindClang - searches for 'clang' executable.
##----------------------------------------------------------------------------##
sub FindClang {
if (!defined $Options{AnalyzerDiscoveryMethod}) {
$Clang = Cwd::realpath("$RealBin/bin/clang") if (-f "$RealBin/bin/clang");
if (!defined $Clang || ! -x $Clang) {
$Clang = Cwd::realpath("$RealBin/clang") if (-f "$RealBin/clang");
}
if (!defined $Clang || ! -x $Clang) {
return "error: Cannot find an executable 'clang' relative to" .
" scan-build. Consider using --use-analyzer to pick a version of" .
" 'clang' to use for static analysis.\n";
}
}
else {
if ($Options{AnalyzerDiscoveryMethod} =~ /^[Xx]code$/) {
my $xcrun = `which xcrun`;
chomp $xcrun;
if ($xcrun eq "") {
return "Cannot find 'xcrun' to find 'clang' for analysis.\n";
}
$Clang = `$xcrun -toolchain XcodeDefault -find clang`;
chomp $Clang;
if ($Clang eq "") {
return "No 'clang' executable found by 'xcrun'\n";
}
}
else {
$Clang = $Options{AnalyzerDiscoveryMethod};
if (!defined $Clang or not -x $Clang) {
return "Cannot find an executable clang at '$Options{AnalyzerDiscoveryMethod}'\n";
}
}
}
return undef;
}
##----------------------------------------------------------------------------##
# Process command-line arguments.
##----------------------------------------------------------------------------##
@ -1642,45 +1688,15 @@ if (!@ARGV and !$RequestDisplayHelp) {
$ForceDisplayHelp = 1;
}
# Find 'clang'
if (!defined $Options{AnalyzerDiscoveryMethod}) {
$Clang = Cwd::realpath("$RealBin/bin/clang") if (-f "$RealBin/bin/clang");
if (!defined $Clang || ! -x $Clang) {
$Clang = Cwd::realpath("$RealBin/clang") if (-f "$RealBin/clang");
}
if (!defined $Clang || ! -x $Clang) {
if (!$RequestDisplayHelp && !$ForceDisplayHelp) {
DieDiag("error: Cannot find an executable 'clang' relative to scan-build." .
" Consider using --use-analyzer to pick a version of 'clang' to use for static analysis.\n");
}
}
}
else {
if ($Options{AnalyzerDiscoveryMethod} =~ /^[Xx]code$/) {
my $xcrun = `which xcrun`;
chomp $xcrun;
if ($xcrun eq "") {
DieDiag("Cannot find 'xcrun' to find 'clang' for analysis.\n");
}
$Clang = `$xcrun -toolchain XcodeDefault -find clang`;
chomp $Clang;
if ($Clang eq "") {
DieDiag("No 'clang' executable found by 'xcrun'\n");
}
}
else {
$Clang = $Options{AnalyzerDiscoveryMethod};
if (!defined $Clang or not -x $Clang) {
DieDiag("Cannot find an executable clang at '$Options{AnalyzerDiscoveryMethod}'\n");
}
}
}
my $ClangNotFoundErrMsg = FindClang();
if ($ForceDisplayHelp || $RequestDisplayHelp) {
DisplayHelp();
DisplayHelp($ClangNotFoundErrMsg);
exit $ForceDisplayHelp;
}
DieDiag($ClangNotFoundErrMsg) if (defined $ClangNotFoundErrMsg);
$ClangCXX = $Clang;
if ($Clang !~ /\+\+(\.exe)?$/) {
# If $Clang holds the name of the clang++ executable then we leave