X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=source%2Fnew-driver;h=81f40699ada296e03a5855031189744e0101445f;hb=b63f8cef412cce8ee15afd97709e6f8b3e722437;hp=602e98201c2e0eb8325971762fbfe532bcaa8fc6;hpb=d51b53237f463a2fbe77d22896fb86ac21b51c21;p=sigrok-util.git diff --git a/source/new-driver b/source/new-driver index 602e982..81f4069 100755 --- a/source/new-driver +++ b/source/new-driver @@ -21,42 +21,21 @@ import os import sys import tempfile -from subprocess import Popen, PIPE +from subprocess import Popen, PIPE, check_output import shutil import re import socket import datetime -TMPL_AUTOCONF_AC_ARG_ENABLE = """\ -AC_ARG_ENABLE(${short}, AC_HELP_STRING([--enable-${short}], - [enable ${name} support [default=yes]]), - [HW_${upper}="$enableval"], - [HW_${upper}=yes]) -AM_CONDITIONAL(HW_${upper}, test x$HW_${upper} = xyes) -if test "x$HW_${upper}" = "xyes"; then - AC_DEFINE(HAVE_HW_${upper}, 1, [${name} support]) -fi +TMPL_AUTOCONF_DRIVER = "SR_DRIVER([${name}], [${short}])\n" -""" -TMPL_AUTOCONF_AC_CONFIG_FILES = "\t\t hardware/${short}/Makefile\n" -TMPL_AUTOCONF_SUMMARY = 'echo " - ${summary}"\n' -TMPL_HWMAKE_SUBDIR = '\t${short}' TMPL_HWMAKE_DRIVERLIB = """if HW_${upper} -libsigrokhardware_la_LIBADD += ${short}/libsigrok_hw_${lib}.la +libsigrok_la_SOURCES += \\ + src/hardware/${short}/protocol.h \\ + src/hardware/${short}/protocol.c \\ + src/hardware/${short}/api.c endif - -""" -TMPL_HWDRIVER_EXTERN = """\ -#ifdef HAVE_HW_${upper} -extern SR_PRIV struct sr_dev_driver ${lib}_driver_info; -#endif """ -TMPL_HWDRIVER_DIPTR = """\ -#ifdef HAVE_HW_${upper} - &${lib}_driver_info, -#endif -""" -FILE_DRV_MAKEFILE = 'drv-Makefile.am' FILE_DRV_API = 'drv-api.c' FILE_DRV_PROTOCOL = 'drv-protocol.c' FILE_DRV_PROTOCOL_H = 'drv-protocol.h' @@ -68,7 +47,7 @@ def tmpl(template): def tmpl_file(filename): - template = open(TMPLDIR + '/' + filename).read() + template = open(os.path.join(TMPLDIR, filename)).read() return tmpl(template) @@ -77,13 +56,14 @@ def new_driver(): tmp = tempfile.mkdtemp() try: os.chdir(tmp) - out, err = Popen("git clone " + LIBSR, shell=True, stderr=PIPE).communicate() - if err: + process = Popen(['git', 'clone', '--depth=1', LIBSR], + stdout=PIPE, stderr=PIPE) + out, err = process.communicate() + if process.returncode: raise Exception(err.decode()) - gitdir = tmp + '/libsigrok/' - do_configure_ac(gitdir) - do_hwdriver(gitdir) - do_hwmake(gitdir) + gitdir = os.path.join(tmp, 'libsigrok') + do_autoconf(gitdir) + do_automake(gitdir) do_driverskel(gitdir) make_patch(gitdir) except Exception as e: @@ -91,209 +71,98 @@ def new_driver(): shutil.rmtree(tmp) -def do_configure_ac(gitdir): - cacpath = gitdir + 'configure.ac' +# add DRIVER and DRIVER2 entries to configure.ac +def do_autoconf(gitdir): + cacpath = os.path.join(gitdir, 'configure.ac') configure_ac = open(cacpath).read() - # add AC_ARG_ENABLE option - out = '' - state = 'copy' - for line in configure_ac.split('\n')[:-1]: - if state == 'copy': - if line == "# Hardware support '--enable' options.": - state = 'acarg' - elif state == 'acarg': - m = re.match('AC_ARG_ENABLE\(([^,]+)', line) - if m: - drv_short = m.group(1) - if drv_short.lower() > names['short']: - out += tmpl(TMPL_AUTOCONF_AC_ARG_ENABLE) - state = 'done' - if line == '# Checks for libraries.': - # new one at the end - out += tmpl(TMPL_AUTOCONF_AC_ARG_ENABLE) - state = 'done' - out += line + '\n' - if state != 'done': - raise Exception('AC_ARG_ENABLE markers not found in configure.ac') - configure_ac = out - - # add driver Makefile to AC_CONFIG_FILES - out = '' - state = 'copy' - for line in configure_ac.split('\n')[:-1]: - if state == 'copy': - if line.find("AC_CONFIG_FILES([Makefile") > -1: - state = 'acconf' - elif state == 'acconf': - m = re.match('\t\t hardware/([^/]+)/Makefile', line) - if m: - drv_short = m.group(1) - if drv_short.lower() > names['short']: - out += tmpl(TMPL_AUTOCONF_AC_CONFIG_FILES) - state = 'done' - else: - # new one at the end - out += tmpl(TMPL_AUTOCONF_AC_CONFIG_FILES) - state = 'done' - out += line + '\n' - if state != 'done': - raise Exception('AC_CONFIG_FILES marker not found in configure.ac') - configure_ac = out - - # add summary line out = '' - state = 'copy' - names['summary'] = "%s%s $HW_%s" % (names['name'], - '.' * (32 - len(names['name'])), names['upper']) + state = 'driver' + active = False for line in configure_ac.split('\n')[:-1]: - if state == 'copy': - if line.find('Enabled hardware drivers') > -1: - state = 'echo' - elif state == 'echo': - m = re.match('echo " - ([^\.]+)', line) + if state == 'driver': + m = re.match(r'SR_DRIVER\(\[([^\]]+)', line) if m: - drv_short = m.group(1) - if drv_short.lower() > names['name'].lower(): - out += tmpl(TMPL_AUTOCONF_SUMMARY) + active = True + if active: + if (m and m.group(1).upper() > names['name'].upper()) or m is None: + out += tmpl(TMPL_AUTOCONF_DRIVER) state = 'done' - else: - # new one at the end - out += tmpl(TMPL_AUTOCONF_SUMMARY) - state = 'done' - out += line + '\n' - if state != 'done': - raise Exception('summary marker not found in configure.ac') - configure_ac = out - - open(cacpath, 'w').write(configure_ac) - - -def do_hwdriver(gitdir): - path = gitdir + 'hwdriver.c' - hwdriver = open(path).read() - # add HAVE_HW_thing extern and pointers - out = '' - state = 'copy' - for line in hwdriver.split('\n')[:-1]: - if state == 'copy': - if line.find('/** @cond PRIVATE */') == 0: - state = 'extern' - elif line.find('static struct sr_dev_driver *drivers_list') == 0: - state = 'diptr' - elif state in ('extern', 'diptr'): - if state == 'extern': - entry = tmpl(TMPL_HWDRIVER_EXTERN) - next_state = 'copy' - else: - entry = tmpl(TMPL_HWDRIVER_DIPTR) - next_state = 'done' - m = re.match('#ifdef HAVE_.._(.*)', line) - if m: - drv = m.group(1) - if drv > names['upper']: - out += entry - state = next_state - elif not re.match('(extern|\t&|#endif)', line): - # new one at the end - out += entry - state = next_state + active = False out += line + '\n' if state != 'done': - raise Exception('HAVE_* markers not found in hwdriver.c') - hwdriver = out - - open(path, 'w').write(hwdriver) + raise Exception('No SR_DRIVER entries found in configure.ac') + open(cacpath, 'w').write(out) -def do_hwmake(gitdir): - path = gitdir + 'hardware/Makefile.am' +# add HW_ entry to Makefile.am +def do_automake(gitdir): + path = os.path.join(gitdir, 'Makefile.am') hwmake = open(path).read() - # add SUBDIRS entry out = '' state = 'copy' for line in hwmake.split('\n')[:-1]: - if state == 'copy': - if line.find('SUBDIRS =') > -1: - state = 'subdirs' - elif state == 'subdirs': - m = re.match('\t([^ \\\]+\s*\\\)', line) - if m: - drv_short = m.group(1) - if drv_short.lower() > names['short']: - out += tmpl(TMPL_HWMAKE_SUBDIR) + ' \\\n' - state = 'driverlib' - else: - out += tmpl(TMPL_HWMAKE_SUBDIR) + ' \\\n' - state = 'driverlib' - elif state == 'driverlib': - m = re.match('if [A-Z]{2}_(.*)$', line) + if state == 'copy' and re.match(r'if\s+HW_\w+$', line): + state = 'drivers' + if state == 'drivers': + m = re.match(r'if\s+HW_(\w+)$', line) if m: drv_short = m.group(1) if drv_short > names['upper']: out += tmpl(TMPL_HWMAKE_DRIVERLIB) state = 'done' + elif not re.match(r'\s*libsigrok_la_SOURCES\b|\s*src/hardware/|endif\b', line): + print("[%s]" % line.strip()) + # we passed the last entry + out += tmpl(TMPL_HWMAKE_DRIVERLIB) + state = 'done' out += line + '\n' - if state == 'driverlib': - # reached end of file, add it in here - out += tmpl(TMPL_HWMAKE_DRIVERLIB).strip() - elif state != 'done': - raise Exception('markers not found in hardware/Makefile.am') - hwmake = out - - open(path, 'w').write(hwmake) + if state != 'done': + raise Exception('No "if HW_" markers found in Makefile.am') + open(path, 'w').write(out) def do_driverskel(gitdir): - drvdir = gitdir + 'hardware/' + names['short'] + drvdir = os.path.join(gitdir, 'src', 'hardware', names['short']) os.mkdir(drvdir) - open(drvdir + '/Makefile.am', 'w').write(tmpl_file(FILE_DRV_MAKEFILE)) - open(drvdir + '/api.c', 'w').write(tmpl_file(FILE_DRV_API)) - open(drvdir + '/protocol.c', 'w').write(tmpl_file(FILE_DRV_PROTOCOL)) - open(drvdir + '/protocol.h', 'w').write(tmpl_file(FILE_DRV_PROTOCOL_H)) + open(os.path.join(drvdir, 'api.c'), 'w').write(tmpl_file(FILE_DRV_API)) + open(os.path.join(drvdir, 'protocol.c'), 'w').write(tmpl_file(FILE_DRV_PROTOCOL)) + open(os.path.join(drvdir, 'protocol.h'), 'w').write(tmpl_file(FILE_DRV_PROTOCOL_H)) def make_patch(gitdir): os.chdir(gitdir) - command('git add hardware/' + names['short']) - cmd = 'git commit -m "%s: Initial driver skeleton." ' % names['short'] - cmd += 'configure.ac hwdriver.c hardware/Makefile.am hardware/' + names['short'] + command(['git', 'add', os.path.join('src', 'hardware', names['short'])]) + cmd = ['git', 'commit', + '-m', '%s: Initial driver skeleton.' % names['short'], + 'configure.ac', 'Makefile.am', + os.path.join('src', 'hardware', names['short'])] command(cmd) - cmd = "git format-patch HEAD~1" - out, err = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE).communicate() + cmd = ['git', 'format-patch', 'HEAD~1'] + out, err = Popen(cmd, stdout=PIPE, stderr=PIPE).communicate() if err: raise Exception(err.decode()) patch = out.decode().strip() - shutil.move(gitdir + '/' + patch, scriptdir + '/' + patch) + shutil.move(os.path.join(gitdir, patch), + os.path.join(scriptdir, patch)) print(patch) def command(cmd): - out, err = Popen(cmd, shell=True, stderr=PIPE).communicate() + out, err = Popen(cmd, stderr=PIPE).communicate() if err: raise Exception(err.decode()) def parse_gitconfig(): + author = email = None try: - author = email = None - for line in open(os.environ['HOME'] + '/.gitconfig').readlines(): - m = re.match('\s*(\w+)\s*=\s*(.*)\s*$', line) - if m: - key, value = m.groups() - if key == 'name': - author = value - elif key == 'email': - email = value - if author and email: - break + author = check_output(["git", "config", "user.name"]).decode().strip(); + email = check_output(["git", "config", "user.email"]).decode().strip(); except: - pass - if not author or not email: - print("Please put your name and email in ~/.gitconfig") + print("Please set your name and email in your git config") sys.exit() - return author, email # @@ -301,12 +170,12 @@ def parse_gitconfig(): # scriptdir = os.getcwd() -if socket.gethostname() == 'sigrok': - LIBSR = '/data/git/libsigrok' - TMPLDIR = '/data/tools/tmpl' -else: - LIBSR = 'git://sigrok.org/libsigrok' - TMPLDIR = scriptdir +if scriptdir.split('/')[-2:] != ['sigrok-util', 'source']: + print("Please call this script from the 'source' directory.") + sys.exit(1) + +LIBSR = 'git://sigrok.org/libsigrok' +TMPLDIR = scriptdir if len(sys.argv) < 2: print("Usage: new-driver ") @@ -319,7 +188,6 @@ names = { 'short': re.sub('[^a-z0-9]', '-', name.lower()), 'lib': re.sub('[^a-z0-9]', '_', name.lower()), 'upper': re.sub('[^A-Z0-9]', '_', name.upper()), - 'libupper': re.sub('[^A-Z0-9]', '', name.upper()), 'year': datetime.datetime.now().year, 'author': author, 'email': email,