diff --git a/bin/ardmk-init b/bin/ardmk-init new file mode 100644 index 0000000..225debe --- /dev/null +++ b/bin/ardmk-init @@ -0,0 +1,139 @@ +#!/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 \n\ +#include \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 Makefile...")) + puts(colored.red("Any existing Makefile in current 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 " + 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 " + 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()