Probe Windows resource compiler type

Determine the type of the Windows resource compiler by looking at its
output, not its name.

Also log the name and version of the resource compiler we are using.
pull/4307/head
Jon Turney 6 years ago
parent d769de316d
commit d0acada1d5
No known key found for this signature in database
GPG Key ID: C7C86F0370285C81
  1. 26
      mesonbuild/modules/windows.py

@ -12,7 +12,9 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import enum
import os import os
import re
from .. import mlog from .. import mlog
from .. import mesonlib, build from .. import mesonlib, build
@ -24,6 +26,10 @@ from ..interpreter import CustomTargetHolder
from ..interpreterbase import permittedKwargs, FeatureNewKwargs from ..interpreterbase import permittedKwargs, FeatureNewKwargs
from ..dependencies import ExternalProgram from ..dependencies import ExternalProgram
class ResourceCompilerType(enum.Enum):
windres = 1
rc = 2
class WindowsModule(ExtensionModule): class WindowsModule(ExtensionModule):
def detect_compiler(self, compilers): def detect_compiler(self, compilers):
@ -62,7 +68,19 @@ class WindowsModule(ExtensionModule):
if not rescomp.found(): if not rescomp.found():
raise MesonException('Could not find Windows resource compiler') raise MesonException('Could not find Windows resource compiler')
self._rescomp = rescomp for (arg, match, type) in [
('/?', '^.*Microsoft.*Resource Compiler.*$', ResourceCompilerType.rc),
('--version', '^.*GNU windres.*$', ResourceCompilerType.windres),
]:
p, o, e = mesonlib.Popen_safe(rescomp.get_command() + [arg])
m = re.search(match, o, re.MULTILINE)
if m:
mlog.log('Windows resource compiler: %s' % m.group())
self._rescomp = (rescomp, type)
break
else:
raise MesonException('Could not determine type of Windows resource compiler')
return self._rescomp return self._rescomp
@FeatureNewKwargs('windows.compile_resources', '0.47.0', ['depend_files', 'depends']) @FeatureNewKwargs('windows.compile_resources', '0.47.0', ['depend_files', 'depends'])
@ -80,8 +98,8 @@ class WindowsModule(ExtensionModule):
raise MesonException('Resource include dirs should be include_directories().') raise MesonException('Resource include dirs should be include_directories().')
extra_args += get_include_args(inc_dirs) extra_args += get_include_args(inc_dirs)
rescomp = self._find_resource_compiler(state) rescomp, rescomp_type = self._find_resource_compiler(state)
if 'rc' in rescomp.get_path(): if rescomp_type == ResourceCompilerType.rc:
# RC is used to generate .res files, a special binary resource # RC is used to generate .res files, a special binary resource
# format, which can be passed directly to LINK (apparently LINK uses # format, which can be passed directly to LINK (apparently LINK uses
# CVTRES internally to convert this to a COFF object) # CVTRES internally to convert this to a COFF object)
@ -137,7 +155,7 @@ class WindowsModule(ExtensionModule):
} }
# instruct binutils windres to generate a preprocessor depfile # instruct binutils windres to generate a preprocessor depfile
if 'windres' in rescomp.get_path(): if rescomp_type == ResourceCompilerType.windres:
res_kwargs['depfile'] = res_kwargs['output'] + '.d' res_kwargs['depfile'] = res_kwargs['output'] + '.d'
res_kwargs['command'] += ['--preprocessor-arg=-MD', '--preprocessor-arg=-MQ@OUTPUT@', '--preprocessor-arg=-MF@DEPFILE@'] res_kwargs['command'] += ['--preprocessor-arg=-MD', '--preprocessor-arg=-MQ@OUTPUT@', '--preprocessor-arg=-MF@DEPFILE@']

Loading…
Cancel
Save