From fe97e7cb46a373d0e1e2ac076271bde9a38083e9 Mon Sep 17 00:00:00 2001 From: midipix Date: Fri, 20 May 2016 20:54:35 -0400 Subject: link mode: support over-linking for an .la wrapper linker input argument. --- src/logic/slbt_exec_link.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/logic/slbt_exec_link.c b/src/logic/slbt_exec_link.c index 53ab54c..6f1bb33 100644 --- a/src/logic/slbt_exec_link.c +++ b/src/logic/slbt_exec_link.c @@ -430,7 +430,14 @@ static int slbt_exec_link_create_dep_file( char ** parg; char * popt; char * plib; + char * mark; + char * base; + size_t size; + FILE * fdeps; + char * deplib; + char deplibs[PATH_MAX]; char depfile[PATH_MAX]; + struct stat st; if (ectx->fdeps) fclose(ectx->fdeps); @@ -459,6 +466,40 @@ static int slbt_exec_link_create_dep_file( } else if (!strncmp(*parg,"--library=",10)) { popt = *parg; plib = popt + 10; + } else if ((popt = strrchr(*parg,'.')) && !strcmp(popt,".la")) { + /* import dependency list */ + if ((base = strrchr(*parg,'/'))) + base++; + else + base = *parg; + + strcpy(depfile,*parg); + mark = depfile + (base - *parg); + size = sizeof(depfile) - (base - *parg); + + if ((size_t)snprintf(mark,size,".libs/%s",base) + >= size) + return -1; + + mark = strrchr(mark,'.'); + size = sizeof(depfile) - (mark - depfile); + + if ((size_t)snprintf(mark,size,".a.slibtool.deps") + >= size) + return -1; + + if (stat(depfile,&st)) + return -1; + + if (!(fdeps = fopen(depfile,"r"))) + return -1; + + for (deplib=fgets(deplibs,st.st_size+1,fdeps); deplib; ) { + if (fprintf(ectx->fdeps,"%s",deplib) < 0) + return -1; + + deplib = fgets(deplibs,st.st_size+1,fdeps); + } } if (plib) -- cgit v1.2.3