gwenhywfar  5.10.1
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 
27 GWEN_INHERIT(GWB_BUILDER, GWB_BUILDER_GENERIC);
28 
29 
30 static void GWENHYWFAR_CB _freeData(void *bp, void *p);
31 
32 static void _readMainSettingsFromXml(GWB_BUILDER *builder);
33 static void _setupVariables(GWB_BUILDER *builder);
34 static void _setupAfterAddingFirstInputFile(GWB_BUILDER *builder);
35 static void _setupOutFiles(GWB_BUILDER *builder);
36 static void _setupTargetLinkSpec(GWB_BUILDER *builder);
37 
38 static GWB_FILE *_parseOutFile(GWB_BUILDER *builder,
39  GWB_PROJECT *project,
40  GWB_TARGET *target,
41  GWEN_XMLNODE *nFile,
42  const char *folder);
43 
45 
46 static int _isAcceptableInput(GWB_BUILDER *builder, const GWB_FILE *file);
47 static void _addSourceFile(GWB_BUILDER *builder, GWB_FILE *f);
48 static int _addBuildCmd(GWB_BUILDER *builder, GWB_BUILD_CONTEXT *bctx);
49 
50 static void _addBuildCommands(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd);
51 static void _addPrepareCommands(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd);
52 static void _addCommands(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, const char *groupName, GWB_BUILD_SUBCMD_LIST *cmdList);
54 
55 static void _readDepFile(GWB_BUILDER *builder, GWB_BUILD_SUBCMD *cmd, GWEN_XMLNODE *xmlNode);
56 static GWEN_BUFFER *_readMainFilename(GWB_CONTEXT *context, GWEN_XMLNODE *xmlFile, GWB_FILE_LIST2 *filesList);
57 static void _readBuildMessage(GWB_BUILDER *builder, GWB_BUILD_SUBCMD *cmd, GWEN_XMLNODE *xmlNode);
58 
59 static GWEN_BUFFER *_readArgs(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *xmlNode);
60 static void _readArgsLoop(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *nArgs, GWEN_BUFFER *argsBuffer);
61 static void _readArgsFixed(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer);
62 static void _readArgsInputFiles(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer);
63 static void _readArgsOutputFiles(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer);
64 static void _readArgsLibraries(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer);
65 static void _readArgsIncludes(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer);
66 static void _readArgsDefines(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer);
67 static void _readArgsUsedSubTargets(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer);
68 static void _readArgsIfHasUsedSubTargets(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer);
69 static void _readArgsIfHasLibraries(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer);
70 static void _readArgsHaveConfigH(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer);
71 
72 static void _addMatchingFiles(GWB_BUILDER *builder, GWB_FILE_LIST2 *filesList, const char *pattern, int addAbs, GWEN_BUFFER *argsBuffer);
73 static void _addStringListToBuffer(GWEN_STRINGLIST *sl, GWEN_BUFFER *argsBuffer);
74 
75 
76 
77 
78 GWB_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 
96  xmlRoot=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root");
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 
156  _readMainSettingsFromXml(builder);
157  _setupVariables(builder);
158 
159  return builder;
160 }
161 
162 
163 
164 void 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);
198 
199  n=GWEN_XMLNode_FindFirstTag(nInputFiles, "acceptedInputFiles", NULL, NULL);
200  if (n)
201  xbuilder->acceptedInputExt=GWB_Parser_ReadXmlDataIntoStringList(GWB_Context_GetVars(context), n);
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 
228 void _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 
487 void _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 
540  cmd=GWB_BuildSubCmd_new();
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 
611 GWEN_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 
669 void _readArgsLoop(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *nArgs, GWEN_BUFFER *argsBuffer)
670 {
671  GWEN_XMLNODE *n;
672 
673  n=GWEN_XMLNode_GetFirstTag(nArgs);
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 
713 void _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 
729 void _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 
764 void _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 
791  s=GWB_File_GetInstallPath(file);
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 
810 void _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 
849 void _readArgsIfHasLibraries(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer)
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 
864 void _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 
882 void _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 
895 void _readArgsHaveConfigH(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer)
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 
912 void _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 
int GWEN_DB_ReplaceVars(GWEN_DB_NODE *db, const char *s, GWEN_BUFFER *dbuf)
Definition: db.c:1951
const char * GWB_File_GetFileType(const GWB_FILE *f)
Definition: file.c:227
int GWB_KeyValuePair_List_SampleValuesByKey(const GWB_KEYVALUEPAIR_LIST *kvpList, const char *key, const char *prefix, const char *delim, GWEN_BUFFER *destBuf)
Definition: keyvaluepair.c:173
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
struct GWEN_STRINGLISTENTRYSTRUCT GWEN_STRINGLISTENTRY
Definition: stringlist.h:53
void GWB_Builder_AddAbsFileNameToBuffer(const GWB_CONTEXT *context, const GWB_FILE *file, GWEN_BUFFER *argBuffer)
Definition: builder.c:312
struct GWB_CONTEXT GWB_CONTEXT
Definition: context.h:17
static void _setupTargetLinkSpec(GWB_BUILDER *builder)
GWB_BUILD_SUBCMD_LIST * GWB_BuildCmd_GetPrepareCommandList(const GWB_BUILD_CMD *bcmd)
Definition: buildcmd.c:196
GWEN_STRINGLIST * GWB_Parser_ReadXmlDataIntoStringList(GWEN_DB_NODE *db, GWEN_XMLNODE *xmlNode)
Definition: parser.c:283
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
void GWB_File_SetInstallName(GWB_FILE *f, const char *s)
Definition: file.c:172
#define GWEN_XML_FLAGS_DEFAULT
Definition: xml.h:117
void GWEN_DB_Group_free(GWEN_DB_NODE *n)
Definition: db.c:421
#define GWEN_DIR_SEPARATOR_S
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition: buffer.c:277
#define GWEN_XML_FLAGS_SIMPLE
Definition: xml.h:89
const char * GWEN_XMLNode_GetProperty(const GWEN_XMLNODE *n, const char *name, const char *defaultValue)
Definition: xml.c:239
static void _addSourceFile(GWB_BUILDER *builder, GWB_FILE *f)
#define GWB_BUILD_SUBCMD_FLAGS_CHECK_DEPENDS
Definition: buildsubcmd.h:24
void GWB_File_SetInstallPath(GWB_FILE *f, const char *s)
Definition: file.c:215
GWEN_XMLNODE * GWEN_XMLNode_FindNextTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:794
static void _addStringListToBuffer(GWEN_STRINGLIST *sl, GWEN_BUFFER *argsBuffer)
void GWB_Builder_AddInputFile(GWB_BUILDER *builder, GWB_FILE *f)
Definition: builder.c:107
static void _readArgsIfHasUsedSubTargets(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer)
GWEN_XMLNODE * GWEN_XMLNode_GetFirstData(const GWEN_XMLNODE *n)
Definition: xml.c:724
void GWB_BuildCmd_SetFolder(GWB_BUILD_CMD *bcmd, const char *s)
Definition: buildcmd.c:173
static void _readArgsFixed(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer)
struct GWB_FILE GWB_FILE
Definition: file.h:18
struct GWB_BUILD_CONTEXT GWB_BUILD_CONTEXT
Definition: buildctx.h:16
void GWB_BuildSubCmd_SetArguments(GWB_BUILD_SUBCMD *cmd, const char *s)
Definition: buildsubcmd.c:122
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:61
#define NULL
Definition: binreloc.c:300
void GWB_Builder_SetTargetLinkSpec(GWB_BUILDER *builder, const char *s)
Definition: builder.c:85
void GWB_File_AddFlags(GWB_FILE *f, uint32_t i)
Definition: file.c:113
GWB_FILE * GWB_File_List2_GetOrCreateFile(GWB_FILE_LIST2 *fileList, const char *folder, const char *fname)
Definition: file.c:385
GWENHYWFAR_API int GWEN_XML_ReadFile(GWEN_XMLNODE *n, const char *filepath, uint32_t flags)
Definition: xmlrw.c:1297
void GWB_File_SetFileType(GWB_FILE *f, const char *s)
Definition: file.c:234
static void _readArgsOutputFiles(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer)
struct GWB_PROJECT GWB_PROJECT
Definition: project.h:14
void GWB_Builder_AddOutputFile(GWB_BUILDER *builder, GWB_FILE *f)
Definition: builder.c:123
void GWB_BuildSubCmd_SetCommand(GWB_BUILD_SUBCMD *cmd, const char *s)
Definition: buildsubcmd.c:107
void GWB_Builder_AddFileNameToBuffer(const GWB_CONTEXT *context, const GWB_FILE *file, GWEN_BUFFER *argBuffer)
Definition: builder.c:241
#define GWB_BUILD_CMD_FLAGS_CHECK_DATES
Definition: buildcmd.h:25
GWEN_INHERIT(GWB_BUILDER, GWB_BUILDER_GENERIC)
GWEN_XMLNODE * GWEN_XMLNode_new(GWEN_XMLNODE_TYPE t, const char *data)
Definition: xml.c:144
static void _addBuildCommands(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd)
static void _readArgsInputFiles(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer)
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
GWEN_STRINGLIST * GWB_Target_GetUsedLibraryNameList(const GWB_TARGET *target)
Definition: target.c:232
GWB_KEYVALUEPAIR_LIST * GWB_Context_GetIncludeList(const GWB_CONTEXT *ctx)
Definition: context.c:360
GWEN_STRINGLISTENTRY * GWEN_StringList_FirstEntry(const GWEN_STRINGLIST *sl)
Definition: stringlist.c:390
const char * GWEN_StringListEntry_Data(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:406
#define GWB_FILE_FLAGS_INSTALL
Definition: file.h:22
static int _isAcceptableInput(GWB_BUILDER *builder, const GWB_FILE *file)
const char * GWB_File_GetInstallPath(const GWB_FILE *f)
Definition: file.c:208
static GWEN_BUFFER * _readArgs(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *xmlNode)
const char * GWB_File_GetFolder(const GWB_FILE *f)
Definition: file.c:127
GWB_BUILD_SUBCMD * GWB_BuildSubCmd_new(void)
Definition: buildsubcmd.c:25
const char * GWB_File_GetName(const GWB_FILE *f)
Definition: file.c:146
GWB_FILE_LIST2 * GWB_Project_GetFileList(const GWB_PROJECT *project)
Definition: project.c:205
GWB_FILE_LIST2 * GWB_Builder_GetOutputFileList2(const GWB_BUILDER *builder)
Definition: builder.c:116
GWEN_XMLNODE * GWEN_XMLNode_FindFirstTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:776
GWEN_DB_NODE * GWB_Context_GetVars(const GWB_CONTEXT *ctx)
Definition: context.c:427
void GWB_BuildSubCmd_SetBuildMessage(GWB_BUILD_SUBCMD *cmd, const char *s)
Definition: buildsubcmd.c:137
static void _addPrepareCommands(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd)
GWEN_STRINGLIST * GWB_Target_GetUsedTargetLinkSpecList(const GWB_TARGET *target)
Definition: target.c:248
void GWB_BuildCmd_SetBuilderName(GWB_BUILD_CMD *bcmd, const char *s)
Definition: buildcmd.c:155
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:55
int GWEN_XMLNode_GetIntProperty(const GWEN_XMLNODE *n, const char *name, int defaultValue)
Definition: xml.c:263
struct GWB_TARGET GWB_TARGET
Definition: target.h:17
const char * GWB_Context_GetInitialSourceDir(const GWB_CONTEXT *ctx)
Definition: context.c:285
static void _setupVariables(GWB_BUILDER *builder)
static void _readArgsLoop(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *nArgs, GWEN_BUFFER *argsBuffer)
#define GWENHYWFAR_CB
Definition: gwenhywfarapi.h:89
GWB_BUILDER * GWB_Builder_new(GWENBUILD *gwenbuild, GWB_CONTEXT *context, const char *typeName)
Definition: builder.c:28
GWB_FILE_LIST2 * GWB_Builder_GetInputFileList2(const GWB_BUILDER *builder)
Definition: builder.c:100
GWEN_XMLNODE * GWEN_XMLNode_GetNextTag(const GWEN_XMLNODE *n)
Definition: xml.c:712
GWB_BUILDER * GWB_GenericBuilder_Factory(GWENBUILD *gwenbuild, GWB_CONTEXT *context, const char *builderName)
const char * GWB_Target_GetInstallPath(const GWB_TARGET *target)
Definition: target.c:142
static void _readMainSettingsFromXml(GWB_BUILDER *builder)
GWB_BUILDER * GWB_GenericBuilder_new(GWENBUILD *gwenbuild, GWB_CONTEXT *context, GWEN_XMLNODE *xmlDescr)
#define GWB_BUILD_CMD_FLAGS_DEL_OUTFILES
Definition: buildcmd.h:26
static int _addBuildCmd(GWB_BUILDER *builder, GWB_BUILD_CONTEXT *bctx)
GWB_CONTEXT * GWB_Builder_GetContext(const GWB_BUILDER *builder)
Definition: builder.c:93
struct GWEN_STRINGLISTSTRUCT GWEN_STRINGLIST
Definition: stringlist.h:56
#define GWB_BUILD_CMD_FLAGS_AUTO
Definition: buildcmd.h:27
#define GWB_BUILD_SUBCMD_FLAGS_IGNORE_RESULT
Definition: buildsubcmd.h:23
void GWB_BuildSubCmd_AddFlags(GWB_BUILD_SUBCMD *cmd, uint32_t f)
Definition: buildsubcmd.c:86
void GWB_BuildCtx_AddInFilesToCtxAndCmd(GWB_BUILD_CONTEXT *bctx, GWB_BUILD_CMD *bcmd, GWB_FILE_LIST2 *fileList)
Definition: buildctx.c:130
const char * GWB_File_GetExt(const GWB_FILE *f)
Definition: file.c:184
GWB_BUILD_SUBCMD_LIST * GWB_BuildCmd_GetBuildCommandList(const GWB_BUILD_CMD *bcmd)
Definition: buildcmd.c:210
GWB_KEYVALUEPAIR_LIST * GWB_Context_GetDefineList(const GWB_CONTEXT *ctx)
Definition: context.c:392
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
struct GWB_BUILD_SUBCMD GWB_BUILD_SUBCMD
Definition: buildsubcmd.h:16
const char * GWB_Target_GetInstallName(const GWB_TARGET *target)
Definition: target.c:90
void GWEN_XMLNode_free(GWEN_XMLNODE *n)
Definition: xml.c:160
void GWEN_XMLNode_UnlinkChild(GWEN_XMLNODE *n, GWEN_XMLNODE *child)
Definition: xml.c:570
static void _readArgsHaveConfigH(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer)
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
void GWB_BuildSubCmd_SetDepFilePath(GWB_BUILD_SUBCMD *cmd, const char *s)
Definition: buildsubcmd.c:152
#define GWB_PROJECT_FLAGS_CONFIG_H
Definition: project.h:27
void GWB_BuildCtx_AddCommand(GWB_BUILD_CONTEXT *bctx, GWB_BUILD_CMD *cmd)
Definition: buildctx.c:83
static void _readBuildMessage(GWB_BUILDER *builder, GWB_BUILD_SUBCMD *cmd, GWEN_XMLNODE *xmlNode)
unsigned int GWEN_StringList_Count(const GWEN_STRINGLIST *sl)
Definition: stringlist.c:427
char * GWEN_Text_strndup(const char *s, size_t n)
Definition: text.c:2088
int GWBUILD_GetTargetIsWindows(const GWENBUILD *gwenbuild)
Definition: gwenbuild.c:126
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
GWEN_XMLNODE * GWEN_XMLNode_GetFirstTag(const GWEN_XMLNODE *n)
Definition: xml.c:705
void GWB_BuildCtx_AddOutFilesToCtxAndCmd(GWB_BUILD_CONTEXT *bctx, GWB_BUILD_CMD *bcmd, GWB_FILE_LIST2 *fileList)
Definition: buildctx.c:167
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
Definition: xml.c:370
static void _readArgsIncludes(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer)
int GWEN_StringList_HasString(const GWEN_STRINGLIST *sl, const char *s)
Definition: stringlist.c:435
int GWEN_Text_ComparePattern(const char *w, const char *p, int sensecase)
Definition: text.c:1208
GWB_BUILD_CMD * GWB_BuildCmd_new(void)
Definition: buildcmd.c:42
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
Definition: db.c:997
GWEN_STRINGLISTENTRY * GWEN_StringListEntry_Next(const GWEN_STRINGLISTENTRY *se)
Definition: stringlist.c:398
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
uint32_t GWB_File_GetFlags(const GWB_FILE *f)
Definition: file.c:99
static void _readArgsDefines(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer)
struct GWB_BUILDER GWB_BUILDER
Definition: builder.h:17
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
void _setToolName(GWB_BUILDER *builder, const char *s)
static void GWENHYWFAR_CB _freeData(void *bp, void *p)
uint32_t GWB_Project_GetFlags(const GWB_PROJECT *project)
Definition: project.c:173
static void _readDepFile(GWB_BUILDER *builder, GWB_BUILD_SUBCMD *cmd, GWEN_XMLNODE *xmlNode)
static GWB_BUILD_SUBCMD * _readSubCmd(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *n)
GWB_TARGET * GWB_Context_GetCurrentTarget(const GWB_CONTEXT *ctx)
Definition: context.c:460
static void _readArgsIfHasLibraries(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer)
GWEN_DB_NODE * GWEN_DB_Group_new(const char *name)
Definition: db.c:173
static void _addMatchingFiles(GWB_BUILDER *builder, GWB_FILE_LIST2 *filesList, const char *pattern, int addAbs, GWEN_BUFFER *argsBuffer)
static GWEN_BUFFER * _readMainFilename(GWB_CONTEXT *context, GWEN_XMLNODE *xmlFile, GWB_FILE_LIST2 *filesList)
const char * GWB_Context_GetCurrentRelativeDir(const GWB_CONTEXT *ctx)
Definition: context.c:255
static void _addCommands(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, const char *groupName, GWB_BUILD_SUBCMD_LIST *cmdList)
int GWB_KeyValuePair_List_WriteAllPairsToBuffer(const GWB_KEYVALUEPAIR_LIST *kvpList, const char *prefix, const char *assignmentString, const char *delim, GWEN_BUFFER *destBuf)
Definition: keyvaluepair.c:199
GWEN_BUILDER_ISACCEPTABLEINPUT_FN GWB_Builder_SetIsAcceptableInputFn(GWB_BUILDER *builder, GWEN_BUILDER_ISACCEPTABLEINPUT_FN fn)
Definition: builder.c:184
struct GWENBUILD GWENBUILD
Definition: gwenbuild.h:15
static void _setupAfterAddingFirstInputFile(GWB_BUILDER *builder)
#define GWEN_INHERIT_SETDATA(bt, t, element, data, fn)
Definition: inherit.h:292
int GWEN_DB_AddGroupChildren(GWEN_DB_NODE *n, GWEN_DB_NODE *nn)
Definition: db.c:1524
GWEN_BUILDER_ADDBUILDCMD_FN GWB_Builder_SetAddBuildCmdFn(GWB_BUILDER *builder, GWEN_BUILDER_ADDBUILDCMD_FN fn)
Definition: builder.c:196
GWB_BUILDER_ADDSOURCEFILE_FN GWB_Builder_SetAddSourceFileFn(GWB_BUILDER *builder, GWB_BUILDER_ADDSOURCEFILE_FN fn)
Definition: builder.c:207
static GWB_FILE * _parseOutFile(GWB_BUILDER *builder, GWB_PROJECT *project, GWB_TARGET *target, GWEN_XMLNODE *nFile, const char *folder)
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:156
GWB_PROJECT * GWB_Target_GetProject(const GWB_TARGET *target)
Definition: target.c:64
#define GWB_FILE_FLAGS_GENERATED
Definition: file.h:23
#define GWEN_UNUSED
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989
#define GWEN_DB_FLAGS_DEFAULT
Definition: db.h:168
#define GWEN_INHERIT_GETDATA(bt, t, element)
Definition: inherit.h:271
static GWEN_BUFFER * _readXmlDataIntoBufferAndExpand(GWEN_DB_NODE *db, GWEN_XMLNODE *xmlNode)
static void _readArgsLibraries(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer)
GWB_FILE * GWB_File_List2_GetAt(const GWB_FILE_LIST2 *fileList, int index)
Definition: file.c:643
static void _readArgsUsedSubTargets(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer)
const char * GWB_Context_GetCurrentBuildDir(const GWB_CONTEXT *ctx)
Definition: context.c:184
static void _setupOutFiles(GWB_BUILDER *builder)