mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-06 09:33:13 +00:00
[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:
parent
5e61cfdb9e
commit
c647a6df72
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user