gwenhywfar  5.7.2
p_buildfiles.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 
18 
19 #include <gwenhywfar/debug.h>
20 #include <gwenhywfar/text.h>
21 
22 
23 
24 
25 static int _parseBuildInputFiles(GWB_BUILD_CMD *bcmd, GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode);
26 static int _parseBuildOutputFiles(GWB_BUILD_CMD *bcmd, GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode);
28  GWB_CONTEXT *currentContext,
29  GWEN_XMLNODE *xmlNode,
30  GWEN_DB_NODE *dbForCmd);
31 
32 static int _readFileList(GWEN_XMLNODE *xmlNode,
33  GWEN_DB_NODE *dbVars,
34  const char *sCurrentRelativeDir,
35  GWB_FILE_LIST2 *projectFileList,
36  GWB_FILE_LIST2 *targetFileList,
37  uint32_t flagsToAdd);
38 static int _readFilesFromDataNode(GWEN_XMLNODE *xmlNode,
39  GWEN_DB_NODE *dbVars,
40  const char *sCurrentRelativeDir,
41  GWB_FILE_LIST2 *projectFileList,
42  GWB_FILE_LIST2 *targetFileList,
43  uint32_t flagsToAdd);
44 static int _readFileListFromTagNode(GWEN_XMLNODE *xmlNode,
45  const GWB_FILE_LIST2 *projectFileList,
46  GWB_FILE_LIST2 *targetFileList);
47 static void _addFilePathsToDb(GWB_CONTEXT *currentContext,
48  const GWB_FILE_LIST2 *fileList,
49  GWEN_DB_NODE *db,
50  const char *varName);
51 
52 
53 
54 
55 
56 
57 int GWB_ParseBuildFiles(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
58 {
59  GWB_TARGET *target;
60  GWEN_XMLNODE *n;
61  GWB_BUILD_CMD *bcmd;
62  GWB_BUILD_SUBCMD *buildSubCmd=NULL;
63  GWEN_DB_NODE *dbForCmd;
64  int rv;
65  const char *s;
66 
67  target=GWB_Context_GetCurrentTarget(currentContext);
68 
69  bcmd=GWB_BuildCmd_new();
71 
72  s=GWEN_XMLNode_GetProperty(xmlNode, "name", NULL);
73  if (s && *s)
75 
76  s=GWEN_XMLNode_GetProperty(xmlNode, "auto", "TRUE");
77  if (s && *s && 0==strcasecmp(s, "TRUE"))
79 
80  n=GWEN_XMLNode_FindFirstTag(xmlNode, "input", NULL, NULL);
81  if (n) {
82  rv=_parseBuildInputFiles(bcmd, project, currentContext, n);
83  if (rv<0) {
84  DBG_INFO(NULL, "here (%d)", rv);
85  GWB_BuildCmd_free(bcmd);
86  return rv;
87  }
88  }
89 
90  n=GWEN_XMLNode_FindFirstTag(xmlNode, "output", NULL, NULL);
91  if (n) {
92  rv=_parseBuildOutputFiles(bcmd, project, currentContext, n);
93  if (rv<0) {
94  DBG_INFO(NULL, "here (%d)", rv);
95  GWB_BuildCmd_free(bcmd);
96  return rv;
97  }
98  }
99 
100  dbForCmd=GWEN_DB_Group_new("dbForCmd");
101  _addFilePathsToDb(currentContext, GWB_BuildCmd_GetInFileList2(bcmd), dbForCmd, "INPUT");
102  _addFilePathsToDb(currentContext, GWB_BuildCmd_GetOutFileList2(bcmd), dbForCmd, "OUTPUT");
103 
104  n=GWEN_XMLNode_FindFirstTag(xmlNode, "cmd", NULL, NULL);
105  if (n) {
106  buildSubCmd=_parseBuildCommand(bcmd, currentContext, n, dbForCmd);
107  if (buildSubCmd==NULL) {
108  DBG_ERROR(NULL, "here");
109  GWEN_DB_Group_free(dbForCmd);
110  GWB_BuildCmd_free(bcmd);
111  return GWEN_ERROR_GENERIC;
112  }
113 
114  s=GWEN_XMLNode_GetProperty(n, "deleteOutFileFirst", "FALSE");
115  if (s && strcasecmp(s, "TRUE")==0)
117  GWB_BuildCmd_AddBuildCommand(bcmd, buildSubCmd);
118  }
119 
120  /* pepare build message */
121  n=GWEN_XMLNode_FindFirstTag(xmlNode, "buildMessage", NULL, NULL);
122  if (n) {
123  GWEN_BUFFER *dbuf;
124 
126  if (dbuf) {
128  GWEN_Buffer_free(dbuf);
129  }
130  }
131 
132  if (target)
133  GWB_Target_AddExplicitBuild(target, bcmd);
134  else
135  GWB_Project_AddExplicitBuild(project, bcmd);
136  GWEN_DB_Group_free(dbForCmd);
137 
138  return 0;
139 }
140 
141 
142 
143 int _parseBuildInputFiles(GWB_BUILD_CMD *bcmd, GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
144 {
145  int rv;
146 
147  rv=_readFileList(xmlNode,
148  GWB_Context_GetVars(currentContext),
149  GWB_Context_GetCurrentRelativeDir(currentContext),
150  GWB_Project_GetFileList(project),
152  0);
153  if (rv<0) {
154  DBG_INFO(NULL, "here (%d)", rv);
155  return rv;
156  }
157 
158  return 0;
159 }
160 
161 
162 
163 int _parseBuildOutputFiles(GWB_BUILD_CMD *bcmd, GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
164 {
165  int rv;
166 
167  rv=_readFileList(xmlNode,
168  GWB_Context_GetVars(currentContext),
169  GWB_Context_GetCurrentRelativeDir(currentContext),
170  GWB_Project_GetFileList(project),
173  if (rv<0) {
174  DBG_INFO(NULL, "here (%d)", rv);
175  return rv;
176  }
177 
178  return 0;
179 }
180 
181 
182 
184  GWB_CONTEXT *currentContext,
185  GWEN_XMLNODE *xmlNode,
186  GWEN_DB_NODE *dbForCmd)
187 {
188  GWEN_BUFFER *dbuf;
189  const char *toolName;
190  GWB_BUILD_SUBCMD *buildSubCmd;
191  const char *s;
192  int rv;
193 
194  rv=GWEN_XMLNode_ExpandProperties(xmlNode, GWB_Context_GetVars(currentContext));
195  if (rv<0) {
196  DBG_INFO(NULL, "here (%d)", rv);
197  return NULL;
198  }
199 
200  toolName=GWEN_XMLNode_GetProperty(xmlNode, "tool", NULL);
201  if (!(toolName && *toolName)) {
202  DBG_ERROR(NULL, "No tool in <cmd>");
203  return NULL;
204  }
205 
206  dbuf=GWB_Parser_ReadXmlDataIntoBufferAndExpand(dbForCmd, xmlNode);
207  buildSubCmd=GWB_BuildSubCmd_new();
208  GWB_BuildSubCmd_SetCommand(buildSubCmd, toolName);
209  if (dbuf) {
211  GWEN_Buffer_free(dbuf);
212  }
213 
214  s=GWEN_XMLNode_GetProperty(xmlNode, "checkDates", "TRUE");
215  if (s && strcasecmp(s, "TRUE")==0)
217 
218  return buildSubCmd;
219 }
220 
221 
222 
224  GWEN_DB_NODE *dbVars,
225  const char *sCurrentRelativeDir,
226  GWB_FILE_LIST2 *projectFileList,
227  GWB_FILE_LIST2 *targetFileList,
228  uint32_t flagsToAdd)
229 {
230  GWEN_XMLNODE *n;
231 
232  n=GWEN_XMLNode_GetChild(xmlNode);
233  while(n) {
235  int rv;
236 
237  tt=GWEN_XMLNode_GetType(n);
238  if (tt==GWEN_XMLNodeTypeTag)
239  rv=_readFileListFromTagNode(n, projectFileList, targetFileList);
240  else if (tt==GWEN_XMLNodeTypeData)
242  dbVars,
243  sCurrentRelativeDir,
244  projectFileList,
245  targetFileList,
246  flagsToAdd);
247  else
248  rv=0;
249  if (rv<0) {
250  DBG_INFO(NULL, "here (%d)", rv);
251  return rv;
252  }
253 
254  n=GWEN_XMLNode_Next(n);
255  }
256 
257  return 0;
258 }
259 
260 
261 
263  GWEN_DB_NODE *dbVars,
264  const char *sCurrentRelativeDir,
265  GWB_FILE_LIST2 *projectFileList,
266  GWB_FILE_LIST2 *targetFileList,
267  uint32_t flagsToAdd)
268 {
269  const char *s;
270 
271  s=GWEN_XMLNode_GetData(xmlNode);
272  if (s && *s) {
273  int rv;
274  GWEN_BUFFER *buf;
275 
276  buf=GWEN_Buffer_new(0, 256, 0, 1);
277  rv=GWEN_DB_ReplaceVars(dbVars, s, buf);
278  if(rv<0) {
279  DBG_INFO(NULL, "here (%d)", rv);
280  GWEN_Buffer_free(buf);
281  return rv;
282  }
283  if (GWEN_Buffer_GetUsedBytes(buf)) {
284  GWEN_STRINGLIST *sl;
285 
287  if (sl==NULL) {
288  DBG_ERROR(NULL, "Could not generate string list from data [%s]", GWEN_Buffer_GetStart(buf));
289  GWEN_Buffer_free(buf);
290  return GWEN_ERROR_GENERIC;
291  }
292  GWBUILD_AddFilesFromStringList(projectFileList,
293  sCurrentRelativeDir,
294  sl,
295  targetFileList,
296  flagsToAdd,
297  0);
299  }
300  GWEN_Buffer_free(buf);
301  }
302  return 0;
303 }
304 
305 
306 
308  const GWB_FILE_LIST2 *projectFileList,
309  GWB_FILE_LIST2 *targetFileList)
310 {
311  const char *tagName;
312 
313  tagName=GWEN_XMLNode_GetData(xmlNode);
314  if (tagName && *tagName && strcasecmp(tagName, "files")==0) {
315  int index;
316  const char *pattern;
317 
318  pattern=GWEN_XMLNode_GetProperty(xmlNode, "match", NULL);
319  index=GWEN_XMLNode_GetIntProperty(xmlNode, "index", -1);
320 
321  if (index>=0) {
322  GWB_FILE *file;
323 
324  file=GWB_File_List2_GetAt(projectFileList, index);
325  if (file)
326  GWB_File_List2_PushBack(targetFileList, file);
327  }
328  else {
329  GWB_FILE_LIST2_ITERATOR *it;
330 
331  it=GWB_File_List2_First(projectFileList);
332  if (it) {
333  GWB_FILE *file;
334 
335  file=GWB_File_List2Iterator_Data(it);
336  while(file) {
337  const char *fname;
338 
339  fname=GWB_File_GetName(file);
340  if (fname) {
341  if (pattern==NULL || -1!=GWEN_Text_ComparePattern(fname, pattern, 0))
342  GWB_File_List2_PushBack(targetFileList, file);
343  }
344  file=GWB_File_List2Iterator_Next(it);
345  }
346 
347  GWB_File_List2Iterator_free(it);
348  }
349  }
350  return 0;
351  }
352  else {
353  DBG_ERROR(NULL, "Unknown tag name \"%s\"", tagName);
354  return GWEN_ERROR_GENERIC;
355  }
356 }
357 
358 
359 
360 void _addFilePathsToDb(GWB_CONTEXT *currentContext,
361  const GWB_FILE_LIST2 *fileList,
362  GWEN_DB_NODE *db,
363  const char *varName)
364 {
365  GWB_FILE_LIST2_ITERATOR *it;
366 
367  it=GWB_File_List2_First(fileList);
368  if (it) {
369  const GWB_FILE *file;
370  GWEN_BUFFER *fbuf;
371 
372  fbuf=GWEN_Buffer_new(0, 256, 0, 1);
373  file=GWB_File_List2Iterator_Data(it);
374  while(file) {
375  const char *folder;
376  int useBuildDir;
377 
378  useBuildDir=GWB_File_GetFlags(file) & GWB_FILE_FLAGS_GENERATED;
379  folder=GWB_File_GetFolder(file);
380  GWB_Builder_AddRelativeFolderToBuffer(currentContext, folder, useBuildDir, fbuf);
381  if (GWEN_Buffer_GetUsedBytes(fbuf))
384  GWEN_DB_SetCharValue(db, 0, varName, GWEN_Buffer_GetStart(fbuf));
385 
386  GWEN_Buffer_Reset(fbuf);
387  file=GWB_File_List2Iterator_Next(it);
388  }
389  GWEN_Buffer_free(fbuf);
390 
391  GWB_File_List2Iterator_free(it);
392  }
393 
394 }
395 
396 
397 
int GWEN_DB_ReplaceVars(GWEN_DB_NODE *db, const char *s, GWEN_BUFFER *dbuf)
Definition: db.c:1951
GWB_FILE_LIST2 * GWB_BuildCmd_GetInFileList2(const GWB_BUILD_CMD *bcmd)
Definition: buildcmd.c:255
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
struct GWB_CONTEXT GWB_CONTEXT
Definition: context.h:17
static int _readFileList(GWEN_XMLNODE *xmlNode, GWEN_DB_NODE *dbVars, const char *sCurrentRelativeDir, GWB_FILE_LIST2 *projectFileList, GWB_FILE_LIST2 *targetFileList, uint32_t flagsToAdd)
Definition: p_buildfiles.c:223
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
static int _readFileListFromTagNode(GWEN_XMLNODE *xmlNode, const GWB_FILE_LIST2 *projectFileList, GWB_FILE_LIST2 *targetFileList)
Definition: p_buildfiles.c:307
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
const char * GWEN_XMLNode_GetProperty(const GWEN_XMLNODE *n, const char *name, const char *defaultValue)
Definition: xml.c:239
void GWB_BuildCmd_SetFolder(GWB_BUILD_CMD *bcmd, const char *s)
Definition: buildcmd.c:173
struct GWB_FILE GWB_FILE
Definition: file.h:18
void GWB_BuildSubCmd_SetArguments(GWB_BUILD_SUBCMD *cmd, const char *s)
Definition: buildsubcmd.c:122
void GWB_Project_AddExplicitBuild(GWB_PROJECT *project, GWB_BUILD_CMD *bcmd)
Definition: project.c:398
#define NULL
Definition: binreloc.c:300
static void _addFilePathsToDb(GWB_CONTEXT *currentContext, const GWB_FILE_LIST2 *fileList, GWEN_DB_NODE *db, const char *varName)
Definition: p_buildfiles.c:360
struct GWB_PROJECT GWB_PROJECT
Definition: project.h:14
void GWB_BuildSubCmd_SetCommand(GWB_BUILD_SUBCMD *cmd, const char *s)
Definition: buildsubcmd.c:107
#define GWB_BUILD_CMD_FLAGS_CHECK_DATES
Definition: buildcmd.h:25
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
int GWB_ParseBuildFiles(GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
Definition: p_buildfiles.c:57
void GWBUILD_AddFilesFromStringList(GWB_FILE_LIST2 *mainFileList, const char *sFolder, const GWEN_STRINGLIST *fileNameList, GWB_FILE_LIST2 *outFileList, uint32_t flagsToAdd, int copyFileForOutList)
Definition: gwenbuild.c:1000
void GWB_Builder_AddRelativeFolderToBuffer(const GWB_CONTEXT *context, const char *folder, int useBuildDir, GWEN_BUFFER *argBuffer)
Definition: builder.c:276
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
Definition: buffer.c:650
static int _parseBuildOutputFiles(GWB_BUILD_CMD *bcmd, GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
Definition: p_buildfiles.c:163
GWEN_BUFFER * GWB_Parser_ReadXmlDataIntoBufferAndExpand(GWEN_DB_NODE *db, GWEN_XMLNODE *xmlNode)
Definition: parser.c:332
GWEN_XMLNODE * GWEN_XMLNode_GetChild(const GWEN_XMLNODE *n)
Definition: xml.c:409
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
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
Definition: stringlist.c:62
GWB_FILE_LIST2 * GWB_Project_GetFileList(const GWB_PROJECT *project)
Definition: project.c:205
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 GWB_BuildCmd_SetBuilderName(GWB_BUILD_CMD *bcmd, const char *s)
Definition: buildcmd.c:155
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
GWEN_XMLNODE_TYPE GWEN_XMLNode_GetType(const GWEN_XMLNODE *n)
Definition: xml.c:458
void GWB_Target_AddExplicitBuild(GWB_TARGET *target, GWB_BUILD_CMD *bcmd)
Definition: target.c:280
#define GWB_BUILD_CMD_FLAGS_DEL_OUTFILES
Definition: buildcmd.h:26
GWB_FILE_LIST2 * GWB_BuildCmd_GetOutFileList2(const GWB_BUILD_CMD *bcmd)
Definition: buildcmd.c:270
GWEN_XMLNODE * GWEN_XMLNode_Next(const GWEN_XMLNODE *n)
Definition: xml.c:465
struct GWEN_STRINGLISTSTRUCT GWEN_STRINGLIST
Definition: stringlist.h:56
#define GWEN_ERROR_GENERIC
Definition: error.h:62
#define GWB_BUILD_CMD_FLAGS_AUTO
Definition: buildcmd.h:27
static int _parseBuildInputFiles(GWB_BUILD_CMD *bcmd, GWB_PROJECT *project, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode)
Definition: p_buildfiles.c:143
GWEN_STRINGLIST * GWEN_StringList_fromString(const char *str, const char *delimiters, int checkDouble)
Definition: stringlist.c:746
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
struct GWB_BUILD_SUBCMD GWB_BUILD_SUBCMD
Definition: buildsubcmd.h:16
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
GWEN_XMLNODE_TYPE
Definition: xml.h:142
static GWB_BUILD_SUBCMD * _parseBuildCommand(GWB_BUILD_CMD *bcmd, GWB_CONTEXT *currentContext, GWEN_XMLNODE *xmlNode, GWEN_DB_NODE *dbForCmd)
Definition: p_buildfiles.c:183
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
const char * GWEN_XMLNode_GetData(const GWEN_XMLNODE *n)
Definition: xml.c:370
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
static int _readFilesFromDataNode(GWEN_XMLNODE *xmlNode, GWEN_DB_NODE *dbVars, const char *sCurrentRelativeDir, GWB_FILE_LIST2 *projectFileList, GWB_FILE_LIST2 *targetFileList, uint32_t flagsToAdd)
Definition: p_buildfiles.c:262
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
Definition: db.c:997
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
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:178
GWB_TARGET * GWB_Context_GetCurrentTarget(const GWB_CONTEXT *ctx)
Definition: context.c:460
void GWB_BuildCmd_AddBuildCommand(GWB_BUILD_CMD *bcmd, GWB_BUILD_SUBCMD *cmd)
Definition: buildcmd.c:217
GWEN_DB_NODE * GWEN_DB_Group_new(const char *name)
Definition: db.c:173
int GWEN_XMLNode_ExpandProperties(const GWEN_XMLNODE *n, GWEN_DB_NODE *dbVars)
Definition: xml.c:634
const char * GWB_Context_GetCurrentRelativeDir(const GWB_CONTEXT *ctx)
Definition: context.c:255
void GWB_BuildCmd_free(GWB_BUILD_CMD *bcmd)
Definition: buildcmd.c:97
struct GWEN__XMLNODE GWEN_XMLNODE
Definition: xml.h:156
#define GWB_FILE_FLAGS_GENERATED
Definition: file.h:23
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989
GWB_FILE * GWB_File_List2_GetAt(const GWB_FILE_LIST2 *fileList, int index)
Definition: file.c:619