diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/driver/slbt_driver_ctx.c | 46 | ||||
-rw-r--r-- | src/internal/slibtool_driver_impl.h | 1 | ||||
-rw-r--r-- | src/skin/slbt_skin_default.c | 4 |
3 files changed, 49 insertions, 2 deletions
diff --git a/src/driver/slbt_driver_ctx.c b/src/driver/slbt_driver_ctx.c index 37d5660..02b0617 100644 --- a/src/driver/slbt_driver_ctx.c +++ b/src/driver/slbt_driver_ctx.c @@ -277,6 +277,7 @@ static int slbt_split_argv( int argc; const char * program; char * compiler; + char * csysroot; char ** dargv; char ** targv; char ** cargv; @@ -377,6 +378,8 @@ static int slbt_split_argv( else if (!(sargv->dargs = calloc(1,size+1))) return -1; + csysroot = 0; + for (i=0,flast=false,dargv=sargv->dargv,dst=sargv->dargs; i<argc; i++) { if ((fcopy = flast)) { (void)0; @@ -441,6 +444,22 @@ static int slbt_split_argv( *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 { fcopy = true; } @@ -456,8 +475,8 @@ static int slbt_split_argv( argc = dargv - sargv->dargv; argv = sargv->dargv; - /* allocate split vectors */ - if ((sargv->targv = calloc(2*(argc+2),sizeof(char *)))) + /* allocate split vectors, account for cargv's added sysroot */ + if ((sargv->targv = calloc(2*(argc+3),sizeof(char *)))) sargv->cargv = sargv->targv + argc + 2; else return -1; @@ -502,6 +521,14 @@ static int slbt_split_argv( for (optout=optv; optout[0]->tag != TAG_OUTPUT; optout++) (void)0; + /* compiler */ + *cargv++ = argv[i++]; + + /* sysroot */ + if (csysroot) + *cargv++ = csysroot; + + /* remaining vector */ for (; i<argc; i++) { if (argv[i][0] != '-') { if (argv[i+1] && (argv[i+1][0] == '+') @@ -545,6 +572,17 @@ static int slbt_split_argv( *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]; @@ -1543,6 +1581,10 @@ int slbt_get_driver_ctx( cctx.rpath = entry->arg; break; + case TAG_SYSROOT: + cctx.sysroot = entry->arg; + break; + case TAG_RELEASE: cctx.release = entry->arg; break; diff --git a/src/internal/slibtool_driver_impl.h b/src/internal/slibtool_driver_impl.h index 120c2e3..c70c334 100644 --- a/src/internal/slibtool_driver_impl.h +++ b/src/internal/slibtool_driver_impl.h @@ -51,6 +51,7 @@ enum app_tags { TAG_LDRPATH, TAG_SHREXT, TAG_RPATH, + TAG_SYSROOT, TAG_RELEASE, TAG_DLOPEN, TAG_DLPREOPEN, diff --git a/src/skin/slbt_skin_default.c b/src/skin/slbt_skin_default.c index 5533b04..b499101 100644 --- a/src/skin/slbt_skin_default.c +++ b/src/skin/slbt_skin_default.c @@ -161,6 +161,10 @@ const struct argv_option slbt_default_options[] = { "where a library should eventually be " "installed, relative to $(DESTDIR)$(PREFIX)"}, + {"sysroot", 0,TAG_SYSROOT,ARGV_OPTARG_REQUIRED,0,0,"<sysroot>", + "an absolute sysroot path to pass to the compiler " + "or linker driver"}, + {"release", 0,TAG_RELEASE,ARGV_OPTARG_REQUIRED, ARGV_OPTION_HYBRID_ONLY|ARGV_OPTION_HYBRID_SPACE,0,0, "specify release information; this will result " |