gwenhywfar  5.7.2
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 GWB_BUILDER *GWB_GenericBuilder_new(GWENBUILD *gwenbuild, GWB_CONTEXT *context, GWEN_XMLNODE *xmlDescr);
31 
32 static void GWENHYWFAR_CB _freeData(void *bp, void *p);
33 
35 void _setupVariables(GWB_BUILDER *builder);
37 void _setupOutFiles(GWB_BUILDER *builder);
38 void _setupTargetLinkSpec(GWB_BUILDER *builder);
39 
41 
42 static int _isAcceptableInput(GWB_BUILDER *builder, const GWB_FILE *file);
43 static void _addSourceFile(GWB_BUILDER *builder, GWB_FILE *f);
44 static int _addBuildCmd(GWB_BUILDER *builder, GWB_BUILD_CONTEXT *bctx);
45 
46 void _addBuildCommands(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd);
47 void _addPrepareCommands(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd);
48 void _addCommands(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, const char *groupName, GWB_BUILD_SUBCMD_LIST *cmdList);
49 
50 static void _readDepFile(GWB_BUILDER *builder, GWB_BUILD_SUBCMD *cmd, GWEN_XMLNODE *xmlNode);
51 GWEN_BUFFER *_readMainFilename(GWB_CONTEXT *context, GWEN_XMLNODE *xmlFile, GWB_FILE_LIST2 *filesList);
52 void _readBuildMessage(GWB_BUILDER *builder, GWB_BUILD_SUBCMD *cmd, GWEN_XMLNODE *xmlNode);
53 
54 GWEN_BUFFER *_readArgs(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *xmlNode);
55 void _readArgsLoop(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *nArgs, GWEN_BUFFER *argsBuffer);
56 void _readArgsFixed(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer);
57 void _readArgsInputFiles(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer);
58 void _readArgsOutputFiles(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer);
59 void _readArgsLibraries(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer);
60 void _readArgsIncludes(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer);
61 void _readArgsDefines(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer);
62 void _readArgsUsedSubTargets(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer);
63 void _readArgsIfHasUsedSubTargets(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer);
64 void _readArgsIfHasLibraries(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer);
65 void _readArgsHaveConfigH(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer);
66 
67 void _addMatchingFiles(GWB_BUILDER *builder, GWB_FILE_LIST2 *filesList, const char *pattern, int addAbs, GWEN_BUFFER *argsBuffer);
69 
70 
71 
72 
73 GWB_BUILDER *GWB_GenericBuilder_Factory(GWENBUILD *gwenbuild, GWB_CONTEXT *context, const char *builderName)
74 {
75  GWB_BUILDER *builder;
76  GWEN_BUFFER *nameBuf;
77  GWEN_XMLNODE *xmlRoot;
78  GWEN_XMLNODE *xmlDescr;
79  int rv;
80 
81  nameBuf=GWEN_Buffer_new(0, 256, 0, 1);
82  GWEN_Buffer_AppendString(nameBuf, BUILDERDATADIR GWEN_DIR_SEPARATOR_S);
83  if (GWBUILD_GetTargetIsWindows(gwenbuild))
84  GWEN_Buffer_AppendString(nameBuf, "windows");
85  else
86  GWEN_Buffer_AppendString(nameBuf, "posix");
88  GWEN_Buffer_AppendString(nameBuf, builderName);
89  GWEN_Buffer_AppendString(nameBuf, ".gwb");
90 
91  xmlRoot=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, "root");
93  if (rv<0) {
95  "No description for builder type \"%s\" found (%d, tried \"%s\")",
96  builderName, rv, GWEN_Buffer_GetStart(nameBuf));
97  GWEN_Buffer_free(nameBuf);
98  return NULL;
99  }
100 
101  xmlDescr=GWEN_XMLNode_FindFirstTag(xmlRoot, "GwenBuilder", NULL, NULL);
102  if (xmlDescr==NULL) {
103  DBG_ERROR(NULL, "No <GwenBuilder> element found in file \"%s\"", GWEN_Buffer_GetStart(nameBuf));
104  GWEN_XMLNode_free(xmlRoot);
105  GWEN_Buffer_free(nameBuf);
106  return NULL;
107  }
108  GWEN_XMLNode_UnlinkChild(xmlRoot, xmlDescr);
109  GWEN_XMLNode_free(xmlRoot);
110 
111  builder=GWB_GenericBuilder_new(gwenbuild, context, xmlDescr);
112  if (builder==NULL) {
113  DBG_ERROR(NULL, "Error in file \"%s\"", GWEN_Buffer_GetStart(nameBuf));
114  GWEN_XMLNode_free(xmlDescr);
115  GWEN_Buffer_free(nameBuf);
116  return NULL;
117  }
118  GWEN_Buffer_free(nameBuf);
119 
120  return builder;
121 }
122 
123 
124 
125 
126 
128 {
129  GWB_BUILDER *builder;
130  GWB_BUILDER_GENERIC *xbuilder;
131  const char *s;
132 
133  s=GWEN_XMLNode_GetProperty(xmlDescr, "name", NULL);
134  if (!(s && *s)) {
135  DBG_ERROR(NULL, "No builder name in XML builder description");
136  return NULL;
137  }
138  builder=GWB_Builder_new(gwenbuild, context, s);
139  GWEN_NEW_OBJECT(GWB_BUILDER_GENERIC, xbuilder);
140  GWEN_INHERIT_SETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder, xbuilder, _freeData);
141 
142  xbuilder->builderName=strdup(s);
143 
144  xbuilder->dbVars=GWEN_DB_Group_new("vars");
145  xbuilder->xmlDescr=xmlDescr;
146 
150 
151  _readMainSettingsFromXml(builder);
152  _setupVariables(builder);
153 
154  return builder;
155 }
156 
157 
158 
159 void GWENHYWFAR_CB _freeData(GWEN_UNUSED void *bp, void *p)
160 {
161  GWB_BUILDER_GENERIC *xbuilder;
162 
163  xbuilder=(GWB_BUILDER_GENERIC*) p;
164 
165  GWEN_DB_Group_free(xbuilder->dbVars);
166  GWEN_XMLNode_free(xbuilder->xmlDescr);
167  free(xbuilder->toolName);
168  free(xbuilder->builderName);
169  GWEN_FREE_OBJECT(xbuilder);
170 }
171 
172 
173 
175 {
176  GWB_BUILDER_GENERIC *xbuilder;
177  GWB_CONTEXT *context;
178  GWEN_XMLNODE *nInputFiles;
179 
180  xbuilder=GWEN_INHERIT_GETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder);
181 
182  context=GWB_Builder_GetContext(builder);
183 
184  xbuilder->maxInputFiles=GWEN_XMLNode_GetIntProperty(xbuilder->xmlDescr, "maxinputfiles", -1);
185 
186  nInputFiles=GWEN_XMLNode_FindFirstTag(xbuilder->xmlDescr, "inputFiles", NULL, NULL);
187  if (nInputFiles) {
188  GWEN_XMLNODE *n;
189 
190  n=GWEN_XMLNode_FindFirstTag(nInputFiles, "acceptedInputTypes", NULL, NULL);
191  if (n)
192  xbuilder->acceptedInputTypes=GWB_Parser_ReadXmlDataIntoStringList(GWB_Context_GetVars(context), n);
193 
194  n=GWEN_XMLNode_FindFirstTag(nInputFiles, "acceptedInputFiles", NULL, NULL);
195  if (n)
196  xbuilder->acceptedInputExt=GWB_Parser_ReadXmlDataIntoStringList(GWB_Context_GetVars(context), n);
197  }
198 }
199 
200 
201 
203 {
204  GWB_BUILDER_GENERIC *xbuilder;
205  GWB_CONTEXT *context;
206  const char *s;
207  GWEN_DB_NODE *db;
208 
209  xbuilder=GWEN_INHERIT_GETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder);
210 
211  db=xbuilder->dbVars;
212  context=GWB_Builder_GetContext(builder);
213 
215  if (s)
217 
219 }
220 
221 
222 
223 void _setToolName(GWB_BUILDER *builder, const char *s)
224 {
225  GWB_BUILDER_GENERIC *xbuilder;
226 
227  xbuilder=GWEN_INHERIT_GETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder);
228  free(xbuilder->toolName);
229  xbuilder->toolName=s?strdup(s):NULL;
230 }
231 
232 
233 
235 {
236  GWB_FILE_LIST2 *fileList;
237 
238  GWB_Builder_AddInputFile(builder, f);
239 
240  fileList=GWB_Builder_GetOutputFileList2(builder);
241  if (!(fileList && GWB_File_List2_GetSize(fileList)>0)) {
243  }
244 }
245 
246 
247 
249 {
250  GWB_BUILDER_GENERIC *xbuilder;
251  GWB_FILE_LIST2 *fileList;
252 
253  xbuilder=GWEN_INHERIT_GETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder);
254 
255  fileList=GWB_Builder_GetInputFileList2(builder);
256  if (fileList) {
257  GWB_FILE *file;
258 
259  file=GWB_File_List2_GetFront(fileList);
260  if (file) {
261  const char *s;
262 
263  s=GWB_File_GetName(file);
264  if (s) {
265  const char *ptrToPoint;
266 
267  GWEN_DB_SetCharValue(xbuilder->dbVars, GWEN_DB_FLAGS_DEFAULT, "firstInputFile", s);
268  ptrToPoint=strrchr(s, '.');
269  if (ptrToPoint) {
270  char *copyOfName;
271 
272  copyOfName=strndup(s, (ptrToPoint-s));
273  GWEN_DB_SetCharValue(xbuilder->dbVars, GWEN_DB_FLAGS_DEFAULT, "firstInputFileNoExt", copyOfName);
274  free(copyOfName);
275  }
276  }
277  }
278  }
279 
280  _setupOutFiles(builder);
281  _setupTargetLinkSpec(builder);
282 }
283 
284 
285 
287 {
288  GWB_BUILDER_GENERIC *xbuilder;
289  GWB_CONTEXT *context;
290  GWB_TARGET *target;
291  GWB_PROJECT *project;
292  const char *folder;
293  GWEN_XMLNODE *nOutputFiles;
294 
295  xbuilder=GWEN_INHERIT_GETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder);
296 
297  context=GWB_Builder_GetContext(builder);
298  target=GWB_Context_GetCurrentTarget(context);
299  project=GWB_Target_GetProject(target);
300 
301  folder=GWB_Context_GetCurrentBuildDir(context);
302 
303  nOutputFiles=GWEN_XMLNode_FindFirstTag(xbuilder->xmlDescr, "outputFiles", NULL, NULL);
304  if (nOutputFiles) {
305  GWEN_XMLNODE *nFile;
306 
307  nFile=GWEN_XMLNode_FindFirstTag(nOutputFiles, "file", NULL, NULL);
308  while (nFile) {
309  const char *sFileType;
310  const char *sInstall;
311  GWEN_BUFFER *nbuf;
312 
313  sFileType=GWEN_XMLNode_GetProperty(nFile, "type", NULL);
314  sInstall=GWEN_XMLNode_GetProperty(nFile, "install", NULL);
315  nbuf=_readXmlDataIntoBufferAndExpand(xbuilder->dbVars, nFile);
316  if (nbuf) {
317  GWB_FILE *fileOut;
318  const char *sTargetInstallPath=NULL;
319 
321  GWEN_Buffer_free(nbuf);
322 
323  if (sFileType)
324  GWB_File_SetFileType(fileOut, sFileType);
325  if (sInstall && strcasecmp(sInstall, "target")==0)
326  sTargetInstallPath=GWB_Target_GetInstallPath(target);
328 
329  if (sTargetInstallPath && *sTargetInstallPath) {
330  GWB_File_SetInstallPath(fileOut, sTargetInstallPath);
332  }
333  GWB_Builder_AddOutputFile(builder, fileOut);
334  } /* if nbuf */
335 
336  nFile=GWEN_XMLNode_FindNextTag(nFile, "file", NULL, NULL);
337  } /* while nFile */
338  } /* if nOutputFiles */
339 }
340 
341 
342 
344 {
345  GWB_BUILDER_GENERIC *xbuilder;
346  GWEN_XMLNODE *nTargetLinkSpec;
347 
348  xbuilder=GWEN_INHERIT_GETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder);
349 
350  nTargetLinkSpec=GWEN_XMLNode_FindFirstTag(xbuilder->xmlDescr, "targetLinkSpecs", NULL, NULL);
351  if (nTargetLinkSpec) {
352  GWEN_BUFFER *buf;
353 
354  buf=_readXmlDataIntoBufferAndExpand(xbuilder->dbVars, nTargetLinkSpec);
355  if (buf) {
357  GWEN_Buffer_free(buf);
358  }
359  }
360 }
361 
362 
363 
365 {
366  GWEN_XMLNODE *xmlData;
367 
368  xmlData=GWEN_XMLNode_GetFirstData(xmlNode);
369  if (xmlData) {
370  const char *s;
371 
372  s=GWEN_XMLNode_GetData(xmlData);
373  if (s && *s) {
374  int rv;
375  GWEN_BUFFER *buf;
376 
377  buf=GWEN_Buffer_new(0, 256, 0, 1);
378  rv=GWEN_DB_ReplaceVars(db, s, buf);
379  if(rv<0) {
380  DBG_INFO(NULL, "here (%d)", rv);
381  GWEN_Buffer_free(buf);
382  return NULL;
383  }
384 
385  return buf;
386  }
387  }
388 
389  return NULL;
390 }
391 
392 
393 
395 {
396  GWB_BUILDER_GENERIC *xbuilder;
397  const char *sType;
398  const char *sExt;
399 
400  xbuilder=GWEN_INHERIT_GETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder);
401 
402  sType=GWB_File_GetFileType(f);
403  sExt=GWB_File_GetExt(f);
404 
405  if (sType && xbuilder->acceptedInputTypes && GWEN_StringList_HasString(xbuilder->acceptedInputTypes, sType))
406  return 1;
407 
408  if (sExt && xbuilder->acceptedInputExt && GWEN_StringList_HasString(xbuilder->acceptedInputExt, sExt))
409  return 1;
410 
411  return 0;
412 }
413 
414 
415 
417 {
418  GWB_BUILDER_GENERIC *xbuilder;
419  GWB_CONTEXT *context;
420  GWB_BUILD_CMD *bcmd;
421 
422  xbuilder=GWEN_INHERIT_GETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder);
423  context=GWB_Builder_GetContext(builder);
424 
425  bcmd=GWB_BuildCmd_new();
427  GWB_BuildCmd_SetBuilderName(bcmd, xbuilder->builderName);
429 
430  _addBuildCommands(builder, bcmd);
431  _addPrepareCommands(builder, bcmd);
432 
435 
436  GWB_BuildCtx_AddCommand(bctx, bcmd);
437 
438  return 0;
439 }
440 
441 
442 
444 {
445  _addCommands(builder, bcmd, "buildCommands", GWB_BuildCmd_GetBuildCommandList(bcmd));
446 }
447 
448 
449 
451 {
452  _addCommands(builder, bcmd, "prepareCommands", GWB_BuildCmd_GetPrepareCommandList(bcmd));
453 }
454 
455 
456 
457 void _addCommands(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, const char *groupName, GWB_BUILD_SUBCMD_LIST *cmdList)
458 {
459  GWB_BUILDER_GENERIC *xbuilder;
460  GWEN_XMLNODE *n;
461 
462  xbuilder=GWEN_INHERIT_GETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder);
463 
464  n=GWEN_XMLNode_FindFirstTag(xbuilder->xmlDescr, groupName, NULL, NULL);
465  if (n) {
466  const char *s;
467 
468  s=GWEN_XMLNode_GetProperty(n, "checkDates", "TRUE");
469  if (s && strcasecmp(s, "TRUE")==0)
471 
472 
473  s=GWEN_XMLNode_GetProperty(n, "deleteOutFileFirst", "FALSE");
474  if (s && strcasecmp(s, "TRUE")==0)
476 
477  n=GWEN_XMLNode_FindFirstTag(n, "cmd", NULL, NULL);
478  while(n) {
479  const char *sToolName;
480  GWEN_BUFFER *argsBuffer;
481  GWEN_BUFFER *toolNameBuffer;
482  GWB_BUILD_SUBCMD *cmd;
483 
484  toolNameBuffer=GWEN_Buffer_new(0, 256, 0, 1);
485  sToolName=GWEN_XMLNode_GetProperty(n, "tool", NULL);
486  if (sToolName) {
487  GWEN_DB_ReplaceVars(xbuilder->dbVars, sToolName, toolNameBuffer);
488  sToolName=GWEN_Buffer_GetStart(toolNameBuffer);
489  }
490 
491  cmd=GWB_BuildSubCmd_new();
492  GWB_BuildSubCmd_SetCommand(cmd, sToolName);
493 
494  s=GWEN_XMLNode_GetProperty(n, "ignoreResult", "FALSE");
495  if (s && strcasecmp(s, "TRUE")==0)
497 
498  s=GWEN_XMLNode_GetProperty(n, "checkDepends", "FALSE");
499  if (s && strcasecmp(s, "TRUE")==0)
501 
502  argsBuffer=_readArgs(builder, bcmd, n);
503  if (argsBuffer) {
505  GWEN_Buffer_free(argsBuffer);
506  }
507 
508  _readDepFile(builder, cmd, n);
509  _readBuildMessage(builder, cmd, n);
510 
511 
512  /* done */
513  GWB_BuildSubCmd_List_Add(cmd, cmdList);
514 
515  GWEN_Buffer_free(toolNameBuffer);
516 
517  n=GWEN_XMLNode_FindNextTag(n, "cmd", NULL, NULL);
518  }
519  }
520 }
521 
522 
523 
525 {
526  GWB_BUILDER_GENERIC *xbuilder;
527  GWEN_XMLNODE *xmlMsg;
528 
529  xbuilder=GWEN_INHERIT_GETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder);
530 
531  xmlMsg=GWEN_XMLNode_FindFirstTag(xmlNode, "buildMessage", NULL, NULL);
532  if (xmlMsg) {
533  GWEN_BUFFER *buf;
534 
535  buf=_readXmlDataIntoBufferAndExpand(xbuilder->dbVars, xmlMsg);
536  if (buf) {
538  GWEN_Buffer_free(buf);
539  }
540  }
541 }
542 
543 
544 
546 {
547  GWEN_XMLNODE *xmlFile;
548 
549  xmlFile=GWEN_XMLNode_FindFirstTag(xmlNode, "depFile", NULL, NULL);
550  if (xmlFile) {
551  GWB_CONTEXT *context;
552  GWB_FILE_LIST2 *filesList;
553  GWEN_BUFFER *filenameBuffer;
554 
555  context=GWB_Builder_GetContext(builder);
556  filesList=GWB_Builder_GetOutputFileList2(builder);
557 
558  filenameBuffer=_readMainFilename(context, xmlFile, filesList);
559  if (filenameBuffer) {
561  GWEN_Buffer_free(filenameBuffer);
562  }
563  }
564 }
565 
566 
567 
568 GWEN_BUFFER *_readMainFilename(GWB_CONTEXT *context, GWEN_XMLNODE *xmlFile, GWB_FILE_LIST2 *filesList)
569 {
570  if (filesList) {
571  int index;
572 
573  index=GWEN_XMLNode_GetIntProperty(xmlFile, "index", -1);
574  if (index>=0) {
575  GWB_FILE *file;
576 
577  file=GWB_File_List2_GetAt(filesList, index);
578  if (file) {
579  GWEN_BUFFER *filenameBuffer;
580  const char *s;
581 
582  filenameBuffer=GWEN_Buffer_new(0, 256, 0, 1);
583 
586  if (s && *s) {
587  GWEN_Buffer_AppendString(filenameBuffer, s);
589  }
590  }
591  s=GWB_File_GetFolder(file);
592  if (s && *s) {
593  GWEN_Buffer_AppendString(filenameBuffer, s);
595  }
596  GWEN_Buffer_AppendString(filenameBuffer, GWB_File_GetName(file));
597  return filenameBuffer;
598  }
599  }
600  }
601  return NULL;
602 }
603 
604 
605 
607 {
608  GWEN_XMLNODE *nArgs;
609 
610  nArgs=GWEN_XMLNode_FindFirstTag(xmlNode, "args", NULL, NULL);
611  if (nArgs) {
612  GWEN_BUFFER *argsBuffer;
613 
614  argsBuffer=GWEN_Buffer_new(0, 256, 0, 1);
615  _readArgsLoop(builder, bcmd, nArgs, argsBuffer);
616  if (GWEN_Buffer_GetUsedBytes(argsBuffer))
617  return argsBuffer;
618  GWEN_Buffer_free(argsBuffer);
619  }
620 
621  return NULL;
622 }
623 
624 
625 
626 void _readArgsLoop(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *nArgs, GWEN_BUFFER *argsBuffer)
627 {
628  GWEN_XMLNODE *n;
629 
630  n=GWEN_XMLNode_GetFirstTag(nArgs);
631  while(n) {
632  const char *sTagName;
633 
634  sTagName=GWEN_XMLNode_GetData(n);
635  if (sTagName) {
636  if (strcasecmp(sTagName, "fixed")==0)
637  _readArgsFixed(builder, n, argsBuffer);
638  else if (strcasecmp(sTagName, "inputFiles")==0)
639  _readArgsInputFiles(builder, n, argsBuffer);
640  else if (strcasecmp(sTagName, "outputFiles")==0)
641  _readArgsOutputFiles(builder, n, argsBuffer);
642  else if (strcasecmp(sTagName, "ifHasSubTargetLibs")==0)
643  _readArgsIfHasUsedSubTargets(builder, bcmd, n, argsBuffer);
644  else if (strcasecmp(sTagName, "subTargetLibs")==0)
645  _readArgsUsedSubTargets(builder, argsBuffer);
646  else if (strcasecmp(sTagName, "includes")==0)
647  _readArgsIncludes(builder, n, argsBuffer);
648  else if (strcasecmp(sTagName, "defines")==0)
649  _readArgsDefines(builder, argsBuffer);
650  else if (strcasecmp(sTagName, "ifHasLibraries")==0)
651  _readArgsIfHasLibraries(builder, bcmd, n, argsBuffer);
652  else if (strcasecmp(sTagName, "libraries")==0)
653  _readArgsLibraries(builder, argsBuffer);
654  else if (strcasecmp(sTagName, "haveConfigH")==0)
655  _readArgsHaveConfigH(builder, argsBuffer);
656  else if (strcasecmp(sTagName, "blank")==0) {
657  GWEN_Buffer_AppendString(argsBuffer, " ");
658  }
659  else {
660  DBG_ERROR(NULL, "Unhandled tag \"%s\", ignoring", sTagName);
661  }
662  }
663 
665  } /* while */
666 }
667 
668 
669 
670 void _readArgsFixed(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer)
671 {
672  GWB_BUILDER_GENERIC *xbuilder;
673  GWEN_BUFFER *buf;
674 
675  xbuilder=GWEN_INHERIT_GETDATA(GWB_BUILDER, GWB_BUILDER_GENERIC, builder);
676 
677  buf=_readXmlDataIntoBufferAndExpand(xbuilder->dbVars, xmlNode);
678  if (buf) {
680  GWEN_Buffer_free(buf);
681  }
682 }
683 
684 
685 
686 void _readArgsInputFiles(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer)
687 {
688  GWB_CONTEXT *context;
689  GWB_FILE_LIST2 *inFilesList;
690 
691  context=GWB_Builder_GetContext(builder);
692 
693  inFilesList=GWB_Builder_GetInputFileList2(builder);
694  if (inFilesList) {
695  int index;
696  const char *pattern;
697  int useAbsPath;
698 
699  useAbsPath=(strcasecmp(GWEN_XMLNode_GetProperty(xmlNode, "mode", "relpath"), "abspath")==0)?1:0;
700  pattern=GWEN_XMLNode_GetProperty(xmlNode, "match", NULL);
701  index=GWEN_XMLNode_GetIntProperty(xmlNode, "index", -1);
702 
703  if (index>=0) {
704  GWB_FILE *file;
705 
706  file=GWB_File_List2_GetAt(inFilesList, index);
707  if (file) {
708  if (useAbsPath)
709  GWB_Builder_AddAbsFileNameToBuffer(context, file, argsBuffer);
710  else
711  GWB_Builder_AddFileNameToBuffer(context, file, argsBuffer);
712  }
713  }
714  else
715  _addMatchingFiles(builder, inFilesList, pattern, useAbsPath, argsBuffer);
716  }
717 }
718 
719 
720 
721 void _readArgsOutputFiles(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer)
722 {
723  GWB_CONTEXT *context;
724  GWB_FILE_LIST2 *filesList;
725 
726  context=GWB_Builder_GetContext(builder);
727 
728  filesList=GWB_Builder_GetOutputFileList2(builder);
729  if (filesList) {
730  int index;
731  const char *pattern;
732  const char *useField;
733  int useAbsPath;
734 
735  useAbsPath=(strcasecmp(GWEN_XMLNode_GetProperty(xmlNode, "mode", "relpath"), "abspath")==0)?1:0;
736 
737  pattern=GWEN_XMLNode_GetProperty(xmlNode, "match", NULL);
738  index=GWEN_XMLNode_GetIntProperty(xmlNode, "index", -1);
739  useField=GWEN_XMLNode_GetProperty(xmlNode, "useFields", NULL);
740  if (index>=0) {
741  GWB_FILE *file;
742 
743  file=GWB_File_List2_GetAt(filesList, index);
744  if (file) {
745  if (useField && strcasecmp(useField, "installPath")==0) {
746  const char *s;
747 
748  s=GWB_File_GetInstallPath(file);
749  if (s)
750  GWEN_Buffer_AppendString(argsBuffer, s);
751  }
752  else {
753  if (useAbsPath)
754  GWB_Builder_AddAbsFileNameToBuffer(context, file, argsBuffer);
755  else
756  GWB_Builder_AddFileNameToBuffer(context, file, argsBuffer);
757  }
758  }
759  }
760  else
761  _addMatchingFiles(builder, filesList, pattern, useAbsPath, argsBuffer);
762  }
763 }
764 
765 
766 
767 void _readArgsLibraries(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer)
768 {
769  GWB_CONTEXT *context;
770  GWB_TARGET *target;
771 
772  context=GWB_Builder_GetContext(builder);
773  target=GWB_Context_GetCurrentTarget(context);
775 }
776 
777 
778 
780 {
781  GWB_CONTEXT *context;
782  GWB_TARGET *target;
783 
784  context=GWB_Builder_GetContext(builder);
785  target=GWB_Context_GetCurrentTarget(context);
787 }
788 
789 
790 
792 {
793  GWB_CONTEXT *context;
794  GWB_TARGET *target;
795  GWEN_STRINGLIST *sl;
796 
797  context=GWB_Builder_GetContext(builder);
798  target=GWB_Context_GetCurrentTarget(context);
800  if (sl && GWEN_StringList_Count(sl)>0)
801  _readArgsLoop(builder, bcmd, xmlNode, argsBuffer);
802 }
803 
804 
805 
806 void _readArgsIfHasLibraries(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer)
807 {
808  GWB_CONTEXT *context;
809  GWB_TARGET *target;
810  GWEN_STRINGLIST *sl;
811 
812  context=GWB_Builder_GetContext(builder);
813  target=GWB_Context_GetCurrentTarget(context);
815  if (sl && GWEN_StringList_Count(sl)>0)
816  _readArgsLoop(builder, bcmd, xmlNode, argsBuffer);
817 }
818 
819 
820 
821 void _readArgsIncludes(GWB_BUILDER *builder, GWEN_XMLNODE *xmlNode, GWEN_BUFFER *argsBuffer)
822 {
823  GWB_CONTEXT *context;
824  GWB_KEYVALUEPAIR_LIST *kvpList;
825  const char *fileType;
826 
827  fileType=GWEN_XMLNode_GetProperty(xmlNode, "type", "c");
828 
829  context=GWB_Builder_GetContext(builder);
830  kvpList=GWB_Context_GetIncludeList(context);
831  if (kvpList) {
832  GWEN_Buffer_AppendString(argsBuffer, " ");
833  GWB_KeyValuePair_List_SampleValuesByKey(kvpList, fileType, NULL, " ", argsBuffer);
834  }
835 }
836 
837 
838 
839 void _readArgsDefines(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer)
840 {
841  GWB_CONTEXT *context;
842  GWB_KEYVALUEPAIR_LIST *kvpList;
843 
844  context=GWB_Builder_GetContext(builder);
845  kvpList=GWB_Context_GetDefineList(context);
846  if (kvpList)
847  GWB_KeyValuePair_List_WriteAllPairsToBuffer(kvpList, "-D", "=", " ", argsBuffer);
848 }
849 
850 
851 
852 void _readArgsHaveConfigH(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer)
853 {
854  GWB_CONTEXT *context;
855  GWB_TARGET *target;
856  GWB_PROJECT *project;
857 
858  context=GWB_Builder_GetContext(builder);
859  target=GWB_Context_GetCurrentTarget(context);
860  project=GWB_Target_GetProject(target);
861 
863  GWEN_Buffer_AppendString(argsBuffer, " -DHAVE_CONFIG_H ");
864  }
865 }
866 
867 
868 
869 void _addMatchingFiles(GWB_BUILDER *builder, GWB_FILE_LIST2 *filesList, const char *pattern, int addAbs, GWEN_BUFFER *argsBuffer)
870 {
871  GWB_CONTEXT *context;
872 
873  context=GWB_Builder_GetContext(builder);
874 
875  if (filesList) {
876  GWB_FILE_LIST2_ITERATOR *it;
877 
878  it=GWB_File_List2_First(filesList);
879  if (it) {
880  GWB_FILE *file;
881 
882  file=GWB_File_List2Iterator_Data(it);
883  while(file) {
884  const char *fname;
885 
886  fname=GWB_File_GetName(file);
887  if (fname) {
888  if (pattern==NULL || -1!=GWEN_Text_ComparePattern(fname, pattern, 0)) {
889  if (GWEN_Buffer_GetUsedBytes(argsBuffer))
890  GWEN_Buffer_AppendString(argsBuffer, " ");
891  if (addAbs)
892  GWB_Builder_AddAbsFileNameToBuffer(context, file, argsBuffer);
893  else
894  GWB_Builder_AddFileNameToBuffer(context, file, argsBuffer);
895  }
896  }
897  file=GWB_File_List2Iterator_Next(it);
898  }
899 
900  GWB_File_List2Iterator_free(it);
901  }
902  }
903 }
904 
905 
906 
908 {
909  if (sl) {
911 
913  while(se) {
914  const char *s;
915 
917  if (s && *s) {
918  if (GWEN_Buffer_GetUsedBytes(argsBuffer))
919  GWEN_Buffer_AppendString(argsBuffer, " ");
920  GWEN_Buffer_AppendString(argsBuffer, s);
921  }
923  }
924  }
925 }
926 
927 
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:206
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
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:308
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
#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:194
GWEN_XMLNODE * GWEN_XMLNode_FindNextTag(const GWEN_XMLNODE *n, const char *tname, const char *pname, const char *pvalue)
Definition: xml.c:794
void _addStringListToBuffer(GWEN_STRINGLIST *sl, GWEN_BUFFER *argsBuffer)
void GWB_Builder_AddInputFile(GWB_BUILDER *builder, GWB_FILE *f)
Definition: builder.c:107
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
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:111
GWB_FILE * GWB_File_List2_GetOrCreateFile(GWB_FILE_LIST2 *fileList, const char *folder, const char *fname)
Definition: file.c:364
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:213
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
void _addBuildCommands(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd)
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:212
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:187
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:125
GWB_BUILD_SUBCMD * GWB_BuildSubCmd_new(void)
Definition: buildsubcmd.c:25
const char * GWB_File_GetName(const GWB_FILE *f)
Definition: file.c:144
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
void _addPrepareCommands(GWB_BUILDER *builder, GWB_BUILD_CMD *bcmd)
GWEN_STRINGLIST * GWB_Target_GetUsedTargetLinkSpecList(const GWB_TARGET *target)
Definition: target.c:228
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
void _setupVariables(GWB_BUILDER *builder)
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:122
void _readMainSettingsFromXml(GWB_BUILDER *builder)
#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
GWB_BUILDER * GWB_GenericBuilder_new(GWENBUILD *gwenbuild, GWB_CONTEXT *context, GWEN_XMLNODE *xmlDescr)
const char * GWB_File_GetExt(const GWB_FILE *f)
Definition: file.c:163
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
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
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
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
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
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:97
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:178
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)
GWB_TARGET * GWB_Context_GetCurrentTarget(const GWB_CONTEXT *ctx)
Definition: context.c:460
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
void _addMatchingFiles(GWB_BUILDER *builder, GWB_FILE_LIST2 *filesList, const char *pattern, int addAbs, GWEN_BUFFER *argsBuffer)
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
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
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
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:156
GWB_PROJECT * GWB_Target_GetProject(const GWB_TARGET *target)
Definition: target.c:63
#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
GWEN_BUFFER * _readXmlDataIntoBufferAndExpand(GWEN_DB_NODE *db, GWEN_XMLNODE *xmlNode)
void _readArgsLibraries(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer)
GWB_FILE * GWB_File_List2_GetAt(const GWB_FILE_LIST2 *fileList, int index)
Definition: file.c:619
void _readArgsUsedSubTargets(GWB_BUILDER *builder, GWEN_BUFFER *argsBuffer)
const char * GWB_Context_GetCurrentBuildDir(const GWB_CONTEXT *ctx)
Definition: context.c:184
void _setupOutFiles(GWB_BUILDER *builder)