1 #include <bash/Config.h>
3 // -------------------------------------------------------------------------
4 int main( int argc, char* argv[] )
10 << "Usage: " << argv[ 0 ]
11 << " definitons_file library_name output_path number_of_sources"
16 std::string definitions_filename = argv[ 1 ];
17 std::string library_name = argv[ 2 ];
18 std::string output_path = argv[ 3 ];
19 unsigned int number_of_sources = std::atoi( argv[ 4 ] );
22 std::string definitions_buffer;
23 if( !( cpPlugins_bash::Read( definitions_buffer, definitions_filename ) ) )
27 << ": Error reading definitions file \"" << definitions_filename
33 // Put it in a line-by-line structure
34 TStrings definitions_lines;
35 cpPlugins_bash::Tokenize( definitions_lines, definitions_buffer, "\n" );
39 cpPlugins_bash::Parse( commands, definitions_lines );
41 // Load pre-compiled definitions
42 cpPlugins_bash::LoadDefinitions( commands );
45 TCommands definitions;
46 cpPlugins_bash::ExpandDefinitions( definitions, commands );
47 definitions[ "_export_" ].clear( );
48 definitions[ "_export_" ].push_back( library_name + std::string( "_EXPORT" ) );
51 TStrings tfiles, cfiles, instances, minstances;
52 cpPlugins_bash::Expand( tfiles, definitions, commands, "tinclude" );
53 cpPlugins_bash::Expand( cfiles, definitions, commands, "cinclude" );
54 cpPlugins_bash::Expand( instances, definitions, commands, "instances" );
55 cpPlugins_bash::Expand( minstances, definitions, commands, "minstances" );
57 // Build all instances
58 TStrings all_instances;
59 for( auto iIt = instances.begin( ); iIt != instances.end( ); ++iIt )
61 std::stringstream str;
62 str << "template class " << library_name << "_EXPORT " << *iIt;
63 all_instances.push_back( str.str( ) );
66 for( auto iIt = minstances.begin( ); iIt != minstances.end( ); ++iIt )
68 std::stringstream str;
69 str << "template " << *iIt;
70 all_instances.push_back( str.str( ) );
74 // Prepare header file
75 std::stringstream header;
77 << "// Automaticaly generated file. Please do not modify." << std::endl
78 << "#ifndef __" << library_name << "__h__" << std::endl
79 << "#define __" << library_name << "__h__" << std::endl << std::endl;
81 auto hIt = commands.find( "header" );
82 if( hIt != commands.end( ) )
84 for( auto vIt = hIt->second.begin( ); vIt != hIt->second.end( ); ++vIt )
85 header << *vIt << std::endl;
90 if( tfiles.size( ) > 0 )
92 for( auto tIt = tfiles.begin( ); tIt != tfiles.end( ); ++tIt )
95 cpPlugins_bash::Tokenize( toks, *tIt, ":|" );
96 if( toks.size( ) == 3 )
98 << "#include <" << toks[ 0 ] << "." << toks[ 1 ] << ">" << std::endl;
104 header << "#endif // __" << library_name << "__h__" << std::endl;
107 std::stringstream header_filename;
108 header_filename << output_path << "/" << library_name << ".h";
109 if( !( cpPlugins_bash::Write( header.str( ), header_filename.str( ) ) ) )
111 std::cerr << "Error writing header file." << std::endl;
117 unsigned int instances_per_file =
119 std::floor( double( all_instances.size( ) ) / double( number_of_sources ) )
121 if( instances_per_file == 0 )
122 instances_per_file = 1;
123 std::vector< std::vector< std::string > > all_lines( 1 );
124 for( unsigned int c_id = 0; c_id < all_instances.size( ); ++c_id )
126 all_lines[ all_lines.size( ) - 1 ].push_back( all_instances[ c_id ] );
127 if( c_id % instances_per_file == instances_per_file - 1 )
128 all_lines.push_back( std::vector< std::string >( ) );
133 while( all_lines.size( ) > number_of_sources )
135 all_lines[ all_lines.size( ) - 2 ].insert(
136 all_lines[ all_lines.size( ) - 2 ].end( ),
137 all_lines[ all_lines.size( ) - 1 ].begin( ),
138 all_lines[ all_lines.size( ) - 1 ].end( )
140 all_lines.pop_back( );
143 while( all_lines.size( ) < number_of_sources )
144 all_lines.push_back( std::vector< std::string >( ) );
147 for( unsigned int f_id = 0; f_id < all_lines.size( ); ++f_id )
149 std::stringstream source;
151 << "#include <" << library_name << "_Export.h>"
154 << "#include <" << output_path<< "/" << library_name << ".h>"
155 << std::endl << std::endl;
156 if( tfiles.size( ) > 0 )
158 for( auto tIt = tfiles.begin( ); tIt != tfiles.end( ); ++tIt )
161 cpPlugins_bash::Tokenize( toks, *tIt, ":|" );
162 if( toks.size( ) == 3 )
163 source << "#include <" << toks[ 0 ] << "." << toks[ 2 ] << ">" << std::endl;
170 if( cfiles.size( ) > 0 )
172 for( auto cIt = cfiles.begin( ); cIt != cfiles.end( ); ++cIt )
173 source << "#include <" << *cIt << ">" << std::endl;
179 auto c_it = all_lines[ f_id ].begin( );
180 c_it != all_lines[ f_id ].end( );
183 source << *c_it << ";" << std::endl;
184 source << std::endl << "// eof" << std::endl;
185 std::stringstream source_file;
187 << output_path << "/" << library_name << "_" << f_id << ".cxx";
188 if( !( cpPlugins_bash::Write( source.str( ), source_file.str( ) ) ) )
190 std::cerr << "Error writing source code." << std::endl;