84 lines
2.9 KiB
Python
84 lines
2.9 KiB
Python
|
|
import os.path
|
|
import subprocess
|
|
from pathlib import Path
|
|
from doit.exceptions import TaskFailed
|
|
from .task import FlowTask
|
|
|
|
|
|
def printCommand ( command ):
|
|
commandBin = command[0]
|
|
print( commandBin, command[1] )
|
|
for arg in command[2:]:
|
|
print( ' '*len(commandBin), arg )
|
|
|
|
|
|
class Svase ( FlowTask ):
|
|
|
|
FlagLog = 0x00000001
|
|
|
|
@staticmethod
|
|
def mkRule ( rule, targets, depends, top, incdirs=[], libdirs=[], defines=[], svargs=[], flags=0 ):
|
|
return Svase( rule, targets, depends, top, incdirs, libdirs, defines, svargs, flags )
|
|
|
|
def __init__ ( self, rule, targets, depends, top, incdirs, libdirs, defines, svargs, flags ):
|
|
self.flags = flags
|
|
self.top = top
|
|
self.svargs = svargs
|
|
self.incdirs = incdirs
|
|
self.libdirs = libdirs
|
|
self.defines = defines
|
|
self.log = None
|
|
self.success = True
|
|
targets = FlowTask._normFileList( targets )
|
|
depends = FlowTask._normFileList( depends )
|
|
if targets == []:
|
|
targets.append( self.top + '.v' )
|
|
#if self.flags & Svase.FlagLog:
|
|
# self.log = Path( self.top + '.log' )
|
|
# targets.append( self.log )
|
|
targets.append( './slang-args.txt' )
|
|
super().__init__( rule, targets, depends )
|
|
self.addClean( targets )
|
|
|
|
def __repr__ ( self ):
|
|
return '<svase top={} {} {}>'.format( self.top, self.file_target(0), self.main )
|
|
|
|
@property
|
|
def main ( self ):
|
|
return self.file_depend( 0 )
|
|
|
|
def doTask ( self ):
|
|
from ..helpers.io import ErrorMessage
|
|
for incdir in self.incdirs:
|
|
if not Path(incdir).is_dir():
|
|
e = ErrorMessage( 1, [ 'Svase.doTask(): Include directory not found.'
|
|
, '"{}"'.format( incdir ) ] )
|
|
return TaskFailed( e )
|
|
with open( 'slang-args.txt', 'w' ) as fdSlangArgs:
|
|
for svarg in self.svargs:
|
|
fdSlangArgs.write( '{}\n'.format(svarg) )
|
|
for define in self.defines:
|
|
fdSlangArgs.write( '-D{}\n'.format(define) )
|
|
for incdir in self.incdirs:
|
|
fdSlangArgs.write( '--include-directory {}\n'.format(incdir) )
|
|
for libdir in self.libdirs:
|
|
fdSlangArgs.write( '--libdir {}\n'.format(libdir) )
|
|
|
|
command = [ 'svase' ]
|
|
command += [ '--slang-argfile=slang-args.txt' ]
|
|
command += [ self.top ]
|
|
command += [ self.file_target(0) ]
|
|
command += [ depend.as_posix() for depend in self.depends ]
|
|
printCommand( command )
|
|
status = subprocess.call( command )
|
|
return status == 0
|
|
|
|
def create_doit_tasks ( self ):
|
|
return { 'basename' : self.basename
|
|
, 'actions' : [ self.doTask ]
|
|
, 'doc' : 'Run {}.'.format( self )
|
|
, 'file_dep' : self.file_dep
|
|
, 'targets' : self.targets
|
|
}
|