summaryrefslogtreecommitdiff
path: root/src/iconc/ccomp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/iconc/ccomp.c')
-rw-r--r--src/iconc/ccomp.c130
1 files changed, 130 insertions, 0 deletions
diff --git a/src/iconc/ccomp.c b/src/iconc/ccomp.c
new file mode 100644
index 0000000..5b86189
--- /dev/null
+++ b/src/iconc/ccomp.c
@@ -0,0 +1,130 @@
+/*
+ * ccomp.c - routines for compiling and linking the C program produced
+ * by the translator.
+ */
+#include "../h/gsupport.h"
+#include "cglobals.h"
+#include "ctrans.h"
+#include "ctree.h"
+#include "ccode.h"
+#include "csym.h"
+#include "cproto.h"
+
+extern char *refpath;
+
+#define ExeFlag "-o"
+#define LinkLibs " -lm"
+
+/*
+ * Structure to hold the list of Icon run-time libraries that must be
+ * linked in.
+ */
+struct lib {
+ char *libname;
+ int nm_sz;
+ struct lib *next;
+ };
+static struct lib *liblst;
+static int lib_sz = 0;
+
+/*
+ * addlib - add a new library to the list the must be linked.
+ */
+void addlib(libname)
+char *libname;
+ {
+ static struct lib **nxtlib = &liblst;
+ struct lib *l;
+
+ l = NewStruct(lib);
+ l->libname = libname;
+ l->nm_sz = strlen(libname);
+ l->next = NULL;
+ *nxtlib = l;
+ nxtlib = &l->next;
+ lib_sz += l->nm_sz + 1;
+ }
+
+/*
+ * ccomp - perform C compilation and linking.
+ */
+int ccomp(srcname, exename)
+char *srcname;
+char *exename;
+ {
+ struct lib *l;
+ char sbuf[MaxPath]; /* file name construction buffer */
+ char *buf;
+ char *s;
+ char *dlrgint;
+ int cmd_sz, opt_sz, flg_sz, exe_sz, src_sz;
+
+ /*
+ * Compute the sizes of the various parts of the command line
+ * to do the compilation.
+ */
+ cmd_sz = strlen(c_comp);
+ opt_sz = strlen(c_opts);
+ flg_sz = strlen(ExeFlag);
+ exe_sz = strlen(exename);
+ src_sz = strlen(srcname);
+ lib_sz += strlen(LinkLibs);
+ if (!largeints) {
+ dlrgint = makename(sbuf, refpath, "dlrgint", ObjSuffix);
+ lib_sz += strlen(dlrgint) + 1;
+ }
+
+#ifdef Graphics
+ lib_sz += strlen(" -L") +
+ strlen(refpath) +
+ strlen(" -lIgpx ");
+ lib_sz += strlen(ICONC_XLIB);
+#endif /* Graphics */
+
+ buf = alloc((unsigned int)cmd_sz + opt_sz + flg_sz + exe_sz + src_sz +
+ lib_sz + 5);
+ strcpy(buf, c_comp);
+ s = buf + cmd_sz;
+ *s++ = ' ';
+ strcpy(s, c_opts);
+ s += opt_sz;
+ *s++ = ' ';
+ strcpy(s, ExeFlag);
+ s += flg_sz;
+ *s++ = ' ';
+ strcpy(s, exename);
+ s += exe_sz;
+ *s++ = ' ';
+ strcpy(s, srcname);
+ s += src_sz;
+ if (!largeints) {
+ *s++ = ' ';
+ strcpy(s, dlrgint);
+ s += strlen(dlrgint);
+ }
+ for (l = liblst; l != NULL; l = l->next) {
+ *s++ = ' ';
+ strcpy(s, l->libname);
+ s += l->nm_sz;
+ }
+
+#ifdef Graphics
+ strcpy(s," -L");
+ strcat(s, refpath);
+ strcat(s," -lIgpx ");
+ strcat(s, ICONC_XLIB);
+ s += strlen(s);
+#endif /* Graphics */
+
+ strcpy(s, LinkLibs);
+
+ if (system(buf) != 0)
+ return EXIT_FAILURE;
+ strcpy(buf, "strip ");
+ s = buf + 6;
+ strcpy(s, exename);
+ system(buf);
+
+
+ return EXIT_SUCCESS;
+ }