gwenhywfar 5.12.0
genericbuilder.c
Go to the documentation of this file.
1/***************************************************************************
2 begin : Mon Feb 08 2021
3 copyright : (C) 2021 by Martin Preuss
4 email : martin@libchipcard.de
5
6 ***************************************************************************
7 * Please see toplevel file COPYING for license details *
8 ***************************************************************************/
9
10#ifdef HAVE_CONFIG_H
11# include <config.h>
12#endif
13
14
15#include "gwenbuild/builders/genericbuilder_p.h"
18
19#include <gwenhywfar/debug.h>
20#include <gwenhywfar/memory.h>
21#include <gwenhywfar/text.h>
22
23#include <string.h>
24
25
26
27GWEN_INHERIT(GWB_BUILDER, GWB_BUILDER_GENERIC);
28
29
30static void GWENHYWFAR_CB _freeData(void *bp, void *p);
31
32static void _readMainSettingsFromXml(GWB_BUILDER *builder);
33static void _setupVariables(GWB_BUILDER *builder);
35static void _setupOutFiles(GWB_BUILDER *builder);
36static void _setupTargetLinkSpec(GWB_BUILDER *builder);
37
38static GWB_FILE *_parseOutFile(GWB_BUILDER *builder,
39 GWB_PROJECT *project,
40 GWB_TARGET *target,
41 GWEN_XMLNODE *nFile,
42 const char *folder);
43
45
46static int _isAcceptableInput(GWB_BUILDER *builder, const GWB_FILE *file);
47static void _addSourceFile(GWB_BUILDER *builder, GWB_FILE *f);
48static int _addBuildCmd(GWB_BUILDER *builder, GWB_BUILD_CONTEXT *bctx);
49
50static void _addBuildCommands(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd);
51static void _addPrepareCommands(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd);
52static void _addCommands(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, const char *groupName, GWB_BUILD_SUBCMD_LIST *cmdList);
54
55static void _readDepFile(GWB_BUILDER *builder, GWB_BUILD_SUBCMD *cmd, GWEN_XMLNODE *xmlNode);
56static GWEN_BUFFER *_readMainFilename(GWB_CONTEXT *context, GWEN_XMLNODE *xmlFile, GWB_FILE_LIST2 *filesList);
57static void _readBuildMessage(GWB_BUILDER *builder, GWB_BUILD_SUBCMD *cmd, GWEN_XMLNODE *xmlNode);
58
59static GWEN_BUFFER *_readArgs(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *xmlNode);
60static void _readArgsLoop(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *nArgs, GWEN_BUFFER *argsBuffer);
61static void _readArgsFixed(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer);
62static void _readArgsInputFiles(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer);
63static void _readArgsOutputFiles(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer);
64static void _readArgsLibraries(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer);
65static void _readArgsIncludes(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer);
66static void _readArgsDefines(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer);
67static void _readArgsUsedSubTargets(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer);
68static void _readArgsIfHasUsedSubTargets(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer);
69static void _readArgsIfHasLibraries(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer);
70static void _readArgsHaveConfigH(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer);
71
72static void _addMatchingFiles(GWB_BUILDER *builder, GWB_FILE_LIST2 *filesList, const char *pattern, int addAbs, GWEN_BUFFER *argsBuffer);
73static void _addStringListToBuffer(GWEN_STRINGLIST *sl, GWEN_BUFFER *argsBuffer);
74
75
76
77
78GWB_BUILDER *GWB_GenericBuilder_Factory(GWENBUILD *gwenbuild, GWB_CONTEXT *context, const char *builderName)
79{
80 GWB_BUILDER *builder;
81 GWEN_BUFFER *nameBuf;
82 GWEN_XMLNODE *xmlRoot;
83 GWEN_XMLNODE *xmlDescr;
84 int rv;
85
86 nameBuf=GWEN_Buffer_new(0, 256, 0, 1);
87 GWEN_Buffer_AppendString(nameBuf, BUILDERDATADIR GWEN_DIR_SEPARATOR_S);
88 if (GWBUILD_GetTargetIsWindows(gwenbuild))
89 GWEN_Buffer_AppendString(nameBuf, "windows");
90 else
91 GWEN_Buffer_AppendString(nameBuf, "posix");
93 GWEN_Buffer_AppendString(nameBuf, builderName);
94 GWEN_Buffer_AppendString(nameBuf, ".gwb");
95
98 if (rv<0) {
100 "No description for builder type \"%s\" found (%d, tried \"%s\")",
101 builderName, rv, GWEN_Buffer_GetStart(nameBuf));
102 GWEN_Buffer_free(nameBuf);
103 return NULL;
104 }
105
106 xmlDescr=GWEN_XMLNode_FindFirstTag(xmlRoot, "GwenBuilder", NULL, NULL);
107 if (xmlDescr==NULL) {
108 DBG_ERROR(NULL, "No <GwenBuilder> element found in file \"%s\"", GWEN_Buffer_GetStart(nameBuf));
109 GWEN_XMLNode_free(xmlRoot);
110 GWEN_Buffer_free(nameBuf);
111 return NULL;
112 }
113 GWEN_XMLNode_UnlinkChild(xmlRoot, xmlDescr);
114 GWEN_XMLNode_free(xmlRoot);
115
116 builder=GWB_GenericBuilder_new(gwenbuild, context, xmlDescr);
117 if (builder==NULL) {
118 DBG_ERROR(NULL, "Error in file \"%s\"", GWEN_Buffer_GetStart(nameBuf));
119 GWEN_XMLNode_free(xmlDescr);
120 GWEN_Buffer_free(nameBuf);
121 return NULL;
122 }
123 GWEN_Buffer_free(nameBuf);
124
125 return builder;
126}
127
128
129
130
131
133{
134 GWB_BUILDER *builder;
135 GWB_BUILDER_GENERIC *xbuilder;
136 const char *s;
137
138 s=GWEN_XMLNode_GetProperty(xmlDescr, "name", NULL);
139 if (!(s && *s)) {
140 DBG_ERROR(NULL, "No builder name in XML builder description");
141 return NULL;
142 }
143 builder=GWB_Builder_new(gwenbuild, context, s);
144 GWEN_NEW_OBJECT(GWB_BUILDER_GENERIC, xbuilder);
145 GWEN_INHERIT_SETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder, xbuilder, _freeData);
146
147 xbuilder->builderName=strdup(s);
148
149 xbuilder->dbVars=GWEN_DB_Group_new("vars");
150 xbuilder->xmlDescr=xmlDescr;
151
155
157 _setupVariables(builder);
158
159 return builder;
160}
161
162
163
164void GWENHYWFAR_CB _freeData(GWEN_UNUSED void *bp, void *p)
165{
166 GWB_BUILDER_GENERIC *xbuilder;
167
168 xbuilder=(GWB_BUILDER_GENERIC*) p;
169
170 GWEN_DB_Group_free(xbuilder->dbVars);
171 GWEN_XMLNode_free(xbuilder->xmlDescr);
172 free(xbuilder->toolName);
173 free(xbuilder->builderName);
174 GWEN_FREE_OBJECT(xbuilder);
175}
176
177
178
180{
181 GWB_BUILDER_GENERIC *xbuilder;
182 GWB_CONTEXT *context;
183 GWEN_XMLNODE *nInputFiles;
184
185 xbuilder=GWEN_INHERIT_GETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder);
186
187 context=GWB_Builder_GetContext(builder);
188
189 xbuilder->maxInputFiles=GWEN_XMLNode_GetIntProperty(xbuilder->xmlDescr, "maxinputfiles", -1);
190
191 nInputFiles=GWEN_XMLNode_FindFirstTag(xbuilder->xmlDescr, "inputFiles", NULL, NULL);
192 if (nInputFiles) {
193 GWEN_XMLNODE *n;
194
195 n=GWEN_XMLNode_FindFirstTag(nInputFiles, "acceptedInputTypes", NULL, NULL);
196 if (n)
197 xbuilder->acceptedInputTypes=GWB_Parser_ReadXmlDataIntoStringList(GWB_Context_GetVars(context), n, 1);
198
199 n=GWEN_XMLNode_FindFirstTag(nInputFiles, "acceptedInputFiles", NULL, NULL);
200 if (n)
201 xbuilder->acceptedInputExt=GWB_Parser_ReadXmlDataIntoStringList(GWB_Context_GetVars(context), n, 1);
202 }
203}
204
205
206
208{
209 GWB_BUILDER_GENERIC *xbuilder;
210 GWB_CONTEXT *context;
211 const char *s;
212 GWEN_DB_NODE *db;
213
214 xbuilder=GWEN_INHERIT_GETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder);
215
216 db=xbuilder->dbVars;
217 context=GWB_Builder_GetContext(builder);
218
220 if (s)
222
224}
225
226
227
228void _setToolName(GWB_BUILDER *builder, const char *s)
229{
230 GWB_BUILDER_GENERIC *xbuilder;
231
232 xbuilder=GWEN_INHERIT_GETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder);
233 free(xbuilder->toolName);
234 xbuilder->toolName=s?strdup(s):NULL;
235}
236
237
238
240{
241 GWB_FILE_LIST2 *fileList;
242
243 GWB_Builder_AddInputFile(builder, f);
244
245 fileList=GWB_Builder_GetOutputFileList2(builder);
246 if (!(fileList && GWB_File_List2_GetSize(fileList)>0)) {
248 }
249}
250
251
252
254{
255 GWB_BUILDER_GENERIC *xbuilder;
256 GWB_FILE_LIST2 *fileList;
257
258 xbuilder=GWEN_INHERIT_GETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder);
259
260 fileList=GWB_Builder_GetInputFileList2(builder);
261 if (fileList) {
262 GWB_FILE *file;
263
264 file=GWB_File_List2_GetFront(fileList);
265 if (file) {
266 const char *s;
267
268 s=GWB_File_GetName(file);
269 if (s) {
270 const char *ptrToPoint;
271
272 GWEN_DB_SetCharValue(xbuilder->dbVars, GWEN_DB_FLAGS_DEFAULT, "firstInputFile", s);
273 ptrToPoint=strrchr(s, '.');
274 if (ptrToPoint) {
275 char *copyOfName;
276
277 copyOfName=GWEN_Text_strndup(s, (ptrToPoint-s));
278 GWEN_DB_SetCharValue(xbuilder->dbVars, GWEN_DB_FLAGS_DEFAULT, "firstInputFileNoExt", copyOfName);
279 free(copyOfName);
280 }
281 }
282 }
283 }
284
285 _setupOutFiles(builder);
286 _setupTargetLinkSpec(builder);
287}
288
289
290
292{
293 GWB_BUILDER_GENERIC *xbuilder;
294 GWB_CONTEXT *context;
295 GWB_TARGET *target;
296 GWB_PROJECT *project;
297 const char *folder;
298 const char *installName;
299 GWEN_XMLNODE *nOutputFiles;
300
301 xbuilder=GWEN_INHERIT_GETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder);
302
303 context=GWB_Builder_GetContext(builder);
304 target=GWB_Context_GetCurrentTarget(context);
305 project=GWB_Target_GetProject(target);
306
307 folder=GWB_Context_GetCurrentBuildDir(context);
308 installName=GWB_Target_GetInstallName(target);
309
310 nOutputFiles=GWEN_XMLNode_FindFirstTag(xbuilder->xmlDescr, "outputFiles", NULL, NULL);
311 if (nOutputFiles) {
312 GWEN_XMLNODE *nFile;
313
314 nFile=GWEN_XMLNode_FindFirstTag(nOutputFiles, "file", NULL, NULL);
315 while (nFile) {
316 GWB_FILE *fileOut;
317
318 fileOut=_parseOutFile(builder, project, target, nFile, folder);
319 if (fileOut) {
320 if (installName && *installName)
321 GWB_File_SetInstallName(fileOut, installName);
322 GWB_Builder_AddOutputFile(builder, fileOut);
323 }
324
325 nFile=GWEN_XMLNode_FindNextTag(nFile, "file", NULL, NULL);
326 } /* while nFile */
327 } /* if nOutputFiles */
328}
329
330
331
333 GWB_PROJECT *project,
334 GWB_TARGET *target,
335 GWEN_XMLNODE *nFile,
336 const char *folder)
337{
338 GWB_BUILDER_GENERIC *xbuilder;
339 const char *sFileType;
340 const char *sInstall;
341 GWEN_BUFFER *nbuf;
342
343 xbuilder=GWEN_INHERIT_GETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder);
344
345 sFileType=GWEN_XMLNode_GetProperty(nFile, "type", NULL);
346 sInstall=GWEN_XMLNode_GetProperty(nFile, "install", NULL);
347 nbuf=_readXmlDataIntoBufferAndExpand(xbuilder->dbVars, nFile);
348 if (nbuf) {
349 GWB_FILE *fileOut;
350 const char *sTargetInstallPath=NULL;
351
353 GWEN_Buffer_free(nbuf);
354
355 if (sFileType)
356 GWB_File_SetFileType(fileOut, sFileType);
357 if (sInstall && strcasecmp(sInstall, "target")==0)
358 sTargetInstallPath=GWB_Target_GetInstallPath(target);
360
361 if (sTargetInstallPath && *sTargetInstallPath) {
362 GWB_File_SetInstallPath(fileOut, sTargetInstallPath);
364 }
365 return fileOut;
366 } /* if nbuf */
367
368 return NULL;
369}
370
371
372
374{
375 GWB_BUILDER_GENERIC *xbuilder;
376 GWEN_XMLNODE *nTargetLinkSpec;
377
378 xbuilder=GWEN_INHERIT_GETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder);
379
380 nTargetLinkSpec=GWEN_XMLNode_FindFirstTag(xbuilder->xmlDescr, "targetLinkSpecs", NULL, NULL);
381 if (nTargetLinkSpec) {
382 GWEN_BUFFER *buf;
383
384 buf=_readXmlDataIntoBufferAndExpand(xbuilder->dbVars, nTargetLinkSpec);
385 if (buf) {
387 GWEN_Buffer_free(buf);
388 }
389 }
390}
391
392
393
395{
396 GWEN_XMLNODE *xmlData;
397
398 xmlData=GWEN_XMLNode_GetFirstData(xmlNode);
399 if (xmlData) {
400 const char *s;
401
402 s=GWEN_XMLNode_GetData(xmlData);
403 if (s && *s) {
404 int rv;
405 GWEN_BUFFER *buf;
406
407 buf=GWEN_Buffer_new(0, 256, 0, 1);
408 rv=GWEN_DB_ReplaceVars(db, s, buf);
409 if(rv<0) {
410 DBG_INFO(NULL, "here (%d)", rv);
411 GWEN_Buffer_free(buf);
412 return NULL;
413 }
414
415 return buf;
416 }
417 }
418
419 return NULL;
420}
421
422
423
425{
426 GWB_BUILDER_GENERIC *xbuilder;
427 const char *sType;
428 const char *sExt;
429
430 xbuilder=GWEN_INHERIT_GETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder);
431
432 sType=GWB_File_GetFileType(f);
433 sExt=GWB_File_GetExt(f);
434
435 if (sType && xbuilder->acceptedInputTypes && GWEN_StringList_HasString(xbuilder->acceptedInputTypes, sType))
436 return 1;
437
438 if (sExt && xbuilder->acceptedInputExt && GWEN_StringList_HasString(xbuilder->acceptedInputExt, sExt))
439 return 1;
440
441 return 0;
442}
443
444
445
447{
448 GWB_BUILDER_GENERIC *xbuilder;
449 GWB_CONTEXT *context;
450 GWB_BUILD_CMD *bcmd;
451
452 xbuilder=GWEN_INHERIT_GETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder);
453 context=GWB_Builder_GetContext(builder);
454
455 bcmd=GWB_BuildCmd_new();
457 GWB_BuildCmd_SetBuilderName(bcmd, xbuilder->builderName);
459
460 _addBuildCommands(builder, bcmd);
461 _addPrepareCommands(builder, bcmd);
462
465
466 GWB_BuildCtx_AddCommand(bctx, bcmd);
467
468 return 0;
469}
470
471
472
474{
475 _addCommands(builder, bcmd, "buildCommands", GWB_BuildCmd_GetBuildCommandList(bcmd));
476}
477
478
479
481{
482 _addCommands(builder, bcmd, "prepareCommands", GWB_BuildCmd_GetPrepareCommandList(bcmd));
483}
484
485
486
487void _addCommands(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, const char *groupName, GWB_BUILD_SUBCMD_LIST *cmdList)
488{
489 GWB_BUILDER_GENERIC *xbuilder;
490 GWEN_XMLNODE *n;
491
492 xbuilder=GWEN_INHERIT_GETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder);
493
494 n=GWEN_XMLNode_FindFirstTag(xbuilder->xmlDescr, groupName, NULL, NULL);
495 if (n) {
496 const char *s;
497
498 s=GWEN_XMLNode_GetProperty(n, "checkDates", "TRUE");
499 if (s && strcasecmp(s, "TRUE")==0)
501
502
503 s=GWEN_XMLNode_GetProperty(n, "deleteOutFileFirst", "FALSE");
504 if (s && strcasecmp(s, "TRUE")==0)
506
507 n=GWEN_XMLNode_FindFirstTag(n, "cmd", NULL, NULL);
508 while(n) {
509 GWB_BUILD_SUBCMD *cmd;
510
511 cmd=_readSubCmd(builder, bcmd, n);
512 if (cmd)
513 GWB_BuildSubCmd_List_Add(cmd, cmdList);
514
515 n=GWEN_XMLNode_FindNextTag(n, "cmd", NULL, NULL);
516 }
517 }
518}
519
520
521
523{
524 GWB_BUILDER_GENERIC *xbuilder;
525 const char *sToolName;
526 GWEN_BUFFER *argsBuffer;
527 GWEN_BUFFER *toolNameBuffer;
528 GWB_BUILD_SUBCMD *cmd;
529 const char *s;
530
531 xbuilder=GWEN_INHERIT_GETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder);
532
533 toolNameBuffer=GWEN_Buffer_new(0, 256, 0, 1);
534 sToolName=GWEN_XMLNode_GetProperty(n, "tool", NULL);
535 if (sToolName) {
536 GWEN_DB_ReplaceVars(xbuilder->dbVars, sToolName, toolNameBuffer);
537 sToolName=GWEN_Buffer_GetStart(toolNameBuffer);
538 }
539
541 GWB_BuildSubCmd_SetCommand(cmd, sToolName);
542
543 s=GWEN_XMLNode_GetProperty(n, "ignoreResult", "FALSE");
544 if (s && strcasecmp(s, "TRUE")==0)
546
547 s=GWEN_XMLNode_GetProperty(n, "checkDepends", "FALSE");
548 if (s && strcasecmp(s, "TRUE")==0)
550
551 argsBuffer=_readArgs(builder, bcmd, n);
552 if (argsBuffer) {
554 GWEN_Buffer_free(argsBuffer);
555 }
556
557 _readDepFile(builder, cmd, n);
558 _readBuildMessage(builder, cmd, n);
559
560 GWEN_Buffer_free(toolNameBuffer);
561
562 return cmd;
563}
564
565
566
568{
569 GWB_BUILDER_GENERIC *xbuilder;
570 GWEN_XMLNODE *xmlMsg;
571
572 xbuilder=GWEN_INHERIT_GETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder);
573
574 xmlMsg=GWEN_XMLNode_FindFirstTag(xmlNode, "buildMessage", NULL, NULL);
575 if (xmlMsg) {
576 GWEN_BUFFER *buf;
577
578 buf=_readXmlDataIntoBufferAndExpand(xbuilder->dbVars, xmlMsg);
579 if (buf) {
581 GWEN_Buffer_free(buf);
582 }
583 }
584}
585
586
587
589{
590 GWEN_XMLNODE *xmlFile;
591
592 xmlFile=GWEN_XMLNode_FindFirstTag(xmlNode, "depFile", NULL, NULL);
593 if (xmlFile) {
594 GWB_CONTEXT *context;
595 GWB_FILE_LIST2 *filesList;
596 GWEN_BUFFER *filenameBuffer;
597
598 context=GWB_Builder_GetContext(builder);
599 filesList=GWB_Builder_GetOutputFileList2(builder);
600
601 filenameBuffer=_readMainFilename(context, xmlFile, filesList);
602 if (filenameBuffer) {
604 GWEN_Buffer_free(filenameBuffer);
605 }
606 }
607}
608
609
610
611GWEN_BUFFER *_readMainFilename(GWB_CONTEXT *context, GWEN_XMLNODE *xmlFile, GWB_FILE_LIST2 *filesList)
612{
613 if (filesList) {
614 int index;
615
616 index=GWEN_XMLNode_GetIntProperty(xmlFile, "index", -1);
617 if (index>=0) {
618 GWB_FILE *file;
619
620 file=GWB_File_List2_GetAt(filesList, index);
621 if (file) {
622 GWEN_BUFFER *filenameBuffer;
623 const char *s;
624
625 filenameBuffer=GWEN_Buffer_new(0, 256, 0, 1);
626
629 if (s && *s) {
630 GWEN_Buffer_AppendString(filenameBuffer, s);
632 }
633 }
634 s=GWB_File_GetFolder(file);
635 if (s && *s) {
636 GWEN_Buffer_AppendString(filenameBuffer, s);
638 }
639 GWEN_Buffer_AppendString(filenameBuffer, GWB_File_GetName(file));
640 return filenameBuffer;
641 }
642 }
643 }
644 return NULL;
645}
646
647
648
650{
651 GWEN_XMLNODE *nArgs;
652
653 nArgs=GWEN_XMLNode_FindFirstTag(xmlNode, "args", NULL, NULL);
654 if (nArgs) {
655 GWEN_BUFFER *argsBuffer;
656
657 argsBuffer=GWEN_Buffer_new(0, 256, 0, 1);
658 _readArgsLoop(builder, bcmd, nArgs, argsBuffer);
659 if (GWEN_Buffer_GetUsedBytes(argsBuffer))
660 return argsBuffer;
661 GWEN_Buffer_free(argsBuffer);
662 }
663
664 return NULL;
665}
666
667
668
669void _readArgsLoop(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *nArgs, GWEN_BUFFER *argsBuffer)
670{
671 GWEN_XMLNODE *n;
672
674 while(n) {
675 const char *sTagName;
676
677 sTagName=GWEN_XMLNode_GetData(n);
678 if (sTagName) {
679 if (strcasecmp(sTagName, "fixed")==0)
680 _readArgsFixed(builder, n, argsBuffer);
681 else if (strcasecmp(sTagName, "inputFiles")==0)
682 _readArgsInputFiles(builder, n, argsBuffer);
683 else if (strcasecmp(sTagName, "outputFiles")==0)
684 _readArgsOutputFiles(builder, n, argsBuffer);
685 else if (strcasecmp(sTagName, "ifHasSubTargetLibs")==0)
686 _readArgsIfHasUsedSubTargets(builder, bcmd, n, argsBuffer);
687 else if (strcasecmp(sTagName, "subTargetLibs")==0)
688 _readArgsUsedSubTargets(builder, argsBuffer);
689 else if (strcasecmp(sTagName, "includes")==0)
690 _readArgsIncludes(builder, n, argsBuffer);
691 else if (strcasecmp(sTagName, "defines")==0)
692 _readArgsDefines(builder, argsBuffer);
693 else if (strcasecmp(sTagName, "ifHasLibraries")==0)
694 _readArgsIfHasLibraries(builder, bcmd, n, argsBuffer);
695 else if (strcasecmp(sTagName, "libraries")==0)
696 _readArgsLibraries(builder, argsBuffer);
697 else if (strcasecmp(sTagName, "haveConfigH")==0)
698 _readArgsHaveConfigH(builder, argsBuffer);
699 else if (strcasecmp(sTagName, "blank")==0) {
700 GWEN_Buffer_AppendString(argsBuffer, " ");
701 }
702 else {
703 DBG_ERROR(NULL, "Unhandled tag \"%s\", ignoring", sTagName);
704 }
705 }
706
708 } /* while */
709}
710
711
712
713void _readArgsFixed(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer)
714{
715 GWB_BUILDER_GENERIC *xbuilder;
716 GWEN_BUFFER *buf;
717
718 xbuilder=GWEN_INHERIT_GETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder);
719
720 buf=_readXmlDataIntoBufferAndExpand(xbuilder->dbVars, xmlNode);
721 if (buf) {
723 GWEN_Buffer_free(buf);
724 }
725}
726
727
728
729void _readArgsInputFiles(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer)
730{
731 GWB_CONTEXT *context;
732 GWB_FILE_LIST2 *inFilesList;
733
734 context=GWB_Builder_GetContext(builder);
735
736 inFilesList=GWB_Builder_GetInputFileList2(builder);
737 if (inFilesList) {
738 int index;
739 const char *pattern;
740 int useAbsPath;
741
742 useAbsPath=(strcasecmp(GWEN_XMLNode_GetProperty(xmlNode, "mode", "relpath"), "abspath")==0)?1:0;
743 pattern=GWEN_XMLNode_GetProperty(xmlNode, "match", NULL);
744 index=GWEN_XMLNode_GetIntProperty(xmlNode, "index", -1);
745
746 if (index>=0) {
747 GWB_FILE *file;
748
749 file=GWB_File_List2_GetAt(inFilesList, index);
750 if (file) {
751 if (useAbsPath)
752 GWB_Builder_AddAbsFileNameToBuffer(context, file, argsBuffer);
753 else
754 GWB_Builder_AddFileNameToBuffer(context, file, argsBuffer);
755 }
756 }
757 else
758 _addMatchingFiles(builder, inFilesList, pattern, useAbsPath, argsBuffer);
759 }
760}
761
762
763
764void _readArgsOutputFiles(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer)
765{
766 GWB_CONTEXT *context;
767 GWB_FILE_LIST2 *filesList;
768
769 context=GWB_Builder_GetContext(builder);
770
771 filesList=GWB_Builder_GetOutputFileList2(builder);
772 if (filesList) {
773 int index;
774 const char *pattern;
775 const char *useField;
776 int useAbsPath;
777
778 useAbsPath=(strcasecmp(GWEN_XMLNode_GetProperty(xmlNode, "mode", "relpath"), "abspath")==0)?1:0;
779
780 pattern=GWEN_XMLNode_GetProperty(xmlNode, "match", NULL);
781 index=GWEN_XMLNode_GetIntProperty(xmlNode, "index", -1);
782 useField=GWEN_XMLNode_GetProperty(xmlNode, "useFields", NULL);
783 if (index>=0) {
784 GWB_FILE *file;
785
786 file=GWB_File_List2_GetAt(filesList, index);
787 if (file) {
788 if (useField && strcasecmp(useField, "installPath")==0) {
789 const char *s;
790
792 if (s)
793 GWEN_Buffer_AppendString(argsBuffer, s);
794 }
795 else {
796 if (useAbsPath)
797 GWB_Builder_AddAbsFileNameToBuffer(context, file, argsBuffer);
798 else
799 GWB_Builder_AddFileNameToBuffer(context, file, argsBuffer);
800 }
801 }
802 }
803 else
804 _addMatchingFiles(builder, filesList, pattern, useAbsPath, argsBuffer);
805 }
806}
807
808
809
810void _readArgsLibraries(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer)
811{
812 GWB_CONTEXT *context;
813 GWB_TARGET *target;
814
815 context=GWB_Builder_GetContext(builder);
816 target=GWB_Context_GetCurrentTarget(context);
818}
819
820
821
823{
824 GWB_CONTEXT *context;
825 GWB_TARGET *target;
826
827 context=GWB_Builder_GetContext(builder);
828 target=GWB_Context_GetCurrentTarget(context);
830}
831
832
833
835{
836 GWB_CONTEXT *context;
837 GWB_TARGET *target;
838 GWEN_STRINGLIST *sl;
839
840 context=GWB_Builder_GetContext(builder);
841 target=GWB_Context_GetCurrentTarget(context);
843 if (sl && GWEN_StringList_Count(sl)>0)
844 _readArgsLoop(builder, bcmd, xmlNode, argsBuffer);
845}
846
847
848
850{
851 GWB_CONTEXT *context;
852 GWB_TARGET *target;
853 GWEN_STRINGLIST *sl;
854
855 context=GWB_Builder_GetContext(builder);
856 target=GWB_Context_GetCurrentTarget(context);
858 if (sl && GWEN_StringList_Count(sl)>0)
859 _readArgsLoop(builder, bcmd, xmlNode, argsBuffer);
860}
861
862
863
864void _readArgsIncludes(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer)
865{
866 GWB_CONTEXT *context;
867 GWB_KEYVALUEPAIR_LIST *kvpList;
868 const char *fileType;
869
870 fileType=GWEN_XMLNode_GetProperty(xmlNode, "type", "c");
871
872 context=GWB_Builder_GetContext(builder);
873 kvpList=GWB_Context_GetIncludeList(context);
874 if (kvpList) {
875 GWEN_Buffer_AppendString(argsBuffer, " ");
876 GWB_KeyValuePair_List_SampleValuesByKey(kvpList, fileType, NULL, " ", argsBuffer);
877 }
878}
879
880
881
882void _readArgsDefines(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer)
883{
884 GWB_CONTEXT *context;
885 GWB_KEYVALUEPAIR_LIST *kvpList;
886
887 context=GWB_Builder_GetContext(builder);
888 kvpList=GWB_Context_GetDefineList(context);
889 if (kvpList)
890 GWB_KeyValuePair_List_WriteAllPairsToBuffer(kvpList, "-D", "=", " ", argsBuffer);
891}
892
893
894
896{
897 GWB_CONTEXT *context;
898 GWB_TARGET *target;
899 GWB_PROJECT *project;
900
901 context=GWB_Builder_GetContext(builder);
902 target=GWB_Context_GetCurrentTarget(context);
903 project=GWB_Target_GetProject(target);
904
906 GWEN_Buffer_AppendString(argsBuffer, " -DHAVE_CONFIG_H ");
907 }
908}
909
910
911
912void _addMatchingFiles(GWB_BUILDER *builder, GWB_FILE_LIST2 *filesList, const char *pattern, int addAbs, GWEN_BUFFER *argsBuffer)
913{
914 GWB_CONTEXT *context;
915
916 context=GWB_Builder_GetContext(builder);
917
918 if (filesList) {
919 GWB_FILE_LIST2_ITERATOR *it;
920
921 it=GWB_File_List2_First(filesList);
922 if (it) {
923 GWB_FILE *file;
924
925 file=GWB_File_List2Iterator_Data(it);
926 while(file) {
927 const char *fname;
928
929 fname=GWB_File_GetName(file);
930 if (fname) {
931 if (pattern==NULL || -1!=GWEN_Text_ComparePattern(fname, pattern, 0)) {
932 if (GWEN_Buffer_GetUsedBytes(argsBuffer))
933 GWEN_Buffer_AppendString(argsBuffer, " ");
934 if (addAbs)
935 GWB_Builder_AddAbsFileNameToBuffer(context, file, argsBuffer);
936 else
937 GWB_Builder_AddFileNameToBuffer(context, file, argsBuffer);
938 }
939 }
940 file=GWB_File_List2Iterator_Next(it);
941 }
942
943 GWB_File_List2Iterator_free(it);
944 }
945 }
946}
947
948
949
951{
952 if (sl) {
954
956 while(se) {
957 const char *s;
958
960 if (s && *s) {
961 if (GWEN_Buffer_GetUsedBytes(argsBuffer))
962 GWEN_Buffer_AppendString(argsBuffer, " ");
963 GWEN_Buffer_AppendString(argsBuffer, s);
964 }
966 }
967 }
968}
969
970
#define NULL
Definition binreloc.c:300
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition buffer.c:42
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition buffer.c:89
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition buffer.c:992
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition buffer.c:277
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition buffer.c:235
void GWB_BuildCmd_SetFolder(GWB_BUILD_CMD *bcmd, const char *s)
Definition buildcmd.c:173
void GWB_BuildCmd_SetBuilderName(GWB_BUILD_CMD *bcmd, const char *s)
Definition buildcmd.c:155
GWB_BUILD_SUBCMD_LIST * GWB_BuildCmd_GetPrepareCommandList(const GWB_BUILD_CMD *bcmd)
Definition buildcmd.c:196
GWB_BUILD_CMD * GWB_BuildCmd_new(void)
Definition buildcmd.c:42
GWB_BUILD_SUBCMD_LIST * GWB_BuildCmd_GetBuildCommandList(const GWB_BUILD_CMD *bcmd)
Definition buildcmd.c:210
void GWB_BuildCmd_AddFlags(GWB_BUILD_CMD *bcmd, uint32_t i)
Definition buildcmd.c:134
struct GWB_BUILD_CMD GWB_BUILD_CMD
Definition buildcmd.h:20
#define GWB_BUILD_CMD_FLAGS_CHECK_DATES
Definition buildcmd.h:25
#define GWB_BUILD_CMD_FLAGS_AUTO
Definition buildcmd.h:27
#define GWB_BUILD_CMD_FLAGS_DEL_OUTFILES
Definition buildcmd.h:26
void GWB_BuildCtx_AddInFilesToCtxAndCmd(GWB_BUILD_CONTEXT *bctx, GWB_BUILD_CMD *bcmd, GWB_FILE_LIST2 *fileList)
Definition buildctx.c:150
void GWB_BuildCtx_AddCommand(GWB_BUILD_CONTEXT *bctx, GWB_BUILD_CMD *cmd)
Definition buildctx.c:102
void GWB_BuildCtx_AddOutFilesToCtxAndCmd(GWB_BUILD_CONTEXT *bctx, GWB_BUILD_CMD *bcmd, GWB_FILE_LIST2 *fileList)
Definition buildctx.c:187
struct GWB_BUILD_CONTEXT GWB_BUILD_CONTEXT
Definition buildctx.h:16
void GWB_Builder_AddAbsFileNameToBuffer(const GWB_CONTEXT *context, const GWB_FILE *file, GWEN_BUFFER *argBuffer)
Definition builder.c:312
GWB_FILE_LIST2 * GWB_Builder_GetOutputFileList2(const GWB_BUILDER *builder)
Definition builder.c:116
GWB_BUILDER_ADDSOURCEFILE_FN GWB_Builder_SetAddSourceFileFn(GWB_BUILDER *builder, GWB_BUILDER_ADDSOURCEFILE_FN fn)
Definition builder.c:207
GWB_CONTEXT * GWB_Builder_GetContext(const GWB_BUILDER *builder)
Definition builder.c:93
GWB_BUILDER * GWB_Builder_new(GWENBUILD *gwenbuild, GWB_CONTEXT *context, const char *typeName)
Definition builder.c:28
void GWB_Builder_AddInputFile(GWB_BUILDER *builder, GWB_FILE *f)
Definition builder.c:107
GWEN_BUILDER_ISACCEPTABLEINPUT_FN GWB_Builder_SetIsAcceptableInputFn(GWB_BUILDER *builder, GWEN_BUILDER_ISACCEPTABLEINPUT_FN fn)
Definition builder.c:184
GWEN_BUILDER_ADDBUILDCMD_FN GWB_Builder_SetAddBuildCmdFn(GWB_BUILDER *builder, GWEN_BUILDER_ADDBUILDCMD_FN fn)
Definition builder.c:196
void GWB_Builder_SetTargetLinkSpec(GWB_BUILDER *builder, const char *s)
Definition builder.c:85
GWB_FILE_LIST2 * GWB_Builder_GetInputFileList2(const GWB_BUILDER *builder)
Definition builder.c:100
void GWB_Builder_AddFileNameToBuffer(const GWB_CONTEXT *context, const GWB_FILE *file, GWEN_BUFFER *argBuffer)
Definition builder.c:241
void GWB_Builder_AddOutputFile(GWB_BUILDER *builder, GWB_FILE *f)
Definition builder.c:123
struct GWB_BUILDER GWB_BUILDER
Definition builder.h:17
void GWB_BuildSubCmd_SetBuildMessage(GWB_BUILD_SUBCMD *cmd, const char *s)
void GWB_BuildSubCmd_SetCommand(GWB_BUILD_SUBCMD *cmd, const char *s)
void GWB_BuildSubCmd_SetArguments(GWB_BUILD_SUBCMD *cmd, const char *s)
GWB_BUILD_SUBCMD * GWB_BuildSubCmd_new(void)
Definition buildsubcmd.c:25
void GWB_BuildSubCmd_AddFlags(GWB_BUILD_SUBCMD *cmd, uint32_t f)
void GWB_BuildSubCmd_SetDepFilePath(GWB_BUILD_SUBCMD *cmd, const char *s)
#define GWB_BUILD_SUBCMD_FLAGS_CHECK_DEPENDS
Definition buildsubcmd.h:24
struct GWB_BUILD_SUBCMD GWB_BUILD_SUBCMD
Definition buildsubcmd.h:16
#define GWB_BUILD_SUBCMD_FLAGS_IGNORE_RESULT
Definition buildsubcmd.h:23
const char * GWB_Context_GetCurrentRelativeDir(const GWB_CONTEXT *ctx)
Definition context.c:255
GWB_TARGET * GWB_Context_GetCurrentTarget(const GWB_CONTEXT *ctx)
Definition context.c:460
GWB_KEYVALUEPAIR_LIST * GWB_Context_GetDefineList(const GWB_CONTEXT *ctx)
Definition context.c:392
GWEN_DB_NODE * GWB_Context_GetVars(const GWB_CONTEXT *ctx)
Definition context.c:427
const char * GWB_Context_GetInitialSourceDir(const GWB_CONTEXT *ctx)
Definition context.c:285
GWB_KEYVALUEPAIR_LIST * GWB_Context_GetIncludeList(const GWB_CONTEXT *ctx)
Definition context.c:360
const char * GWB_Context_GetCurrentBuildDir(const GWB_CONTEXT *ctx)
Definition context.c:184
struct GWB_CONTEXT GWB_CONTEXT
Definition context.h:17
GWEN_DB_NODE * GWEN_DB_Group_new(const char *name)
Definition db.c:173
int GWEN_DB_AddGroupChildren(GWEN_DB_NODE *n, GWEN_DB_NODE *nn)
Definition db.c:1524
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
Definition db.c:997
int GWEN_DB_ReplaceVars(GWEN_DB_NODE *db, const char *s, GWEN_BUFFER *dbuf)
Definition db.c:1951
void GWEN_DB_Group_free(GWEN_DB_NODE *n)
Definition db.c:421
#define GWEN_DB_FLAGS_DEFAULT
Definition db.h:168
struct GWEN_DB_NODE GWEN_DB_NODE
Definition db.h:228
#define DBG_INFO(dbg_logger, format,...)
Definition debug.h:181
#define DBG_ERROR(dbg_logger, format,...)
Definition debug.h:97
GWB_FILE * GWB_File_List2_GetAt(const GWB_FILE_LIST2 *fileList, int index)
Definition file.c:644
void GWB_File_SetInstallPath(GWB_FILE *f, const char *s)
Definition file.c:215
const char * GWB_File_GetFolder(const GWB_FILE *f)
Definition file.c:127
const char * GWB_File_GetName(const GWB_FILE *f)
Definition file.c:146
void GWB_File_SetInstallName(GWB_FILE *f, const char *s)
Definition file.c:172
void GWB_File_SetFileType(GWB_FILE *f, const char *s)
Definition file.c:234
GWB_FILE * GWB_File_List2_GetOrCreateFile(GWB_FILE_LIST2 *fileList, const char *folder, const char *fname)
Definition file.c:386
uint32_t GWB_File_GetFlags(const GWB_FILE *f)
Definition file.c:99
const char * GWB_File_GetInstallPath(const GWB_FILE *f)
Definition file.c:208
const char * GWB_File_GetFileType(const GWB_FILE *f)
Definition file.c:227
void GWB_File_AddFlags(GWB_FILE *f, uint32_t i)
Definition file.c:113
const char * GWB_File_GetExt(const GWB_FILE *f)
Definition file.c:184
struct GWB_FILE GWB_FILE
Definition file.h:18
#define GWB_FILE_FLAGS_GENERATED
Definition file.h:23
#define GWB_FILE_FLAGS_INSTALL
Definition file.h:22
static void _setupOutFiles(GWB_BUILDER *builder)
static void _readArgsFixed(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer)
static void _readArgsInputFiles(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer)
void _setToolName(GWB_BUILDER *builder, const char *s)
static void _readDepFile(GWB_BUILDER *builder, GWB_BUILD_SUBCMD *cmd, GWEN_XMLNODE *xmlNode)
static void _readArgsDefines(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer)
static void _addBuildCommands(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd)
static void _addSourceFile(GWB_BUILDER *builder, GWB_FILE *f)
static void _readArgsIncludes(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer)
static GWEN_BUFFER * _readMainFilename(GWB_CONTEXT *context, GWEN_XMLNODE *xmlFile, GWB_FILE_LIST2 *filesList)
static void _readArgsIfHasLibraries(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer)
GWB_BUILDER * GWB_GenericBuilder_new(GWENBUILD *gwenbuild, GWB_CONTEXT *context, GWEN_XMLNODE *xmlDescr)
static void _addStringListToBuffer(GWEN_STRINGLIST *sl, GWEN_BUFFER *argsBuffer)
static void GWENHYWFAR_CB _freeData(void *bp, void *p)
static void _readArgsLibraries(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer)
static void _setupVariables(GWB_BUILDER *builder)
static void _readArgsUsedSubTargets(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer)
static void _setupTargetLinkSpec(GWB_BUILDER *builder)
static void _readArgsHaveConfigH(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer)
static void _addCommands(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, const char *groupName, GWB_BUILD_SUBCMD_LIST *cmdList)
static void _addMatchingFiles(GWB_BUILDER *builder, GWB_FILE_LIST2 *filesList, const char *pattern, int addAbs, GWEN_BUFFER *argsBuffer)
static GWB_BUILD_SUBCMD * _readSubCmd(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *n)
static GWB_FILE * _parseOutFile(GWB_BUILDER *builder, GWB_PROJECT *project, GWB_TARGET *target, GWEN_XMLNODE *nFile, const char *folder)
static GWEN_BUFFER * _readArgs(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *xmlNode)
GWB_BUILDER * GWB_GenericBuilder_Factory(GWENBUILD *gwenbuild, GWB_CONTEXT *context, const char *builderName)
static void _readArgsLoop(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *nArgs, GWEN_BUFFER *argsBuffer)
static int _isAcceptableInput(GWB_BUILDER *builder, const GWB_FILE *file)
static GWEN_BUFFER * _readXmlDataIntoBufferAndExpand(GWEN_DB_NODE *db, GWEN_XMLNODE *xmlNode)
static void _readArgsOutputFiles(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer)
static void _readArgsIfHasUsedSubTargets(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer)
static void _readMainSettingsFromXml(GWB_BUILDER *builder)
static void _readBuildMessage(GWB_BUILDER *builder, GWB_BUILD_SUBCMD *cmd, GWEN_XMLNODE *xmlNode)
static void _setupAfterAddingFirstInputFile(GWB_BUILDER *builder)
static int _addBuildCmd(GWB_BUILDER *builder, GWB_BUILD_CONTEXT *bctx)
static void _addPrepareCommands(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd)
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition buffer.h:38
int GWBUILD_GetTargetIsWindows(const GWENBUILD *gwenbuild)
Definition gwenbuild.c:126
struct GWENBUILD GWENBUILD
Definition gwenbuild.h:15
#define GWEN_UNUSED
#define GWEN_DIR_SEPARATOR_S
#define GWENHYWFAR_CB
#define GWEN_INHERIT_SETDATA(bt, t, element, data, fn)
Definition inherit.h:300
#define GWEN_INHERIT(bt, t)
Definition inherit.h:264
#define GWEN_INHERIT_GETDATA(bt, t, element)
Definition inherit.h:279
int GWB_KeyValuePair_List_SampleValuesByKey(const GWB_KEYVALUEPAIR_LIST *kvpList, const char *key, const char *prefix, const char *delim, GWEN_BUFFER *destBuf)
int GWB_KeyValuePair_List_WriteAllPairsToBuffer(const GWB_KEYVALUEPAIR_LIST *kvpList, const char *prefix, const char *assignmentString, const char *delim, GWEN_BUFFER *destBuf)
#define GWEN_FREE_OBJECT(varname)
Definition memory.h:61
#define GWEN_NEW_OBJECT(typ, varname)
Definition memory.h:55
static void GWENHYWFAR_CB _freeData(GWEN_UNUSED void *bp, void *p)
Definition nogui.c:222
GWEN_STRINGLIST * GWB_Parser_ReadXmlDataIntoStringList(GWEN_DB_NODE *db, GWEN_XMLNODE *xmlNode, int ignoreDupes)
Definition parser.c:283
uint32_t GWB_Project_GetFlags(const GWB_PROJECT *project)
Definition project.c:173
GWB_FILE_LIST2 * GWB_Project_GetFileList(const GWB_PROJECT *project)
Definition project.c:205
#define GWB_PROJECT_FLAGS_CONFIG_H
Definition project.h:27
struct GWB_PROJECT GWB_PROJECT
Definition project.h:14
const char * GWEN_StringListEntry_Data(const GWEN_STRINGLISTENTRY *se)
Definition stringlist.c:406
GWEN_STRINGLISTENTRY * GWEN_StringListEntry_Next(const GWEN_STRINGLISTENTRY *se)
Definition stringlist.c:398
unsigned int GWEN_StringList_Count(const GWEN_STRINGLIST *sl)
Definition stringlist.c:427
int GWEN_StringList_HasString(const GWEN_STRINGLIST *sl, const char *s)
Definition stringlist.c:435
GWEN_STRINGLISTENTRY * GWEN_StringList_FirstEntry(const GWEN_STRINGLIST *sl)
Definition stringlist.c:390
struct GWEN_STRINGLISTENTRYSTRUCT GWEN_STRINGLISTENTRY
Definition stringlist.h:53
struct GWEN_STRINGLISTSTRUCT GWEN_STRINGLIST
Definition stringlist.h:56
const char * GWB_Target_GetInstallName(const GWB_TARGET *target)
Definition target.c:90
GWEN_STRINGLIST * GWB_Target_GetUsedLibraryNameList(const GWB_TARGET *target)
Definition target.c:232
GWEN_STRINGLIST * GWB_Target_GetUsedTargetLinkSpecList(const GWB_TARGET *target)
Definition target.c:248
const char * GWB_Target_GetInstallPath(const GWB_TARGET *target)
Definition target.c:142
GWB_PROJECT * GWB_Target_GetProject(const GWB_TARGET *target)
Definition target.c:64
struct GWB_TARGET GWB_TARGET
Definition target.h:17
char * GWEN_Text_strndup(const char *s, size_t n)
Definition text.c:2088
int GWEN_Text_ComparePattern(const char *w, const char *p, int sensecase)
Definition text.c:1208
const char * GWEN_XMLNode_GetProperty(const GWEN_XMLNODE *n, const char *name, const char *defaultValue)
Definition xml.c:239
GWEN_XMLNODE * GWEN_XMLNode_FindFirstTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition xml.c:776
GWEN_XMLNODE * GWEN_XMLNode_GetFirstTag(const GWEN_XMLNODE *n)
Definition xml.c:705
void GWEN_XMLNode_UnlinkChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
Definition xml.c:570
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition xml.c:144
GWEN_XMLNODE * GWEN_XMLNode_GetNextTag(const GWEN_XMLNODE *n)
Definition xml.c:712
GWEN_XMLNODE * GWEN_XMLNode_FindNextTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition xml.c:794
GWEN_XMLNODE * GWEN_XMLNode_GetFirstData(const GWEN_XMLNODE *n)
Definition xml.c:724
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition xml.c:160
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
Definition xml.c:370
int GWEN_XMLNode_GetIntProperty(const GWEN_XMLNODE *n, const char *name, int defaultValue)
Definition xml.c:263
struct GWEN__XMLNODE GWEN_XMLNODE
Definition xml.h:156
#define GWEN_XML_FLAGS_DEFAULT
Definition xml.h:117
GWENHYWFAR_API int GWEN_XML_ReadFile(GWEN_XMLNODE *n, const char *filepath, uint32_t flags)
Definition xmlrw.c:1298
@ GWEN_XMLNodeTypeTag
Definition xml.h:145
#define GWEN_XML_FLAGS_SIMPLE
Definition xml.h:89