139 lines
4.8 KiB
Python
Executable file
139 lines
4.8 KiB
Python
Executable file
#!/usr/bin/env python
|
|
|
|
from __future__ import print_function
|
|
import serial
|
|
import os
|
|
import argparse
|
|
from clint.textui import prompt, validators, colored, puts
|
|
|
|
## Global Vars
|
|
VERSION = "0.1"
|
|
directory = ""
|
|
ard_template = "\n\
|
|
#include <Arduino.h>\n\
|
|
#include <Wire.h>\n\
|
|
\n\
|
|
\n\
|
|
void setup() {\n\
|
|
}\n\
|
|
\n\
|
|
void loop() {\n\
|
|
}\n\
|
|
"
|
|
|
|
## Command Parser
|
|
parser = argparse.ArgumentParser(description='Arduino Makefile and boilerplate project generator. For use with Ard-Makefile')
|
|
parser.add_argument('-v', '--verbose', action='store_true', help="Print file contents during creation")
|
|
parser.add_argument('-d', '--directory', default='.', help='Directory to run generator')
|
|
args = parser.parse_args()
|
|
|
|
directory = args.directory
|
|
|
|
def generateMakefile():
|
|
src_dir = ""
|
|
|
|
puts(colored.cyan("Generating Arduino Ard-Makefile project in " + os.path.abspath(directory)))
|
|
puts(colored.red("Any existing Makefile in " + os.path.abspath(directory) + " will be overwritten!!"))
|
|
# Header
|
|
fileContents = "# Generated by ard-make version " + VERSION + "\n\n"
|
|
btag = prompt.query('Board tag?', default='uno')
|
|
if not btag == 'uno':
|
|
bsub = prompt.query('Board sub micro?', default='atmega328')
|
|
f_cpu = prompt.query('Board frequency', default='16000000L')
|
|
else:
|
|
bsub = 'AUTO'
|
|
f_cpu = 'AUTO'
|
|
monitor_port = prompt.query('Arduino port?', default='AUTO')
|
|
|
|
fileContents += checkDefine('BOARD_TAG', btag)
|
|
fileContents += checkDefine('BOARD_SUB', bsub)
|
|
fileContents += checkDefine('F_CPU', f_cpu)
|
|
fileContents += checkDefine('MONITOR_PORT', monitor_port)
|
|
|
|
if not prompt.yn('Extended options?', default='n'):
|
|
if not prompt.yn('Define local folders?', default='n'):
|
|
src_dir = prompt.query('Sources folder (Makefile will be created here)?', default='', validators=[])
|
|
userlibs = prompt.query('Library folder (will create if does not exist) - AUTO is Sketchbook directory?', default='AUTO', validators=[])
|
|
obj_dir = prompt.query('Output directory?', default='AUTO', validators=[])
|
|
boards_txt = prompt.query('Boards file?', default='AUTO')
|
|
isp_prog = prompt.query('ISP programmer?', default='atmelice_isp')
|
|
isp_port = prompt.query('ISP port?', default='AUTO')
|
|
if not prompt.yn('Quiet make?', default='n'):
|
|
fileContents += "ARDUINO_QUIET = 1\n"
|
|
|
|
fileContents += checkDefine('ISP_PROG', isp_prog)
|
|
fileContents += checkDefine('ISP_PORT', isp_port)
|
|
fileContents += checkDefine('BOARDS_TXT', boards_txt)
|
|
|
|
# Check andd create folders
|
|
checkCreateFolder(src_dir)
|
|
checkCreateFolder(userlibs)
|
|
checkCreateFolder(obj_dir)
|
|
|
|
# Makefile will be in src_dir so lib and bin must be relative
|
|
if src_dir:
|
|
userlibs = "../" + userlibs
|
|
obj_dir = "../" + obj_dir
|
|
|
|
fileContents += checkDefine('USER_LIB_PATH', userlibs)
|
|
fileContents += checkDefine('OBJDIR', obj_dir)
|
|
|
|
if not prompt.yn('Create template Arduino source?', default='n'):
|
|
sourceFilename = prompt.query('Name of project?', default='')
|
|
if src_dir:
|
|
writeTemplate(src_dir + "/" + sourceFilename)
|
|
else:
|
|
writeTemplate(sourceFilename)
|
|
fileContents += checkDefine('TARGET', sourceFilename)
|
|
|
|
if not "ARDMK_DIR" in os.environ:
|
|
ardmk = prompt.query('Arduino Makefile path?', default='/usr/share/arduino', validators=[validators.PathValidator()])
|
|
ardmk = "ARDMK_DIR := " + ardmk + "\n"
|
|
|
|
|
|
fileContents += "\ninclude $(ARDMK_DIR)/Arduino.mk"
|
|
|
|
# Add forward slash if source directory exists
|
|
if src_dir:
|
|
writeToMakefile(fileContents, (src_dir + "/"))
|
|
else:
|
|
writeToMakefile(fileContents, "")
|
|
|
|
return fileContents
|
|
|
|
def writeToMakefile(fileContents, path):
|
|
makefile = open(path + "Makefile", 'w')
|
|
puts(colored.cyan("Writing Makefile..."))
|
|
if args.verbose:
|
|
puts(colored.yellow(fileContents))
|
|
makefile.write(fileContents)
|
|
makefile.close()
|
|
|
|
def writeTemplate(filename):
|
|
src = open((filename + ".ino"),'w')
|
|
puts(colored.cyan("Writing " + os.path.abspath(filename) + ".ino..."))
|
|
if args.verbose:
|
|
puts(colored.yellow(ard_template))
|
|
src.write("/* Project: " + filename + " */\n" + ard_template)
|
|
src.close()
|
|
|
|
def checkCreateFolder(folder):
|
|
if folder and not folder == 'AUTO':
|
|
if not os.path.exists(folder):
|
|
puts(colored.cyan(("Creating " + os.path.abspath(folder) + " folder")))
|
|
os.makedirs(folder)
|
|
|
|
def checkDefine(define, user):
|
|
if user and not user == 'AUTO':
|
|
return define + " = " + user + "\n"
|
|
else:
|
|
return ""
|
|
|
|
def main():
|
|
# Create directory if not exist
|
|
checkCreateFolder(directory)
|
|
# Change to dir so all commands are run relative
|
|
os.chdir(directory)
|
|
generateMakefile();
|
|
|
|
main()
|