gwenhywfar  5.10.1
trycompile.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 
15 
16 #include <gwenhywfar/syncio.h>
17 #include <gwenhywfar/process.h>
18 #include <gwenhywfar/debug.h>
19 
20 #include <unistd.h>
21 #include <stdlib.h>
22 
23 
24 
25 
26 int GWB_Tools_TryCompile(GWB_CONTEXT *context, const char *testCode)
27 {
28  GWEN_BUFFER *argBuffer;
29  GWEN_BUFFER *stdOutBuffer;
30  GWEN_BUFFER *stdErrBuffer;
31  const char *toolName;
32  const char *s;
33  int rv;
34 
35  toolName=GWEN_DB_GetCharValue(GWB_Context_GetVars(context), "GWBUILD_TOOL_CC", 0, "gcc");
36  if (!(toolName && *toolName)) {
37  DBG_ERROR(NULL, "No tool name for \"CC\"");
38  return GWEN_ERROR_INTERNAL;
39  }
40 
41  rv=GWEN_SyncIo_Helper_WriteFile("conftest.c", (const uint8_t*) testCode, strlen(testCode));
42  if (rv<0) {
43  DBG_ERROR(NULL, "Error writing conftest.c (%d)", rv);
44  return rv;
45  }
46 
47  stdOutBuffer=GWEN_Buffer_new(0, 256, 0, 1);
48  stdErrBuffer=GWEN_Buffer_new(0, 256, 0, 1);
49 
50  argBuffer=GWEN_Buffer_new(0, 256, 0, 1);
51  s=GWEN_DB_GetCharValue(GWB_Context_GetVars(context), "cflags", 0, NULL);
52  if (s) {
53  if (GWEN_Buffer_GetUsedBytes(argBuffer))
54  GWEN_Buffer_AppendString(argBuffer, " ");
55  GWEN_Buffer_AppendString(argBuffer, s);
56  }
57  s=GWEN_DB_GetCharValue(GWB_Context_GetVars(context), "local/cflags", 0, NULL);
58  if (s) {
59  if (GWEN_Buffer_GetUsedBytes(argBuffer))
60  GWEN_Buffer_AppendString(argBuffer, " ");
61  GWEN_Buffer_AppendString(argBuffer, s);
62  }
63  if (GWEN_Buffer_GetUsedBytes(argBuffer))
64  GWEN_Buffer_AppendString(argBuffer, " ");
65  GWEN_Buffer_AppendString(argBuffer, "-c -fPIC -o conftest.o conftest.c");
66 
67 
68  rv=GWEN_Process_RunCommandWaitAndGather(toolName, GWEN_Buffer_GetStart(argBuffer), stdOutBuffer, stdErrBuffer);
69  if (rv<0) {
70  DBG_ERROR(NULL, "Error running gcc (%d)", rv);
71  GWEN_Buffer_free(argBuffer);
72  GWEN_Buffer_free(stdErrBuffer);
73  GWEN_Buffer_free(stdOutBuffer);
74  unlink("conftest.c");
75  return rv;
76  }
77  GWEN_Buffer_free(argBuffer);
78  GWEN_Buffer_free(stdErrBuffer);
79  GWEN_Buffer_free(stdOutBuffer);
80 
81  unlink("conftest.c");
82  unlink("conftest.o");
83 
84  return rv;
85 }
86 
87 
88 
89 int GWB_Tools_CheckCompilerArgs(GWB_CONTEXT *context, const char *compilerArgs)
90 {
91  GWEN_BUFFER *stdOutBuffer;
92  GWEN_BUFFER *stdErrBuffer;
93  const char *toolName;
94  int rv;
95  const char *testCode="int main(int argc, char **argv) { return 0;};\n";
96  GWEN_BUFFER *argBuffer;
97 
98 
99  toolName=GWEN_DB_GetCharValue(GWB_Context_GetVars(context), "GWBUILD_TOOL_CC", 0, "gcc");
100  if (!(toolName && *toolName)) {
101  DBG_ERROR(NULL, "No tool name for \"CC\"");
102  return GWEN_ERROR_INTERNAL;
103  }
104 
105  rv=GWEN_SyncIo_Helper_WriteFile("conftest.c", (const uint8_t*) testCode, strlen(testCode));
106  if (rv<0) {
107  DBG_ERROR(NULL, "Error writing conftest.c (%d)", rv);
108  return rv;
109  }
110 
111  stdOutBuffer=GWEN_Buffer_new(0, 256, 0, 1);
112  stdErrBuffer=GWEN_Buffer_new(0, 256, 0, 1);
113 
114  argBuffer=GWEN_Buffer_new(0, 256, 0, 1);
115  GWEN_Buffer_AppendString(argBuffer, compilerArgs);
116  GWEN_Buffer_AppendString(argBuffer, " -c -fPIC conftest.c -o conftest.o");
117 
118  rv=GWEN_Process_RunCommandWaitAndGather(toolName, GWEN_Buffer_GetStart(argBuffer), stdOutBuffer, stdErrBuffer);
119  if (rv<0) {
120  DBG_ERROR(NULL, "Error running gcc (%d)", rv);
121  GWEN_Buffer_free(argBuffer);
122  GWEN_Buffer_free(stdErrBuffer);
123  GWEN_Buffer_free(stdOutBuffer);
124  unlink("conftest.c");
125  return rv;
126  }
127  GWEN_Buffer_free(argBuffer);
128  GWEN_Buffer_free(stdErrBuffer);
129  GWEN_Buffer_free(stdOutBuffer);
130 
131  unlink("conftest.c");
132  unlink("conftest.o");
133 
134  return rv;
135 }
136 
137 
138 
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
struct GWB_CONTEXT GWB_CONTEXT
Definition: context.h:17
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition: buffer.c:277
GWENHYWFAR_API int GWEN_Process_RunCommandWaitAndGather(const char *prg, const char *args, GWEN_BUFFER *stdOutBuffer, GWEN_BUFFER *stdErrBuffer)
Definition: process_all.c:31
#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
int GWB_Tools_TryCompile(GWB_CONTEXT *context, const char *testCode)
Definition: trycompile.c:26
int GWB_Tools_CheckCompilerArgs(GWB_CONTEXT *context, const char *compilerArgs)
Definition: trycompile.c:89
GWEN_DB_NODE * GWB_Context_GetVars(const GWB_CONTEXT *ctx)
Definition: context.c:427
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
Definition: db.c:971
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
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
#define GWEN_ERROR_INTERNAL
Definition: error.h:125
int GWEN_SyncIo_Helper_WriteFile(const char *fName, const uint8_t *ptrSource, uint64_t lenSource)
Definition: syncio.c:586
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:989