scan-build: Determine the location of the clang binary before printing help.

We need the clang executable to print the list of available checkers.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@163925 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jordan Rose 2012-09-14 18:59:03 +00:00
Родитель b3cd3c0c8a
Коммит a778d710e2
1 изменённых файлов: 63 добавлений и 60 удалений

Просмотреть файл

@ -1135,73 +1135,74 @@ foreach my $lang ("c", "objective-c", "objective-c++", "c++") {
}
# Query clang for complete list of checkers.
pipe(FROM_CHILD, TO_PARENT);
my $pid = fork();
if ($pid == 0) {
close FROM_CHILD;
open(STDOUT,">&", \*TO_PARENT);
open(STDERR,">&", \*TO_PARENT);
exec $Clang, ('-cc1', @PluginsToLoad , '-analyzer-checker-help');
}
close(TO_PARENT);
my $foundCheckers = 0;
while(<FROM_CHILD>) {
if (/CHECKERS:/) {
$foundCheckers = 1;
last;
if (defined $Clang && -x $Clang) {
pipe(FROM_CHILD, TO_PARENT);
my $pid = fork();
if ($pid == 0) {
close FROM_CHILD;
open(STDOUT,">&", \*TO_PARENT);
open(STDERR,">&", \*TO_PARENT);
exec $Clang, ('-cc1', @PluginsToLoad , '-analyzer-checker-help');
}
}
if (!$foundCheckers) {
print " *** Could not query Clang for the list of available checkers.";
}
else {
print("\nAVAILABLE CHECKERS:\n\n");
my $skip = 0;
close(TO_PARENT);
my $foundCheckers = 0;
while(<FROM_CHILD>) {
if (/experimental/) {
$skip = 1;
next;
if (/CHECKERS:/) {
$foundCheckers = 1;
last;
}
if ($skip) {
next if (!/^\s\s[^\s]/);
$skip = 0;
}
s/^\s\s//;
if (/^([^\s]+)/) {
# Is the checker enabled?
my $checker = $1;
my $enabled = 0;
my $aggregate = "";
foreach my $domain (split /\./, $checker) {
$aggregate .= $domain;
if ($EnabledCheckers{$aggregate}) {
$enabled =1;
last;
}
# append a dot, if an additional domain is added in the next iteration
$aggregate .= ".";
}
if (!$foundCheckers) {
print " *** Could not query Clang for the list of available checkers.";
}
else {
print("\nAVAILABLE CHECKERS:\n\n");
my $skip = 0;
while(<FROM_CHILD>) {
if (/experimental/) {
$skip = 1;
next;
}
if ($skip) {
next if (!/^\s\s[^\s]/);
$skip = 0;
}
s/^\s\s//;
if (/^([^\s]+)/) {
# Is the checker enabled?
my $checker = $1;
my $enabled = 0;
my $aggregate = "";
foreach my $domain (split /\./, $checker) {
$aggregate .= $domain;
if ($EnabledCheckers{$aggregate}) {
$enabled =1;
last;
}
# append a dot, if an additional domain is added in the next iteration
$aggregate .= ".";
}
if ($enabled) {
print " + ";
if ($enabled) {
print " + ";
}
else {
print " ";
}
}
else {
print " ";
}
print $_;
}
else {
print " ";
}
print $_;
}
print "\nNOTE: \"+\" indicates that an analysis is enabled by default.\n"
}
waitpid($pid,0);
close(FROM_CHILD);
}
waitpid($pid,0);
close(FROM_CHILD);
print <<ENDTEXT
NOTE: "+" indicates that an analysis is enabled by default.
BUILD OPTIONS
You can specify any build option acceptable to the build command.
@ -1456,11 +1457,6 @@ if (!@ARGV and $displayHelp == 0) {
$displayHelp = 1;
}
if ($displayHelp) {
DisplayHelp();
exit 1;
}
# Find 'clang'
if (!defined $AnalyzerDiscoveryMethod) {
$Clang = Cwd::realpath("$RealBin/bin/clang");
@ -1468,8 +1464,10 @@ if (!defined $AnalyzerDiscoveryMethod) {
$Clang = Cwd::realpath("$RealBin/clang");
}
if (!defined $Clang || ! -x $Clang) {
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");
if (!$displayHelp) {
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 {
@ -1493,6 +1491,11 @@ else {
}
}
if ($displayHelp) {
DisplayHelp();
exit 1;
}
$ClangCXX = $Clang;
$ClangCXX =~ s/\-\d+\.\d+$//;
$ClangCXX .= "++";