From 0913c3d46b180e40867e7de6a062582acd1902e9 Mon Sep 17 00:00:00 2001 From: midipix Date: Sat, 16 Apr 2016 20:53:08 -0400 Subject: link mode: .deps file generation: initial implementation. --- include/slibtool/slibtool.h | 1 + src/logic/slbt_exec_ctx.c | 3 +++ src/logic/slbt_exec_link.c | 58 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+) diff --git a/include/slibtool/slibtool.h b/include/slibtool/slibtool.h index 265ba49..24dd8be 100644 --- a/include/slibtool/slibtool.h +++ b/include/slibtool/slibtool.h @@ -100,6 +100,7 @@ struct slbt_exec_ctx { char ** lout[2]; char ** sentinel; FILE * fwrapper; + FILE * fdeps; char * csrc; char * ldirname; char * lbasename; diff --git a/src/logic/slbt_exec_ctx.c b/src/logic/slbt_exec_ctx.c index 39fa26c..37bb475 100644 --- a/src/logic/slbt_exec_ctx.c +++ b/src/logic/slbt_exec_ctx.c @@ -329,6 +329,9 @@ static int slbt_free_exec_ctx_impl( if (ictx->ctx.fwrapper) fclose(ictx->ctx.fwrapper); + if (ictx->ctx.fdeps) + fclose(ictx->ctx.fdeps); + free(ictx->args); free(ictx->shadow); free (ictx); diff --git a/src/logic/slbt_exec_link.c b/src/logic/slbt_exec_link.c index 501486f..3fd35ad 100644 --- a/src/logic/slbt_exec_link.c +++ b/src/logic/slbt_exec_link.c @@ -245,6 +245,56 @@ static int slbt_exec_link_remove_file( return -1; } +static int slbt_exec_link_create_dep_file( + struct slbt_exec_ctx * ectx, + char ** altv, + const char * libfilename) +{ + char ** parg; + char * popt; + char * plib; + char depfile[PATH_MAX]; + + if (ectx->fdeps) + fclose(ectx->fdeps); + + if ((size_t)snprintf(depfile,sizeof(depfile),"%s.slibtool.deps", + libfilename) + >= sizeof(depfile)) + return -1; + + if (!(ectx->fdeps = fopen(depfile,"w"))) + return -1; + + for (parg=altv; *parg; parg++) { + popt = 0; + plib = 0; + + if (!strcmp(*parg,"-l")) { + popt = *parg++; + plib = *parg; + } else if (!strcmp(*parg,"--library")) { + popt = *parg++; + plib = *parg; + } else if (!strncmp(*parg,"-l",2)) { + popt = *parg; + plib = popt + 2; + } else if (!strncmp(*parg,"--library=",10)) { + popt = *parg; + plib = popt + 10; + } + + if (plib) + if (fprintf(ectx->fdeps,"-l%s\n",plib) < 0) + return -1; + } + + if (fflush(ectx->fdeps)) + return -1; + + return 0; +} + static int slbt_exec_link_create_archive( const struct slbt_driver_ctx * dctx, struct slbt_exec_ctx * ectx, @@ -298,6 +348,10 @@ static int slbt_exec_link_create_archive( if (slbt_exec_link_remove_file(dctx,ectx,output)) return -1; + /* .deps */ + if (slbt_exec_link_create_dep_file(ectx,ectx->cargv,arfilename)) + return -1; + /* ar spawn */ if ((slbt_spawn(ectx,true) < 0) || ectx->exitcode) return -1; @@ -413,6 +467,10 @@ static int slbt_exec_link_create_library( if (slbt_output_link(dctx,ectx)) return -1; + /* .deps */ + if (slbt_exec_link_create_dep_file(ectx,ectx->argv,dsofilename)) + return -1; + /* spawn */ if ((slbt_spawn(ectx,true) < 0) || ectx->exitcode) return -1; -- cgit v1.2.3