| #!/usr/bin/env python | 
 |  | 
 | """Amalgamate json-cpp library sources into a single source and header file. | 
 |  | 
 | Works with python2.6+ and python3.4+. | 
 |  | 
 | Example of invocation (must be invoked from json-cpp top directory): | 
 | python amalgamate.py | 
 | """ | 
 | import os | 
 | import os.path | 
 | import sys | 
 |  | 
 | INCLUDE_PATH = "include/json" | 
 | SRC_PATH = "src/lib_json" | 
 |  | 
 | class AmalgamationFile: | 
 |     def __init__(self, top_dir): | 
 |         self.top_dir = top_dir | 
 |         self.blocks = [] | 
 |  | 
 |     def add_text(self, text): | 
 |         if not text.endswith("\n"): | 
 |             text += "\n" | 
 |         self.blocks.append(text) | 
 |  | 
 |     def add_file(self, relative_input_path, wrap_in_comment=False): | 
 |         def add_marker(prefix): | 
 |             self.add_text("") | 
 |             self.add_text("// " + "/"*70) | 
 |             self.add_text("// %s of content of file: %s" % (prefix, relative_input_path.replace("\\","/"))) | 
 |             self.add_text("// " + "/"*70) | 
 |             self.add_text("") | 
 |         add_marker("Beginning") | 
 |         f = open(os.path.join(self.top_dir, relative_input_path), "rt") | 
 |         content = f.read() | 
 |         if wrap_in_comment: | 
 |             content = "/*\n" + content + "\n*/" | 
 |         self.add_text(content) | 
 |         f.close() | 
 |         add_marker("End") | 
 |         self.add_text("\n\n\n\n") | 
 |  | 
 |     def get_value(self): | 
 |         return "".join(self.blocks).replace("\r\n","\n") | 
 |  | 
 |     def write_to(self, output_path): | 
 |         output_dir = os.path.dirname(output_path) | 
 |         if output_dir and not os.path.isdir(output_dir): | 
 |             os.makedirs(output_dir) | 
 |         f = open(output_path, "wb") | 
 |         f.write(str.encode(self.get_value(), 'UTF-8')) | 
 |         f.close() | 
 |  | 
 | def amalgamate_source(source_top_dir=None, | 
 |                        target_source_path=None, | 
 |                        header_include_path=None): | 
 |     """Produces amalgamated source. | 
 |        Parameters: | 
 |            source_top_dir: top-directory | 
 |            target_source_path: output .cpp path | 
 |            header_include_path: generated header path relative to target_source_path. | 
 |     """ | 
 |     print("Amalgamating header...") | 
 |     header = AmalgamationFile(source_top_dir) | 
 |     header.add_text("/// Json-cpp amalgamated header (https://github.com/open-source-parsers/jsoncpp/).") | 
 |     header.add_text('/// It is intended to be used with #include "%s"' % header_include_path) | 
 |     header.add_file("LICENSE", wrap_in_comment=True) | 
 |     header.add_text("#ifndef JSON_AMALGAMATED_H_INCLUDED") | 
 |     header.add_text("# define JSON_AMALGAMATED_H_INCLUDED") | 
 |     header.add_text("/// If defined, indicates that the source file is amalgamated") | 
 |     header.add_text("/// to prevent private header inclusion.") | 
 |     header.add_text("#define JSON_IS_AMALGAMATION") | 
 |     header.add_file(os.path.join(INCLUDE_PATH, "version.h")) | 
 |     header.add_file(os.path.join(INCLUDE_PATH, "allocator.h")) | 
 |     header.add_file(os.path.join(INCLUDE_PATH, "config.h")) | 
 |     header.add_file(os.path.join(INCLUDE_PATH, "forwards.h")) | 
 |     header.add_file(os.path.join(INCLUDE_PATH, "json_features.h")) | 
 |     header.add_file(os.path.join(INCLUDE_PATH, "value.h")) | 
 |     header.add_file(os.path.join(INCLUDE_PATH, "reader.h")) | 
 |     header.add_file(os.path.join(INCLUDE_PATH, "writer.h")) | 
 |     header.add_file(os.path.join(INCLUDE_PATH, "assertions.h")) | 
 |     header.add_text("#endif //ifndef JSON_AMALGAMATED_H_INCLUDED") | 
 |  | 
 |     target_header_path = os.path.join(os.path.dirname(target_source_path), header_include_path) | 
 |     print("Writing amalgamated header to %r" % target_header_path) | 
 |     header.write_to(target_header_path) | 
 |  | 
 |     base, ext = os.path.splitext(header_include_path) | 
 |     forward_header_include_path = base + "-forwards" + ext | 
 |     print("Amalgamating forward header...") | 
 |     header = AmalgamationFile(source_top_dir) | 
 |     header.add_text("/// Json-cpp amalgamated forward header (https://github.com/open-source-parsers/jsoncpp/).") | 
 |     header.add_text('/// It is intended to be used with #include "%s"' % forward_header_include_path) | 
 |     header.add_text("/// This header provides forward declaration for all JsonCpp types.") | 
 |     header.add_file("LICENSE", wrap_in_comment=True) | 
 |     header.add_text("#ifndef JSON_FORWARD_AMALGAMATED_H_INCLUDED") | 
 |     header.add_text("# define JSON_FORWARD_AMALGAMATED_H_INCLUDED") | 
 |     header.add_text("/// If defined, indicates that the source file is amalgamated") | 
 |     header.add_text("/// to prevent private header inclusion.") | 
 |     header.add_text("#define JSON_IS_AMALGAMATION") | 
 |     header.add_file(os.path.join(INCLUDE_PATH, "version.h")) | 
 |     header.add_file(os.path.join(INCLUDE_PATH, "allocator.h")) | 
 |     header.add_file(os.path.join(INCLUDE_PATH, "config.h")) | 
 |     header.add_file(os.path.join(INCLUDE_PATH, "forwards.h")) | 
 |     header.add_text("#endif //ifndef JSON_FORWARD_AMALGAMATED_H_INCLUDED") | 
 |  | 
 |     target_forward_header_path = os.path.join(os.path.dirname(target_source_path), | 
 |                                                forward_header_include_path) | 
 |     print("Writing amalgamated forward header to %r" % target_forward_header_path) | 
 |     header.write_to(target_forward_header_path) | 
 |  | 
 |     print("Amalgamating source...") | 
 |     source = AmalgamationFile(source_top_dir) | 
 |     source.add_text("/// Json-cpp amalgamated source (https://github.com/open-source-parsers/jsoncpp/).") | 
 |     source.add_text('/// It is intended to be used with #include "%s"' % header_include_path) | 
 |     source.add_file("LICENSE", wrap_in_comment=True) | 
 |     source.add_text("") | 
 |     source.add_text('#include "%s"' % header_include_path) | 
 |     source.add_text(""" | 
 | #ifndef JSON_IS_AMALGAMATION | 
 | #error "Compile with -I PATH_TO_JSON_DIRECTORY" | 
 | #endif | 
 | """) | 
 |     source.add_text("") | 
 |     source.add_file(os.path.join(SRC_PATH, "json_tool.h")) | 
 |     source.add_file(os.path.join(SRC_PATH, "json_reader.cpp")) | 
 |     source.add_file(os.path.join(SRC_PATH, "json_valueiterator.inl")) | 
 |     source.add_file(os.path.join(SRC_PATH, "json_value.cpp")) | 
 |     source.add_file(os.path.join(SRC_PATH, "json_writer.cpp")) | 
 |  | 
 |     print("Writing amalgamated source to %r" % target_source_path) | 
 |     source.write_to(target_source_path) | 
 |  | 
 | def main(): | 
 |     usage = """%prog [options] | 
 | Generate a single amalgamated source and header file from the sources. | 
 | """ | 
 |     from optparse import OptionParser | 
 |     parser = OptionParser(usage=usage) | 
 |     parser.allow_interspersed_args = False | 
 |     parser.add_option("-s", "--source", dest="target_source_path", action="store", default="dist/jsoncpp.cpp", | 
 |         help="""Output .cpp source path. [Default: %default]""") | 
 |     parser.add_option("-i", "--include", dest="header_include_path", action="store", default="json/json.h", | 
 |         help="""Header include path. Used to include the header from the amalgamated source file. [Default: %default]""") | 
 |     parser.add_option("-t", "--top-dir", dest="top_dir", action="store", default=os.getcwd(), | 
 |         help="""Source top-directory. [Default: %default]""") | 
 |     parser.enable_interspersed_args() | 
 |     options, args = parser.parse_args() | 
 |  | 
 |     msg = amalgamate_source(source_top_dir=options.top_dir, | 
 |                              target_source_path=options.target_source_path, | 
 |                              header_include_path=options.header_include_path) | 
 |     if msg: | 
 |         sys.stderr.write(msg + "\n") | 
 |         sys.exit(1) | 
 |     else: | 
 |         print("Source successfully amalgamated") | 
 |  | 
 | if __name__ == "__main__": | 
 |     main() |