diff options
Diffstat (limited to 'src/driver/slbt_driver_ctx.c')
-rw-r--r-- | src/driver/slbt_driver_ctx.c | 493 |
1 files changed, 2 insertions, 491 deletions
diff --git a/src/driver/slbt_driver_ctx.c b/src/driver/slbt_driver_ctx.c index ec468a2..2eee876 100644 --- a/src/driver/slbt_driver_ctx.c +++ b/src/driver/slbt_driver_ctx.c @@ -48,9 +48,6 @@ static const struct slbt_fd_ctx slbt_default_fdctx = { .fdlog = (-1), }; -/* default compiler argv */ -static char * slbt_default_cargv[] = {"cc",0}; - static const char aclr_reset [] = "\x1b[0m"; static const char aclr_bold [] = "\x1b[1m"; static const char aclr_red [] = "\x1b[31m"; @@ -94,7 +91,7 @@ static void slbt_output_raw_vector(int fderr, char ** argv, char ** envp, bool f slbt_dprintf(fderr,"%s\n\n",fcolor ? aclr_reset : ""); } -static uint64_t slbt_argv_flags(uint64_t flags) +uint64_t slbt_argv_flags(uint64_t flags) { uint32_t ret = 0; @@ -137,7 +134,7 @@ static int slbt_free_argv_buffer( return -1; } -static int slbt_driver_usage( +int slbt_driver_usage( int fdout, const char * program, const char * arg, @@ -224,492 +221,6 @@ static int slbt_get_driver_ctx_fail( return -1; } -static int slbt_split_argv( - char ** argv, - uint64_t flags, - struct slbt_split_vector * sargv, - struct slbt_obj_list ** aobjlistv, - int fderr, - int fdcwd) -{ - int i; - int argc; - int objc; - const char * program; - char * compiler; - char * csysroot; - char ** dargv; - char ** targv; - char ** cargv; - char ** objp; - struct slbt_obj_list * objlistv; - struct slbt_obj_list * objlistp; - char * dst; - bool flast; - bool fcopy; - bool altmode; - size_t size; - const char * base; - struct argv_meta * meta; - struct argv_entry * entry; - struct argv_entry * mode; - struct argv_entry * help; - struct argv_entry * version; - struct argv_entry * config; - struct argv_entry * finish; - struct argv_entry * features; - struct argv_entry * ccwrap; - struct argv_entry * dumpmachine; - struct argv_entry * aropt; - const struct argv_option ** popt; - const struct argv_option ** optout; - const struct argv_option * optv[SLBT_OPTV_ELEMENTS]; - struct argv_ctx ctx = {ARGV_VERBOSITY_NONE, - ARGV_MODE_SCAN, - 0,0,0,0,0,0,0}; - - program = argv_program_name(argv[0]); - - /* missing arguments? */ - if ((altmode = (flags & SLBT_DRIVER_MODE_AR))) { - argv_optv_init(slbt_ar_options,optv); - } else { - argv_optv_init(slbt_default_options,optv); - } - - - if (!argv[1] && !altmode && (flags & SLBT_DRIVER_VERBOSITY_USAGE)) - return slbt_driver_usage( - fderr,program, - 0,optv,0,sargv,0, - !!getenv("NO_COLOR")); - - /* initial argv scan: ... --mode=xxx ... <compiler> ... */ - argv_scan(argv,optv,&ctx,0); - - /* invalid slibtool arguments? */ - if (ctx.erridx && !ctx.unitidx && altmode) { - if (flags & SLBT_DRIVER_VERBOSITY_ERRORS) - argv_get( - argv,optv, - slbt_argv_flags(flags), - fderr); - return -1; - } - - /* error possibly due to an altmode argument? */ - if (ctx.erridx && !ctx.unitidx) - ctx.unitidx = ctx.erridx; - - /* obtain slibtool's own arguments */ - if (ctx.unitidx) { - compiler = argv[ctx.unitidx]; - argv[ctx.unitidx] = 0; - - meta = argv_get(argv,optv,ARGV_VERBOSITY_NONE,fderr); - argv[ctx.unitidx] = compiler; - } else { - meta = argv_get(argv,optv,ARGV_VERBOSITY_NONE,fderr); - } - - if (!meta) { - if (flags & SLBT_DRIVER_VERBOSITY_ERRORS) - argv_get( - argv,optv, - slbt_argv_flags(flags), - fderr); - return -1; - } - - /* missing all of --mode, --help, --version, --config, --dumpmachine, --features, and --finish? */ - mode = help = version = config = finish = features = ccwrap = dumpmachine = aropt = 0; - - for (entry=meta->entries; entry->fopt; entry++) - if (entry->tag == TAG_MODE) - mode = entry; - else if (entry->tag == TAG_HELP) - help = entry; - else if (entry->tag == TAG_VERSION) - version = entry; - else if (entry->tag == TAG_CONFIG) - config = entry; - else if (entry->tag == TAG_FINISH) - finish = entry; - else if (entry->tag == TAG_FEATURES) - features = entry; - else if (entry->tag == TAG_CCWRAP) - ccwrap = entry; - else if (entry->tag == TAG_DUMPMACHINE) - dumpmachine = entry; - - /* alternate execusion mode? */ - if (!altmode && mode && !strcmp(mode->arg,"ar")) - aropt = mode; - - /* release temporary argv meta context */ - argv_free(meta); - - /* error not due to an altmode argument? */ - if (!aropt && ctx.erridx && (ctx.erridx == ctx.unitidx)) { - if (flags & SLBT_DRIVER_VERBOSITY_ERRORS) - argv_get( - argv,optv, - slbt_argv_flags(flags), - fderr); - return -1; - } - - if (!mode && !help && !version && !config && !finish && !features && !dumpmachine && !altmode) { - slbt_dprintf(fderr, - "%s: error: --mode must be specified.\n", - program); - return -1; - } - - /* missing compiler? */ - if (!ctx.unitidx && !help && !version && !finish && !features && !dumpmachine && !altmode && !aropt) { - if (flags & SLBT_DRIVER_VERBOSITY_ERRORS) - slbt_dprintf(fderr, - "%s: error: <compiler> is missing.\n", - program); - return -1; - } - - /* clone and normalize the argv vector (-l, --library) */ - for (argc=0,size=0,dargv=argv; *dargv; argc++,dargv++) - size += strlen(*dargv) + 1; - - if (!(sargv->dargv = calloc(argc+1,sizeof(char *)))) - return -1; - - else if (!(sargv->dargs = calloc(1,size+1))) - return -1; - - else if (!(*aobjlistv = calloc(argc,sizeof(**aobjlistv)))) { - free(sargv->dargv); - free(sargv->dargs); - return -1; - } - - objlistv = *aobjlistv; - objlistp = objlistv; - csysroot = 0; - - for (i=0,flast=false,dargv=sargv->dargv,dst=sargv->dargs; i<argc; i++) { - if ((fcopy = (flast || altmode || aropt))) { - (void)0; - - } else if (!strcmp(argv[i],"--")) { - flast = true; - fcopy = true; - - } else if (!strcmp(argv[i],"-l")) { - *dargv++ = dst; - *dst++ = '-'; - *dst++ = 'l'; - strcpy(dst,argv[++i]); - dst += strlen(dst)+1; - - } else if (!strncmp(argv[i],"-l",2)) { - fcopy = true; - - } else if (!strcmp(argv[i],"--library")) { - *dargv++ = dst; - *dst++ = '-'; - *dst++ = 'l'; - strcpy(dst,argv[++i]); - dst += strlen(dst)+1; - - } else if (!strncmp(argv[i],"--library=",10)) { - *dargv++ = dst; - *dst++ = '-'; - *dst++ = 'l'; - strcpy(dst,&argv[++i][10]); - dst += strlen(dst)+1; - - } else if (!strcmp(argv[i],"-L")) { - *dargv++ = dst; - *dst++ = '-'; - *dst++ = 'L'; - strcpy(dst,argv[++i]); - dst += strlen(dst)+1; - - } else if (!strncmp(argv[i],"-L",2)) { - fcopy = true; - - } else if (!strcmp(argv[i],"-Xlinker")) { - *dargv++ = dst; - *dst++ = '-'; - *dst++ = 'W'; - *dst++ = 'l'; - *dst++ = ','; - strcpy(dst,argv[++i]); - dst += strlen(dst)+1; - - } else if (!strcmp(argv[i],"--library-path")) { - *dargv++ = dst; - *dst++ = '-'; - *dst++ = 'L'; - strcpy(dst,argv[++i]); - dst += strlen(dst)+1; - - } else if (!strncmp(argv[i],"--library-path=",15)) { - *dargv++ = dst; - *dst++ = '-'; - *dst++ = 'L'; - strcpy(dst,&argv[i][15]); - dst += strlen(dst)+1; - - } else if (!strcmp(argv[i],"--sysroot") && (i<ctx.unitidx)) { - *dargv++ = dst; - csysroot = dst; - strcpy(dst,argv[i]); - dst[9] = '='; - strcpy(&dst[10],argv[++i]); - dst += strlen(dst)+1; - ctx.unitidx--; - - } else if (!strncmp(argv[i],"--sysroot=",10) && (i<ctx.unitidx)) { - *dargv++ = dst; - csysroot = dst; - strcpy(dst,argv[i]); - dst += strlen(dst)+1; - - } else if (!strcmp(argv[i],"-objectlist")) { - *dargv++ = dst; - strcpy(dst,argv[i++]); - dst += strlen(dst)+1; - - objlistp->name = dst; - objlistp++; - fcopy = true; - - } else { - fcopy = true; - } - - if (fcopy) { - *dargv++ = dst; - strcpy(dst,argv[i]); - dst += strlen(dst)+1; - } - } - - /* update argc,argv */ - argc = dargv - sargv->dargv; - argv = sargv->dargv; - - /* iterate through the object list vector: map, parse, store */ - for (objlistp=objlistv; objlistp->name; objlistp++) - if (slbt_objlist_read(fdcwd,objlistp) < 0) - return -1; - - for (objc=0,objlistp=objlistv; objlistp->name; objlistp++) - objc += objlistp->objc; - - /* allocate split vectors, account for cargv's added sysroot */ - if ((sargv->targv = calloc(objc + 2*(argc+3),sizeof(char *)))) - sargv->cargv = sargv->targv + argc + 2; - else - return -1; - - /* --features and no <compiler>? */ - if (ctx.unitidx) { - (void)0; - - } else if (help || version || features || dumpmachine || altmode) { - for (i=0; i<argc; i++) - sargv->targv[i] = argv[i]; - - sargv->cargv = altmode ? sargv->targv : slbt_default_cargv; - - return 0; - } - - /* --mode=ar and no ar-specific arguments? */ - if (aropt && !ctx.unitidx) - ctx.unitidx = argc; - - /* split vectors: slibtool's own options */ - for (i=0; i<ctx.unitidx; i++) - sargv->targv[i] = argv[i]; - - /* split vector marks */ - targv = sargv->targv + i; - cargv = sargv->cargv; - - /* known wrappers */ - if (ctx.unitidx && !ccwrap && !aropt) { - if ((base = strrchr(argv[i],'/'))) - base++; - else if ((base = strrchr(argv[i],'\\'))) - base++; - else - base = argv[i]; - - if (!strcmp(base,"ccache") - || !strcmp(base,"distcc") - || !strcmp(base,"compiler") - || !strcmp(base,"purify")) { - *targv++ = "--ccwrap"; - *targv++ = argv[i++]; - } - } - - /* split vectors: legacy mixture */ - for (optout=optv; optout[0] && (optout[0]->tag != TAG_OUTPUT); optout++) - (void)0; - - /* compiler, archiver, etc. */ - if (altmode) { - i = 0; - } else if (aropt) { - *cargv++ = argv[0]; - } else { - *cargv++ = argv[i++]; - } - - /* sysroot */ - if (csysroot) - *cargv++ = csysroot; - - /* remaining vector */ - for (objlistp=objlistv; i<argc; i++) { - if (aropt && (i >= ctx.unitidx)) { - *cargv++ = argv[i]; - - } else if (argv[i][0] != '-') { - if (argv[i+1] && (argv[i+1][0] == '+') - && (argv[i+1][1] == '=') - && (argv[i+1][2] == 0) - && !(strrchr(argv[i],'.'))) - /* libfoo_la_LDFLAGS += -Wl,.... */ - i++; - else - *cargv++ = argv[i]; - - /* must capture -objectlist prior to -o */ - } else if (!(strcmp("objectlist",&argv[i][1]))) { - for (objp=objlistp->objv; *objp; objp++) - *cargv++ = *objp; - - i++; - objlistp++; - - } else if (argv[i][1] == 'o') { - *targv++ = argv[i]; - - if (argv[i][2] == 0) - *targv++ = argv[++i]; - } else if ((argv[i][1] == 'W') && (argv[i][2] == 'c')) { - *cargv++ = argv[i]; - - } else if (!(strcmp("Xcompiler",&argv[i][1]))) { - *cargv++ = argv[++i]; - - } else if (!(strcmp("XCClinker",&argv[i][1]))) { - *cargv++ = argv[++i]; - - } else if ((argv[i][1] == 'R') && (argv[i][2] == 0)) { - *targv++ = argv[i++]; - *targv++ = argv[i]; - - } else if (argv[i][1] == 'R') { - *targv++ = argv[i]; - - } else if (!(strncmp("-target=",&argv[i][1],8))) { - *cargv++ = argv[i]; - *targv++ = argv[i]; - - } else if (!(strcmp("-target",&argv[i][1]))) { - *cargv++ = argv[i]; - *targv++ = argv[i++]; - - *cargv++ = argv[i]; - *targv++ = argv[i]; - - } else if (!(strcmp("target",&argv[i][1]))) { - *cargv++ = argv[i]; - *targv++ = argv[i++]; - - *cargv++ = argv[i]; - *targv++ = argv[i]; - - } else if (!(strncmp("-sysroot=",&argv[i][1],9))) { - *cargv++ = argv[i]; - *targv++ = argv[i]; - - } else if (!(strcmp("-sysroot",&argv[i][1]))) { - *cargv++ = argv[i]; - *targv++ = argv[i++]; - - *cargv++ = argv[i]; - *targv++ = argv[i]; - - } else if (!(strcmp("bindir",&argv[i][1]))) { - *targv++ = argv[i++]; - *targv++ = argv[i]; - - } else if (!(strcmp("shrext",&argv[i][1]))) { - *targv++ = argv[i++]; - *targv++ = argv[i]; - - } else if (!(strcmp("rpath",&argv[i][1]))) { - *targv++ = argv[i++]; - *targv++ = argv[i]; - - } else if (!(strcmp("release",&argv[i][1]))) { - *targv++ = argv[i++]; - *targv++ = argv[i]; - - } else if (!(strcmp("dlopen",&argv[i][1]))) { - *targv++ = argv[i++]; - *targv++ = argv[i]; - - } else if (!(strcmp("weak",&argv[i][1]))) { - *targv++ = argv[i++]; - *targv++ = argv[i]; - - } else if (!(strcmp("static-libtool-libs",&argv[i][1]))) { - *targv++ = argv[i]; - - } else if (!(strcmp("export-dynamic",&argv[i][1]))) { - *targv++ = argv[i]; - - } else if (!(strcmp("export-symbols",&argv[i][1]))) { - *targv++ = argv[i++]; - *targv++ = argv[i]; - - } else if (!(strcmp("export-symbols-regex",&argv[i][1]))) { - *targv++ = argv[i++]; - *targv++ = argv[i]; - - } else if (!(strcmp("version-info",&argv[i][1]))) { - *targv++ = argv[i++]; - *targv++ = argv[i]; - - } else if (!(strcmp("version-number",&argv[i][1]))) { - *targv++ = argv[i++]; - *targv++ = argv[i]; - - } else if (!(strcmp("dlpreopen",&argv[i][1]))) { - (void)0; - - } else { - for (popt=optout; popt[0] && popt[0]->long_name; popt++) - if (!(strcmp(popt[0]->long_name,&argv[i][1]))) - break; - - if (popt[0] && popt[0]->long_name) - *targv++ = argv[i]; - else - *cargv++ = argv[i]; - } - } - - return 0; -} - static int slbt_init_version_info( struct slbt_driver_ctx_impl * ictx, |