gwenhywfar 5.12.0
trylink.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_TryLink(GWB_CONTEXT *context, const char *testCode, const char *libName)
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 argBuffer=GWEN_Buffer_new(0, 256, 0, 1);
50
51 s=GWEN_DB_GetCharValue(GWB_Context_GetVars(context), "ldflags", 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/ldflags", 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, "-fPIC conftest.c -o conftest");
66 if (libName) {
67 GWEN_Buffer_AppendString(argBuffer, " -l");
68 GWEN_Buffer_AppendString(argBuffer, libName);
69 }
70
71 rv=GWEN_Process_RunCommandWaitAndGather(toolName, GWEN_Buffer_GetStart(argBuffer), stdOutBuffer, stdErrBuffer);
72 if (rv<0) {
73 DBG_ERROR(NULL, "Error running gcc (%d)", rv);
74 GWEN_Buffer_free(argBuffer);
75 GWEN_Buffer_free(stdErrBuffer);
76 GWEN_Buffer_free(stdOutBuffer);
77 return rv;
78 }
79 GWEN_Buffer_free(argBuffer);
80 GWEN_Buffer_free(stdErrBuffer);
81 GWEN_Buffer_free(stdOutBuffer);
82
83 unlink("conftest.c");
84 unlink("conftest");
85
86 return rv;
87}
88
89
90
#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