summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2019-03-19 20:39:34 +0200
committerGitHub <noreply@github.com>2019-03-19 20:39:34 +0200
commit44dd5535f056922294867bac2eb07b57f21bede6 (patch)
treeef603fb176951caac7201046d0204a6e489a7791
parent3d0b110ec2e5e0e9eddc4dcfeb925e6f62dbcba0 (diff)
parenta223b20bb60c7c643d3d4e9581101e5f54522c57 (diff)
downloadmeson-44dd5535f056922294867bac2eb07b57f21bede6.tar.gz
Merge pull request #4724 from jon-turney/lib-machine-always
Fix linking when cross-compiling and a windows resource is first object
-rw-r--r--mesonbuild/compilers/c.py9
-rw-r--r--mesonbuild/environment.py2
-rw-r--r--mesonbuild/linkers.py9
-rw-r--r--test cases/windows/5 resources/res/dummy.c0
-rw-r--r--test cases/windows/5 resources/res/meson.build4
5 files changed, 20 insertions, 4 deletions
diff --git a/mesonbuild/compilers/c.py b/mesonbuild/compilers/c.py
index 3548b6d19..6ab14d27a 100644
--- a/mesonbuild/compilers/c.py
+++ b/mesonbuild/compilers/c.py
@@ -1399,6 +1399,13 @@ class VisualStudioCCompiler(CCompiler):
self.base_options = ['b_pch', 'b_ndebug', 'b_vscrt'] # FIXME add lto, pgo and the like
self.target = target
self.is_64 = ('x64' in target) or ('x86_64' in target)
+ # do some canonicalization of target machine
+ if 'x86_64' in target:
+ self.machine = 'x64'
+ elif '86' in target:
+ self.machine = 'x86'
+ else:
+ self.machine = target
# Override CCompiler.get_always_args
def get_always_args(self):
@@ -1475,7 +1482,7 @@ class VisualStudioCCompiler(CCompiler):
return ['/nologo']
def get_linker_output_args(self, outputname):
- return ['/OUT:' + outputname]
+ return ['/MACHINE:' + self.machine, '/OUT:' + outputname]
def get_linker_search_args(self, dirname):
return ['/LIBPATH:' + dirname]
diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py
index ac6e70a6d..58adb0696 100644
--- a/mesonbuild/environment.py
+++ b/mesonbuild/environment.py
@@ -1179,7 +1179,7 @@ class Environment:
popen_exceptions[' '.join(linker + [arg])] = e
continue
if '/OUT:' in out.upper() or '/OUT:' in err.upper():
- return VisualStudioLinker(linker)
+ return VisualStudioLinker(linker, getattr(compiler, 'machine', None))
if p.returncode == 0 and ('armar' in linker or 'armar.exe' in linker):
return ArmarLinker(linker)
if 'DMD32 D Compiler' in out or 'DMD64 D Compiler' in out:
diff --git a/mesonbuild/linkers.py b/mesonbuild/linkers.py
index 543251462..c6302bfc4 100644
--- a/mesonbuild/linkers.py
+++ b/mesonbuild/linkers.py
@@ -26,8 +26,9 @@ class StaticLinker:
class VisualStudioLinker(StaticLinker):
always_args = ['/NOLOGO']
- def __init__(self, exelist):
+ def __init__(self, exelist, machine):
self.exelist = exelist
+ self.machine = machine
def get_exelist(self):
return self.exelist[:]
@@ -39,7 +40,11 @@ class VisualStudioLinker(StaticLinker):
return []
def get_output_args(self, target):
- return ['/OUT:' + target]
+ args = []
+ if self.machine:
+ args += ['/MACHINE:' + self.machine]
+ args += ['/OUT:' + target]
+ return args
def get_coverage_link_args(self):
return []
diff --git a/test cases/windows/5 resources/res/dummy.c b/test cases/windows/5 resources/res/dummy.c
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/test cases/windows/5 resources/res/dummy.c
diff --git a/test cases/windows/5 resources/res/meson.build b/test cases/windows/5 resources/res/meson.build
index 6d501a2e3..160d6518a 100644
--- a/test cases/windows/5 resources/res/meson.build
+++ b/test cases/windows/5 resources/res/meson.build
@@ -3,3 +3,7 @@ win = import('windows')
res = win.compile_resources('myres.rc',
depend_files: 'sample.ico',
include_directories : inc)
+
+# test that with MSVC tools, LIB/LINK invokes CVTRES with correct /MACHINE
+static_library('reslib', res, 'dummy.c')
+shared_library('shreslib', res, 'dummy.c')