aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2016-08-15 20:39:53 +0200
committerGitHub <noreply@github.com>2016-08-15 20:39:53 +0200
commit5b1559a4e8fdd9eb506e69371df975a223abde46 (patch)
tree82303cc582ff2fa1a5cb5cf77b54b78518bed42f
parentc6ca8a59be5f1a8dd42f2087c7f3f29a4e76a0ed (diff)
parenta5e01fa15522c33dfbdfee4cec43227026184c84 (diff)
downloadmeson-5b1559a4e8fdd9eb506e69371df975a223abde46.zip
meson-5b1559a4e8fdd9eb506e69371df975a223abde46.tar.gz
meson-5b1559a4e8fdd9eb506e69371df975a223abde46.tar.bz2
Merge pull request #673 from centricular/inherited-env-flags
Two changes to how we inherit cflags/linkflags from the environment
-rw-r--r--mesonbuild/compilers.py14
-rw-r--r--mesonbuild/environment.py69
-rw-r--r--mesonbuild/interpreter.py5
3 files changed, 55 insertions, 33 deletions
diff --git a/mesonbuild/compilers.py b/mesonbuild/compilers.py
index 30eecec..d020033 100644
--- a/mesonbuild/compilers.py
+++ b/mesonbuild/compilers.py
@@ -1255,7 +1255,7 @@ class ValaCompiler(Compiler):
return False # Because compiles into C.
def get_exelist(self):
- return self.exelist
+ return self.exelist[:]
def get_werror_args(self):
return ['--fatal-warnings']
@@ -1299,7 +1299,7 @@ class RustCompiler(Compiler):
return ' '.join(self.exelist)
def get_exelist(self):
- return self.exelist
+ return self.exelist[:]
def get_id(self):
return self.id
@@ -1343,7 +1343,7 @@ class SwiftCompiler(Compiler):
return self.id
def get_linker_exelist(self):
- return self.exelist
+ return self.exelist[:]
def name_string(self):
return ' '.join(self.exelist)
@@ -1352,7 +1352,7 @@ class SwiftCompiler(Compiler):
return True
def get_exelist(self):
- return self.exelist
+ return self.exelist[:]
def get_werror_args(self):
return ['--fatal-warnings']
@@ -1973,7 +1973,7 @@ class FortranCompiler(Compiler):
return ' '.join(self.exelist)
def get_exelist(self):
- return self.exelist
+ return self.exelist[:]
def get_language(self):
return self.language
@@ -2240,7 +2240,7 @@ class VisualStudioLinker():
self.exelist = exelist
def get_exelist(self):
- return self.exelist
+ return self.exelist[:]
def get_std_link_args(self):
return []
@@ -2292,7 +2292,7 @@ class ArLinker():
return []
def get_exelist(self):
- return self.exelist
+ return self.exelist[:]
def get_std_link_args(self):
return self.std_args
diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py
index 404ed3e..16af0d1 100644
--- a/mesonbuild/environment.py
+++ b/mesonbuild/environment.py
@@ -13,7 +13,9 @@
# limitations under the License.
import os, re, subprocess, platform
-from . import coredata, mesonlib
+from . import coredata
+from . import mesonlib
+from . import mlog
from .compilers import *
import configparser
@@ -699,30 +701,47 @@ class Environment():
return self.coredata.get_builtin_option('datadir')
-def get_args_from_envvars(lang):
- if lang == 'c':
- compile_args = os.environ.get('CFLAGS', '').split()
- link_args = compile_args + os.environ.get('LDFLAGS', '').split()
- compile_args += os.environ.get('CPPFLAGS', '').split()
- elif lang == 'cpp':
- compile_args = os.environ.get('CXXFLAGS', '').split()
- link_args = compile_args + os.environ.get('LDFLAGS', '').split()
- compile_args += os.environ.get('CPPFLAGS', '').split()
- elif lang == 'objc':
- compile_args = os.environ.get('OBJCFLAGS', '').split()
- link_args = compile_args + os.environ.get('LDFLAGS', '').split()
- compile_args += os.environ.get('CPPFLAGS', '').split()
- elif lang == 'objcpp':
- compile_args = os.environ.get('OBJCXXFLAGS', '').split()
- link_args = compile_args + os.environ.get('LDFLAGS', '').split()
- compile_args += os.environ.get('CPPFLAGS', '').split()
- elif lang == 'fortran':
- compile_args = os.environ.get('FFLAGS', '').split()
- link_args = compile_args + os.environ.get('LDFLAGS', '').split()
- else:
- compile_args = []
- link_args = []
- return (compile_args, link_args)
+def get_args_from_envvars(lang, compiler_is_linker):
+ """
+ @lang: Language to fetch environment flags for
+
+ Returns a tuple of (compile_flags, link_flags) for the specified language
+ from the inherited environment
+ """
+ def log_var(var, val):
+ if val:
+ mlog.log('Appending {} from environment: {!r}'.format(var, val))
+
+ if lang not in ('c', 'cpp', 'objc', 'objcpp', 'fortran'):
+ return ([], [])
+
+ # Compile flags
+ cflags_mapping = {'c': 'CFLAGS', 'cpp': 'CXXFLAGS',
+ 'objc': 'OBJCFLAGS', 'objcpp': 'OBJCXXFLAGS',
+ 'fortran': 'FFLAGS'}
+ compile_flags = os.environ.get(cflags_mapping[lang], '')
+ log_var(cflags_mapping[lang], compile_flags)
+ compile_flags = compile_flags.split()
+
+ # Link flags (same for all languages)
+ link_flags = os.environ.get('LDFLAGS', '')
+ log_var('LDFLAGS', link_flags)
+ link_flags = link_flags.split()
+ if compiler_is_linker:
+ # When the compiler is used as a wrapper around the linker (such as
+ # with GCC and Clang), the compile flags can be needed while linking
+ # too. This is also what Autotools does. However, we don't want to do
+ # this when the linker is stand-alone such as with MSVC C/C++, etc.
+ link_flags = compile_flags + link_flags
+
+ # Pre-processof rlags (not for fortran)
+ preproc_flags = ''
+ if lang in ('c', 'cpp', 'objc', 'objcpp'):
+ preproc_flags = os.environ.get('CPPFLAGS', '')
+ log_var('CPPFLAGS', preproc_flags)
+ compile_flags += preproc_flags.split()
+
+ return (compile_flags, link_flags)
class CrossBuildInfo():
def __init__(self, filename):
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 9c2a74c..8645b68 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -1619,8 +1619,11 @@ class Interpreter():
else:
raise
mlog.log('Native %s compiler: ' % lang, mlog.bold(' '.join(comp.get_exelist())), ' (%s %s)' % (comp.id, comp.version), sep='')
+ compiler_is_linker = False
+ if hasattr(comp, 'get_linker_exelist'):
+ compiler_is_linker = (comp.get_exelist() == comp.get_linker_exelist())
if not comp.get_language() in self.coredata.external_args:
- (ext_compile_args, ext_link_args) = environment.get_args_from_envvars(comp.get_language())
+ (ext_compile_args, ext_link_args) = environment.get_args_from_envvars(comp.get_language(), compiler_is_linker)
self.coredata.external_args[comp.get_language()] = ext_compile_args
self.coredata.external_link_args[comp.get_language()] = ext_link_args
self.build.add_compiler(comp)