From 91604be7cc6a6b55f5890998c08856acc2dd9f0b Mon Sep 17 00:00:00 2001 From: John Whittington Date: Fri, 22 Sep 2017 14:42:24 +0000 Subject: WIP: CLI project makefile generator --- bin/ardmk-init | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 bin/ardmk-init (limited to 'bin/ardmk-init') 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() -- cgit v1.2.3 From 8819e761fbe45082f4a1357b80eec2b9650a5910 Mon Sep 17 00:00:00 2001 From: John Whittington Date: Mon, 25 Sep 2017 10:45:14 +0000 Subject: WIP: ardmk-init more verbose about directory operating in --- bin/ardmk-init | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) mode change 100644 => 100755 bin/ardmk-init (limited to 'bin/ardmk-init') diff --git a/bin/ardmk-init b/bin/ardmk-init old mode 100644 new mode 100755 index 225debe..5976f2e --- a/bin/ardmk-init +++ b/bin/ardmk-init @@ -32,8 +32,8 @@ 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!!")) + 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') @@ -111,7 +111,7 @@ def writeToMakefile(fileContents, path): def writeTemplate(filename): src = open((filename + ".ino"),'w') - puts(colored.cyan("Writing " + filename + ".ino...")) + puts(colored.cyan("Writing " + os.path.abspath(filename) + ".ino...")) if args.verbose: puts(colored.yellow(ard_template)) src.write("/* Project: " + filename + " */\n" + ard_template) @@ -120,7 +120,7 @@ def writeTemplate(filename): def checkCreateFolder(folder): if folder and not folder == 'AUTO': if not os.path.exists(folder): - puts(colored.cyan(("Creating " + folder + " folder"))) + puts(colored.cyan(("Creating " + os.path.abspath(folder) + " folder"))) os.makedirs(folder) def checkDefine(define, user): -- cgit v1.2.3 From f3bb8249c128df016d1cd417e9c61f6afa3a7a2c Mon Sep 17 00:00:00 2001 From: John Whittington Date: Mon, 25 Sep 2017 15:43:13 +0000 Subject: ardmk-init arg parse options and made V1.0 --- bin/ardmk-init | 149 +++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 108 insertions(+), 41 deletions(-) (limited to 'bin/ardmk-init') diff --git a/bin/ardmk-init b/bin/ardmk-init index 5976f2e..4b3b1f7 100755 --- a/bin/ardmk-init +++ b/bin/ardmk-init @@ -7,8 +7,8 @@ import argparse from clint.textui import prompt, validators, colored, puts ## Global Vars -VERSION = "0.1" -directory = "" +VERSION = "1.0" +directory = os.getcwd() ard_template = "\n\ #include \n\ #include \n\ @@ -22,48 +22,100 @@ void loop() {\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') +parser = argparse.ArgumentParser(description='Arduino Makefile and boilerplate project generator. For use with Ard-Makefile: https://github.com/sudar/Arduino-Makefile. Script created by John Whittington https://github.com/tuna-f1sh 2017\n\nVersion: ' + VERSION, usage='"ardmk-init -b uno -quiet -project" Automonously create boiler plate Arduino Uno project in current working directory with same name. See --help for more.') +parser.add_argument('-v', '--verbose', action='store_true', help="print file contents during creation") +parser.add_argument('-d', '--directory', default=directory, help='directory to run generator') +parser.add_argument('-b', '--board', default='uno', help='board tag') +parser.add_argument('-u', '--micro', default='AUTO', help='microcontroller on board') +parser.add_argument('-f', '--freq', default='AUTO', help='mlock frequency') +parser.add_argument('-p', '--port', default='AUTO', help='monitor port') +parser.add_argument('-n', '--name', default=os.path.basename(directory), help='project name') +parser.add_argument('-q', '--quiet', action='store_true', help='run quiet without user prompts') +parser.add_argument('-P', '--project', action='store_true', help='create boilerplate project with src, lib and bin folder structure') +parser.add_argument('-t', '--template', action='store_true', help='create bare minimum Arduino source file') 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') + + # Basic + if not args.quiet: + puts(colored.cyan("Generating Arduino Ard-Makefile project in " + os.path.abspath(directory))) + 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') else: - bsub = 'AUTO' - f_cpu = 'AUTO' - monitor_port = prompt.query('Arduino port?', default='AUTO') + btag = args.board + bsub = args.micro + f_cpu = args.freq + monitor_port = args.port 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) + # Extended + if not args.quiet: + 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=[]) + else: + src_dir = '' + userlibs = 'AUTO' + obj_dir = 'AUTO' + 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) + else: + src_dir = '' + + if args.template or not prompt.yn('Create template Arduino source?', default='n'): + sourceFilename = prompt.query('Name of project?', default=os.path.basename(os.getcwd())) + if src_dir: + writeTemplate(src_dir + "/" + sourceFilename) + else: + writeTemplate(sourceFilename) + fileContents += checkDefine('TARGET', sourceFilename) + + else: + if args.project: + src_dir = 'src' + userlibs = 'lib' + obj_dir = 'bin' + else: + src_dir = '' + userlibs = 'AUTO' + obj_dir = 'AUTO' # Check andd create folders checkCreateFolder(src_dir) @@ -78,18 +130,19 @@ def generateMakefile(): 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 args.project or args.template: + if src_dir: + writeTemplate(src_dir + "/" + args.name) + else: + writeTemplate(args.name) + fileContents += checkDefine('TARGET', args.name) 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" - + if args.quiet: + puts(colored.magenta('Warning: ARDMK_DIR environment variable not defined. Must be defined for Makefile to work')) + else: + ardmk = prompt.query('Arduino Makefile path?', default='/usr/share/arduino', validators=[validators.PathValidator()]) + ardmk = "ARDMK_DIR := " + ardmk + "\n" fileContents += "\ninclude $(ARDMK_DIR)/Arduino.mk" @@ -110,8 +163,15 @@ def writeToMakefile(fileContents, path): makefile.close() def writeTemplate(filename): - src = open((filename + ".ino"),'w') puts(colored.cyan("Writing " + os.path.abspath(filename) + ".ino...")) + if os.path.isfile(filename + '.ino'): + if args.quiet: + puts(colored.red(filename + '.ino' + ' already exists! Stopping.')) + return + puts(colored.red(filename + '.ino' + ' already exists! Overwrite?')) + if prompt.yn('Continue?', default='n'): + return + src = open((filename + ".ino"),'w') if args.verbose: puts(colored.yellow(ard_template)) src.write("/* Project: " + filename + " */\n" + ard_template) @@ -134,6 +194,13 @@ def main(): checkCreateFolder(directory) # Change to dir so all commands are run relative os.chdir(directory) + if os.path.isfile('Makefile'): + if args.quiet: + puts(colored.red('Makefile in ' + os.path.abspath(directory) + ' already exists! Stopping.')) + return + puts(colored.red('Makefile in ' + os.path.abspath(directory) + ' already exists! Overwrite?')) + if prompt.yn('Continue?', default='n'): + return generateMakefile(); main() -- cgit v1.2.3 From c2d17c825a7b9e20c8ad76d5983007db20fa5e0b Mon Sep 17 00:00:00 2001 From: John Whittington Date: Mon, 2 Oct 2017 15:26:02 +0100 Subject: ardmk-init linted using pylint --- bin/ardmk-init | 230 ++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 139 insertions(+), 91 deletions(-) (limited to 'bin/ardmk-init') diff --git a/bin/ardmk-init b/bin/ardmk-init index 4b3b1f7..ec1f3b8 100755 --- a/bin/ardmk-init +++ b/bin/ardmk-init @@ -1,15 +1,30 @@ #!/usr/bin/env python +""" +Arduino-mk Makefile and project initialiser + +This script can be used in it's basic form create a project specific Makefile +for use with Arduino-mk. Addionally, it can be used to create a template +Arduino source file and a traditional boilerplate project file structure. + +Example: + * Run prompted within current working directory: `ardmk-init` + * Create Arduino Uno Makefile (useful within a library example): `ardmk-init -qb uno` + * Create boilerplate Arduino Uno project in current working directory of same + name: `ardmk-init -b uno --quiet --project` + * Create Arduino-mk nano Makefile in current working directory with template .ino: + `ardmk-init -b nano -u atmega328 -qtn my-project` + +See `armk-init --help` for CLI arguments +""" from __future__ import print_function -import serial import os import argparse from clint.textui import prompt, validators, colored, puts ## Global Vars VERSION = "1.0" -directory = os.getcwd() -ard_template = "\n\ +ARD_TEMPLATE = "\n\ #include \n\ #include \n\ \n\ @@ -22,30 +37,38 @@ void loop() {\n\ " ## Command Parser -parser = argparse.ArgumentParser(description='Arduino Makefile and boilerplate project generator. For use with Ard-Makefile: https://github.com/sudar/Arduino-Makefile. Script created by John Whittington https://github.com/tuna-f1sh 2017\n\nVersion: ' + VERSION, usage='"ardmk-init -b uno -quiet -project" Automonously create boiler plate Arduino Uno project in current working directory with same name. See --help for more.') -parser.add_argument('-v', '--verbose', action='store_true', help="print file contents during creation") -parser.add_argument('-d', '--directory', default=directory, help='directory to run generator') -parser.add_argument('-b', '--board', default='uno', help='board tag') -parser.add_argument('-u', '--micro', default='AUTO', help='microcontroller on board') -parser.add_argument('-f', '--freq', default='AUTO', help='mlock frequency') -parser.add_argument('-p', '--port', default='AUTO', help='monitor port') -parser.add_argument('-n', '--name', default=os.path.basename(directory), help='project name') -parser.add_argument('-q', '--quiet', action='store_true', help='run quiet without user prompts') -parser.add_argument('-P', '--project', action='store_true', help='create boilerplate project with src, lib and bin folder structure') -parser.add_argument('-t', '--template', action='store_true', help='create bare minimum Arduino source file') -args = parser.parse_args() - -directory = args.directory - -def generateMakefile(): +PARSER = argparse.ArgumentParser(description='Arduino Makefile and boilerplate project generator.\ + For use with Ard-Makefile: https://github.com/sudar/Arduino-Makefile.\ + Script created by John Whittington https://github.com/tuna-f1sh 2017\ + \n\nVersion: ' + VERSION, usage='ardmk-init # prompted CLI, see --help for more.') +PARSER.add_argument('-v', '--verbose', action='store_true', + help="print file contents during creation") +PARSER.add_argument('-d', '--directory', default=os.getcwd(), help='directory to run generator') +PARSER.add_argument('-b', '--board', default='uno', help='board tag') +PARSER.add_argument('-u', '--micro', default='AUTO', help='microcontroller on board') +PARSER.add_argument('-f', '--freq', default='AUTO', help='mlock frequency') +PARSER.add_argument('-p', '--port', default='AUTO', help='monitor port') +PARSER.add_argument('-n', '--name', default=os.path.basename(os.getcwd()), help='project name') +PARSER.add_argument('-q', '--quiet', action='store_true', help='run quiet without user prompts') +PARSER.add_argument('-P', '--project', action='store_true', + help='create boilerplate project with src, lib and bin folder structure') +PARSER.add_argument('-t', '--template', action='store_true', + help='create bare minimum Arduino source file') +ARGS = PARSER.parse_args() + +def generate_makefile(): + """ + Generate the Makefile content using prompts or parsed arguments + """ # Header - fileContents = "# Generated by ard-make version " + VERSION + "\n\n" + file_content = "# Generated by ard-make version " + VERSION + "\n\n" # Basic - if not args.quiet: - puts(colored.cyan("Generating Arduino Ard-Makefile project in " + os.path.abspath(directory))) + if not ARGS.quiet: + puts(colored.cyan("Generating Arduino Ard-Makefile project in " + + os.path.abspath(ARGS.directory))) btag = prompt.query('Board tag?', default='uno') - if not btag == 'uno': + if btag != 'uno': bsub = prompt.query('Board sub micro?', default='atmega328') f_cpu = prompt.query('Board frequency', default='16000000L') else: @@ -53,22 +76,24 @@ def generateMakefile(): f_cpu = 'AUTO' monitor_port = prompt.query('Arduino port?', default='AUTO') else: - btag = args.board - bsub = args.micro - f_cpu = args.freq - monitor_port = args.port + btag = ARGS.board + bsub = ARGS.micro + f_cpu = ARGS.freq + monitor_port = ARGS.port - fileContents += checkDefine('BOARD_TAG', btag) - fileContents += checkDefine('BOARD_SUB', bsub) - fileContents += checkDefine('F_CPU', f_cpu) - fileContents += checkDefine('MONITOR_PORT', monitor_port) + file_content += check_define('BOARD_TAG', btag) + file_content += check_define('BOARD_SUB', bsub) + file_content += check_define('F_CPU', f_cpu) + file_content += check_define('MONITOR_PORT', monitor_port) # Extended - if not args.quiet: + if not ARGS.quiet: 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=[]) + 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=[]) else: src_dir = '' @@ -78,37 +103,38 @@ def generateMakefile(): 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" + file_content += "ARDUINO_QUIET = 1\n" - fileContents += checkDefine('ISP_PROG', isp_prog) - fileContents += checkDefine('ISP_PORT', isp_port) - fileContents += checkDefine('BOARDS_TXT', boards_txt) + file_content += check_define('ISP_PROG', isp_prog) + file_content += check_define('ISP_PORT', isp_port) + file_content += check_define('BOARDS_TXT', boards_txt) # Check andd create folders - checkCreateFolder(src_dir) - checkCreateFolder(userlibs) - checkCreateFolder(obj_dir) + check_create_folder(src_dir) + check_create_folder(userlibs) + check_create_folder(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) + file_content += check_define('USER_LIB_PATH', userlibs) + file_content += check_define('OBJDIR', obj_dir) else: src_dir = '' - if args.template or not prompt.yn('Create template Arduino source?', default='n'): - sourceFilename = prompt.query('Name of project?', default=os.path.basename(os.getcwd())) + if ARGS.template or not prompt.yn('Create template Arduino source?', default='n'): + source_filename = prompt.query('Name of project?', + default=os.path.basename(os.getcwd())) if src_dir: - writeTemplate(src_dir + "/" + sourceFilename) + write_template(src_dir + "/" + source_filename) else: - writeTemplate(sourceFilename) - fileContents += checkDefine('TARGET', sourceFilename) + write_template(source_filename) + file_content += check_define('TARGET', source_filename) else: - if args.project: + if ARGS.project: src_dir = 'src' userlibs = 'lib' obj_dir = 'bin' @@ -118,89 +144,111 @@ def generateMakefile(): obj_dir = 'AUTO' # Check andd create folders - checkCreateFolder(src_dir) - checkCreateFolder(userlibs) - checkCreateFolder(obj_dir) + check_create_folder(src_dir) + check_create_folder(userlibs) + check_create_folder(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) + file_content += check_define('USER_LIB_PATH', userlibs) + file_content += check_define('OBJDIR', obj_dir) - if args.project or args.template: + if ARGS.project or ARGS.template: if src_dir: - writeTemplate(src_dir + "/" + args.name) + write_template(src_dir + "/" + ARGS.name) else: - writeTemplate(args.name) - fileContents += checkDefine('TARGET', args.name) + write_template(ARGS.name) + file_content += check_define('TARGET', ARGS.name) if not "ARDMK_DIR" in os.environ: - if args.quiet: - puts(colored.magenta('Warning: ARDMK_DIR environment variable not defined. Must be defined for Makefile to work')) + if ARGS.quiet: + puts(colored.magenta('Warning: ARDMK_DIR environment variable not defined. \ + Must be defined for Makefile to work')) else: - ardmk = prompt.query('Arduino Makefile path?', default='/usr/share/arduino', validators=[validators.PathValidator()]) + ardmk = prompt.query('Arduino Makefile path?', + default='/usr/share/arduino', + validators=[validators.PathValidator()]) ardmk = "ARDMK_DIR := " + ardmk + "\n" - fileContents += "\ninclude $(ARDMK_DIR)/Arduino.mk" + file_content += "\ninclude $(ARDMK_DIR)/Arduino.mk" # Add forward slash if source directory exists if src_dir: - writeToMakefile(fileContents, (src_dir + "/")) + write_to_makefile(file_content, (src_dir + "/")) else: - writeToMakefile(fileContents, "") + write_to_makefile(file_content, "") - return fileContents + return file_content -def writeToMakefile(fileContents, path): +def write_to_makefile(file_content, path): + """ + Write the Makefile file + """ makefile = open(path + "Makefile", 'w') puts(colored.cyan("Writing Makefile...")) - if args.verbose: - puts(colored.yellow(fileContents)) - makefile.write(fileContents) + if ARGS.verbose: + puts(colored.yellow(file_content)) + makefile.write(file_content) makefile.close() -def writeTemplate(filename): +def write_template(filename): + """ + Write template Arduino .ino source + """ puts(colored.cyan("Writing " + os.path.abspath(filename) + ".ino...")) if os.path.isfile(filename + '.ino'): - if args.quiet: + if ARGS.quiet: puts(colored.red(filename + '.ino' + ' already exists! Stopping.')) return puts(colored.red(filename + '.ino' + ' already exists! Overwrite?')) if prompt.yn('Continue?', default='n'): return - src = open((filename + ".ino"),'w') - if args.verbose: - puts(colored.yellow(ard_template)) - src.write("/* Project: " + filename + " */\n" + ard_template) + src = open((filename + ".ino"), 'w') + if ARGS.verbose: + puts(colored.yellow(ARD_TEMPLATE)) + src.write("/* Project: " + filename + " */\n" + ARD_TEMPLATE) src.close() -def checkCreateFolder(folder): +def check_create_folder(folder): + """ + Check if folder exists and make it if it doesn't and hasn't been set to AUTO + """ 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): +def check_define(define, user): + """ + Check whether user has set define and return Makefile formatted string if they have + """ + # Return is empty unless user has passed value + string = "" + + # Set define only if not empty or set to AUTO if user and not user == 'AUTO': - return define + " = " + user + "\n" - else: - return "" + string = define + " = " + user + "\n" -def main(): + return string + +if __name__ == '__main__': # Create directory if not exist - checkCreateFolder(directory) + check_create_folder(ARGS.directory) # Change to dir so all commands are run relative - os.chdir(directory) + os.chdir(ARGS.directory) if os.path.isfile('Makefile'): - if args.quiet: - puts(colored.red('Makefile in ' + os.path.abspath(directory) + ' already exists! Stopping.')) - return - puts(colored.red('Makefile in ' + os.path.abspath(directory) + ' already exists! Overwrite?')) + if ARGS.quiet: + puts(colored.red('Makefile in ' + os.path.abspath(ARGS.directory) + + ' already exists! Stopping.')) + quit() + + # Confirm with user if not quiet mode + puts(colored.red('Makefile in ' + os.path.abspath(ARGS.directory) + + ' already exists! Overwrite?')) if prompt.yn('Continue?', default='n'): - return - generateMakefile(); - -main() + quit() + # Run it + generate_makefile() -- cgit v1.2.3 From 55c149fb0352a56b57fce98c706a0a23f743a66b Mon Sep 17 00:00:00 2001 From: John Whittington Date: Fri, 6 Oct 2017 10:32:17 +0100 Subject: Add ardmk-init manpage and correct typos --- bin/ardmk-init | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'bin/ardmk-init') diff --git a/bin/ardmk-init b/bin/ardmk-init index ec1f3b8..bf932d5 100755 --- a/bin/ardmk-init +++ b/bin/ardmk-init @@ -2,7 +2,7 @@ """ Arduino-mk Makefile and project initialiser -This script can be used in it's basic form create a project specific Makefile +This script can be used in its basic form create a project specific Makefile for use with Arduino-mk. Addionally, it can be used to create a template Arduino source file and a traditional boilerplate project file structure. @@ -46,7 +46,7 @@ PARSER.add_argument('-v', '--verbose', action='store_true', PARSER.add_argument('-d', '--directory', default=os.getcwd(), help='directory to run generator') PARSER.add_argument('-b', '--board', default='uno', help='board tag') PARSER.add_argument('-u', '--micro', default='AUTO', help='microcontroller on board') -PARSER.add_argument('-f', '--freq', default='AUTO', help='mlock frequency') +PARSER.add_argument('-f', '--freq', default='AUTO', help='clock frequency') PARSER.add_argument('-p', '--port', default='AUTO', help='monitor port') PARSER.add_argument('-n', '--name', default=os.path.basename(os.getcwd()), help='project name') PARSER.add_argument('-q', '--quiet', action='store_true', help='run quiet without user prompts') -- cgit v1.2.3 From 2a4c2660be99e0b27c4faed9980d5ab0b96ee2e2 Mon Sep 17 00:00:00 2001 From: John Whittington Date: Thu, 12 Oct 2017 09:25:56 +0100 Subject: Run ardmk-init without dependancy if running quiet --- bin/ardmk-init | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) (limited to 'bin/ardmk-init') diff --git a/bin/ardmk-init b/bin/ardmk-init index bf932d5..461e9ab 100755 --- a/bin/ardmk-init +++ b/bin/ardmk-init @@ -20,7 +20,6 @@ See `armk-init --help` for CLI arguments from __future__ import print_function import os import argparse -from clint.textui import prompt, validators, colored, puts ## Global Vars VERSION = "1.0" @@ -56,6 +55,14 @@ PARSER.add_argument('-t', '--template', action='store_true', help='create bare minimum Arduino source file') ARGS = PARSER.parse_args() +try: + from clint.textui import prompt, validators +except ImportError: + if not ARGS.quiet: + print("Python module 'clint' is required for running prompted. Install the module or run with arguments only using --quiet") + quit() + + def generate_makefile(): """ Generate the Makefile content using prompts or parsed arguments @@ -65,8 +72,8 @@ def generate_makefile(): # Basic if not ARGS.quiet: - puts(colored.cyan("Generating Arduino Ard-Makefile project in " - + os.path.abspath(ARGS.directory))) + print("Generating Arduino Ard-Makefile project in " + + os.path.abspath(ARGS.directory)) btag = prompt.query('Board tag?', default='uno') if btag != 'uno': bsub = prompt.query('Board sub micro?', default='atmega328') @@ -188,9 +195,9 @@ def write_to_makefile(file_content, path): Write the Makefile file """ makefile = open(path + "Makefile", 'w') - puts(colored.cyan("Writing Makefile...")) + print("Writing Makefile...") if ARGS.verbose: - puts(colored.yellow(file_content)) + print(file_content) makefile.write(file_content) makefile.close() @@ -198,17 +205,17 @@ def write_template(filename): """ Write template Arduino .ino source """ - puts(colored.cyan("Writing " + os.path.abspath(filename) + ".ino...")) + print("Writing " + os.path.abspath(filename) + ".ino...") if os.path.isfile(filename + '.ino'): if ARGS.quiet: - puts(colored.red(filename + '.ino' + ' already exists! Stopping.')) + print(filename + '.ino' + ' already exists! Stopping.') return - puts(colored.red(filename + '.ino' + ' already exists! Overwrite?')) + print(filename + '.ino' + ' already exists! Overwrite?') if prompt.yn('Continue?', default='n'): return src = open((filename + ".ino"), 'w') if ARGS.verbose: - puts(colored.yellow(ARD_TEMPLATE)) + print(ARD_TEMPLATE) src.write("/* Project: " + filename + " */\n" + ARD_TEMPLATE) src.close() @@ -218,7 +225,7 @@ def check_create_folder(folder): """ if folder and not folder == 'AUTO': if not os.path.exists(folder): - puts(colored.cyan(("Creating " + os.path.abspath(folder) + " folder"))) + print("Creating " + os.path.abspath(folder) + " folder") os.makedirs(folder) def check_define(define, user): @@ -241,13 +248,13 @@ if __name__ == '__main__': os.chdir(ARGS.directory) if os.path.isfile('Makefile'): if ARGS.quiet: - puts(colored.red('Makefile in ' + os.path.abspath(ARGS.directory) - + ' already exists! Stopping.')) + print('Makefile in ' + os.path.abspath(ARGS.directory) + + ' already exists! Stopping.') quit() # Confirm with user if not quiet mode - puts(colored.red('Makefile in ' + os.path.abspath(ARGS.directory) - + ' already exists! Overwrite?')) + print('Makefile in ' + os.path.abspath(ARGS.directory) + + ' already exists! Overwrite?') if prompt.yn('Continue?', default='n'): quit() # Run it -- cgit v1.2.3 From d874c59103fc9619df906c0f967bcfa539325592 Mon Sep 17 00:00:00 2001 From: John Whittington Date: Tue, 7 Nov 2017 16:54:34 +0000 Subject: ardmk-init runs without prompt by default, cli arg added to avoid clint dependency --- bin/ardmk-init | 59 +++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 23 deletions(-) (limited to 'bin/ardmk-init') diff --git a/bin/ardmk-init b/bin/ardmk-init index 461e9ab..1a01cd3 100755 --- a/bin/ardmk-init +++ b/bin/ardmk-init @@ -7,12 +7,12 @@ for use with Arduino-mk. Addionally, it can be used to create a template Arduino source file and a traditional boilerplate project file structure. Example: - * Run prompted within current working directory: `ardmk-init` - * Create Arduino Uno Makefile (useful within a library example): `ardmk-init -qb uno` + * Run prompted within current working directory (requires Clint): `ardmk-init --cli` + * Create Arduino Uno Makefile (useful within a library example): `ardmk-init -b uno` * Create boilerplate Arduino Uno project in current working directory of same - name: `ardmk-init -b uno --quiet --project` + name: `ardmk-init -b uno --project` * Create Arduino-mk nano Makefile in current working directory with template .ino: - `ardmk-init -b nano -u atmega328 -qtn my-project` + `ardmk-init -b nano -u atmega328 -tn my-project` See `armk-init --help` for CLI arguments """ @@ -22,7 +22,7 @@ import os import argparse ## Global Vars -VERSION = "1.0" +VERSION = "1.1" ARD_TEMPLATE = "\n\ #include \n\ #include \n\ @@ -36,30 +36,32 @@ void loop() {\n\ " ## Command Parser -PARSER = argparse.ArgumentParser(description='Arduino Makefile and boilerplate project generator.\ +PARSER = argparse.ArgumentParser(prog='ardmk-init', + description='Arduino Makefile and boilerplate project generator.\ For use with Ard-Makefile: https://github.com/sudar/Arduino-Makefile.\ Script created by John Whittington https://github.com/tuna-f1sh 2017\ - \n\nVersion: ' + VERSION, usage='ardmk-init # prompted CLI, see --help for more.') + \n\nVersion: ' + VERSION) PARSER.add_argument('-v', '--verbose', action='store_true', help="print file contents during creation") -PARSER.add_argument('-d', '--directory', default=os.getcwd(), help='directory to run generator') +PARSER.add_argument('-d', '--directory', default=os.getcwd(), help='directory to run generator, default cwd') PARSER.add_argument('-b', '--board', default='uno', help='board tag') PARSER.add_argument('-u', '--micro', default='AUTO', help='microcontroller on board') PARSER.add_argument('-f', '--freq', default='AUTO', help='clock frequency') PARSER.add_argument('-p', '--port', default='AUTO', help='monitor port') PARSER.add_argument('-n', '--name', default=os.path.basename(os.getcwd()), help='project name') -PARSER.add_argument('-q', '--quiet', action='store_true', help='run quiet without user prompts') +PARSER.add_argument('--cli', action='store_true', help='run with user prompts (requires "Clint" module), rather than args') PARSER.add_argument('-P', '--project', action='store_true', help='create boilerplate project with src, lib and bin folder structure') PARSER.add_argument('-t', '--template', action='store_true', - help='create bare minimum Arduino source file') + help='create bare minimum Arduino source file') +PARSER.add_argument('-V', '--version', action='version', version='%(prog)s '+ VERSION) ARGS = PARSER.parse_args() try: from clint.textui import prompt, validators except ImportError: - if not ARGS.quiet: - print("Python module 'clint' is required for running prompted. Install the module or run with arguments only using --quiet") + if ARGS.cli: + print("Python module 'clint' is required for running prompted. Install the module or run with arguments only") quit() @@ -71,7 +73,7 @@ def generate_makefile(): file_content = "# Generated by ard-make version " + VERSION + "\n\n" # Basic - if not ARGS.quiet: + if ARGS.cli: print("Generating Arduino Ard-Makefile project in " + os.path.abspath(ARGS.directory)) btag = prompt.query('Board tag?', default='uno') @@ -94,13 +96,13 @@ def generate_makefile(): file_content += check_define('MONITOR_PORT', monitor_port) # Extended - if not ARGS.quiet: + if ARGS.cli: 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=[]) + 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=[]) + default='AUTO', validators=[]) obj_dir = prompt.query('Output directory?', default='AUTO', validators=[]) else: src_dir = '' @@ -171,9 +173,9 @@ def generate_makefile(): file_content += check_define('TARGET', ARGS.name) if not "ARDMK_DIR" in os.environ: - if ARGS.quiet: - puts(colored.magenta('Warning: ARDMK_DIR environment variable not defined. \ - Must be defined for Makefile to work')) + if not ARGS.cli: + print("Warning: ARDMK_DIR environment variable not defined. \ + Must be defined for Makefile to work") else: ardmk = prompt.query('Arduino Makefile path?', default='/usr/share/arduino', @@ -207,7 +209,7 @@ def write_template(filename): """ print("Writing " + os.path.abspath(filename) + ".ino...") if os.path.isfile(filename + '.ino'): - if ARGS.quiet: + if not ARGS.cli: print(filename + '.ino' + ' already exists! Stopping.') return print(filename + '.ino' + ' already exists! Overwrite?') @@ -241,15 +243,26 @@ def check_define(define, user): return string +def check_args(): + """ + Check input args will work with Makefile + """ + # Micro should be defined for non uno boards + if ARGS.board != 'uno' and ARGS.micro == 'AUTO': + print('\n!!! Warning: --micro should be defined and not left AUTO for non-Uno boards\n') + + if __name__ == '__main__': # Create directory if not exist check_create_folder(ARGS.directory) + # Check input args + check_args() # Change to dir so all commands are run relative os.chdir(ARGS.directory) if os.path.isfile('Makefile'): - if ARGS.quiet: + if not ARGS.cli: print('Makefile in ' + os.path.abspath(ARGS.directory) - + ' already exists! Stopping.') + + ' already exists! Please remove before generating. Stopping.') quit() # Confirm with user if not quiet mode -- cgit v1.2.3