]> sigrok.org Git - sigrok-util.git/blobdiff - source/new-driver
new-driver: *.c: Only #include protocol.h.
[sigrok-util.git] / source / new-driver
index 78d4cb628e40e0d8d709643cb9db4d328c1e9e59..602e98201c2e0eb8325971762fbfe532bcaa8fc6 100755 (executable)
@@ -1,22 +1,22 @@
 #!/usr/bin/python3
-#
-# This file is part of the sigrok project.
-#
-# Copyright (C) 2012 Bert Vermeulen <bert@biot.com>
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#
+##
+## This file is part of the sigrok-util project.
+##
+## Copyright (C) 2012 Bert Vermeulen <bert@biot.com>
+##
+## This program is free software: you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program.  If not, see <http://www.gnu.org/licenses/>.
+##
 
 import os
 import sys
@@ -27,19 +27,35 @@ import re
 import socket
 import datetime
 
-TMPL_AUTOCONF_AC_ARG_ENABLE = """AC_ARG_ENABLE(${short}, AC_HELP_STRING([--enable-${short}],
-          [enable ${name} driver support [default=yes]]),
-          [HW_${upper}="$enableval"],
-          [HW_${upper}=yes])
+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} driver support])
+       AC_DEFINE(HAVE_HW_${upper}, 1, [${name} support])
 fi
 
 """
 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
+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'
@@ -66,6 +82,7 @@ def new_driver():
             raise Exception(err.decode())
         gitdir = tmp + '/libsigrok/'
         do_configure_ac(gitdir)
+        do_hwdriver(gitdir)
         do_hwmake(gitdir)
         do_driverskel(gitdir)
         make_patch(gitdir)
@@ -152,11 +169,48 @@ def do_configure_ac(gitdir):
     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
+        out += line + '\n'
+    if state != 'done':
+        raise Exception('HAVE_* markers not found in hwdriver.c')
+    hwdriver = out
+
+    open(path, 'w').write(hwdriver)
+
+
 def do_hwmake(gitdir):
     path = gitdir + 'hardware/Makefile.am'
     hwmake = open(path).read()
 
-    # add AC_ARG_ENABLE option
+    # add SUBDIRS entry
     out = ''
     state = 'copy'
     for line in hwmake.split('\n')[:-1]:
@@ -169,13 +223,23 @@ def do_hwmake(gitdir):
                 drv_short = m.group(1)
                 if drv_short.lower() > names['short']:
                     out += tmpl(TMPL_HWMAKE_SUBDIR) + ' \\\n'
-                    state = 'done'
+                    state = 'driverlib'
             else:
                 out += tmpl(TMPL_HWMAKE_SUBDIR) + ' \\\n'
-                state = 'done'
+                state = 'driverlib'
+        elif state == 'driverlib':
+            m = re.match('if [A-Z]{2}_(.*)$', line)
+            if m:
+                drv_short = m.group(1)
+                if drv_short > names['upper']:
+                    out += tmpl(TMPL_HWMAKE_DRIVERLIB)
+                    state = 'done'
         out += line + '\n'
-    if state != 'done':
-        raise Exception('SUBDIRS markers not found in hardware/Makefile.am')
+    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)
@@ -193,8 +257,8 @@ def do_driverskel(gitdir):
 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 hardware/Makefile.am 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(cmd)
     cmd = "git format-patch HEAD~1"
     out, err = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE).communicate()
@@ -212,25 +276,25 @@ def command(cmd):
 
 
 def parse_gitconfig():
-       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
-       except:
-               pass
-       if not author or not email:
-               print("Please put your name and email in ~/.gitconfig")
-               sys.exit()
-
-       return author, email
+    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
+    except:
+        pass
+    if not author or not email:
+        print("Please put your name and email in ~/.gitconfig")
+        sys.exit()
+
+    return author, email
 
 #
 # main
@@ -238,14 +302,14 @@ def parse_gitconfig():
 
 scriptdir = os.getcwd()
 if socket.gethostname() == 'sigrok':
-       LIBSR = '/data/git/libsigrok'
-       TMPLDIR = '/data/tools/tmpl'
+    LIBSR = '/data/git/libsigrok'
+    TMPLDIR = '/data/tools/tmpl'
 else:
-       LIBSR = 'git://sigrok.org/libsigrok'
-       TMPLDIR = scriptdir
+    LIBSR = 'git://sigrok.org/libsigrok'
+    TMPLDIR = scriptdir
 
 if len(sys.argv) < 2:
-    print("Usage: new-driver.py <name>")
+    print("Usage: new-driver <name>")
     sys.exit()
 
 author, email = parse_gitconfig()
@@ -256,10 +320,9 @@ names = {
     '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,
+    'year': datetime.datetime.now().year,
+    'author': author,
+    'email': email,
 }
 new_driver()
 
-