waifulib: owcc tool

This commit is contained in:
mittorn 2020-02-08 23:04:26 +07:00
parent 97228a4249
commit 828def3b25
1 changed files with 122 additions and 0 deletions

122
scripts/waifulib/owcc.py Executable file
View File

@ -0,0 +1,122 @@
#! /usr/bin/env python
# encoding: utf-8
"""
Compiler definition for OpenWatcom's owcc
"""
from waflib import Errors, Utils
from waflib.Tools import ccroot, ar
from waflib.Configure import conf
@conf
def find_owcc(conf):
v = conf.env
cc = None
if v.CC:
cc = v.CC
else:
cc = conf.find_program('cc', var='CC')
if not cc:
conf.fatal('owcc was not found')
try:
out = conf.cmd_and_log(cc + ['-v'])
except Errors.WafError:
conf.fatal('%r -v could not be executed' % cc)
if not 'Open Watcom' in out:
conf.fatal('failed to detect owcc')
v.CC = cc
v.CC_NAME = 'owcc'
v.CXX = v.CC
v.CXX_NAME = v.cc_NAME
if not v.AR:
conf.find_program('wlib', var='AR')
conf.add_os_flags('ARFLAGS')
if not v.ARFLAGS:
v.ARFLAGS = ['-fo']
@conf
def owcc_common_flags(conf):
v = conf.env
v.CC_SRC_F = ''
v.CXX_SRC_F = ''
v.CC_TGT_F = ['-c', '-o']
v.CXX_TGT_F = ['-c', '-o']
v.CPPPATH_ST = '-I%s'
v.DEFINES_ST = '-D%s'
if not v.LINK_CC:
v.LINK_CC = v.CC
if not v.LINK_CXX:
v.LINK_CXX = v.CXX
v.CCLNK_SRC_F = ''
v.CCLNK_TGT_F = ['-o']
v.CXXLNK_SRC_F = ''
v.CXXLNK_TGT_F = ['-o']
v.LIB_ST = '-l%s' # template for adding libs
v.LIBPATH_ST = '-L%s' # template for adding libpaths
v.STLIB_ST = '-l%s'
v.STLIBPATH_ST = '-L%s'
v.cprogram_PATTERN = '%s.exe'
v.cxxprogram_PATTERN = '%s.exe'
v.cshlib_PATTERN = 'lib%s.so'
v.cxxshlib_PATTERN = 'lib%s.so'
v.cstlib_PATTERN = '%s.a'
v.cxxstlib_PATTERN = '%s.a'
def find_target(flags):
if '-b' in flags:
return flags[flags.index('-b')+1]
@conf
def owcc_detect_platform(conf):
v = conf.env
target = find_target(v.LINKFLAGS)
if not target:
target = find_target(v.CC)
if not target:
target = find_target(v.CFLAGS)
if not target:
target = Utils.unversioned_sys_platform()
if target in ['dos4g', 'dos4gnz', 'dos32a', 'stub32a', 'stub32ac']:
v.DEST_BINFMT = 'le'
v.DEST_OS = 'dos'
elif target in ['dos32x', 'stub32x', 'stub32xc']:
v.DEST_BINFMT = 'lx'
v.DEST_OS = 'dos'
elif target.startswith('win') or target.startswith('nt'):
v.DEST_BINFMT = 'pe'
v.DEST_OS = 'win32'
elif target == 'qnx386':
v.DEST_OS = 'qnx'
v.DEST_BINFMT = 'qnx'
elif target in ['linux', '386']:
v.DEST_OS = 'linux'
v.DEST_BINFMT = 'elf'
else:
v.DEST_OS = target
v.DEST_BINFMT = None
v.DEST_CPU = 'i386'
for f in v.LINKFLAGS + v.CC + v.CFLAGS:
if f.startswith('-march'):
v.DEST_CPU=f.split('=')[1]
break
def configure(conf):
conf.find_owcc()
conf.owcc_common_flags()
conf.cc_load_tools()
conf.cc_add_flags()
conf.cxx_load_tools()
conf.cxx_add_flags()
conf.link_add_flags()
conf.owcc_detect_platform()