]>
Commit | Line | Data |
---|---|---|
1 | #!/usr/bin/env python3 | |
2 | # | |
3 | # This file is part of the libsigrokdecode project. | |
4 | # | |
5 | # Copyright (C) 2013 Bert Vermeulen <bert@biot.com> | |
6 | # | |
7 | # This program is free software; you can redistribute it and/or modify | |
8 | # it under the terms of the GNU General Public License as published by | |
9 | # the Free Software Foundation; either version 3 of the License, or | |
10 | # (at your option) any later version. | |
11 | # | |
12 | # This program is distributed in the hope that it will be useful, | |
13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | # GNU General Public License for more details. | |
16 | # | |
17 | # You should have received a copy of the GNU General Public License | |
18 | # along with this program; if not, see <http://www.gnu.org/licenses/>. | |
19 | # | |
20 | ||
21 | import os | |
22 | import sys | |
23 | from shutil import copy | |
24 | from getopt import getopt | |
25 | ||
26 | ||
27 | def install(srcdir, dstdir): | |
28 | worklist = [] | |
29 | for pd in os.listdir(srcdir): | |
30 | pd_dir = srcdir + '/' + pd | |
31 | if not os.path.isdir(pd_dir): | |
32 | continue | |
33 | install_list = [] | |
34 | for f in os.listdir(pd_dir): | |
35 | pd_file = pd_dir + '/' + f | |
36 | if not os.path.isfile(pd_file): | |
37 | continue | |
38 | if f == 'config': | |
39 | install_list.extend(config_get_extra_install(pd_file)) | |
40 | elif f[-3:] == '.py': | |
41 | install_list.append(f) | |
42 | worklist.append((pd, pd_dir, install_list)) | |
43 | ||
44 | print("Installing %d protocol decoders:" % len(worklist)) | |
45 | col = 0 | |
46 | for pd, pd_dir, install_list in worklist: | |
47 | msg = pd + ' ' | |
48 | if (col + len(msg) > 80): | |
49 | print() | |
50 | col = 0 | |
51 | print(msg, end='') | |
52 | col += len(msg) | |
53 | pd_dst = os.path.join(dstdir, pd) | |
54 | try: | |
55 | os.mkdir(pd_dst) | |
56 | except OSError as e: | |
57 | if e.errno != os.errno.EEXIST: | |
58 | raise | |
59 | else: | |
60 | pass | |
61 | for f in install_list: | |
62 | copy(os.path.join(pd_dir, f), pd_dst) | |
63 | print() | |
64 | ||
65 | ||
66 | def config_get_extra_install(config_file): | |
67 | install_list = [] | |
68 | for line in open(config_file).read().split('\n'): | |
69 | line = line.strip() | |
70 | if len(line) == 0 or line[0] == '#': | |
71 | continue | |
72 | words = line.split() | |
73 | if words[0] != 'extra-install': | |
74 | continue | |
75 | install_list.extend(words[1:]) | |
76 | ||
77 | return install_list | |
78 | ||
79 | ||
80 | def usage(msg=None): | |
81 | if msg: | |
82 | print(msg) | |
83 | ret = 1 | |
84 | else: | |
85 | ret = 0 | |
86 | print("""Usage: | |
87 | install-decoders [-i <decoder source>] -o <install path>""") | |
88 | sys.exit(ret) | |
89 | ||
90 | ||
91 | # | |
92 | # main | |
93 | # | |
94 | ||
95 | src = 'decoders' | |
96 | dst = None | |
97 | try: | |
98 | opts, args = getopt(sys.argv[1:], 'i:o:') | |
99 | for opt, arg in opts: | |
100 | if opt == '-i': | |
101 | src = arg | |
102 | elif opt == '-o': | |
103 | dst = arg | |
104 | except Exception as e: | |
105 | usage(str(e)) | |
106 | ||
107 | if len(args) != 0 or dst is None: | |
108 | usage() | |
109 | ||
110 | install(src, dst) | |
111 | ||
112 |