Commit b9492305c00625a8ea8883f61d28cecca687de4f

Authored by Henry Fredrick Schreiner
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  
... ...