Blame third_party/waf/waflib/Tools/ifort.py

Packit Service fa3ceb
#! /usr/bin/env python
Packit Service fa3ceb
# encoding: utf-8
Packit Service fa3ceb
# DC 2008
Packit Service fa3ceb
# Thomas Nagy 2016-2018 (ita)
Packit Service fa3ceb
Packit Service fa3ceb
import os, re, traceback
Packit Service fa3ceb
from waflib import Utils, Logs, Errors
Packit Service fa3ceb
from waflib.Tools import fc, fc_config, fc_scan, ar, ccroot
Packit Service fa3ceb
from waflib.Configure import conf
Packit Service fa3ceb
from waflib.TaskGen import after_method, feature
Packit Service fa3ceb
Packit Service fa3ceb
@conf
Packit Service fa3ceb
def find_ifort(conf):
Packit Service fa3ceb
	fc = conf.find_program('ifort', var='FC')
Packit Service fa3ceb
	conf.get_ifort_version(fc)
Packit Service fa3ceb
	conf.env.FC_NAME = 'IFORT'
Packit Service fa3ceb
Packit Service fa3ceb
@conf
Packit Service fa3ceb
def ifort_modifier_win32(self):
Packit Service fa3ceb
	v = self.env
Packit Service fa3ceb
	v.IFORT_WIN32 = True
Packit Service fa3ceb
	v.FCSTLIB_MARKER = ''
Packit Service fa3ceb
	v.FCSHLIB_MARKER = ''
Packit Service fa3ceb
Packit Service fa3ceb
	v.FCLIB_ST = v.FCSTLIB_ST = '%s.lib'
Packit Service fa3ceb
	v.FCLIBPATH_ST = v.STLIBPATH_ST = '/LIBPATH:%s'
Packit Service fa3ceb
	v.FCINCPATH_ST = '/I%s'
Packit Service fa3ceb
	v.FCDEFINES_ST = '/D%s'
Packit Service fa3ceb
Packit Service fa3ceb
	v.fcprogram_PATTERN = v.fcprogram_test_PATTERN = '%s.exe'
Packit Service fa3ceb
	v.fcshlib_PATTERN = '%s.dll'
Packit Service fa3ceb
	v.fcstlib_PATTERN = v.implib_PATTERN = '%s.lib'
Packit Service fa3ceb
Packit Service fa3ceb
	v.FCLNK_TGT_F = '/out:'
Packit Service fa3ceb
	v.FC_TGT_F = ['/c', '/o', '']
Packit Service fa3ceb
	v.FCFLAGS_fcshlib = ''
Packit Service fa3ceb
	v.LINKFLAGS_fcshlib = '/DLL'
Packit Service fa3ceb
	v.AR_TGT_F = '/out:'
Packit Service fa3ceb
	v.IMPLIB_ST = '/IMPLIB:%s'
Packit Service fa3ceb
Packit Service fa3ceb
	v.append_value('LINKFLAGS', '/subsystem:console')
Packit Service fa3ceb
	if v.IFORT_MANIFEST:
Packit Service fa3ceb
		v.append_value('LINKFLAGS', ['/MANIFEST'])
Packit Service fa3ceb
Packit Service fa3ceb
@conf
Packit Service fa3ceb
def ifort_modifier_darwin(conf):
Packit Service fa3ceb
	fc_config.fortran_modifier_darwin(conf)
Packit Service fa3ceb
Packit Service fa3ceb
@conf
Packit Service fa3ceb
def ifort_modifier_platform(conf):
Packit Service fa3ceb
	dest_os = conf.env.DEST_OS or Utils.unversioned_sys_platform()
Packit Service fa3ceb
	ifort_modifier_func = getattr(conf, 'ifort_modifier_' + dest_os, None)
Packit Service fa3ceb
	if ifort_modifier_func:
Packit Service fa3ceb
		ifort_modifier_func()
Packit Service fa3ceb
Packit Service fa3ceb
@conf
Packit Service fa3ceb
def get_ifort_version(conf, fc):
Packit Service fa3ceb
	"""
Packit Service fa3ceb
	Detects the compiler version and sets ``conf.env.FC_VERSION``
Packit Service fa3ceb
	"""
Packit Service fa3ceb
	version_re = re.compile(r"\bIntel\b.*\bVersion\s*(?P<major>\d*)\.(?P<minor>\d*)",re.I).search
Packit Service fa3ceb
	if Utils.is_win32:
Packit Service fa3ceb
		cmd = fc
Packit Service fa3ceb
	else:
Packit Service fa3ceb
		cmd = fc + ['-logo']
Packit Service fa3ceb
Packit Service fa3ceb
	out, err = fc_config.getoutput(conf, cmd, stdin=False)
Packit Service fa3ceb
	match = version_re(out) or version_re(err)
Packit Service fa3ceb
	if not match:
Packit Service fa3ceb
		conf.fatal('cannot determine ifort version.')
Packit Service fa3ceb
	k = match.groupdict()
Packit Service fa3ceb
	conf.env.FC_VERSION = (k['major'], k['minor'])
Packit Service fa3ceb
Packit Service fa3ceb
def configure(conf):
Packit Service fa3ceb
	"""
Packit Service fa3ceb
	Detects the Intel Fortran compilers
Packit Service fa3ceb
	"""
Packit Service fa3ceb
	if Utils.is_win32:
Packit Service fa3ceb
		compiler, version, path, includes, libdirs, arch = conf.detect_ifort()
Packit Service fa3ceb
		v = conf.env
Packit Service fa3ceb
		v.DEST_CPU = arch
Packit Service fa3ceb
		v.PATH = path
Packit Service fa3ceb
		v.INCLUDES = includes
Packit Service fa3ceb
		v.LIBPATH = libdirs
Packit Service fa3ceb
		v.MSVC_COMPILER = compiler
Packit Service fa3ceb
		try:
Packit Service fa3ceb
			v.MSVC_VERSION = float(version)
Packit Service fa3ceb
		except ValueError:
Packit Service fa3ceb
			v.MSVC_VERSION = float(version[:-3])
Packit Service fa3ceb
Packit Service fa3ceb
		conf.find_ifort_win32()
Packit Service fa3ceb
		conf.ifort_modifier_win32()
Packit Service fa3ceb
	else:
Packit Service fa3ceb
		conf.find_ifort()
Packit Service fa3ceb
		conf.find_program('xiar', var='AR')
Packit Service fa3ceb
		conf.find_ar()
Packit Service fa3ceb
		conf.fc_flags()
Packit Service fa3ceb
		conf.fc_add_flags()
Packit Service fa3ceb
		conf.ifort_modifier_platform()
Packit Service fa3ceb
Packit Service fa3ceb
Packit Service fa3ceb
all_ifort_platforms = [ ('intel64', 'amd64'), ('em64t', 'amd64'), ('ia32', 'x86'), ('Itanium', 'ia64')]
Packit Service fa3ceb
"""List of icl platforms"""
Packit Service fa3ceb
Packit Service fa3ceb
@conf
Packit Service fa3ceb
def gather_ifort_versions(conf, versions):
Packit Service fa3ceb
	"""
Packit Service fa3ceb
	List compiler versions by looking up registry keys
Packit Service fa3ceb
	"""
Packit Service fa3ceb
	version_pattern = re.compile(r'^...?.?\....?.?')
Packit Service fa3ceb
	try:
Packit Service fa3ceb
		all_versions = Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE, 'SOFTWARE\\Wow6432node\\Intel\\Compilers\\Fortran')
Packit Service fa3ceb
	except OSError:
Packit Service fa3ceb
		try:
Packit Service fa3ceb
			all_versions = Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE, 'SOFTWARE\\Intel\\Compilers\\Fortran')
Packit Service fa3ceb
		except OSError:
Packit Service fa3ceb
			return
Packit Service fa3ceb
	index = 0
Packit Service fa3ceb
	while 1:
Packit Service fa3ceb
		try:
Packit Service fa3ceb
			version = Utils.winreg.EnumKey(all_versions, index)
Packit Service fa3ceb
		except OSError:
Packit Service fa3ceb
			break
Packit Service fa3ceb
		index += 1
Packit Service fa3ceb
		if not version_pattern.match(version):
Packit Service fa3ceb
			continue
Packit Service fa3ceb
		targets = {}
Packit Service fa3ceb
		for target,arch in all_ifort_platforms:
Packit Service fa3ceb
			if target=='intel64':
Packit Service fa3ceb
				targetDir='EM64T_NATIVE'
Packit Service fa3ceb
			else:
Packit Service fa3ceb
				targetDir=target
Packit Service fa3ceb
			try:
Packit Service fa3ceb
				Utils.winreg.OpenKey(all_versions,version+'\\'+targetDir)
Packit Service fa3ceb
				icl_version=Utils.winreg.OpenKey(all_versions,version)
Packit Service fa3ceb
				path,type=Utils.winreg.QueryValueEx(icl_version,'ProductDir')
Packit Service fa3ceb
			except OSError:
Packit Service fa3ceb
				pass
Packit Service fa3ceb
			else:
Packit Service fa3ceb
				batch_file=os.path.join(path,'bin','ifortvars.bat')
Packit Service fa3ceb
				if os.path.isfile(batch_file):
Packit Service fa3ceb
					targets[target] = target_compiler(conf, 'intel', arch, version, target, batch_file)
Packit Service fa3ceb
Packit Service fa3ceb
		for target,arch in all_ifort_platforms:
Packit Service fa3ceb
			try:
Packit Service fa3ceb
				icl_version = Utils.winreg.OpenKey(all_versions, version+'\\'+target)
Packit Service fa3ceb
				path,type = Utils.winreg.QueryValueEx(icl_version,'ProductDir')
Packit Service fa3ceb
			except OSError:
Packit Service fa3ceb
				continue
Packit Service fa3ceb
			else:
Packit Service fa3ceb
				batch_file=os.path.join(path,'bin','ifortvars.bat')
Packit Service fa3ceb
				if os.path.isfile(batch_file):
Packit Service fa3ceb
					targets[target] = target_compiler(conf, 'intel', arch, version, target, batch_file)
Packit Service fa3ceb
		major = version[0:2]
Packit Service fa3ceb
		versions['intel ' + major] = targets
Packit Service fa3ceb
Packit Service fa3ceb
@conf
Packit Service fa3ceb
def setup_ifort(conf, versiondict):
Packit Service fa3ceb
	"""
Packit Service fa3ceb
	Checks installed compilers and targets and returns the first combination from the user's
Packit Service fa3ceb
	options, env, or the global supported lists that checks.
Packit Service fa3ceb
Packit Service fa3ceb
	:param versiondict: dict(platform -> dict(architecture -> configuration))
Packit Service fa3ceb
	:type versiondict: dict(string -> dict(string -> target_compiler)
Packit Service fa3ceb
	:return: the compiler, revision, path, include dirs, library paths and target architecture
Packit Service fa3ceb
	:rtype: tuple of strings
Packit Service fa3ceb
	"""
Packit Service fa3ceb
	platforms = Utils.to_list(conf.env.MSVC_TARGETS) or [i for i,j in all_ifort_platforms]
Packit Service fa3ceb
	desired_versions = conf.env.MSVC_VERSIONS or list(reversed(list(versiondict.keys())))
Packit Service fa3ceb
	for version in desired_versions:
Packit Service fa3ceb
		try:
Packit Service fa3ceb
			targets = versiondict[version]
Packit Service fa3ceb
		except KeyError:
Packit Service fa3ceb
			continue
Packit Service fa3ceb
		for arch in platforms:
Packit Service fa3ceb
			try:
Packit Service fa3ceb
				cfg = targets[arch]
Packit Service fa3ceb
			except KeyError:
Packit Service fa3ceb
				continue
Packit Service fa3ceb
			cfg.evaluate()
Packit Service fa3ceb
			if cfg.is_valid:
Packit Service fa3ceb
				compiler,revision = version.rsplit(' ', 1)
Packit Service fa3ceb
				return compiler,revision,cfg.bindirs,cfg.incdirs,cfg.libdirs,cfg.cpu
Packit Service fa3ceb
	conf.fatal('ifort: Impossible to find a valid architecture for building %r - %r' % (desired_versions, list(versiondict.keys())))
Packit Service fa3ceb
Packit Service fa3ceb
@conf
Packit Service fa3ceb
def get_ifort_version_win32(conf, compiler, version, target, vcvars):
Packit Service fa3ceb
	# FIXME hack
Packit Service fa3ceb
	try:
Packit Service fa3ceb
		conf.msvc_cnt += 1
Packit Service fa3ceb
	except AttributeError:
Packit Service fa3ceb
		conf.msvc_cnt = 1
Packit Service fa3ceb
	batfile = conf.bldnode.make_node('waf-print-msvc-%d.bat' % conf.msvc_cnt)
Packit Service fa3ceb
	batfile.write("""@echo off
Packit Service fa3ceb
set INCLUDE=
Packit Service fa3ceb
set LIB=
Packit Service fa3ceb
call "%s" %s
Packit Service fa3ceb
echo PATH=%%PATH%%
Packit Service fa3ceb
echo INCLUDE=%%INCLUDE%%
Packit Service fa3ceb
echo LIB=%%LIB%%;%%LIBPATH%%
Packit Service fa3ceb
""" % (vcvars,target))
Packit Service fa3ceb
	sout = conf.cmd_and_log(['cmd.exe', '/E:on', '/V:on', '/C', batfile.abspath()])
Packit Service fa3ceb
	batfile.delete()
Packit Service fa3ceb
	lines = sout.splitlines()
Packit Service fa3ceb
Packit Service fa3ceb
	if not lines[0]:
Packit Service fa3ceb
		lines.pop(0)
Packit Service fa3ceb
Packit Service fa3ceb
	MSVC_PATH = MSVC_INCDIR = MSVC_LIBDIR = None
Packit Service fa3ceb
	for line in lines:
Packit Service fa3ceb
		if line.startswith('PATH='):
Packit Service fa3ceb
			path = line[5:]
Packit Service fa3ceb
			MSVC_PATH = path.split(';')
Packit Service fa3ceb
		elif line.startswith('INCLUDE='):
Packit Service fa3ceb
			MSVC_INCDIR = [i for i in line[8:].split(';') if i]
Packit Service fa3ceb
		elif line.startswith('LIB='):
Packit Service fa3ceb
			MSVC_LIBDIR = [i for i in line[4:].split(';') if i]
Packit Service fa3ceb
	if None in (MSVC_PATH, MSVC_INCDIR, MSVC_LIBDIR):
Packit Service fa3ceb
		conf.fatal('ifort: Could not find a valid architecture for building (get_ifort_version_win32)')
Packit Service fa3ceb
Packit Service fa3ceb
	# Check if the compiler is usable at all.
Packit Service fa3ceb
	# The detection may return 64-bit versions even on 32-bit systems, and these would fail to run.
Packit Service fa3ceb
	env = dict(os.environ)
Packit Service fa3ceb
	env.update(PATH = path)
Packit Service fa3ceb
	compiler_name, linker_name, lib_name = _get_prog_names(conf, compiler)
Packit Service fa3ceb
	fc = conf.find_program(compiler_name, path_list=MSVC_PATH)
Packit Service fa3ceb
Packit Service fa3ceb
	# delete CL if exists. because it could contain parameters which can change cl's behaviour rather catastrophically.
Packit Service fa3ceb
	if 'CL' in env:
Packit Service fa3ceb
		del(env['CL'])
Packit Service fa3ceb
Packit Service fa3ceb
	try:
Packit Service fa3ceb
		conf.cmd_and_log(fc + ['/help'], env=env)
Packit Service fa3ceb
	except UnicodeError:
Packit Service fa3ceb
		st = traceback.format_exc()
Packit Service fa3ceb
		if conf.logger:
Packit Service fa3ceb
			conf.logger.error(st)
Packit Service fa3ceb
		conf.fatal('ifort: Unicode error - check the code page?')
Packit Service fa3ceb
	except Exception as e:
Packit Service fa3ceb
		Logs.debug('ifort: get_ifort_version: %r %r %r -> failure %s', compiler, version, target, str(e))
Packit Service fa3ceb
		conf.fatal('ifort: cannot run the compiler in get_ifort_version (run with -v to display errors)')
Packit Service fa3ceb
	else:
Packit Service fa3ceb
		Logs.debug('ifort: get_ifort_version: %r %r %r -> OK', compiler, version, target)
Packit Service fa3ceb
	finally:
Packit Service fa3ceb
		conf.env[compiler_name] = ''
Packit Service fa3ceb
Packit Service fa3ceb
	return (MSVC_PATH, MSVC_INCDIR, MSVC_LIBDIR)
Packit Service fa3ceb
Packit Service fa3ceb
class target_compiler(object):
Packit Service fa3ceb
	"""
Packit Service fa3ceb
	Wraps a compiler configuration; call evaluate() to determine
Packit Service fa3ceb
	whether the configuration is usable.
Packit Service fa3ceb
	"""
Packit Service fa3ceb
	def __init__(self, ctx, compiler, cpu, version, bat_target, bat, callback=None):
Packit Service fa3ceb
		"""
Packit Service fa3ceb
		:param ctx: configuration context to use to eventually get the version environment
Packit Service fa3ceb
		:param compiler: compiler name
Packit Service fa3ceb
		:param cpu: target cpu
Packit Service fa3ceb
		:param version: compiler version number
Packit Service fa3ceb
		:param bat_target: ?
Packit Service fa3ceb
		:param bat: path to the batch file to run
Packit Service fa3ceb
		:param callback: optional function to take the realized environment variables tup and map it (e.g. to combine other constant paths)
Packit Service fa3ceb
		"""
Packit Service fa3ceb
		self.conf = ctx
Packit Service fa3ceb
		self.name = None
Packit Service fa3ceb
		self.is_valid = False
Packit Service fa3ceb
		self.is_done = False
Packit Service fa3ceb
Packit Service fa3ceb
		self.compiler = compiler
Packit Service fa3ceb
		self.cpu = cpu
Packit Service fa3ceb
		self.version = version
Packit Service fa3ceb
		self.bat_target = bat_target
Packit Service fa3ceb
		self.bat = bat
Packit Service fa3ceb
		self.callback = callback
Packit Service fa3ceb
Packit Service fa3ceb
	def evaluate(self):
Packit Service fa3ceb
		if self.is_done:
Packit Service fa3ceb
			return
Packit Service fa3ceb
		self.is_done = True
Packit Service fa3ceb
		try:
Packit Service fa3ceb
			vs = self.conf.get_ifort_version_win32(self.compiler, self.version, self.bat_target, self.bat)
Packit Service fa3ceb
		except Errors.ConfigurationError:
Packit Service fa3ceb
			self.is_valid = False
Packit Service fa3ceb
			return
Packit Service fa3ceb
		if self.callback:
Packit Service fa3ceb
			vs = self.callback(self, vs)
Packit Service fa3ceb
		self.is_valid = True
Packit Service fa3ceb
		(self.bindirs, self.incdirs, self.libdirs) = vs
Packit Service fa3ceb
Packit Service fa3ceb
	def __str__(self):
Packit Service fa3ceb
		return str((self.bindirs, self.incdirs, self.libdirs))
Packit Service fa3ceb
Packit Service fa3ceb
	def __repr__(self):
Packit Service fa3ceb
		return repr((self.bindirs, self.incdirs, self.libdirs))
Packit Service fa3ceb
Packit Service fa3ceb
@conf
Packit Service fa3ceb
def detect_ifort(self):
Packit Service fa3ceb
	return self.setup_ifort(self.get_ifort_versions(False))
Packit Service fa3ceb
Packit Service fa3ceb
@conf
Packit Service fa3ceb
def get_ifort_versions(self, eval_and_save=True):
Packit Service fa3ceb
	"""
Packit Service fa3ceb
	:return: platforms to compiler configurations
Packit Service fa3ceb
	:rtype: dict
Packit Service fa3ceb
	"""
Packit Service fa3ceb
	dct = {}
Packit Service fa3ceb
	self.gather_ifort_versions(dct)
Packit Service fa3ceb
	return dct
Packit Service fa3ceb
Packit Service fa3ceb
def _get_prog_names(self, compiler):
Packit Service fa3ceb
	if compiler=='intel':
Packit Service fa3ceb
		compiler_name = 'ifort'
Packit Service fa3ceb
		linker_name = 'XILINK'
Packit Service fa3ceb
		lib_name = 'XILIB'
Packit Service fa3ceb
	else:
Packit Service fa3ceb
		# assumes CL.exe
Packit Service fa3ceb
		compiler_name = 'CL'
Packit Service fa3ceb
		linker_name = 'LINK'
Packit Service fa3ceb
		lib_name = 'LIB'
Packit Service fa3ceb
	return compiler_name, linker_name, lib_name
Packit Service fa3ceb
Packit Service fa3ceb
@conf
Packit Service fa3ceb
def find_ifort_win32(conf):
Packit Service fa3ceb
	# the autodetection is supposed to be performed before entering in this method
Packit Service fa3ceb
	v = conf.env
Packit Service fa3ceb
	path = v.PATH
Packit Service fa3ceb
	compiler = v.MSVC_COMPILER
Packit Service fa3ceb
	version = v.MSVC_VERSION
Packit Service fa3ceb
Packit Service fa3ceb
	compiler_name, linker_name, lib_name = _get_prog_names(conf, compiler)
Packit Service fa3ceb
	v.IFORT_MANIFEST = (compiler == 'intel' and version >= 11)
Packit Service fa3ceb
Packit Service fa3ceb
	# compiler
Packit Service fa3ceb
	fc = conf.find_program(compiler_name, var='FC', path_list=path)
Packit Service fa3ceb
Packit Service fa3ceb
	# before setting anything, check if the compiler is really intel fortran
Packit Service fa3ceb
	env = dict(conf.environ)
Packit Service fa3ceb
	if path:
Packit Service fa3ceb
		env.update(PATH = ';'.join(path))
Packit Service fa3ceb
	if not conf.cmd_and_log(fc + ['/nologo', '/help'], env=env):
Packit Service fa3ceb
		conf.fatal('not intel fortran compiler could not be identified')
Packit Service fa3ceb
Packit Service fa3ceb
	v.FC_NAME = 'IFORT'
Packit Service fa3ceb
Packit Service fa3ceb
	if not v.LINK_FC:
Packit Service fa3ceb
		conf.find_program(linker_name, var='LINK_FC', path_list=path, mandatory=True)
Packit Service fa3ceb
Packit Service fa3ceb
	if not v.AR:
Packit Service fa3ceb
		conf.find_program(lib_name, path_list=path, var='AR', mandatory=True)
Packit Service fa3ceb
		v.ARFLAGS = ['/nologo']
Packit Service fa3ceb
Packit Service fa3ceb
	# manifest tool. Not required for VS 2003 and below. Must have for VS 2005 and later
Packit Service fa3ceb
	if v.IFORT_MANIFEST:
Packit Service fa3ceb
		conf.find_program('MT', path_list=path, var='MT')
Packit Service fa3ceb
		v.MTFLAGS = ['/nologo']
Packit Service fa3ceb
Packit Service fa3ceb
	try:
Packit Service fa3ceb
		conf.load('winres')
Packit Service fa3ceb
	except Errors.WafError:
Packit Service fa3ceb
		Logs.warn('Resource compiler not found. Compiling resource file is disabled')
Packit Service fa3ceb
Packit Service fa3ceb
#######################################################################################################
Packit Service fa3ceb
##### conf above, build below
Packit Service fa3ceb
Packit Service fa3ceb
@after_method('apply_link')
Packit Service fa3ceb
@feature('fc')
Packit Service fa3ceb
def apply_flags_ifort(self):
Packit Service fa3ceb
	"""
Packit Service fa3ceb
	Adds additional flags implied by msvc, such as subsystems and pdb files::
Packit Service fa3ceb
Packit Service fa3ceb
		def build(bld):
Packit Service fa3ceb
			bld.stlib(source='main.c', target='bar', subsystem='gruik')
Packit Service fa3ceb
	"""
Packit Service fa3ceb
	if not self.env.IFORT_WIN32 or not getattr(self, 'link_task', None):
Packit Service fa3ceb
		return
Packit Service fa3ceb
Packit Service fa3ceb
	is_static = isinstance(self.link_task, ccroot.stlink_task)
Packit Service fa3ceb
Packit Service fa3ceb
	subsystem = getattr(self, 'subsystem', '')
Packit Service fa3ceb
	if subsystem:
Packit Service fa3ceb
		subsystem = '/subsystem:%s' % subsystem
Packit Service fa3ceb
		flags = is_static and 'ARFLAGS' or 'LINKFLAGS'
Packit Service fa3ceb
		self.env.append_value(flags, subsystem)
Packit Service fa3ceb
Packit Service fa3ceb
	if not is_static:
Packit Service fa3ceb
		for f in self.env.LINKFLAGS:
Packit Service fa3ceb
			d = f.lower()
Packit Service fa3ceb
			if d[1:] == 'debug':
Packit Service fa3ceb
				pdbnode = self.link_task.outputs[0].change_ext('.pdb')
Packit Service fa3ceb
				self.link_task.outputs.append(pdbnode)
Packit Service fa3ceb
Packit Service fa3ceb
				if getattr(self, 'install_task', None):
Packit Service fa3ceb
					self.pdb_install_task = self.add_install_files(install_to=self.install_task.install_to, install_from=pdbnode)
Packit Service fa3ceb
Packit Service fa3ceb
				break
Packit Service fa3ceb
Packit Service fa3ceb
@feature('fcprogram', 'fcshlib', 'fcprogram_test')
Packit Service fa3ceb
@after_method('apply_link')
Packit Service fa3ceb
def apply_manifest_ifort(self):
Packit Service fa3ceb
	"""
Packit Service fa3ceb
	Enables manifest embedding in Fortran DLLs when using ifort on Windows
Packit Service fa3ceb
	See: http://msdn2.microsoft.com/en-us/library/ms235542(VS.80).aspx
Packit Service fa3ceb
	"""
Packit Service fa3ceb
	if self.env.IFORT_WIN32 and getattr(self, 'link_task', None):
Packit Service fa3ceb
		# it seems ifort.exe cannot be called for linking
Packit Service fa3ceb
		self.link_task.env.FC = self.env.LINK_FC
Packit Service fa3ceb
Packit Service fa3ceb
	if self.env.IFORT_WIN32 and self.env.IFORT_MANIFEST and getattr(self, 'link_task', None):
Packit Service fa3ceb
		out_node = self.link_task.outputs[0]
Packit Service fa3ceb
		man_node = out_node.parent.find_or_declare(out_node.name + '.manifest')
Packit Service fa3ceb
		self.link_task.outputs.append(man_node)
Packit Service fa3ceb
		self.env.DO_MANIFEST = True
Packit Service fa3ceb