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
28GWB_BUILDER *GWB_Builder_new(GWENBUILD *gwenbuild, GWB_CONTEXT *context, const char *typeName)
29{
30 GWB_BUILDER *builder;
31
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
64uint32_t GWB_Builder_GetId(const GWB_BUILDER *builder)
65{
66 return builder->id;
67}
68
69
70
71const char *GWB_Builder_GetTypeName(const GWB_BUILDER *builder)
72{
73 return builder->typeName;
74}
75
76
77
78const char *GWB_Builder_GetTargetLinkSpec(const GWB_BUILDER *builder)
79{
80 return builder->targetLinkSpec;
81}
82
83
84
85void 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
100GWB_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
116GWB_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
218void 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
241void 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))
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
276void 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
312void 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))
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
345void 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
#define NULL
Definition: binreloc.c:300
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition: buffer.c:277
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
struct GWB_BUILD_CONTEXT GWB_BUILD_CONTEXT
Definition: buildctx.h:16
void GWB_Builder_AddAbsFileNameToBuffer(const GWB_CONTEXT *context, const GWB_FILE *file, GWEN_BUFFER *argBuffer)
Definition: builder.c:312
int GWB_Builder_AddBuildCmd(GWB_BUILDER *builder, GWB_BUILD_CONTEXT *bctx)
Definition: builder.c:166
GWB_FILE_LIST2 * GWB_Builder_GetOutputFileList2(const GWB_BUILDER *builder)
Definition: builder.c:116
GWB_BUILDER_ADDSOURCEFILE_FN GWB_Builder_SetAddSourceFileFn(GWB_BUILDER *builder, GWB_BUILDER_ADDSOURCEFILE_FN fn)
Definition: builder.c:207
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
GWB_BUILDER * GWB_Builder_new(GWENBUILD *gwenbuild, GWB_CONTEXT *context, const char *typeName)
Definition: builder.c:28
int GWB_Builder_IsAcceptableInput(GWB_BUILDER *builder, const GWB_FILE *file)
Definition: builder.c:156
void GWB_Builder_AddInputFile(GWB_BUILDER *builder, GWB_FILE *f)
Definition: builder.c:107
GWEN_BUILDER_ISACCEPTABLEINPUT_FN GWB_Builder_SetIsAcceptableInputFn(GWB_BUILDER *builder, GWEN_BUILDER_ISACCEPTABLEINPUT_FN fn)
Definition: builder.c:184
int GWB_Builder_IncNumBlockingInputFiles(GWB_BUILDER *builder)
Definition: builder.c:139
void GWB_Builder_AddSourceFile(GWB_BUILDER *builder, GWB_FILE *f)
Definition: builder.c:176
const char * GWB_Builder_GetTypeName(const GWB_BUILDER *builder)
Definition: builder.c:71
void GWB_Builder_free(GWB_BUILDER *builder)
Definition: builder.c:43
void GWB_Builder_Dump(const GWB_BUILDER *builder, int indent, int fullDump)
Definition: builder.c:345
int GWB_Builder_DecNumBlockingInputFiles(GWB_BUILDER *builder)
Definition: builder.c:147
uint32_t GWB_Builder_GetId(const GWB_BUILDER *builder)
Definition: builder.c:64
int GWB_Builder_GetNumBlockingInputFiles(const GWB_BUILDER *builder)
Definition: builder.c:132
GWEN_BUILDER_ADDBUILDCMD_FN GWB_Builder_SetAddBuildCmdFn(GWB_BUILDER *builder, GWEN_BUILDER_ADDBUILDCMD_FN fn)
Definition: builder.c:196
void GWB_Builder_SetTargetLinkSpec(GWB_BUILDER *builder, const char *s)
Definition: builder.c:85
GWB_FILE_LIST2 * GWB_Builder_GetInputFileList2(const GWB_BUILDER *builder)
Definition: builder.c:100
void GWB_Builder_AddFileNamesToBuffer(const GWB_CONTEXT *context, const GWB_FILE_LIST2 *inFileList, GWEN_BUFFER *argBuffer)
Definition: builder.c:218
void GWB_Builder_AddFileNameToBuffer(const GWB_CONTEXT *context, const GWB_FILE *file, GWEN_BUFFER *argBuffer)
Definition: builder.c:241
void GWB_Builder_AddOutputFile(GWB_BUILDER *builder, GWB_FILE *f)
Definition: builder.c:123
const char * GWB_Builder_GetTargetLinkSpec(const GWB_BUILDER *builder)
Definition: builder.c:78
void GWB_Builder_AddRelativeFolderToBuffer(const GWB_CONTEXT *context, const char *folder, int useBuildDir, GWEN_BUFFER *argBuffer)
Definition: builder.c:276
struct GWB_BUILDER GWB_BUILDER
Definition: builder.h:17
void(* GWB_BUILDER_ADDSOURCEFILE_FN)(GWB_BUILDER *builder, GWB_FILE *f)
Definition: builder_be.h:18
int(* GWEN_BUILDER_ADDBUILDCMD_FN)(GWB_BUILDER *builder, GWB_BUILD_CONTEXT *bctx)
Definition: builder_be.h:17
int(* GWEN_BUILDER_ISACCEPTABLEINPUT_FN)(GWB_BUILDER *builder, const GWB_FILE *file)
Definition: builder_be.h:16
void GWB_Context_Dump(const GWB_CONTEXT *ctx, int indent)
Definition: context.c:598
const char * GWB_Context_GetInitialSourceDir(const GWB_CONTEXT *ctx)
Definition: context.c:285
const char * GWB_Context_GetCurrentBuildDir(const GWB_CONTEXT *ctx)
Definition: context.c:184
struct GWB_CONTEXT GWB_CONTEXT
Definition: context.h:17
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
GWENHYWFAR_API int GWEN_Directory_GetAbsoluteFolderPath(const char *folder, GWEN_BUFFER *tbuf)
#define GWEN_ERROR_NOT_IMPLEMENTED
Definition: error.h:108
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
uint32_t GWB_File_GetFlags(const GWB_FILE *f)
Definition: file.c:99
struct GWB_FILE GWB_FILE
Definition: file.h:18
#define GWB_FILE_FLAGS_GENERATED
Definition: file.h:23
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
void GWBUILD_Debug_PrintFileList2(const char *sName, const GWB_FILE_LIST2 *fileList2, int indent)
Definition: gwenbuild.c:334
void GWBUILD_Debug_PrintValue(const char *sName, const char *sValue, int indent)
Definition: gwenbuild.c:225
struct GWENBUILD GWENBUILD
Definition: gwenbuild.h:15
#define GWEN_DIR_SEPARATOR_S
#define GWEN_INHERIT_FUNCTIONS(t)
Definition: inherit.h:163
#define GWEN_INHERIT_INIT(t, element)
Definition: inherit.h:223
#define GWEN_INHERIT_FINI(t, element)
Definition: inherit.h:238
#define GWEN_LIST2_FUNCTIONS(t, pr)
Definition: list2.h:99
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:55
int GWEN_Path_GetPathBetween(const char *path1, const char *path2, GWEN_BUFFER *diffBuf)
Definition: path.c:427