blob: 550f6a67624ccb03cd2018721a54e0644e5795a7 [file] [log] [blame]
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001"""Amalgate json-cpp library sources into a single source and header file.
2
3Requires Python 2.6
4
5Example of invocation (must be invoked from json-cpp top directory):
6python amalgate.py
7"""
8import os
9import os.path
10import sys
11
12class AmalgamationFile:
13 def __init__( self, top_dir ):
14 self.top_dir = top_dir
15 self.blocks = []
16
17 def add_text( self, text ):
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -050018 if not text.endswith( "\n" ):
19 text += "\n"
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040020 self.blocks.append( text )
21
22 def add_file( self, relative_input_path, wrap_in_comment=False ):
23 def add_marker( prefix ):
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -050024 self.add_text( "" )
25 self.add_text( "// " + "/"*70 )
26 self.add_text( "// %s of content of file: %s" % (prefix, relative_input_path.replace("\\","/")) )
27 self.add_text( "// " + "/"*70 )
28 self.add_text( "" )
29 add_marker( "Beginning" )
30 f = open( os.path.join( self.top_dir, relative_input_path ), "rt" )
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040031 content = f.read()
32 if wrap_in_comment:
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -050033 content = "/*\n" + content + "\n*/"
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040034 self.add_text( content )
35 f.close()
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -050036 add_marker( "End" )
37 self.add_text( "\n\n\n\n" )
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040038
39 def get_value( self ):
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -050040 return "".join( self.blocks ).replace("\r\n","\n")
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040041
42 def write_to( self, output_path ):
43 output_dir = os.path.dirname( output_path )
44 if output_dir and not os.path.isdir( output_dir ):
45 os.makedirs( output_dir )
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -050046 f = open( output_path, "wb" )
47 f.write( str.encode(self.get_value(), 'UTF-8') )
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040048 f.close()
49
50def amalgamate_source( source_top_dir=None,
51 target_source_path=None,
52 header_include_path=None ):
53 """Produces amalgated source.
54 Parameters:
55 source_top_dir: top-directory
56 target_source_path: output .cpp path
57 header_include_path: generated header path relative to target_source_path.
58 """
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -050059 print("Amalgating header...")
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040060 header = AmalgamationFile( source_top_dir )
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -050061 header.add_text( "/// Json-cpp amalgated header (http://jsoncpp.sourceforge.net/)." )
62 header.add_text( "/// It is intented to be used with #include <%s>" % header_include_path )
63 header.add_file( "LICENSE", wrap_in_comment=True )
64 header.add_text( "#ifndef JSON_AMALGATED_H_INCLUDED" )
65 header.add_text( "# define JSON_AMALGATED_H_INCLUDED" )
66 header.add_text( "/// If defined, indicates that the source file is amalgated" )
67 header.add_text( "/// to prevent private header inclusion." )
68 header.add_text( "#define JSON_IS_AMALGAMATION" )
69 header.add_file( "include/json/version.h" )
70 header.add_file( "include/json/config.h" )
71 header.add_file( "include/json/forwards.h" )
72 header.add_file( "include/json/features.h" )
73 header.add_file( "include/json/value.h" )
74 header.add_file( "include/json/reader.h" )
75 header.add_file( "include/json/writer.h" )
76 header.add_file( "include/json/assertions.h" )
77 header.add_text( "#endif //ifndef JSON_AMALGATED_H_INCLUDED" )
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040078
79 target_header_path = os.path.join( os.path.dirname(target_source_path), header_include_path )
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -050080 print("Writing amalgated header to %r" % target_header_path)
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040081 header.write_to( target_header_path )
82
83 base, ext = os.path.splitext( header_include_path )
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -050084 forward_header_include_path = base + "-forwards" + ext
85 print("Amalgating forward header...")
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040086 header = AmalgamationFile( source_top_dir )
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -050087 header.add_text( "/// Json-cpp amalgated forward header (http://jsoncpp.sourceforge.net/)." )
88 header.add_text( "/// It is intented to be used with #include <%s>" % forward_header_include_path )
89 header.add_text( "/// This header provides forward declaration for all JsonCpp types." )
90 header.add_file( "LICENSE", wrap_in_comment=True )
91 header.add_text( "#ifndef JSON_FORWARD_AMALGATED_H_INCLUDED" )
92 header.add_text( "# define JSON_FORWARD_AMALGATED_H_INCLUDED" )
93 header.add_text( "/// If defined, indicates that the source file is amalgated" )
94 header.add_text( "/// to prevent private header inclusion." )
95 header.add_text( "#define JSON_IS_AMALGAMATION" )
96 header.add_file( "include/json/config.h" )
97 header.add_file( "include/json/forwards.h" )
98 header.add_text( "#endif //ifndef JSON_FORWARD_AMALGATED_H_INCLUDED" )
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040099
100 target_forward_header_path = os.path.join( os.path.dirname(target_source_path),
101 forward_header_include_path )
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500102 print("Writing amalgated forward header to %r" % target_forward_header_path)
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400103 header.write_to( target_forward_header_path )
104
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500105 print("Amalgating source...")
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400106 source = AmalgamationFile( source_top_dir )
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500107 source.add_text( "/// Json-cpp amalgated source (http://jsoncpp.sourceforge.net/)." )
108 source.add_text( "/// It is intented to be used with #include <%s>" % header_include_path )
109 source.add_file( "LICENSE", wrap_in_comment=True )
110 source.add_text( "" )
111 source.add_text( "#include <%s>" % header_include_path )
112 source.add_text( "" )
113 lib_json = "src/lib_json"
114 source.add_file( os.path.join(lib_json, "json_tool.h") )
115 source.add_file( os.path.join(lib_json, "json_reader.cpp") )
116 source.add_file( os.path.join(lib_json, "json_batchallocator.h") )
117 source.add_file( os.path.join(lib_json, "json_valueiterator.inl") )
118 source.add_file( os.path.join(lib_json, "json_value.cpp") )
119 source.add_file( os.path.join(lib_json, "json_writer.cpp") )
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400120
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500121 print("Writing amalgated source to %r" % target_source_path)
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400122 source.write_to( target_source_path )
123
124def main():
125 usage = """%prog [options]
126Generate a single amalgated source and header file from the sources.
127"""
128 from optparse import OptionParser
129 parser = OptionParser(usage=usage)
130 parser.allow_interspersed_args = False
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500131 parser.add_option("-s", "--source", dest="target_source_path", action="store", default="dist/jsoncpp.cpp",
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400132 help="""Output .cpp source path. [Default: %default]""")
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500133 parser.add_option("-i", "--include", dest="header_include_path", action="store", default="json/json.h",
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400134 help="""Header include path. Used to include the header from the amalgated source file. [Default: %default]""")
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500135 parser.add_option("-t", "--top-dir", dest="top_dir", action="store", default=os.getcwd(),
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400136 help="""Source top-directory. [Default: %default]""")
137 parser.enable_interspersed_args()
138 options, args = parser.parse_args()
139
140 msg = amalgamate_source( source_top_dir=options.top_dir,
141 target_source_path=options.target_source_path,
142 header_include_path=options.header_include_path )
143 if msg:
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500144 sys.stderr.write( msg + "\n" )
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400145 sys.exit( 1 )
146 else:
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500147 print("Source succesfully amalagated")
148
149if __name__ == "__main__":
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400150 main()