bear: fix wrapper detection patch by checking result of find_executable
With the wrapper detection patch, if a build invokes an executable that cannot be found in PATH by `find_executable`, bear will fail with an `AttributeError` in `os.path.realpath`. This can happen if the build invokes some project-local tool or command, like `./build-something`. Instead of calling using the result of `find_executable` directly, first check whether the executable was found and fall back to original Bear behavior if it was not.
This commit is contained in:
parent
a6a8712146
commit
4cb889f166
1 changed files with 14 additions and 10 deletions
|
@ -1,6 +1,6 @@
|
|||
--- Bear-2.3.11-src/bear/main.py.in 1970-01-01 01:00:01.000000000 +0100
|
||||
+++ Bear-2.3.11-src-patch/bear/main.py.in 1970-01-01 01:00:01.000000000 +0100
|
||||
@@ -49,6 +49,7 @@
|
||||
--- a/bear/main.py.in
|
||||
+++ b/bear/main.py.in
|
||||
@@ -49,6 +49,7 @@ import tempfile
|
||||
import shutil
|
||||
import contextlib
|
||||
import logging
|
||||
|
@ -8,16 +8,20 @@
|
|||
|
||||
# Map of ignored compiler option for the creation of a compilation database.
|
||||
# This map is used in _split_command method, which classifies the parameters
|
||||
@@ -540,7 +541,11 @@
|
||||
any(pattern.match(cmd) for pattern in COMPILER_PATTERNS_CXX)
|
||||
@@ -569,7 +570,15 @@ class Compilation:
|
||||
(compiler, language, rest of the command) otherwise """
|
||||
|
||||
if command: # not empty list will allow to index '0' and '1:'
|
||||
- executable = os.path.basename(command[0]) # type: str
|
||||
+ absolute_executable = os.path.realpath(find_executable(command[0]))
|
||||
+ if 'wrapper' in absolute_executable:
|
||||
+ return None
|
||||
+
|
||||
+ executable = os.path.basename(absolute_executable) # type: str
|
||||
+ executable_file = find_executable(command[0])
|
||||
+ if executable_file:
|
||||
+ absolute_executable = os.path.realpath(executable_file)
|
||||
+ # Ignore Nix wrappers.
|
||||
+ if 'wrapper' in absolute_executable:
|
||||
+ return None
|
||||
+ executable = os.path.basename(absolute_executable)
|
||||
+ else:
|
||||
+ executable = os.path.basename(command[0])
|
||||
parameters = command[1:] # type: List[str]
|
||||
# 'wrapper' 'parameters' and
|
||||
# 'wrapper' 'compiler' 'parameters' are valid.
|
Loading…
Reference in a new issue