gwenhywfar  5.10.1
builder.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/types/builder_p.h"
16 
17 #include <gwenhywfar/debug.h>
18 #include <gwenhywfar/memory.h>
19 #include <gwenhywfar/directory.h>
20 
21 
22 
25 
26 
27 
28 GWB_BUILDER *GWB_Builder_new(GWENBUILD *gwenbuild, GWB_CONTEXT *context, const char *typeName)
29 {
30  GWB_BUILDER *builder;
31 
32  GWEN_NEW_OBJECT(GWB_BUILDER, builder);
34  builder->gwenbuild=gwenbuild;
35  builder->context=context;
36  if (typeName)
37  builder->typeName=strdup(typeName);
38  return builder;
39 }
40 
41 
42 
44 {
45  if (builder) {
47 
48  free(builder->targetLinkSpec);
49  free(builder->typeName);
50  GWB_File_List2_free(builder->inputFileList2);
51  GWB_File_List2_free(builder->outputFileList2);
52  }
53 }
54 
55 
56 
58 {
59  return builder->gwenbuild;
60 }
61 
62 
63 
64 uint32_t GWB_Builder_GetId(const GWB_BUILDER *builder)
65 {
66  return builder->id;
67 }
68 
69 
70 
71 const char *GWB_Builder_GetTypeName(const GWB_BUILDER *builder)
72 {
73  return builder->typeName;
74 }
75 
76 
77 
78 const char *GWB_Builder_GetTargetLinkSpec(const GWB_BUILDER *builder)
79 {
80  return builder->targetLinkSpec;
81 }
82 
83 
84 
85 void GWB_Builder_SetTargetLinkSpec(GWB_BUILDER *builder, const char *s)
86 {
87  free(builder->targetLinkSpec);
88  builder->targetLinkSpec=s?strdup(s):NULL;
89 }
90 
91 
92 
94 {
95  return builder->context;
96 }
97 
98 
99 
100 GWB_FILE_LIST2 *GWB_Builder_GetInputFileList2(const GWB_BUILDER *builder)
101 {
102  return builder->inputFileList2;
103 }
104 
105 
106 
108 {
109  if (builder->inputFileList2==NULL)
110  builder->inputFileList2=GWB_File_List2_new();
111  GWB_File_List2_PushBack(builder->inputFileList2, f);
112 }
113 
114 
115 
116 GWB_FILE_LIST2 *GWB_Builder_GetOutputFileList2(const GWB_BUILDER *builder)
117 {
118  return builder->outputFileList2;
119 }
120 
121 
122 
124 {
125  if (builder->outputFileList2==NULL)
126  builder->outputFileList2=GWB_File_List2_new();
127  GWB_File_List2_PushBack(builder->outputFileList2, f);
128 }
129 
130 
131 
133 {
134  return builder->numBlockingInputFiles;
135 }
136 
137 
138 
140 {
141  builder->numBlockingInputFiles++;
142  return builder->numBlockingInputFiles;
143 }
144 
145 
146 
148 {
149  if (builder->numBlockingInputFiles>0)
150  builder->numBlockingInputFiles--;
151  return builder->numBlockingInputFiles;
152 }
153 
154 
155 
157 {
158  if (builder->isAcceptableInputFn)
159  return builder->isAcceptableInputFn(builder, file);
160  else
162 }
163 
164 
165 
167 {
168  if (builder->addBuildCmdFn)
169  return builder->addBuildCmdFn(builder, bctx);
170  else
172 }
173 
174 
175 
177 {
178  if (builder->addSourceFileFn)
179  return builder->addSourceFileFn(builder, f);
180 }
181 
182 
183 
186 {
188 
189  oldFn=builder->isAcceptableInputFn;
190  builder->isAcceptableInputFn=fn;
191  return oldFn;
192 }
193 
194 
195 
197 {
199 
200  oldFn=builder->addBuildCmdFn;
201  builder->addBuildCmdFn=fn;
202  return oldFn;
203 }
204 
205 
206 
208 {
210 
211  oldFn=builder->addSourceFileFn;
212  builder->addSourceFileFn=fn;
213  return oldFn;
214 }
215 
216 
217 
218 void GWB_Builder_AddFileNamesToBuffer(const GWB_CONTEXT *context, const GWB_FILE_LIST2 *inFileList, GWEN_BUFFER *argBuffer)
219 {
220  GWB_FILE_LIST2_ITERATOR *it;
221  int entriesAdded=0;
222 
223  it=GWB_File_List2_First(inFileList);
224  if (it) {
225  GWB_FILE *file;
226 
227  file=GWB_File_List2Iterator_Data(it);
228  while(file) {
229  if (entriesAdded)
230  GWEN_Buffer_AppendString(argBuffer, " ");
231  GWB_Builder_AddFileNameToBuffer(context, file, argBuffer);
232  entriesAdded++;
233  file=GWB_File_List2Iterator_Next(it);
234  }
235  GWB_File_List2Iterator_free(it);
236  }
237 }
238 
239 
240 
241 void GWB_Builder_AddFileNameToBuffer(const GWB_CONTEXT *context, const GWB_FILE *file, GWEN_BUFFER *argBuffer)
242 {
243  const char *folder;
244  const char *buildDir;
245  const char *initialSourceDir;
246  GWEN_BUFFER *realFileFolderBuffer;
247  GWEN_BUFFER *relBuffer;
248 
249  buildDir=GWB_Context_GetCurrentBuildDir(context);
250  initialSourceDir=GWB_Context_GetInitialSourceDir(context);
251 
252  folder=GWB_File_GetFolder(file);
253 
254  realFileFolderBuffer=GWEN_Buffer_new(0, 256, 0, 1);
256  GWEN_Buffer_AppendString(realFileFolderBuffer, initialSourceDir);
257  GWEN_Buffer_AppendString(realFileFolderBuffer, GWEN_DIR_SEPARATOR_S);
258  }
259  GWEN_Buffer_AppendString(realFileFolderBuffer, folder);
260 
261  relBuffer=GWEN_Buffer_new(0, 256, 0, 1);
262  GWEN_Path_GetPathBetween(buildDir, GWEN_Buffer_GetStart(realFileFolderBuffer), relBuffer);
263 
264  if (GWEN_Buffer_GetUsedBytes(relBuffer))
266  GWEN_Buffer_AppendString(relBuffer, GWB_File_GetName(file));
267 
268  GWEN_Buffer_AppendString(argBuffer, GWEN_Buffer_GetStart(relBuffer));
269 
270  GWEN_Buffer_free(relBuffer);
271  GWEN_Buffer_free(realFileFolderBuffer);
272 }
273 
274 
275 
276 void GWB_Builder_AddRelativeFolderToBuffer(const GWB_CONTEXT *context, const char *folder, int useBuildDir, GWEN_BUFFER *argBuffer)
277 {
278  const char *buildDir;
279  const char *initialSourceDir;
280  GWEN_BUFFER *realFileFolderBuffer;
281  GWEN_BUFFER *relBuffer;
282 
283  buildDir=GWB_Context_GetCurrentBuildDir(context);
284  initialSourceDir=GWB_Context_GetInitialSourceDir(context);
285 
286  realFileFolderBuffer=GWEN_Buffer_new(0, 256, 0, 1);
287  if (!useBuildDir) {
288  GWEN_Buffer_AppendString(realFileFolderBuffer, initialSourceDir);
289  GWEN_Buffer_AppendString(realFileFolderBuffer, GWEN_DIR_SEPARATOR_S);
290  }
291  if (folder)
292  GWEN_Buffer_AppendString(realFileFolderBuffer, folder);
293 
294  relBuffer=GWEN_Buffer_new(0, 256, 0, 1);
295  GWEN_Path_GetPathBetween(buildDir, GWEN_Buffer_GetStart(realFileFolderBuffer), relBuffer);
296 #if 0
297  DBG_ERROR(NULL, "Paths: [%s]->[%s]: [%s]",
298  buildDir,
299  GWEN_Buffer_GetStart(realFileFolderBuffer),
300  GWEN_Buffer_GetStart(relBuffer));
301 #endif
302  if (GWEN_Buffer_GetUsedBytes(relBuffer)>0)
303  GWEN_Buffer_AppendString(argBuffer, GWEN_Buffer_GetStart(relBuffer));
304  else
305  GWEN_Buffer_AppendString(argBuffer, ".");
306  GWEN_Buffer_free(relBuffer);
307  GWEN_Buffer_free(realFileFolderBuffer);
308 }
309 
310 
311 
312 void GWB_Builder_AddAbsFileNameToBuffer(const GWB_CONTEXT *context, const GWB_FILE *file, GWEN_BUFFER *argBuffer)
313 {
314  const char *folder;
315  const char *initialSourceDir;
316  GWEN_BUFFER *realFileFolderBuffer;
317  GWEN_BUFFER *absBuffer;
318 
319  initialSourceDir=GWB_Context_GetInitialSourceDir(context);
320 
321  folder=GWB_File_GetFolder(file);
322 
323  realFileFolderBuffer=GWEN_Buffer_new(0, 256, 0, 1);
325  GWEN_Buffer_AppendString(realFileFolderBuffer, initialSourceDir);
326  GWEN_Buffer_AppendString(realFileFolderBuffer, GWEN_DIR_SEPARATOR_S);
327  }
328  GWEN_Buffer_AppendString(realFileFolderBuffer, folder);
329 
330  absBuffer=GWEN_Buffer_new(0, 256, 0, 1);
331  GWEN_Directory_GetAbsoluteFolderPath(GWEN_Buffer_GetStart(realFileFolderBuffer), absBuffer);
332 
333  if (GWEN_Buffer_GetUsedBytes(absBuffer))
335  GWEN_Buffer_AppendString(absBuffer, GWB_File_GetName(file));
336 
337  GWEN_Buffer_AppendString(argBuffer, GWEN_Buffer_GetStart(absBuffer));
338 
339  GWEN_Buffer_free(absBuffer);
340  GWEN_Buffer_free(realFileFolderBuffer);
341 }
342 
343 
344 
345 void GWB_Builder_Dump(const GWB_BUILDER *builder, int indent, int fullDump)
346 {
347  int i;
348 
349  for(i=0; i<indent; i++)
350  fprintf(stderr, " ");
351  fprintf(stderr, "Builder:\n");
352 
353  GWBUILD_Debug_PrintValue( "typeName.......", builder->typeName, indent+2);
354  GWBUILD_Debug_PrintFileList2("inputFileList2.", builder->inputFileList2, indent+2);
355  GWBUILD_Debug_PrintFileList2("outputFileList2", builder->outputFileList2, indent+2);
356  if (fullDump)
357  GWB_Context_Dump(builder->context, indent+2);
358 
359 }
360 
361 
362 
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
GWENHYWFAR_API int GWEN_Directory_GetAbsoluteFolderPath(const char *folder, GWEN_BUFFER *tbuf)
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
#define GWEN_LIST2_FUNCTIONS(t, pr)
Definition: list2.h:99
#define GWEN_INHERIT_FINI(t, element)
Definition: inherit.h:238
#define GWEN_DIR_SEPARATOR_S
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition: buffer.c:277
void GWB_Builder_free(GWB_BUILDER *builder)
Definition: builder.c:43
void GWB_Builder_AddInputFile(GWB_BUILDER *builder, GWB_FILE *f)
Definition: builder.c:107
struct GWB_FILE GWB_FILE
Definition: file.h:18
struct GWB_BUILD_CONTEXT GWB_BUILD_CONTEXT
Definition: buildctx.h:16
#define NULL
Definition: binreloc.c:300
void GWB_Builder_SetTargetLinkSpec(GWB_BUILDER *builder, const char *s)
Definition: builder.c:85
int GWB_Builder_AddBuildCmd(GWB_BUILDER *builder, GWB_BUILD_CONTEXT *bctx)
Definition: builder.c:166
void GWB_Builder_AddOutputFile(GWB_BUILDER *builder, GWB_FILE *f)
Definition: builder.c:123
void GWB_Builder_AddFileNameToBuffer(const GWB_CONTEXT *context, const GWB_FILE *file, GWEN_BUFFER *argBuffer)
Definition: builder.c:241
void GWB_Builder_AddSourceFile(GWB_BUILDER *builder, GWB_FILE *f)
Definition: builder.c:176
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
int GWB_Builder_GetNumBlockingInputFiles(const GWB_BUILDER *builder)
Definition: builder.c:132
void GWB_Builder_AddRelativeFolderToBuffer(const GWB_CONTEXT *context, const char *folder, int useBuildDir, GWEN_BUFFER *argBuffer)
Definition: builder.c:276
int(* GWEN_BUILDER_ISACCEPTABLEINPUT_FN)(GWB_BUILDER *builder, const GWB_FILE *file)
Definition: builder_be.h:16
const char * GWB_File_GetFolder(const GWB_FILE *f)
Definition: file.c:127
const char * GWB_File_GetName(const GWB_FILE *f)
Definition: file.c:146
void GWBUILD_Debug_PrintValue(const char *sName, const char *sValue, int indent)
Definition: gwenbuild.c:225
GWB_FILE_LIST2 * GWB_Builder_GetOutputFileList2(const GWB_BUILDER *builder)
Definition: builder.c:116
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:55
const char * GWB_Context_GetInitialSourceDir(const GWB_CONTEXT *ctx)
Definition: context.c:285
int(* GWEN_BUILDER_ADDBUILDCMD_FN)(GWB_BUILDER *builder, GWB_BUILD_CONTEXT *bctx)
Definition: builder_be.h:17
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
int GWB_Builder_IncNumBlockingInputFiles(GWB_BUILDER *builder)
Definition: builder.c:139
GWENBUILD * GWB_Builder_GetGwenbuild(const GWB_BUILDER *builder)
Definition: builder.c:57
GWB_CONTEXT * GWB_Builder_GetContext(const GWB_BUILDER *builder)
Definition: builder.c:93
int GWB_Builder_DecNumBlockingInputFiles(GWB_BUILDER *builder)
Definition: builder.c:147
void GWBUILD_Debug_PrintFileList2(const char *sName, const GWB_FILE_LIST2 *fileList2, int indent)
Definition: gwenbuild.c:334
#define GWEN_INHERIT_INIT(t, element)
Definition: inherit.h:223
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
const char * GWB_Builder_GetTargetLinkSpec(const GWB_BUILDER *builder)
Definition: builder.c:78
void GWB_Builder_AddFileNamesToBuffer(const GWB_CONTEXT *context, const GWB_FILE_LIST2 *inFileList, GWEN_BUFFER *argBuffer)
Definition: builder.c:218
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
uint32_t GWB_File_GetFlags(const GWB_FILE *f)
Definition: file.c:99
int GWEN_Path_GetPathBetween(const char *path1, const char *path2, GWEN_BUFFER *diffBuf)
Definition: path.c:427
struct GWB_BUILDER GWB_BUILDER
Definition: builder.h:17
void GWB_Context_Dump(const GWB_CONTEXT *ctx, int indent)
Definition: context.c:598
int GWB_Builder_IsAcceptableInput(GWB_BUILDER *builder, const GWB_FILE *file)
Definition: builder.c:156
void GWB_Builder_Dump(const GWB_BUILDER *builder, int indent, int fullDump)
Definition: builder.c:345
uint32_t GWB_Builder_GetId(const GWB_BUILDER *builder)
Definition: builder.c:64
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
const char * GWB_Builder_GetTypeName(const GWB_BUILDER *builder)
Definition: builder.c:71
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
#define GWEN_INHERIT_FUNCTIONS(t)
Definition: inherit.h:163
#define GWB_FILE_FLAGS_GENERATED
Definition: file.h:23
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989
void(* GWB_BUILDER_ADDSOURCEFILE_FN)(GWB_BUILDER *builder, GWB_FILE *f)
Definition: builder_be.h:18
const char * GWB_Context_GetCurrentBuildDir(const GWB_CONTEXT *ctx)
Definition: context.c:184
#define GWEN_ERROR_NOT_IMPLEMENTED
Definition: error.h:108