mirror of https://gitlab.com/ita1024/waf
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.5 KiB
Python
97 lines
2.5 KiB
Python
#! /usr/bin/env python
|
|
# encoding: utf-8
|
|
# Detection of the flang Fortran compiler
|
|
|
|
import re
|
|
from waflib.Tools import fc,fc_config,fc_scan
|
|
from waflib.Configure import conf
|
|
from waflib.Tools.compiler_fc import fc_compiler
|
|
fc_compiler['linux'].append('fc_flang')
|
|
|
|
@conf
|
|
def find_flang(conf):
|
|
fc = conf.find_program(['flang'], var='FC')
|
|
conf.get_nfort_version(fc)
|
|
conf.env.FC_NAME = 'FLANG'
|
|
conf.env.FC_MOD_CAPITALIZATION = 'lower'
|
|
|
|
@conf
|
|
def flang_flags(conf):
|
|
v = conf.env
|
|
v['_FCMODOUTFLAGS'] = []
|
|
v['FCFLAGS_DEBUG'] = []
|
|
v['FCFLAGS_fcshlib'] = []
|
|
v['LINKFLAGS_fcshlib'] = []
|
|
v['FCSTLIB_MARKER'] = ''
|
|
v['FCSHLIB_MARKER'] = ''
|
|
|
|
@conf
|
|
def get_flang_version(conf, fc):
|
|
cmd = fc + ['-dM', '-E', '-']
|
|
env = conf.env.env or None
|
|
|
|
try:
|
|
out, err = conf.cmd_and_log(cmd, output=0, input='\n'.encode(), env=env)
|
|
except Errors.WafError:
|
|
conf.fatal('Could not determine the FLANG compiler version for %r' % cmd)
|
|
if out.find('__clang__') < 0:
|
|
conf.fatal('Not a flang compiler')
|
|
|
|
k = {}
|
|
out = out.splitlines()
|
|
for line in out:
|
|
lst = shlex.split(line)
|
|
if len(lst)>2:
|
|
key = lst[1]
|
|
val = lst[2]
|
|
k[key] = val
|
|
|
|
def isD(var):
|
|
return var in k
|
|
|
|
# Some documentation is available at http://predef.sourceforge.net
|
|
# The names given to DEST_OS must match what Utils.unversioned_sys_platform() returns.
|
|
if not conf.env.DEST_OS:
|
|
conf.env.DEST_OS = ''
|
|
for i in MACRO_TO_DESTOS:
|
|
if isD(i):
|
|
conf.env.DEST_OS = MACRO_TO_DESTOS[i]
|
|
break
|
|
else:
|
|
if isD('__APPLE__') and isD('__MACH__'):
|
|
conf.env.DEST_OS = 'darwin'
|
|
elif isD('__unix__'): # unix must be tested last as it's a generic fallback
|
|
conf.env.DEST_OS = 'generic'
|
|
|
|
if isD('__ELF__'):
|
|
conf.env.DEST_BINFMT = 'elf'
|
|
elif isD('__WINNT__') or isD('__CYGWIN__') or isD('_WIN32'):
|
|
conf.env.DEST_BINFMT = 'pe'
|
|
if not conf.env.IMPLIBDIR:
|
|
conf.env.IMPLIBDIR = conf.env.LIBDIR # for .lib or .dll.a files
|
|
conf.env.LIBDIR = conf.env.BINDIR
|
|
elif isD('__APPLE__'):
|
|
conf.env.DEST_BINFMT = 'mac-o'
|
|
|
|
if not conf.env.DEST_BINFMT:
|
|
# Infer the binary format from the os name.
|
|
conf.env.DEST_BINFMT = Utils.destos_to_binfmt(conf.env.DEST_OS)
|
|
|
|
for i in MACRO_TO_DEST_CPU:
|
|
if isD(i):
|
|
conf.env.DEST_CPU = MACRO_TO_DEST_CPU[i]
|
|
break
|
|
|
|
Logs.debug('fc_flang: dest platform: ' + ' '.join([conf.env[x] or '?' for x in ('DEST_OS', 'DEST_BINFMT', 'DEST_CPU')]))
|
|
conf.env.FC_VERSION = (k['__clang_major__'], k['__clang_minor__'], k['__clang_patchlevel__'])
|
|
|
|
return k
|
|
|
|
|
|
def configure(conf):
|
|
conf.find_flang()
|
|
conf.find_ar()
|
|
conf.fc_flags()
|
|
conf.fc_add_flags()
|
|
conf.flang_flags()
|