aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNirbheek Chauhan <nirbheek@centricular.com>2017-03-24 18:31:22 +0530
committerNirbheek Chauhan <nirbheek@centricular.com>2017-03-27 11:25:22 +0530
commit14d0f381580222f4b4eac376f514fcfcfdb6ee4c (patch)
tree5105ec03bd92fc4fc5dc528aaa6c886c572baec0
parentff4b32741acb36e8b2cf3d83fe0d513ad5753e59 (diff)
downloadmeson-14d0f381580222f4b4eac376f514fcfcfdb6ee4c.zip
meson-14d0f381580222f4b4eac376f514fcfcfdb6ee4c.tar.gz
meson-14d0f381580222f4b4eac376f514fcfcfdb6ee4c.tar.bz2
Try harder to use the C compiler for compiling asm
Use an ordered dict for the compiler dictionary and sort it according to a priority order: fortran, c, c++, etc. This also ensures that builds are reproducible because it would be a toss-up whether a C or a C++ compiler would be used based on the order in which compilers.items() would return items. Closes https://github.com/mesonbuild/meson/issues/1370
-rw-r--r--mesonbuild/build.py23
-rw-r--r--mesonbuild/coredata.py5
-rw-r--r--mesonbuild/interpreter.py14
3 files changed, 25 insertions, 17 deletions
diff --git a/mesonbuild/build.py b/mesonbuild/build.py
index 2806331..c28a8a4 100644
--- a/mesonbuild/build.py
+++ b/mesonbuild/build.py
@@ -391,13 +391,6 @@ class BuildTarget(Target):
raise InvalidArguments(msg)
@staticmethod
- def can_compile_sources(compiler, sources):
- for s in sources:
- if compiler.can_compile(s):
- return True
- return False
-
- @staticmethod
def can_compile_remove_sources(compiler, sources):
removed = False
for s in sources[:]:
@@ -442,13 +435,15 @@ class BuildTarget(Target):
if not s.endswith(lang_suffixes['vala']):
sources.append(s)
if sources:
- # Add compilers based on the above sources
- for lang, compiler in compilers.items():
- # We try to be conservative because sometimes people add files
- # in the list of sources that we can't determine the type based
- # just on the suffix.
- if self.can_compile_sources(compiler, sources):
- self.compilers[lang] = compiler
+ # For each source, try to add one compiler that can compile it.
+ # It's ok if no compilers can do so, because users are expected to
+ # be able to add arbitrary non-source files to the sources list.
+ for s in sources:
+ for lang, compiler in compilers.items():
+ if compiler.can_compile(s):
+ if lang not in self.compilers:
+ self.compilers[lang] = compiler
+ break
else:
# No source files, target consists of only object files of unknown
# origin. Just add the first clike compiler that we have and hope
diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py
index 9562211..51eeaff 100644
--- a/mesonbuild/coredata.py
+++ b/mesonbuild/coredata.py
@@ -14,6 +14,7 @@
import pickle, os, uuid
from pathlib import PurePath
+from collections import OrderedDict
from .mesonlib import MesonException, commonpath
from .mesonlib import default_libdir, default_libexecdir, default_prefix
@@ -128,8 +129,8 @@ class CoreData:
else:
self.cross_file = None
self.wrap_mode = options.wrap_mode
- self.compilers = {}
- self.cross_compilers = {}
+ self.compilers = OrderedDict()
+ self.cross_compilers = OrderedDict()
self.deps = {}
self.modules = {}
# Only to print a warning if it changes between Meson invocations.
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 5d3c095..56e5b8f 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -1752,10 +1752,22 @@ class Interpreter(InterpreterBase):
self.coredata.compiler_options = new_options
return comp, cross_comp
+ @staticmethod
+ def sort_clike(lang):
+ '''
+ Sorting function to sort the list of languages according to
+ reversed(compilers.clike_langs) and append the unknown langs in the end.
+ The purpose is to prefer C over C++ for files that can be compiled by
+ both such as assembly, C, etc. Also applies to ObjC, ObjC++, etc.
+ '''
+ if lang not in compilers.clike_langs:
+ return 1
+ return -compilers.clike_langs.index(lang)
+
def add_languages(self, args, required):
success = True
need_cross_compiler = self.environment.is_cross_build() and self.environment.cross_info.need_cross_compiler()
- for lang in args:
+ for lang in sorted(args, key=self.sort_clike):
lang = lang.lower()
if lang in self.coredata.compilers:
comp = self.coredata.compilers[lang]