gwenhywfar 5.14.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
26int 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\"");
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
89int 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
#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:992
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
GWEN_DB_NODE * GWB_Context_GetVars(const GWB_CONTEXT *ctx)
Definition context.c:427
struct GWB_CONTEXT GWB_CONTEXT
Definition context.h:17
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
Definition db.c:971
#define DBG_ERROR(dbg_logger, format,...)
Definition debug.h:97
#define GWEN_ERROR_INTERNAL
Definition error.h:125
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition buffer.h:38
GWENHYWFAR_API int GWEN_Process_RunCommandWaitAndGather(const char *prg, const char *args, GWEN_BUFFER *stdOutBuffer, GWEN_BUFFER *stdErrBuffer)
Definition process_all.c:31
int GWEN_SyncIo_Helper_WriteFile(const char *fName, const uint8_t *ptrSource, uint64_t lenSource)
Definition syncio.c:586
int GWB_Tools_CheckCompilerArgs(GWB_CONTEXT *context, const char *compilerArgs)
Definition trycompile.c:89
int GWB_Tools_TryCompile(GWB_CONTEXT *context, const char *testCode)
Definition trycompile.c:26