Skip to content

Commit

Permalink
New templates and updates to scripts
Browse files Browse the repository at this point in the history
  • Loading branch information
mballance committed Feb 3, 2019
1 parent 0a8757f commit 66dd89b
Show file tree
Hide file tree
Showing 24 changed files with 538 additions and 43 deletions.
155 changes: 139 additions & 16 deletions src/vte/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,34 +5,157 @@
import argparse
import jinja2
import os
import stat
from stat import *
from . import template_rgy

def generate(args, rgy):
print("TODO: generate_cmd")
for t in rgy.template_map.keys():
print("Template: " + str(t))
env = jinja2.Environment(
loader = rgy.template_map[t])

for tmpl in env.list_templates():
print("template: " + str(tmpl))
template = env.get_template(tmpl)
print("filename: " + template.module.filename)
print(" result: " + template.render({
"name": "foo",
"vte_sv_header": "header"
}))
def substitute(vars, str):
i=0
while i < len(str):
idx = str.find("{{", i)

if idx == -1:
break

end = str.find("}}", idx)

if end == -1:
print("Error: unterminated reference")
break

key = str[idx+2:end]

if key in vars.keys():
str = str[:idx] + vars[key] + str[end+2:]

i=idx+2

print("str: " + str)
return str

def generate(args, parameters, rgy):
if args.template not in rgy.template_map.keys():
print("Error: template does not exist")
return

template = rgy.template_map[args.template]

env = jinja2.Environment(loader=template)

# jinja2.Environment.globals['name'] = "foo";
global_vars = {
"name" : args.name
}

# First, check all template parameters
# and set the default or
for param_k in template.parameters.keys():
param = template.parameters[param_k]

if param_k in parameters.keys():
global_vars[param_k] = parameters[param_k]
elif param.has_default == True:
global_vars[param_k] = param.default
else:
print("Error: parameter \"" + param_k + "\" is not specified")
return

for param_k in parameters.keys():
if param_k not in template.parameters.keys():
print("Warning: user-specified parameter \"" + param_k + "\" has no effect")

for tmpl in env.list_templates():
tmpl_e = env.get_template(tmpl)

filename = tmpl_e.name
try:
filename = tmpl_e.module.filename;
except:
pass

filename = substitute(global_vars, filename)

result = tmpl_e.render(global_vars)
print("Result: " + result)

dir = os.path.dirname(filename)

if dir != "":
if os.path.isdir(dir) == False:
os.makedirs(dir)

fh = open(filename, "w");
fh.write(result)
fh.close()

chmod = ""
try:
chmod = tmpl_e.module.chmod
except:
pass

chmod = chmod.strip()

if chmod != "":
mode = os.stat(filename).st_mode

i=0
is_add = True
while i < len(chmod):
if chmod[i] == "+":
is_add = True
elif chmod[i] == "-":
is_add = False
elif chmod[i] == "x":
if is_add:
mode = mode | stat.S_IEXEC
else:
mode = mode & ~stat.S_IEXEC
elif chmod[i] == "r":
if is_add:
mode = mode | stat.S_IREAD
else:
mode = mode & ~stat.S_IREAD
elif chmod[i] == "w":
if is_add:
mode = mode | stat.S_IWRITE
else:
mode = mode & ~stat.S_IWRITE
else:
print("Error: unknown chmod character \"" + chmod[i] + "\" in chmod string \"" + chmod + "\"")

i=i+1
os.chmod(filename, mode)


def main():
parser = argparse.ArgumentParser(prog="vte")
subparser = parser.add_subparsers(dest="subcmd")
generate_cmd = subparser.add_parser("generate",
help="generate source files")

generate_cmd.add_argument("template", help="ID of template")
generate_cmd.add_argument("name", help="Name to use in the template")
generate_cmd.add_argument("parameters",
metavar="KEY=VALUE",
nargs="*",
help="Specify other template variables")

args = parser.parse_args()

if args.name.find("=") != -1:
print("Error: name contains '='")
exit(1)

# Check that parameters are properly-specified
parameters = {}
for param in args.parameters:
idx = param.find("=")
if idx == -1:
print("Error: parameter specification \"" + param + "\" doesn't contain '='");
exit(1)
parameters[param[:idx]] = param[idx+1:]

template_path = []
template_path.append("/project/fun/vte/vte-mballance/templates")

Expand All @@ -44,7 +167,7 @@ def main():
rgy = template_rgy.TemplateRgy(template_path)

if args.subcmd == "generate":
generate(args, rgy)
generate(args, parameters, rgy)


if __name__ == "__main__":
Expand Down
47 changes: 34 additions & 13 deletions src/vte/template_rgy.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,16 @@
#import yaml

class Parameter:
def __init__(self, pname, desc, default):
def __init__(self, pname, desc, has_default, default):
self.pname = pname
self.desc = desc
self.has_default = has_default
self.default = default

class TemplateInfo (jinja2.BaseLoader):
def __init__(self,
tmpl_id,
vte_file):
print("template_info::init " + tmpl_id)
self.tmpl_id = tmpl_id
self.tmpl_dir = os.path.dirname(vte_file)
self.parameters = {}
Expand All @@ -28,43 +28,64 @@ def __init__(self,
vte.read(vte_file)

for s in vte.sections():
print("Section: " + str(s))
s = s.strip()
if s.startswith("parameter"):
colon_idx = s.find(":")
if s == -1:
print("Error: malformed parameter section \"" + s + "\"")
pname = s[colon_idx+1:].strip()
print(" Parameter: " + pname)

if "desc" in vte[s].keys():
desc = vte[s]["desc"]
else:
desc = ""

if "default" in vte[s].keys():
default_val = vte[s]["default"]
has_default = True
else:
default_val = ""
has_default = False

param = Parameter(pname, "desc", "default")
param = Parameter(pname, desc, has_default, default_val)
self.parameters[pname] = param

def list_templates(self):
print("list_templates")
templates = []
for f in os.listdir(self.tmpl_dir):
# TODO: must respect filter list from spec
if f != ".vte":
templates.append(f)
self.find_template_files(self.tmpl_dir, "", templates)

return templates

def find_template_files(self, parent_dir_abs, parent_name, templates):
for f in os.listdir(parent_dir_abs):
if parent_name == "":
this_name = f;
else:
this_name = os.path.join(parent_name, f)

if os.path.isdir(os.path.join(parent_dir_abs, f)):
# Must recurse
self.find_template_files(
os.path.join(parent_dir_abs, f),
this_name,
templates)
elif f != ".vte":
templates.append(this_name)


def get_source(self, environment, template):
print("get_source")
path = os.path.join(self.tmpl_dir, template)
if not os.path.exists(path):
raise jinja2.TemplateNotFound(template)
mtime = os.path.getmtime(path)
f = open(path, "r")
source = f.read()
f.close()
print("path=" + path + " source=" + str(source))
return source, path, lambda: mtime == os.path.getmtime(path)


class TemplateRgy:
def find_templates(self, dir, template_id):
print("find_templates ", dir)

if os.path.isfile(os.path.join(dir, ".vte")):
if len(template_id) == 0:
Expand Down
14 changes: 14 additions & 0 deletions templates/project/ivpm/googletest-hdl/.vte
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#****************************************************************************
#* IVPM Googletest-HDL Project
#****************************************************************************

[template]
desc = IVPM project with dependences for Googletest-HDL configured

[parameter:version]
desc=Starting version for this project
default=0.0.1

[parameter:rootvar]
desc=Specify a root variable for this project
default=
21 changes: 21 additions & 0 deletions templates/project/ivpm/googletest-hdl/etc/env.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#****************************************************************************
#* {{name}}_env.sh
#*
#* Environment setup script for {{name}}
#****************************************************************************
{% set filename = "etc/{{name}}_env.sh" %}

etc_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd)"
rootdir=`cd $etc_dir/.. ; pwd`

{% if rootvar != "" %}
{{rootvar}}=${rootdir}
export {{rootvar}}
{% endif %}

# Add a path to the simscripts directory
export PATH=$rootdir/packages/simscripts/bin:$PATH

# Force the PACKAGES_DIR
export PACKAGES_DIR=$rootdir/packages

10 changes: 10 additions & 0 deletions templates/project/ivpm/googletest-hdl/etc/ivpm.info
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#****************************************************************************
#* ivpm.info for {{name}}
#****************************************************************************

name={{name}}
version={{version}}
{% if rootvar != "" %}
rootvar={{rootvar}}
{% endif %}

8 changes: 8 additions & 0 deletions templates/project/ivpm/googletest-hdl/etc/packages.mf
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#****************************************************************************
#* packages.mf for {{name}}
#****************************************************************************

simscripts@http://github.com/mballance/simscripts.git

googletest-hdl@http://github.com/mballance/googletest-hdl.git

49 changes: 49 additions & 0 deletions templates/project/ivpm/googletest-hdl/scripts/ivpm.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#****************************************************************************
#* ivpm.mk
#*
#* Makefile template for a Chisel project
#****************************************************************************
SCRIPTS_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
ROOT_DIR := $(abspath $(SCRIPTS_DIR)/..)
PACKAGES_DIR ?= $(ROOT_DIR)/packages

ifneq (true,$(VERBOSE))
Q=@
endif

# Must support dual modes:
# - build dependencies if this project is the active one
# - rely on the upper-level makefile to resolve dependencies if we're not
-include $(PACKAGES_DIR)/packages.mk
include $(ROOT_DIR)/etc/ivpm.info
PROJECT := $(name)

# Include makefiles with dependencies
MK_INCLUDES += $(wildcard $(ROOT_DIR)/mkfiles/*.mk)

include $(MK_INCLUDES)

RULES := 1

ifeq (true,$(PHASE2))
build :
else
build : $($(PROJECT)_deps)
$(Q)$(MAKE) -f $(SCRIPTS_DIR)/ivpm.mk PHASE2=true VERBOSE=$(VERBOSE) build
endif

release : build
$(Q)rm -rf $(ROOT_DIR)/build
$(Q)mkdir -p $(ROOT_DIR)/build/$(PROJECT)
$(Q)cp -r \
$(ROOT_DIR)/lib \
$(ROOT_DIR)/etc \
$(ROOT_DIR)/build/$(PROJECT)
$(Q)cd $(ROOT_DIR)/build ; \
tar czf $(PROJECT)-$(version).tar.gz $(PROJECT)
$(Q)rm -rf $(ROOT_DIR)/build/$(PROJECT)

include $(MK_INCLUDES)

-include $(PACKAGES_DIR)/packages.mk

Loading

0 comments on commit 66dd89b

Please sign in to comment.