diff options
author | George Jiglau <george@mux.ro> | 2017-11-21 05:11:51 +0300 |
---|---|---|
committer | Karl Palsson <karlp@tweak.net.au> | 2018-04-14 21:40:54 +0300 |
commit | 396701808d83d21f9b292dd752daa2495ba90acb (patch) | |
tree | 6e525bb6f3fa63da93fddc75f7fa4b75598b2e14 /scripts | |
parent | c7d46c4fbb816d5b082313b28745a02d7d606e23 (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.awk | 77 | ||||
-rwxr-xr-x | scripts/genlink.py | 125 | ||||
-rwxr-xr-x | scripts/genlinktest.sh | 13 |
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 |