void linkBaseExecutable() { char *cout = out; #if !defined(HOST_OS_WINDOWS) /* bit of a hack ... */ if ( embed_shared ) { linkSharedObject(); return; } #endif #if defined(HOST_TOOLCHAIN_MSC) { char tmp[MAXPATHLEN]; sprintf(tmp, "/out:%s", cout); prependArgList(&ldoptions, tmp); } concatArgList(&ldoptions, "", &ofiles); /* object files */ exportlibdirs(); if ( !nolibswipl ) { appendArgList(&ldoptions, pllib); /* -lswipl */ addOptionString(pllibs); } concatArgList(&ldoptions, "", &libs); /* libraries */ concatArgList(&ldoptions, "", &lastlibs); /* libraries */ #else /* !defined(HOST_TOOLCHAIN_MSC) */ prependArgList(&ldoptions, cout); prependArgList(&ldoptions, "-o"); /* -o ctmp */ concatArgList(&ldoptions, "", &ofiles); /* object files */ concatArgList(&ldoptions, "-L", &libdirs); /* library directories */ if ( !nolibswipl ) { appendArgList(&ldoptions, pllib); /* -lswipl */ addOptionString(pllibs); } concatArgList(&ldoptions, "", &libs); /* libraries */ concatArgList(&ldoptions, "", &lastlibs); /* libraries */ #endif /* !defined(HOST_TOOLCHAIN_MSC) */ if ( !nostate ) { #if defined(HOST_TOOLCHAIN_MSC) if ( !embed_shared ) { char buf[MAXPATHLEN]; appendArgList(&tmpfiles, replaceExtension(cout, "exp", buf)); appendArgList(&tmpfiles, replaceExtension(cout, "lib", buf)); } #endif } callprog(ld, &ldoptions); }
void createSavedState() { char buf[1024]; char *e; int n; strcpy(buf, "consult(["); e = buf + strlen(buf); for(n=0; n<plfiles.size; n++) { if ( n > 0 ) *e++ = ','; quoted_name(plfiles.list[n], e); e += strlen(e); } for(n=0; n<qlfiles.size; n++) { if ( n > 0 ) *e++ = ','; quoted_name(qlfiles.list[n], e); e += strlen(e); } strcpy(e, "]),qsave_program("); e += strlen(e); quoted_name(pltmp, e); e += strlen(e); strcpy(e, ",["); e += strlen(e); e = put_pl_option(e, "goal", plgoal); *e++ = ','; e = put_pl_option(e, "toplevel", pltoplevel); *e++ = ','; e = put_pl_option(e, "init_file", plinitfile); if ( plclass ) { *e++ = ','; e = put_pl_option(e, "class", plclass); } strcpy(e, "])"); e += strlen(e); appendArgList(&ploptions, "-f"); appendArgList(&ploptions, "none"); appendArgList(&ploptions, "-F"); appendArgList(&ploptions, plsysinit); appendArgList(&ploptions, "-g"); appendArgList(&ploptions, "true"); appendArgList(&ploptions, "-t"); appendArgList(&ploptions, buf); appendArgList(&tmpfiles, pltmp); callprog(pl, &ploptions); }
static void compileFile(const char *compiler, arglist *options, const char *cfile) { char ofile[MAXPATHLEN]; char *ext; arglist *args = copyArgList(options); if ( opt_o && nolink ) { strcpy(ofile, out); } else { strcpy(ofile, cfile); if ( (ext = (char *)file_name_extension(ofile)) ) strcpy(ext, EXT_OBJ); } if ( !opt_E ) prependArgList(args, "-c"); #if defined(HOST_OS_WINDOWS) appendArgList(args, "-D__WINDOWS__"); appendArgList(args, "-D_WINDOWS"); #endif appendArgList(args, "-D__SWI_PROLOG__"); if ( !shared ) appendArgList(args, "-D__SWI_EMBEDDED__"); concatArgList(args, "-I", &includedirs); if ( opt_o || !opt_E ) { appendArgList(args, "-o"); appendArgList(args, ofile); } appendArgList(args, cfile); callprog(compiler, args); appendArgList(&ofiles, ofile); if ( !nolink ) appendArgList(&tmpfiles, ofile); freeArgList(args); }
int main(int argc, char **argv) { int special; plld = argv[0]; argc--; argv++; catchSignals(); if ( argc == 0 ) { fprintf(stderr, "No input files. Use %s -help.\n", plld); exit(0); } putenv("PLLD=true"); /* for subprograms */ verbose = FALSE; if ( argc > 2 && streq(argv[0], "-pl") ) special = 2; else special = 0; /* swipl-ld [-pl x] -v: verbose */ if ( argc-special == 1 && streq(argv[special], "-v") ) { arglist coptions; int i; memset(&coptions, 0, sizeof(coptions)); for(i=special; i < argc; i++) appendArgList(&coptions, argv[i]); callprog(PROG_CC, &coptions); return 0; } parseOptions(argc, argv); defaultProgram(&pl, PROG_PL); if ( build_defaults ) { nostate = TRUE; /* not needed and Prolog won't run */ defaultProgram(&cc, C_CC); #ifdef PLBASE defaultPath(&plbase, PLBASE); #else defaultPath(&plbase, PLHOME); #endif defaultPath(&plarch, PLARCH); defaultProgram(&pllib, C_PLLIB); addOptionString(C_LIBS); appendArgList(&ldoptions, C_LDFLAGS); appendArgList(&coptions, C_CFLAGS); appendArgList(&cppoptions, C_CFLAGS); #ifdef SO_EXT soext = strdup(SO_EXT); #endif #ifdef O_PLMT ensureOption(&coptions, "-D_REENTRANT"); ensureOption(&cppoptions, "-D_REENTRANT"); #ifdef _THREAD_SAFE /* FreeBSD */ ensureOption(&coptions, "-D_THREAD_SAFE"); ensureOption(&cppoptions, "-D_THREAD_SAFE"); #endif #endif } else { getPrologOptions(); } fillDefaultOptions(); if ( show_version ) { callprog(cc, &coptions); exit(0); } compileObjectFiles(); if ( !nolink ) { if ( shared ) linkSharedObject(); else { linkBaseExecutable(); if ( !nostate ) { createSavedState(); createOutput(); } } } removeTempFiles(); return 0; }
void linkSharedObject() { char soname[MAXPATHLEN]; char *soout; if ( !soext ) soext = SO_EXT; if ( file_name_extension(out) ) { soout = out; } else { soout = replaceExtension(out, soext, soname); } #if defined(HOST_TOOLCHAIN_MSC) prependArgList(&ldoptions, "/dll"); { char tmp[MAXPATHLEN]; sprintf(tmp, "/out:%s", soout); prependArgList(&ldoptions, tmp); } concatArgList(&ldoptions, "", &ofiles); /* object files */ exportlibdirs(); if ( !nolibswipl ) { appendArgList(&ldoptions, pllib); /* swipl.lib */ addOptionString(pllibs); } concatArgList(&ldoptions, "", &libs); /* libraries */ concatArgList(&ldoptions, "", &lastlibs); /* libraries */ #else /* !defined(HOST_TOOLCHAIN_MSC) */ #ifdef __CYGWIN__ prependArgList(&ldoptions, SO_LDFLAGS); prependArgList(&ldoptions, soout); prependArgList(&ldoptions, "-o"); /* -o ctmp */ concatArgList(&ldoptions, "", &ofiles); /* object files */ if ( !nolibswipl ) { appendArgList(&ldoptions, pllib); /* -lswipl */ addOptionString(pllibs); } concatArgList(&ldoptions, "-L", &libdirs); /* library directories */ concatArgList(&ldoptions, "", &libs); /* libraries */ concatArgList(&ldoptions, "", &lastlibs); /* libraries */ #else /*__CYGWIN__*/ #ifdef SO_FORMAT_LDFLAGS /* must specify output too */ { char tmp[MAXPATHLEN]; tmp[0] = UNQUOTED; sprintf(&tmp[1], SO_FORMAT_LDFLAGS); prependArgList(&ldoptions, tmp); } #else prependArgList(&ldoptions, SO_LDFLAGS); prependArgList(&ldoptions, soout); prependArgList(&ldoptions, "-o"); /* -o ctmp */ #endif /*SO_FORMAT_LDFLAGS*/ concatArgList(&ldoptions, "", &ofiles); /* object files */ concatArgList(&ldoptions, "-L", &libdirs); /* library directories */ concatArgList(&ldoptions, "", &libs); /* libraries */ #ifdef O_SHARED_KERNEL if ( !nolibswipl ) #endif { appendArgList(&ldoptions, pllib); /* -lswipl */ } concatArgList(&ldoptions, "", &lastlibs); /* libraries */ #ifdef __BEOS__ appendArgList(&ldoptions, plexe); /* last is executable */ #endif #endif /*__CYGWIN__*/ #endif /* !defined(HOST_TOOLCHAIN_MSC) */ callprog(ld, &ldoptions); }