| """Amalgate json-cpp library sources into a single source and header file. | 
 |  | 
 | Requires Python 2.6 | 
 |  | 
 | Example of invocation (must be invoked from json-cpp top directory): | 
 | python amalgate.py | 
 | """ | 
 | import os | 
 | import os.path | 
 | import sys | 
 |  | 
 | 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 amalgated 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("Amalgating header...") | 
 |     header = AmalgamationFile( source_top_dir ) | 
 |     header.add_text( "/// Json-cpp amalgated header (http://jsoncpp.sourceforge.net/)." ) | 
 |     header.add_text( "/// It is intented to be used with #include <%s>" % header_include_path ) | 
 |     header.add_file( "LICENSE", wrap_in_comment=True ) | 
 |     header.add_text( "#ifndef JSON_AMALGATED_H_INCLUDED" ) | 
 |     header.add_text( "# define JSON_AMALGATED_H_INCLUDED" ) | 
 |     header.add_text( "/// If defined, indicates that the source file is amalgated" ) | 
 |     header.add_text( "/// to prevent private header inclusion." ) | 
 |     header.add_text( "#define JSON_IS_AMALGAMATION" ) | 
 |     header.add_file( "include/json/version.h" ) | 
 |     header.add_file( "include/json/config.h" ) | 
 |     header.add_file( "include/json/forwards.h" ) | 
 |     header.add_file( "include/json/features.h" ) | 
 |     header.add_file( "include/json/value.h" ) | 
 |     header.add_file( "include/json/reader.h" ) | 
 |     header.add_file( "include/json/writer.h" ) | 
 |     header.add_file( "include/json/assertions.h" ) | 
 |     header.add_text( "#endif //ifndef JSON_AMALGATED_H_INCLUDED" ) | 
 |  | 
 |     target_header_path = os.path.join( os.path.dirname(target_source_path), header_include_path ) | 
 |     print("Writing amalgated 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("Amalgating forward header...") | 
 |     header = AmalgamationFile( source_top_dir ) | 
 |     header.add_text( "/// Json-cpp amalgated forward header (http://jsoncpp.sourceforge.net/)." ) | 
 |     header.add_text( "/// It is intented 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_AMALGATED_H_INCLUDED" ) | 
 |     header.add_text( "# define JSON_FORWARD_AMALGATED_H_INCLUDED" ) | 
 |     header.add_text( "/// If defined, indicates that the source file is amalgated" ) | 
 |     header.add_text( "/// to prevent private header inclusion." ) | 
 |     header.add_text( "#define JSON_IS_AMALGAMATION" ) | 
 |     header.add_file( "include/json/config.h" ) | 
 |     header.add_file( "include/json/forwards.h" ) | 
 |     header.add_text( "#endif //ifndef JSON_FORWARD_AMALGATED_H_INCLUDED" ) | 
 |  | 
 |     target_forward_header_path = os.path.join( os.path.dirname(target_source_path), | 
 |                                                forward_header_include_path ) | 
 |     print("Writing amalgated forward header to %r" % target_forward_header_path) | 
 |     header.write_to( target_forward_header_path ) | 
 |  | 
 |     print("Amalgating source...") | 
 |     source = AmalgamationFile( source_top_dir ) | 
 |     source.add_text( "/// Json-cpp amalgated source (http://jsoncpp.sourceforge.net/)." ) | 
 |     source.add_text( "/// It is intented 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( "" ) | 
 |     lib_json = "src/lib_json" | 
 |     source.add_file( os.path.join(lib_json, "json_tool.h") ) | 
 |     source.add_file( os.path.join(lib_json, "json_reader.cpp") ) | 
 |     source.add_file( os.path.join(lib_json, "json_batchallocator.h") ) | 
 |     source.add_file( os.path.join(lib_json, "json_valueiterator.inl") ) | 
 |     source.add_file( os.path.join(lib_json, "json_value.cpp") ) | 
 |     source.add_file( os.path.join(lib_json, "json_writer.cpp") ) | 
 |  | 
 |     print("Writing amalgated source to %r" % target_source_path) | 
 |     source.write_to( target_source_path ) | 
 |  | 
 | def main(): | 
 |     usage = """%prog [options] | 
 | Generate a single amalgated 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 amalgated 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 succesfully amalagated") | 
 |  | 
 | if __name__ == "__main__": | 
 |     main() |