From 828def3b25d838c0d724e7e9e4e51c6c10c8c358 Mon Sep 17 00:00:00 2001 From: mittorn Date: Sat, 8 Feb 2020 23:04:26 +0700 Subject: [PATCH] waifulib: owcc tool --- scripts/waifulib/owcc.py | 122 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100755 scripts/waifulib/owcc.py diff --git a/scripts/waifulib/owcc.py b/scripts/waifulib/owcc.py new file mode 100755 index 00000000..73b5827a --- /dev/null +++ b/scripts/waifulib/owcc.py @@ -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()