|
11 | 11 | import re |
12 | 12 | import shutil |
13 | 13 | import datetime |
| 14 | +from typing import TextIO |
14 | 15 |
|
15 | 16 | if sys.version_info[0] < 3: |
16 | 17 | sys.stdout.write('Sorry, requires Python 3.x or better\n') |
17 | 18 | sys.exit(1) |
18 | 19 |
|
19 | | -SCRIPTPATH = os.path.dirname(os.path.abspath(sys.argv[0])) |
20 | | -PROJECTPATH = os.path.dirname(SCRIPTPATH) |
21 | | -print(f'SCRIPTPATH={SCRIPTPATH} PROJECTPATH={PROJECTPATH}') |
22 | | - |
23 | | -if 'AMALGAMATE_SOURCE_PATH' not in os.environ: |
24 | | - AMALGAMATE_SOURCE_PATH = os.path.join(PROJECTPATH, 'src') |
25 | | -else: |
26 | | - AMALGAMATE_SOURCE_PATH = os.environ['AMALGAMATE_SOURCE_PATH'] |
27 | | -if 'AMALGAMATE_INCLUDE_PATH' not in os.environ: |
28 | | - AMALGAMATE_INCLUDE_PATH = os.path.join(PROJECTPATH, 'include') |
29 | | -else: |
30 | | - AMALGAMATE_INCLUDE_PATH = os.environ['AMALGAMATE_INCLUDE_PATH'] |
31 | | -if 'AMALGAMATE_OUTPUT_PATH' not in os.environ: |
32 | | - AMALGAMATE_OUTPUT_PATH = os.path.join(SCRIPTPATH) |
33 | | -else: |
34 | | - AMALGAMATE_OUTPUT_PATH = os.environ['AMALGAMATE_OUTPUT_PATH'] |
| 20 | +SCRIPT_PATH = os.path.dirname(os.path.abspath(sys.argv[0])) |
| 21 | +PROJECT_PATH = os.path.dirname(SCRIPT_PATH) |
| 22 | +print(f'SCRIPT_PATH={SCRIPT_PATH} PROJECT_PATH={PROJECT_PATH}') |
| 23 | + |
| 24 | +AMALGAMATE_SOURCE_PATH = os.environ.get('AMALGAMATE_SOURCE_PATH') or os.path.join(PROJECT_PATH, 'src') |
| 25 | +AMALGAMATE_INCLUDE_PATH = os.environ.get('AMALGAMATE_INCLUDE_PATH') or os.path.join(PROJECT_PATH, 'include') |
| 26 | +AMALGAMATE_OUTPUT_PATH = os.environ.get('AMALGAMATE_OUTPUT_PATH') or os.path.join(SCRIPT_PATH) |
35 | 27 |
|
36 | 28 | # this list excludes the "src/generic headers" |
37 | | -ALLCFILES = ['ada.cpp'] |
| 29 | +ALL_C_FILES = ['ada.cpp'] |
38 | 30 |
|
39 | 31 | # order matters |
40 | | -ALLCHEADERS = ['ada.h'] |
| 32 | +ALL_C_HEADERS = ['ada.h'] |
41 | 33 |
|
42 | 34 | found_includes = [] |
43 | 35 |
|
44 | | -current_implementation = '' |
45 | | - |
46 | | - |
47 | | -def doinclude(fid: str, file: str, line: str, origin: str) -> None: |
| 36 | +def doinclude(fid: TextIO, file: str, line: str, origin: str) -> None: |
48 | 37 | p = os.path.join(AMALGAMATE_INCLUDE_PATH, file) |
49 | 38 | pi = os.path.join(AMALGAMATE_SOURCE_PATH, file) |
50 | 39 |
|
51 | 40 | if os.path.exists(p): |
52 | 41 | if file not in found_includes: |
53 | 42 | found_includes.append(file) |
54 | 43 | dofile(fid, AMALGAMATE_INCLUDE_PATH, file) |
55 | | - else: |
56 | | - pass |
57 | 44 | elif os.path.exists(pi): |
58 | 45 | if file not in found_includes: |
59 | 46 | found_includes.append(file) |
60 | 47 | dofile(fid, AMALGAMATE_SOURCE_PATH, file) |
61 | | - else: |
62 | | - pass |
63 | 48 | else: |
64 | 49 | # If we don't recognize it, just emit the #include |
65 | 50 | print('unrecognized:', file, ' from ', line, ' in ', origin) |
66 | 51 | print(line, file=fid) |
67 | 52 |
|
68 | 53 |
|
69 | | -def dofile(fid: str, prepath: str, filename: str) -> None: |
| 54 | +def dofile(fid: TextIO, prepath: str, filename: str) -> None: |
70 | 55 | file = os.path.join(prepath, filename) |
71 | | - RELFILE = os.path.relpath(file, PROJECTPATH) |
| 56 | + RELFILE = os.path.relpath(file, PROJECT_PATH) |
72 | 57 | # Last lines are always ignored. Files should end by an empty lines. |
73 | 58 | print(f'/* begin file {RELFILE} */', file=fid) |
74 | 59 | includepattern = re.compile('\\s*#\\s*include "(.*)"') |
@@ -114,27 +99,25 @@ def dofile(fid: str, prepath: str, filename: str) -> None: |
114 | 99 | README = os.path.join(AMALGAMATE_OUTPUT_PATH, 'README.md') |
115 | 100 |
|
116 | 101 | print(f'Creating {AMAL_H}') |
117 | | -amal_h = open(AMAL_H, 'w') |
| 102 | +amal_h = open(AMAL_H, mode='w', encoding='utf8') |
118 | 103 | print(f'/* auto-generated on {timestamp}. Do not edit! */', file=amal_h) |
119 | | -for h in ALLCHEADERS: |
| 104 | +for h in ALL_C_HEADERS: |
120 | 105 | doinclude(amal_h, h, f'ERROR {h} not found', h) |
121 | 106 |
|
122 | 107 | amal_h.close() |
123 | | -print() |
124 | | -print() |
125 | 108 | print(f'Creating {AMAL_C}') |
126 | | -amal_c = open(AMAL_C, 'w') |
| 109 | +amal_c = open(AMAL_C, mode='w', encoding='utf8') |
127 | 110 | print(f'/* auto-generated on {timestamp}. Do not edit! */', file=amal_c) |
128 | | -for c in ALLCFILES: |
| 111 | +for c in ALL_C_FILES: |
129 | 112 | doinclude(amal_c, c, f'ERROR {c} not found', c) |
130 | 113 |
|
131 | 114 | amal_c.close() |
132 | 115 |
|
133 | 116 | # copy the README and DEMOCPP |
134 | | -if SCRIPTPATH != AMALGAMATE_OUTPUT_PATH: |
135 | | - shutil.copy2(os.path.join(SCRIPTPATH, 'demo.cpp'), AMALGAMATE_OUTPUT_PATH) |
136 | | - shutil.copy2(os.path.join(SCRIPTPATH, 'demo.c'), AMALGAMATE_OUTPUT_PATH) |
137 | | - shutil.copy2(os.path.join(SCRIPTPATH, 'README.md'), AMALGAMATE_OUTPUT_PATH) |
| 117 | +if SCRIPT_PATH != AMALGAMATE_OUTPUT_PATH: |
| 118 | + shutil.copy2(os.path.join(SCRIPT_PATH, 'demo.cpp'), AMALGAMATE_OUTPUT_PATH) |
| 119 | + shutil.copy2(os.path.join(SCRIPT_PATH, 'demo.c'), AMALGAMATE_OUTPUT_PATH) |
| 120 | + shutil.copy2(os.path.join(SCRIPT_PATH, 'README.md'), AMALGAMATE_OUTPUT_PATH) |
138 | 121 |
|
139 | 122 | shutil.copy2(os.path.join(AMALGAMATE_INCLUDE_PATH, 'ada_c.h'), AMALGAMATE_OUTPUT_PATH) |
140 | 123 |
|
|
0 commit comments