From bae532d2adc61dc1db83f878366c54cc880b16f6 Mon Sep 17 00:00:00 2001 From: patacongo Date: Wed, 21 Nov 2012 18:19:49 +0000 Subject: configs/cloudctrl and tools/prebuild.py from Darcy Gong git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5378 42af7a65-404d-4744-a932-0658087f49c3 --- nuttx/tools/README.txt | 24 +++++ nuttx/tools/prebuild.py | 256 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 280 insertions(+) create mode 100644 nuttx/tools/prebuild.py (limited to 'nuttx/tools') diff --git a/nuttx/tools/README.txt b/nuttx/tools/README.txt index 68b85dc4f..efe8ad68f 100644 --- a/nuttx/tools/README.txt +++ b/nuttx/tools/README.txt @@ -403,6 +403,30 @@ unlink.sh script so that it uses the NTFS mklink command. But I have never tried that +prebuild.py +----------- + + This is a Python script contributed by Darcy Gong that automates many + build actions: + + Nuttx configure utils v 0.3 + usage: tools/prebuild.py [-abcdfhmr] [-b boardname] [-l number]\n'%(program_name) + -c, --clean : Will execute "make clean" command. + -d, --distclean : Will execute "make distclean" command. + -l, --cleanlevel : Will execute "make clean"(value of 1) or "make distclean"(value of 2) command. + -f, --fixcfg : The configuration correction nuttx.cfg defconfig configuration items. + -a, --auto : Equivalent parameters -d and -f. + -b, --boardname : The boardname configuration. + -r, --mkromfs : Make Romfs. + -m, --make : Make now. + -h, --help : Help Message. + + example:' + usage 1 : tools/prebuild.py -b fire-stm32v2/nsh + usage 2 : tools/prebuild.py -f -b fire-stm32v2/nsh + usage 3 : tools/prebuild.py -a -b fire-stm32v2/nsh + usage 4 : tools/prebuild.py -l 1 -f -b fire-stm32v2/nsh + mkimage.sh ---------- diff --git a/nuttx/tools/prebuild.py b/nuttx/tools/prebuild.py new file mode 100644 index 000000000..34fed09b6 --- /dev/null +++ b/nuttx/tools/prebuild.py @@ -0,0 +1,256 @@ +#!/usr/bin/python + +import os +import sys,getopt +import commands +import ConfigParser +import socket +import fcntl +import struct +import re + +class Enum(object): + def __init__(self, *keys): + self.__dict__.update(zip(keys, range(len(keys)))) + +enum_parse_tag = Enum('tag','item') +enum_config = Enum('std','ext') + +def put_file_contents(filename,data=''): + if not os.path.isfile(filename): + return '' + try: + f = open(filename,'w') + contents = f.write(data) + f.close() + except IOError: + print 'file open or write err!' + +def fix_nuttx_cfg_value(key,val): + #if key == "CONFIG_NSH_IPADDR": + if re.search(r"_IPADDR$", key): + return '%s=%s\n'%(key,get_local_ip(50,2)) + #elif key == "CONFIG_NSH_DRIPADDR": + elif re.search(r"_DRIPADDR$", key): + return '%s=%s\n'%(key,get_local_ip(1,2)) + else: + return '%s=%s\n'%(key,val) + +def fix_nuttx_config(cfg,fix_cfgs): + result = '' + for line in cfg.readlines(): + line = line.strip() + if line.startswith('#'): + result += line+'\n' + continue + elif len(line) == 0: + result += '\n' + continue + elif line.count('=') > 0 : + #print line + it = line.find('=') + key = line[0:it].strip() + val = line[it + 1:].strip() + if fix_cfgs.has_key(key): + result += fix_nuttx_cfg_value(key, fix_cfgs.pop(key)) + else: + result += line+'\n' + else: + result += line+'\n' + #fix_cfgs = {} + #print fix_cfgs.viewitems() + if (len(fix_cfgs.keys())>0): + result += '\n\n####################################################\n\n' + for key in fix_cfgs.keys(): + result += fix_nuttx_cfg_value(key, fix_cfgs.pop(key)) + return result + + +def usage(): + program_name = sys.argv[0] + print 'Nuttx configure utils v 0.3\n' + print ' usage: %s [-abcdfhmr] [-b boardname] [-l number]\n'%(program_name) + print ' -c, --clean : Will execute "make clean" command.' + print ' -d, --distclean : Will execute "make distclean" command.' + print ' -l, --cleanlevel : Will execute "make clean"(value of 1) or "make distclean"(value of 2) command.' + print ' -f, --fixcfg : The configuration correction nuttx.cfg defconfig configuration items.' + print ' -a, --auto : Equivalent parameters -d and -f.' + print ' -b, --boardname : The boardname configuration.' + print ' -r, --mkromfs : Make Romfs.' + print ' -m, --make : Make now.' + print ' -h, --help : Help Message.' + print '\n example:' + print ' usage 1 : %s -b fire-stm32v2/nsh'%(program_name) + print ' usage 2 : %s -f -b fire-stm32v2/nsh'%(program_name) + print ' usage 3 : %s -a -b fire-stm32v2/nsh'%(program_name) + print ' usage 4 : %s -l 1 -f -b fire-stm32v2/nsh'%(program_name) + +def fix_config(boardname,fix_cfgs): + cfg_path = './configs/%s/defconfig'%boardname + if (os.path.isfile(cfg_path)): + try: + cfg = open(cfg_path, "r") + contents = fix_nuttx_config(cfg,fix_cfgs) + cfg.close() + #print contents + put_file_contents(cfg_path,contents) + except IOError: + print 'nuttx config open err!' + return '' + +def fix_root_config(fix_cfgs): + cfg_path = '.config' + if (os.path.isfile(cfg_path)): + try: + cfg = open(cfg_path, "r") + contents = fix_nuttx_config(cfg,fix_cfgs) + cfg.close() + #print contents + put_file_contents(cfg_path,contents) + except IOError: + print 'nuttx config open err!' + return '' + +def get_local_ipn(ifname): + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + ip = fcntl.ioctl(s.fileno(), + 0x8915, # SIOCGIFADDR + struct.pack('256s', ifname[:15]))[20:24] + return ip + +def get_local_ip(id=-1,mode=1): + ip = get_local_ipn('eth0') + if (id < 0): + id = ord(ip[3]) + ipr = ord(ip[0])<<24|ord(ip[1])<<16|ord(ip[2])<<8|(id & 0xFF) + if mode == 1 : + return socket.inet_ntoa(struct.pack('>L', ipr)) + if mode == 2 : + return "0x%x"%ipr + else: + return ipr + +def get_ip_address(ifname): + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + return socket.inet_ntoa(fcntl.ioctl( + s.fileno(), + 0x8915, # SIOCGIFADDR + struct.pack('256s', ifname[:15]) + )[20:24]) + +def config(cfg={}): + output = '' + fix_cfgs = {} + if cfg.clearlevel == 2: + print "make distclean apps_distclean" + output = commands.getoutput("make distclean apps_distclean") + elif cfg.clearlevel == 1: + print "make clean apps_clean" + output = commands.getoutput("make clean apps_clean") + + ini = ConfigParser.ConfigParser() + ini.optionxform = str + cfgf = 'nuttx_cfg.py' + #if not(os.path.isfile(cfgf)): + #fp = open(cfgf,'w') + #fp.write('# is nuttx config\n[info]\nlast=') + #fp.close() + #cfgf = open(cfgf,'rw') + ini.readfp(open(cfgf)) + lastfile = ini.get('info','last') + if (cmp(lastfile,cfg.boardname) != 0): + if ((cfg.boardname.strip() !='')): + lastfile = cfg.boardname + ini.set('info','last',lastfile) + ini.write(open(cfgf, "w")) + if cfg.usefix: + #print lastfile + if ini.has_section('defconfig'): + opts = ini.items('defconfig') + for item in opts: + fix_cfgs[item[0]] = item[1] + if ini.has_section(lastfile): + opts = ini.items(lastfile) + for item in opts: + fix_cfgs[item[0]] = item[1] + #print fix_cfgs + #fix_config(boardname,fix_cfgs) + + output = commands.getoutput("cd tools;./configure.sh %s;cd .."%lastfile) + print "tools/configure.sh %s"%lastfile + if cfg.usefix: + fix_root_config(fix_cfgs) + print "fix .config file" + if cfg.mkromfs: + if (os.path.isfile("./rcS.template")): + print "tools/mkromfsimg.sh ." + #output = commands.getoutput("tools/mkromfs.sh .") + os.system("tools/mkromfsimg.sh .") + bpath = "configs/%s/include"%(lastfile.split('/')[0]) + if (not os.path.exists(bpath)): + print "mkdir -p %s"%(bpath) + #commands.getoutput("mkdir -pv %s"%(bpath)) + os.system("mkdir -pv %s"%(bpath)) + if (not os.path.exists(bpath)): + print "[ERROR] no %s"%(bpath) + if (os.path.isfile("nsh_romfsimg.h")): + print "cp nsh_romfsimg.h %s/nsh_romfsimg.h"%(bpath) + #output = commands.getoutput("cp nsh_romfsimg.h include/arch/board/nsh_romfsimg.h") + os.system("cp nsh_romfsimg.h %s/nsh_romfsimg.h"%(bpath)) + if cfg.make: + os.system("sleep 3") + print "make" + os.system("make") + if '' != output.strip(): + print output + +class cfgobj(): + usefix = False + mkromfs = False + make = False + clearlevel = 0 + boardname = '' + +def main(): + try: + opts, args = getopt.getopt(sys.argv[1:], "dcb:hal:frm", + ["dictclean","clean","board=", "auto", "cleanlevel=", + "help","fixcfg","mkromfs","make"]) + except getopt.GetoptError: + # print help information and exit: + usage() + sys.exit(2) + #cfg = {"usefix":False,"mkromfs":False,"make":False,"clearlevel":0,"boardname":'' } + cfg = cfgobj() + for o, v in opts: + if o in ("-a","--auto"): + cfg.clearlevel = 2 + cfg.usefix = True + cfg.mkromfs = True + cfg.make = True + if o in ("-c","--clean"): + cfg.clearlevel = 1 + if o in ("-d","--distclean"): + cfg.clearlevel = 2 + if o in ("-l","--cleanlevel"): + if v == '1': + cfg.clearlevel = 1 + elif v == '2': + cfg.clearlevel = 2 + else: + cfg.clearlevel = 0 + if o in ("-b","--board"): + cfg.boardname = v + if o in ("-f","--fixcfg"): + cfg.usefix = True + if o in ("-r","--mkromfs"): + cfg.mkromfs = True + if o in ("-m","--make"): + cfg.make = True + if o in ("-h", "--help"): + usage() + sys.exit() + config(cfg) + +if __name__ == "__main__": + main() -- cgit v1.2.3