diff options
Diffstat (limited to 'src/iconc/ccomp.c')
-rw-r--r-- | src/iconc/ccomp.c | 130 |
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; + } |