aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/environment.py
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/environment.py')
-rw-r--r--mesonbuild/environment.py69
1 files changed, 15 insertions, 54 deletions
diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py
index 098f8ca..e673d50 100644
--- a/mesonbuild/environment.py
+++ b/mesonbuild/environment.py
@@ -17,6 +17,7 @@ from . import coredata
from . import mesonlib
from . import mlog
from .compilers import *
+from .mesonlib import Popen_safe
import configparser
import shutil
@@ -42,11 +43,10 @@ def find_coverage_tools():
def detect_ninja():
for n in ['ninja', 'ninja-build']:
try:
- p = subprocess.Popen([n, '--version'], stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
+ p, version = Popen_safe([n, '--version'])[0:2]
except (FileNotFoundError, PermissionError):
# Doesn't exist in PATH or isn't executable
continue
- version = p.communicate()[0].decode(errors='ignore')
# Perhaps we should add a way for the caller to know the failure mode
# (not found or too old)
if p.returncode == 0 and mesonlib.version_compare(version, ">=1.6"):
@@ -306,9 +306,7 @@ class Environment():
# Arguments to output compiler pre-processor defines to stdout
# gcc, g++, and gfortran all support these arguments
args = compiler + ['-E', '-dM', '-']
- p = subprocess.Popen(args, universal_newlines=True,
- stdin=subprocess.PIPE, stdout=subprocess.PIPE)
- output = p.communicate('')[0]
+ p, output = Popen_safe(args, write='', stdin=subprocess.PIPE)[0:2]
if p.returncode != 0:
raise EnvironmentException('Unable to detect GNU compiler type:\n' + output)
# Parse several lines of the type:
@@ -372,14 +370,10 @@ class Environment():
arg = '/?'
else:
arg = '--version'
- p = subprocess.Popen([compiler, arg], stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
+ p, out, err = Popen_safe([compiler, arg])
except OSError as e:
popen_exceptions[' '.join([compiler, arg])] = e
continue
- (out, err) = p.communicate()
- out = out.decode(errors='ignore')
- err = err.decode(errors='ignore')
version = search_version(out)
if 'Free Software Foundation' in out:
defines = self.get_gnu_compiler_defines([compiler])
@@ -428,15 +422,10 @@ class Environment():
for compiler in compilers:
for arg in ['--version', '-V']:
try:
- p = subprocess.Popen([compiler, arg],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
+ p, out, err = Popen_safe([compiler, arg])
except OSError as e:
popen_exceptions[' '.join([compiler, arg])] = e
continue
- (out, err) = p.communicate()
- out = out.decode(errors='ignore')
- err = err.decode(errors='ignore')
version = search_version(out)
@@ -512,15 +501,10 @@ class Environment():
else:
arg = '--version'
try:
- p = subprocess.Popen([compiler, arg],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
+ p, out, err = Popen_safe([compiler, arg])
except OSError as e:
popen_exceptions[' '.join([compiler, arg])] = e
continue
- (out, err) = p.communicate()
- out = out.decode(errors='ignore')
- err = err.decode(errors='ignore')
version = search_version(out)
if 'Free Software Foundation' in out:
defines = self.get_gnu_compiler_defines([compiler])
@@ -559,12 +543,9 @@ class Environment():
is_cross = False
exe_wrap = None
try:
- p = subprocess.Popen(exelist + ['--version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ p, out, err = Popen_safe(exelist + ['--version'])
except OSError:
raise EnvironmentException('Could not execute ObjC compiler "%s"' % ' '.join(exelist))
- (out, err) = p.communicate()
- out = out.decode(errors='ignore')
- err = err.decode(errors='ignore')
version = search_version(out)
if 'Free Software Foundation' in out:
defines = self.get_gnu_compiler_defines(exelist)
@@ -587,12 +568,9 @@ class Environment():
is_cross = False
exe_wrap = None
try:
- p = subprocess.Popen(exelist + ['--version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ p, out, err = Popen_safe(exelist + ['--version'])
except OSError:
raise EnvironmentException('Could not execute ObjC++ compiler "%s"' % ' '.join(exelist))
- (out, err) = p.communicate()
- out = out.decode(errors='ignore')
- err = err.decode(errors='ignore')
version = search_version(out)
if 'Free Software Foundation' in out:
defines = self.get_gnu_compiler_defines(exelist)
@@ -604,12 +582,9 @@ class Environment():
def detect_java_compiler(self):
exelist = ['javac']
try:
- p = subprocess.Popen(exelist + ['-version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ p, out, err = Popen_safe(exelist + ['-version'])
except OSError:
raise EnvironmentException('Could not execute Java compiler "%s"' % ' '.join(exelist))
- (out, err) = p.communicate()
- out = out.decode(errors='ignore')
- err = err.decode(errors='ignore')
version = search_version(err)
if 'javac' in err:
return JavaCompiler(exelist, version)
@@ -618,12 +593,9 @@ class Environment():
def detect_cs_compiler(self):
exelist = ['mcs']
try:
- p = subprocess.Popen(exelist + ['--version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ p, out, err = Popen_safe(exelist + ['--version'])
except OSError:
raise EnvironmentException('Could not execute C# compiler "%s"' % ' '.join(exelist))
- (out, err) = p.communicate()
- out = out.decode(errors='ignore')
- err = err.decode(errors='ignore')
version = search_version(out)
if 'Mono' in out:
return MonoCompiler(exelist, version)
@@ -632,11 +604,9 @@ class Environment():
def detect_vala_compiler(self):
exelist = ['valac']
try:
- p = subprocess.Popen(exelist + ['--version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ p, out = Popen_safe(exelist + ['--version'])[0:2]
except OSError:
raise EnvironmentException('Could not execute Vala compiler "%s"' % ' '.join(exelist))
- (out, _) = p.communicate()
- out = out.decode(errors='ignore')
version = search_version(out)
if 'Vala' in out:
return ValaCompiler(exelist, version)
@@ -645,11 +615,9 @@ class Environment():
def detect_rust_compiler(self):
exelist = ['rustc']
try:
- p = subprocess.Popen(exelist + ['--version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ p, out = Popen_safe(exelist + ['--version'])[0:2]
except OSError:
raise EnvironmentException('Could not execute Rust compiler "%s"' % ' '.join(exelist))
- (out, _) = p.communicate()
- out = out.decode(errors='ignore')
version = search_version(out)
if 'rustc' in out:
return RustCompiler(exelist, version)
@@ -679,11 +647,9 @@ class Environment():
raise EnvironmentException('Could not find any supported D compiler.')
try:
- p = subprocess.Popen(exelist + ['--version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ p, out = Popen_safe(exelist + ['--version'])[0:2]
except OSError:
raise EnvironmentException('Could not execute D compiler "%s"' % ' '.join(exelist))
- (out, _) = p.communicate()
- out = out.decode(errors='ignore')
version = search_version(out)
if 'LLVM D compiler' in out:
return LLVMDCompiler(exelist, version, is_cross)
@@ -696,11 +662,9 @@ class Environment():
def detect_swift_compiler(self):
exelist = ['swiftc']
try:
- p = subprocess.Popen(exelist + ['-v'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ p, _, err = Popen_safe(exelist + ['-v'])
except OSError:
raise EnvironmentException('Could not execute Swift compiler "%s"' % ' '.join(exelist))
- (_, err) = p.communicate()
- err = err.decode(errors='ignore')
version = search_version(err)
if 'Swift' in err:
return SwiftCompiler(exelist, version)
@@ -723,12 +687,9 @@ class Environment():
else:
arg = '--version'
try:
- p = subprocess.Popen([linker, arg], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ p, out, err = Popen_safe([linker, arg])
except OSError:
raise EnvironmentException('Could not execute static linker "%s".' % linker)
- (out, err) = p.communicate()
- out = out.decode(errors='ignore')
- err = err.decode(errors='ignore')
if '/OUT:' in out or '/OUT:' in err:
return VisualStudioLinker([linker])
if p.returncode == 0: