- Adding latest kll git commit rev - Adding list of changed files since latest git rev - Adding list of all command line arguments during generation - Adding generation timestamp - Updating copyrightssimple
# | # | ||||
# Backend code generator for the Kiibohd Controller firmware. | # Backend code generator for the Kiibohd Controller firmware. | ||||
# | # | ||||
# Copyright (C) 2014 by Jacob Alexander | |||||
# Copyright (C) 2014-2015 by Jacob Alexander | |||||
# | # | ||||
# This file is free software: you can redistribute it and/or modify | # This file is free software: you can redistribute it and/or modify | ||||
# it under the terms of the GNU General Public License as published by | # it under the terms of the GNU General Public License as published by | ||||
import sys | import sys | ||||
import re | import re | ||||
from datetime import date | |||||
# Modifying Python Path, which is dumb, but the only way to import up one directory... | # Modifying Python Path, which is dumb, but the only way to import up one directory... | ||||
sys.path.append( os.path.expanduser('..') ) | sys.path.append( os.path.expanduser('..') ) | ||||
return "usbKeyOut"; | return "usbKeyOut"; | ||||
# TODO | |||||
def layerInformation( self, name, date, author ): | def layerInformation( self, name, date, author ): | ||||
self.fill_dict['Information'] += "// Name: {0}\n".format( "TODO" ) | self.fill_dict['Information'] += "// Name: {0}\n".format( "TODO" ) | ||||
self.fill_dict['Information'] += "// Version: {0}\n".format( "TODO" ) | self.fill_dict['Information'] += "// Version: {0}\n".format( "TODO" ) | ||||
# Processes content for fill tags and does any needed dataset calculations | # Processes content for fill tags and does any needed dataset calculations | ||||
def process( self, capabilities, macros, variables ): | |||||
def process( self, capabilities, macros, variables, gitRev, gitChanges ): | |||||
# Build string list of compiler arguments | |||||
compilerArgs = "" | |||||
for arg in sys.argv: | |||||
if "--" in arg or ".py" in arg: | |||||
compilerArgs += "// {0}\n".format( arg ) | |||||
else: | |||||
compilerArgs += "// {0}\n".format( arg ) | |||||
# Build a string of modified files, if any | |||||
gitChangesStr = "\n" | |||||
if len( gitChanges ) > 0: | |||||
for gitFile in gitChanges: | |||||
gitChangesStr += "// {0}\n".format( gitFile ) | |||||
else: | |||||
gitChangesStr = " None\n" | |||||
## Information ## | ## Information ## | ||||
# TODO | # TODO | ||||
self.fill_dict['Information'] = "// This file was generated by the kll compiler, DO NOT EDIT.\n" | self.fill_dict['Information'] = "// This file was generated by the kll compiler, DO NOT EDIT.\n" | ||||
self.fill_dict['Information'] += "// Generation Date: {0}\n".format( "TODO" ) | |||||
self.fill_dict['Information'] += "// Compiler arguments: {0}\n".format( "TODO" ) | |||||
self.fill_dict['Information'] += "// Generation Date: {0}\n".format( date.today() ) | |||||
self.fill_dict['Information'] += "// KLL Backend: {0}\n".format( "kiibohd" ) | self.fill_dict['Information'] += "// KLL Backend: {0}\n".format( "kiibohd" ) | ||||
self.fill_dict['Information'] += "// KLL Git Rev: {0}\n".format( "TODO" ) | |||||
self.fill_dict['Information'] += "// KLL Git Rev: {0}\n".format( gitRev ) | |||||
self.fill_dict['Information'] += "// KLL Git Changes:{0}".format( gitChangesStr ) | |||||
self.fill_dict['Information'] += "// Compiler arguments:\n{0}".format( compilerArgs ) | |||||
self.fill_dict['Information'] += "//\n" | self.fill_dict['Information'] += "//\n" | ||||
self.fill_dict['Information'] += "// - Base Layer -\n" | self.fill_dict['Information'] += "// - Base Layer -\n" | ||||
self.fill_dict['Information'] += "// - Default Layer -\n" | self.fill_dict['Information'] += "// - Default Layer -\n" |
# KLL Compiler | # KLL Compiler | ||||
# Keyboard Layout Langauge | # Keyboard Layout Langauge | ||||
# | # | ||||
# Copyright (C) 2014 by Jacob Alexander | |||||
# Copyright (C) 2014-2015 by Jacob Alexander | |||||
# | # | ||||
# This file is free software: you can redistribute it and/or modify | # This file is free software: you can redistribute it and/or modify | ||||
# it under the terms of the GNU General Public License as published by | # it under the terms of the GNU General Public License as published by | ||||
print("Error parsing %s. %s" % (filename, e.msg), file=sys.stderr) | print("Error parsing %s. %s" % (filename, e.msg), file=sys.stderr) | ||||
sys.exit(1) | sys.exit(1) | ||||
### Misc Utility Functions ### | |||||
def gitRevision( kllPath ): | |||||
import subprocess | |||||
# Change the path to where kll.py is | |||||
origPath = os.getcwd() | |||||
os.chdir( kllPath ) | |||||
# Just in case git can't be found | |||||
try: | |||||
# Get hash of the latest git commit | |||||
revision = subprocess.check_output( ['git', 'rev-parse', 'HEAD'] ).decode()[:-1] | |||||
# Get list of files that have changed since the commit | |||||
changed = subprocess.check_output( ['git', 'diff-index', '--name-only', 'HEAD', '--'] ).decode().splitlines() | |||||
except: | |||||
revision = "<no git>" | |||||
changed = [] | |||||
# Change back to the old working directory | |||||
os.chdir( origPath ) | |||||
return revision, changed | |||||
### Main Entry Point ### | ### Main Entry Point ### | ||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
(baseFiles, defaultFiles, partialFileSets, backend_name, template, defines_template, output, defines_output) = processCommandLineArgs() | (baseFiles, defaultFiles, partialFileSets, backend_name, template, defines_template, output, defines_output) = processCommandLineArgs() | ||||
# Look up git information on the compiler | |||||
gitRev, gitChanges = gitRevision( os.path.dirname( os.path.realpath( __file__ ) ) ) | |||||
# Load backend module | # Load backend module | ||||
global backend | global backend | ||||
backend_import = importlib.import_module( "backends.{0}".format( backend_name ) ) | backend_import = importlib.import_module( "backends.{0}".format( backend_name ) ) | ||||
macros_map.generate() | macros_map.generate() | ||||
# Process needed templating variables using backend | # Process needed templating variables using backend | ||||
backend.process( capabilities_dict, macros_map, variables_dict ) | |||||
backend.process( | |||||
capabilities_dict, | |||||
macros_map, | |||||
variables_dict, | |||||
gitRev, | |||||
gitChanges | |||||
) | |||||
# Generate output file using template and backend | # Generate output file using template and backend | ||||
backend.generate( output, defines_output ) | backend.generate( output, defines_output ) |
/* Copyright (C) 2014 by Jacob Alexander | |||||
/* Copyright (C) 2014-2015 by Jacob Alexander | |||||
* | * | ||||
* This file is free software: you can redistribute it and/or modify | * This file is free software: you can redistribute it and/or modify | ||||
* it under the terms of the GNU General Public License as published by | * it under the terms of the GNU General Public License as published by |
/* Copyright (C) 2014 by Jacob Alexander | |||||
/* Copyright (C) 2014-2015 by Jacob Alexander | |||||
* | * | ||||
* This file is free software: you can redistribute it and/or modify | * This file is free software: you can redistribute it and/or modify | ||||
* it under the terms of the GNU General Public License as published by | * it under the terms of the GNU General Public License as published by |