87 lines
2.4 KiB
Python
Executable File
87 lines
2.4 KiB
Python
Executable File
import re, os
|
|
|
|
class DefaultTarget(object):
|
|
def __init__(self, regex):
|
|
self._regex = re.compile(regex)
|
|
|
|
def match(self, pathname):
|
|
m = self._regex.match(pathname)
|
|
if m:
|
|
return self.format(m, pathname)
|
|
|
|
def format(self, mregex, pathname):
|
|
pass
|
|
|
|
class FileIDAllocator(object):
|
|
def __init__(self):
|
|
self.last_id = -1
|
|
self.path_dict = {}
|
|
self.path_list = []
|
|
|
|
def allocate(self, pathname):
|
|
if pathname not in self.path_dict:
|
|
self.last_id += 1
|
|
last_id = self.last_id
|
|
self.path_dict[pathname] = last_id
|
|
self.path_list.append(pathname)
|
|
return last_id
|
|
return self.path_dict[pathname]
|
|
|
|
file_id_allocator = FileIDAllocator()
|
|
|
|
class DefaultObj(DefaultTarget):
|
|
def format(self, mregex, pathname):
|
|
global colinux_file_id
|
|
from target import RawTarget, RawInput, RawOptions
|
|
from tools import Compiler
|
|
base_dep_name = None
|
|
|
|
full_name = mregex.groups(0)[0] + '.c'
|
|
if os.path.exists(full_name) and not os.path.islink(full_name):
|
|
base_dep_name = os.path.basename(full_name)
|
|
else:
|
|
full_name = mregex.groups(0)[0] + '.cpp'
|
|
if os.path.exists(full_name) and not os.path.islink(full_name):
|
|
base_dep_name = os.path.basename(full_name)
|
|
|
|
if not base_dep_name:
|
|
return None
|
|
|
|
inputs = [RawInput(base_dep_name)]
|
|
|
|
from cdeps import calc_deps
|
|
inputs.extend(calc_deps(full_name))
|
|
|
|
colinux_file_id = file_id_allocator.allocate(full_name)
|
|
return RawTarget(inputs=inputs,
|
|
tool=Compiler(),
|
|
options=RawOptions(
|
|
appenders=dict(
|
|
compiler_defines=dict(
|
|
COLINUX_FILE_ID=str(colinux_file_id),
|
|
))))
|
|
|
|
_default_targets = (
|
|
DefaultObj('(.*)[.]o$'),
|
|
)
|
|
|
|
def get_default_raw_target(pathname):
|
|
for default in _default_targets:
|
|
m = default.match(pathname)
|
|
if m:
|
|
return m
|
|
|
|
def get_default_tool(target):
|
|
if target.get_ext() == '.o':
|
|
for tinput in target.get_actual_inputs():
|
|
if tinput.get_ext() != '.o':
|
|
break
|
|
else:
|
|
from tools import Linker
|
|
return Linker()
|
|
|
|
if target.get_ext() == '.a':
|
|
from tools import Archiver
|
|
return Archiver()
|
|
|