gwenhywfar  5.10.1
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 
26 int 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\"");
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  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 
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
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