Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/thirdpin/libopencm3.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Jiglau <george@mux.ro>2017-11-21 05:11:51 +0300
committerKarl Palsson <karlp@tweak.net.au>2018-04-14 21:40:54 +0300
commit396701808d83d21f9b292dd752daa2495ba90acb (patch)
tree6e525bb6f3fa63da93fddc75f7fa4b75598b2e14 /scripts
parentc7d46c4fbb816d5b082313b28745a02d7d606e23 (diff)
genlink: Rewrite genlink script from awk to python
This removes the dependency on awk and should fix #732 python was already a dependency, for the irq generation
Diffstat (limited to 'scripts')
-rw-r--r--scripts/genlink.awk77
-rwxr-xr-xscripts/genlink.py125
-rwxr-xr-xscripts/genlinktest.sh13
3 files changed, 134 insertions, 81 deletions
diff --git a/scripts/genlink.awk b/scripts/genlink.awk
deleted file mode 100644
index 2b7e9d12..00000000
--- a/scripts/genlink.awk
+++ /dev/null
@@ -1,77 +0,0 @@
-# This awk program generates parameters for the linker script generator feature.
-#
-# See ld/README file for more info.
-#
-
-# This file is part of the libopencm3 project.
-#
-# Copyright (C) 2013 Frantisek Burian <Bufran@seznam.cz>
-# Copyright (C) 2013 Werner Almesberger <wpwrak>
-#
-# This library is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This library 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 Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with this library. If not, see <http://www.gnu.org/licenses/>.
-
-BEGIN {
- PAT = tolower(PAT);
- family = PAT;
-}
-!/^#/{
- #remove cr on windows
- gsub(/\r$/,"");
-
- tmp = "^"$1"$";
- gsub(/\?/, ".", tmp);
- gsub(/\*/, ".*", tmp);
- gsub(/\+/, ".+", tmp);
- tolower(tmp);
-
- if (PAT ~ tmp) {
- if ("CPPFLAGS" == MODE)
- printf "-D%s ",toupper(PAT);
- if ($2 != "+")
- PAT=$2;
- for (i = 3; i <= NF; i = i + 1) {
- if ($i ~ /^CPU=/) {
- if ("CPU" == MODE){
- sub(/[^=]*=/,"",$i);
- printf "%s",$i;
- exit;
- }
- }
- else if ($i ~ /^FPU=/) {
- if ("FPU" == MODE){
- sub(/[^=]*=/,"",$i);
- printf "%s",$i;
- exit;
- }
- }
- else if ($i ~ /[[:upper:]]*=/) {
- if ("DEFS" == MODE)
- printf "-D_%s ",$i;
- }
- }
- if (PAT=="END"){
- if ("FAMILY" == MODE)
- printf "%s",family;
- else if ("SUBFAMILY" == MODE)
- printf "%s",subfamily;
- exit;
- }
- else{
- subfamily = family;
- family = PAT;
- if("DEFS" == MODE)
- printf "-D%s ",toupper(PAT);
- }
- }
-}
diff --git a/scripts/genlink.py b/scripts/genlink.py
new file mode 100755
index 00000000..96c27e08
--- /dev/null
+++ b/scripts/genlink.py
@@ -0,0 +1,125 @@
+#!/usr/bin/env python
+# This python program generates parameters for the linker script generator feature.
+
+# This file is part of the libopencm3 project.
+#
+# 2017 George-Cristian Jiglau <noonien>
+#
+# This library is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This library 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 Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this library. If not, see <http://www.gnu.org/licenses/>.
+from __future__ import print_function
+import fnmatch
+import sys
+import re
+import os
+
+if len(sys.argv) != 4:
+ print("usage: %s <device-data-file> <device> <mode>" % sys.argv[0], file=sys.stderr)
+ sys.exit(1)
+
+data_file_path = sys.argv[1]
+find = sys.argv[2].lower()
+mode = sys.argv[3].upper()
+
+device = {
+ 'info': {},
+ 'defs': [],
+ 'family': [],
+}
+
+# open device data file
+with open(data_file_path, 'r') as data_file:
+ # iterate lines
+ for line in data_file:
+ # strip whitespace from the beginning and end of line
+ line = line.strip()
+
+ # skip empty lines and comments
+ if line == '' or line.startswith('#'):
+ continue
+
+ # split line into it's parts: <pattern> <parent> <data..>
+ parts = line.split()
+ pattern, parent, data = parts[0], parts[1], parts[2:]
+
+ # skip line if pattern did not match first element
+ if not fnmatch.fnmatch(find, pattern):
+ continue
+
+ # extract data
+ for d in data:
+ # split into K=V
+ try:
+ (k, v) = d.split('=')
+ except:
+ continue
+
+ # skip invalid datas
+ if not re.match('^[A-Z0-9_]+$', k):
+ continue
+
+ # add FPU and CPU to info, not defs
+ if k in ('FPU', 'CPU'):
+ device['info'][k.lower()] = v
+ continue
+
+ device['defs'].append((k, v))
+
+ # if parent is +, there's more data for this pattern
+ if parent == '+':
+ continue
+
+ # device family
+ device['family'].append(find)
+
+ # break if this was the last line in this chain
+ if parent == 'END':
+ break
+
+ # look for the parent
+ find = parent
+
+# reverse device list
+device['family'] = device['family'][::-1]
+
+# device was not found
+if len(device['family']) == 0:
+ sys.exit(1)
+
+# for CPPFLAGS and DEFS, define device family
+if mode in ('CPPFLAGS', 'DEFS'):
+ sys.stdout.write(' '.join('-D%s' % d.upper() for d in device['family']))
+
+# defines
+if mode == 'DEFS':
+ if len(device['defs']) > 0:
+ defs = ' '.join('-D_%s=%s' % d for d in device['defs'])
+ sys.stdout.write(' ' + defs)
+
+# device family
+elif mode == 'FAMILY':
+ if len(device['family']) > 0:
+ sys.stdout.write(device['family'][0])
+
+# device subfamily
+elif mode == 'SUBFAMILY':
+ if len(device['family']) > 1:
+ sys.stdout.write(device['family'][1])
+
+# device info
+else:
+ info = mode.lower()
+ if info in device['info']:
+ sys.stdout.write(device['info'][info])
+
+sys.stdout.flush()
diff --git a/scripts/genlinktest.sh b/scripts/genlinktest.sh
index 148eae16..2c8d4a8b 100755
--- a/scripts/genlinktest.sh
+++ b/scripts/genlinktest.sh
@@ -1,6 +1,6 @@
#!/bin/sh
-# This script is intended to test the awk program genlink.awk for the linker
+# This script is intended to test the python program genlink.py for the linker
# script generator feature.
#
# See ld/README file for more info.
@@ -25,8 +25,13 @@
# along with this library. If not, see <http://www.gnu.org/licenses/>.
# run test
-PAAT=`basename $1`;
-gawk -v PAT="$PAAT" -f scripts/genlink.awk $1.data > $1.out;
+DEVICE=`basename $1`;
+(scripts/genlink.py $1.data $DEVICE CPPFLAGS; echo) > $1.out
+(scripts/genlink.py $1.data $DEVICE DEFS; echo) >> $1.out
+(scripts/genlink.py $1.data $DEVICE FAMILY; echo) >> $1.out
+(scripts/genlink.py $1.data $DEVICE SUBFAMILY; echo) >> $1.out
+(scripts/genlink.py $1.data $DEVICE CPU; echo) >> $1.out
+(scripts/genlink.py $1.data $DEVICE FPU; echo) >> $1.out
#check test
if ! diff -q $1.out $1.result >/dev/null; then
@@ -36,4 +41,4 @@ fi
#remove workout only if it is OK
rm -f $1.out
-exit 0 \ No newline at end of file
+exit 0