29 #include "arcslibmakerparser.h"
30 #include <QCoreApplication>
75 bool useWrapper =
false;
77 QString header_preamble =
"#include<arcs/arcslibtoolkit.h>\n#include<QMetaType>\n";
78 QString header_line =
"#include<@>\n" ;
80 QString type_struct_line =
"Q_DECLARE_METATYPE(@)\n";
82 QString register_preamble =
83 "extern \"C\" DLL_EXPORT void arcsLibraryRegister(ARCSComponentMap* cmap," \
84 " ARCSFamilyMap* fmap, ARCSTypeMap* tmap)\n{\n";
85 QString unregister_preamble =
86 "extern \"C\" DLL_EXPORT void arcsLibraryUnregister(ARCSComponentMap* cmap," \
87 "ARCSFamilyMap* fmap, ARCSTypeMap* tmap)\n{\n";
89 QString register_component_line =
"\tcmap->insert(\"@\",new ARCSNativeComponentTemplate<@>());\n";
90 QString register_family_line =
"\tfmap->insert(\"@\",new @());\n";
91 QString register_variant_line =
"\tqRegisterMetaType<@>(\"@\");\n" ;
92 QString register_type_line =
"\tatf = new @();\n" \
93 "\ttmap->insert(atf->getTypeName(), atf);\n";
95 QString register_type_linebis =
"\ttmap->insert(\"@\", new ARCSTypeFactoryTemplate_@());\n" \
96 "\tqRegisterMetaType<@>(\"@\");\n";
99 QString unregister_component_line =
"\tdelete cmap->take(\"@\");\n";
100 QString unregister_family_line =
"\tdelete fmap->take(\"@\");\n";
101 QString unregister_type_line =
"\tdelete tmap->take(\"@\");\n" \
102 "\tQMetaType::unregisterType(\"@\");\n";
105 QString qmake_append =
106 "\n\nALXFILE = @\nOTHER_FILES += @\narcslibrary.output = alm_${QMAKE_FILE_BASE}.cpp\n" \
107 "arcslibrary.input = ALXFILE\narcslibrary.commands = arcslibmaker ${QMAKE_FILE_NAME}\n" \
108 "arcslibrary.variable_out = SOURCES\n" \
109 "QMAKE_EXTRA_COMPILERS += arcslibrary\n";
111 QString qmake_preamble =
112 "win32-msvc* {\n TEMPLATE = vclib\n } else {\nTEMPLATE = lib\n}\n" \
113 "INCLUDEPATH += $$(ARCSDIR)/include\n" \
114 "LIBS += -L$$(ARCSDIR)/lib -larcs\n"\
118 QString qmake_header =
"HEADERS += @\n";
120 QString qmake_source =
"SOURCES += @\n";
154 QString replace(QString src, QString insert)
157 return src.replace(
"@", insert).replace(
"*(",
"Star(");
163 QString cppFileBase(
char* fn)
167 return fi.canonicalPath() +QDir::separator() +
"alm_" + fi.baseName() +
".cpp";
171 void writeHeaders(std::ofstream & file, QStringList hl)
175 for(
int i=0; i < hl.count() ; i++)
176 file << qPrintable(replace(header_line, hl[i]));
181 void writeTypeList(std::ofstream &file, QStringList tl)
183 for (
int i=0; i < tl.count() ; i++)
184 file << qPrintable(replace(type_struct_line,tl[i]));
190 void writeRegisterWrapper(std::ofstream &file, QStringList cl, QStringList fl, QList<ARCSTypeWrapper> tl)
193 file <<
"extern \"C\" DLL_EXPORT void arcsLibraryRegister(ARCSComponentMap* " ;
196 file <<
", ARCSFamilyMap* ";
199 file <<
", ARCSTypeMap* ";
207 for (i=0; i < cl.count() ; i++)
208 file << qPrintable(replace(register_component_line,cl[i])) ;
212 for (i=0; i < fl.count() ; i++)
213 file << qPrintable(replace(register_family_line,fl[i]));
216 for (i=0; i < tl.count() ; i++)
219 if (atw.getWrapper().isEmpty())
220 file << qPrintable(replace(register_type_linebis,atw.getName()));
224 file <<
"\tARCSTypeFactory* atf;" ;
226 file << qPrintable(replace(register_type_line, atw.getWrapper()))
227 << qPrintable(replace(register_variant_line, atw.getName()));
231 file <<
"}" << std::endl << std::endl;
235 void writeUnRegisterWrapper(std::ofstream &file,QStringList cl, QStringList fl, QList<ARCSTypeWrapper> tl)
238 file <<
"extern \"C\" DLL_EXPORT void arcsLibraryUnregister(ARCSComponentMap* " ;
241 file <<
", ARCSFamilyMap* ";
244 file <<
", ARCSTypeMap* ";
252 for (i=0; i < cl.count() ; i++)
253 file << qPrintable(replace(unregister_component_line,cl[i])) ;
257 for (i=0; i < fl.count() ; i++)
258 file << qPrintable(replace(unregister_family_line,fl[i]));
261 for (i=0; i < tl.count() ; i++)
266 file << qPrintable(replace(unregister_type_line,atw.getName()));
269 file <<
"}" << std::endl << std::endl;
273 void appendProjectFile(std::ofstream & of)
275 QStringList alxFilter;
276 alxFilter <<
"*.alx";
278 QDir dir = QDir::current() ;
280 QStringList alxFiles = dir.entryList(alxFilter, QDir::Files | QDir::Readable | QDir::Writable );
282 if (alxFiles.count() <= 0 )
285 of << qPrintable(replace(qmake_append, alxFiles[0])) << std::endl;
294 QStringList proFilter;
295 proFilter <<
"*.pro";
297 QDir dir = QDir::current() ;
298 QStringList proFiles = dir.entryList(proFilter, QDir::Files | QDir::Readable | QDir::Writable );
302 if (proFiles.count() > 0)
304 of.open(qPrintable(proFiles[0]),std::ios_base::app);
311 QString proName = QDir::current().dirName() +
".pro" ;
312 of.open(qPrintable(proName));
317 QString path = QDir(QCoreApplication::applicationDirPath() + QDir::separator() +
"..").canonicalPath() ;
318 of << qPrintable(replace(qmake_preamble, path));
322 QStringList headerFilter;
323 headerFilter <<
"*.h";
324 QStringList headerFiles = dir.entryList(headerFilter, QDir::Files);
325 for (i = 0; i < headerFiles.count() ; i++)
326 of << qPrintable(replace(qmake_header, headerFiles[i]));
328 QStringList sourceFilter;
329 sourceFilter <<
"*.cpp" <<
"*.c";
330 QStringList sourceFiles = dir.entryList(sourceFilter, QDir::Files);
331 for (i = 0; i < sourceFiles.count() ; i++)
332 of << qPrintable(replace(qmake_source, sourceFiles[i]));
337 QStringList alxFilter(QString(
"*.alx"));
338 QStringList alxFiles = dir.entryList(alxFilter, QDir::Files | QDir::Readable | QDir::Writable );
339 if( alxFiles.count() <= 0)
341 QString alxTarget =
"lib"+QDir::current().dirName() +
".alx" ;
342 if (QFile::copy(
":/alx_skeleton.xml",alxTarget))
343 QFile::setPermissions(alxTarget,QFile::permissions(alxTarget) | QFile::WriteOwner | QFile::WriteUser);
347 appendProjectFile(of);
352 void usage(
char* prg)
354 std::cout << prg <<
" [--help] [file]" << std::endl;
356 std::cout << prg <<
" has two modes, one for generating ARCS library wrappers,"
357 << std::endl <<
" the second for adding ARCS options to Qt project files."
358 << std::endl << std::endl
359 <<
"The first mode needs an xml file describing the library contents."
363 int main(
int argc,
char* argv[])
365 QCoreApplication app(argc, argv);
369 if (QString(argv[1]) ==
"--help")
377 almp.setFileName(argv[1]);
378 if (almp.parseFile())
381 std::ofstream of( qPrintable(cppFileBase(argv[1])) );
384 of << qPrintable( header_preamble ) ;
386 writeHeaders(of, almp.getHeaders());
388 writeRegisterWrapper(of, almp.getComponents(), almp.getFamilies(), almp.getTypes());
389 writeUnRegisterWrapper(of, almp.getComponents(), almp.getFamilies(), almp.getTypes());