Commit b9492305c00625a8ea8883f61d28cecca687de4f
Committed by
Henry Schreiner
1 parent
e7dc4c23
Add support for making custom versions of CLI11 single header
Showing
1 changed file
with
35 additions
and
8 deletions
scripts/MakeSingleHeader.py
| ... | ... | @@ -54,6 +54,8 @@ class HeaderFile(object): |
| 54 | 54 | |
| 55 | 55 | self.body = '\n// From {}:\n\n'.format(inc) + inner[inner.find('namespace'):] |
| 56 | 56 | |
| 57 | + self.namespace = None | |
| 58 | + | |
| 57 | 59 | def __add__(self, other): |
| 58 | 60 | out = copy(self) |
| 59 | 61 | out.headers |= other.headers |
| ... | ... | @@ -69,8 +71,16 @@ class HeaderFile(object): |
| 69 | 71 | def verbatim_str(self): |
| 70 | 72 | return '\n'.join(self.verbatim) |
| 71 | 73 | |
| 74 | + def insert_namespace(self, namespace): | |
| 75 | + self.namespace = namespace | |
| 76 | + | |
| 77 | + def macro_replacement(self, before, after): | |
| 78 | + self.verbatim = [x.replace(before, after) for x in self.verbatim] | |
| 79 | + self.body = self.body.replace(before, after) | |
| 80 | + | |
| 81 | + | |
| 72 | 82 | def __str__(self): |
| 73 | - return '''\ | |
| 83 | + result = '''\ | |
| 74 | 84 | #pragma once |
| 75 | 85 | |
| 76 | 86 | // CLI11: Version {self.VERSION} |
| ... | ... | @@ -87,12 +97,18 @@ class HeaderFile(object): |
| 87 | 97 | // Standard combined includes: |
| 88 | 98 | |
| 89 | 99 | {self.header_str} |
| 90 | -{self.verbatim_str} | |
| 91 | -{self.body} | |
| 92 | 100 | '''.format(self=self) |
| 93 | 101 | |
| 102 | + if self.namespace: | |
| 103 | + result += '\nnamespace ' + self.namespace + ' {\n\n' | |
| 104 | + result += '{self.verbatim_str}\n{self.body}\n'.format(self=self) | |
| 105 | + if self.namespace: | |
| 106 | + result += '} // namespace ' + self.namespace + '\n\n' | |
| 107 | + | |
| 108 | + return result | |
| 94 | 109 | |
| 95 | -def MakeHeader(output, main_header, include_dir = '../include'): | |
| 110 | + | |
| 111 | +def MakeHeader(output, main_header, include_dir = '../include', namespace=None, macro=None): | |
| 96 | 112 | # Set tag if possible to class variable |
| 97 | 113 | try: |
| 98 | 114 | HeaderFile.TAG = check_output(['git', 'describe', '--tags', '--always'], cwd=str(DIR)).decode("utf-8").strip() |
| ... | ... | @@ -114,18 +130,29 @@ def MakeHeader(output, main_header, include_dir = '../include'): |
| 114 | 130 | headers = [HeaderFile(base_dir, inc) for inc in include_files] |
| 115 | 131 | single_header = reduce(operator.add, headers) |
| 116 | 132 | |
| 133 | + if macro: | |
| 134 | + before, after = macro | |
| 135 | + print("Converting macros", before, "->", after) | |
| 136 | + single_header.macro_replacement(before, after) | |
| 137 | + | |
| 138 | + if namespace: | |
| 139 | + print("Adding namespace", namespace) | |
| 140 | + single_header.insert_namespace(namespace) | |
| 141 | + | |
| 117 | 142 | with open(output, 'w') as f: |
| 118 | 143 | f.write(str(single_header)) |
| 119 | 144 | |
| 120 | 145 | print("Created", output) |
| 121 | 146 | |
| 122 | - | |
| 123 | 147 | if __name__ == '__main__': |
| 124 | - parser = argparse.ArgumentParser() | |
| 148 | + parser = argparse.ArgumentParser(usage='Convert source to single header include. Can optionally add namespace and search-replace replacements (for macros).') | |
| 125 | 149 | parser.add_argument("output", help="Single header file output") |
| 126 | 150 | parser.add_argument("--main", default='CLI/CLI.hpp', help="The main include file that defines the other files") |
| 127 | - parser.add_argument("--include", default='../include') | |
| 151 | + parser.add_argument("--include", default='../include', help="The include directory") | |
| 152 | + parser.add_argument("--namespace", help="Add an optional namespace") | |
| 153 | + parser.add_argument("--macro", nargs=2, help="Macro replacement: CLI11_ NEW_PREFIX_") | |
| 128 | 154 | args = parser.parse_args() |
| 129 | 155 | |
| 130 | - MakeHeader(args.output, args.main, args.include) | |
| 156 | + | |
| 157 | + MakeHeader(args.output, args.main, args.include, args.namespace, args.macro) | |
| 131 | 158 | ... | ... |