41 #define BUFSIZE 1000000
55 char **targv=0,**ptr,**phelp;
59 actualdir=opendir(directory);
61 if(!actualdir)
return targv;
64 for(entry=readdir(actualdir);entry!=NULL;entry=readdir(actualdir))
67 if(strcmp(entry->d_name,
".")==0 ||
68 strcmp(entry->d_name,
"..")==0)
continue;
70 if(buffer) free(buffer);
71 buffer=(
char*) malloc((strlen(directory)+
72 strlen(entry->d_name)+2)*
sizeof(char));
73 strcpy(buffer,directory);
74 strncat(buffer,
"/",1);
75 strncat(buffer,entry->d_name,strlen(entry->d_name));
76 s=stat(buffer,&status);
79 if(S_ISDIR(status.st_mode))
87 targv=(
char**) malloc((*argc+targc)*
sizeof(
char*));
88 memcpy(targv,phelp,*argc*
sizeof(
char*));
89 memcpy(&targv[*argc],ptr,targc*
sizeof(
char*));
95 else if(S_ISREG(status.st_mode))
98 len=strlen(entry->d_name);
99 if(entry->d_name[len-2]==
'.' && entry->d_name[len-1]==
'd')
102 targv=(
char**) malloc((*argc+1)*
sizeof(
char*));
103 memcpy(targv,phelp,*argc*
sizeof(
char*));
104 targv[*argc]=strdup(buffer);
114 " No status - perhaps file %s does not exist.\n",
120 if(buffer) free(buffer);
127 int main (
int argc,
char** argv) {
130 char *ptr,*
p,**
pp,**pp1,**pp2,*directory=0,*libpath=0;
133 int i,optl=0,optm=0,swapping,
c,rargc;
136 #if defined ( _WIN32 ) || defined ( __CYGWIN__ ) || defined ( __CYGWIN32__ )
137 char *ntg4tmp=0,*ntg4tmp1=0;
147 struct libmap_ *next;
150 struct libmap_ *libmap=0,*libmapPtr=0,*libmapPtr1=0,*libmapPtr2=0,
151 *prevPtr1,*prevPtr2,*tmpp,*userLibmapPtr;
153 while((c=getopt(argc,argv,
"ld: m:"))!=EOF)
193 " ERROR: If you specify a directory don't also specify files\n");
198 if(optl)fprintf(stderr,
" Reading library name map file...\n");
203 if(feof(stdin))
break;
204 if (strlen(buffer) >=
BUFSIZE-1)
207 " Internal ERROR: BUFSIZE too small to read library name map file\n");
211 if ( buffer[strlen(buffer)-1] ==
'\n')
212 { buffer[strlen(buffer)-1]=
'\0'; }
214 ptr=strtok(buffer,
":\n");
217 for(libmapPtr1=libmap;libmapPtr1;libmapPtr1=libmapPtr1->next)
219 if(strcmp(libmapPtr1->lib,ptr)==0)
221 fprintf(stderr,
" ERROR: Duplicate library name: %s\n",ptr);
223 " Perhaps a duplicate subdirectory with"
224 " a GNUmakefile with the same library name.\n"
232 libmapPtr->next=(
struct libmap_*) malloc(
sizeof(
struct libmap_));
233 libmapPtr=libmapPtr->next;
237 libmap=(
struct libmap_*) malloc(
sizeof(
struct libmap_));
241 libmapPtr->lib=strdup(ptr);
243 libmapPtr->uses=(
char**)calloc(
NLIBMAX,
sizeof(
char*));
251 ptr=strtok(NULL,
" \n");
256 ptr=strtok(NULL,
" \n");
265 if (strlen(buffer) >=
BUFSIZE-1)
268 " Internal ERROR: BUFSIZE too small to read directory name\n");
272 if ( buffer[strlen(buffer)-1] ==
'\n')
273 { buffer[strlen(buffer)-1]=
'\0'; }
275 ptr=strtok(buffer,
"/");
278 fprintf(stderr,
" ERROR: \"/\" before \"source\" expected.\n");
281 while(ptr&&strcmp (ptr,
"source"))ptr=strtok(NULL,
"/");
282 ptr=strtok(NULL,
"/");
285 fprintf(stderr,
" ERROR: \"source\" expected.\n");
288 libmapPtr->trigger=(
char*)malloc(
TRIGSIZE);
291 fprintf(stderr,
" ERROR: String overflow for: %s\n", ptr);
294 strcpy(libmapPtr->trigger,ptr);
295 ptr=strtok(NULL,
"/");
296 while(ptr&&strcmp(ptr,
"GNUmakefile"))
298 strncat(libmapPtr->trigger,
"/",1);
299 strncat(libmapPtr->trigger,ptr,strlen(ptr));
300 ptr=strtok(NULL,
"/");
306 " ERROR: \"source/<unique-sub-path>/GNUmakefile\" expected.\n");
312 if(optl)fprintf(stderr,
" Reading dependency files...\n");
314 #if defined ( _WIN32 ) || defined ( __CYGWIN__ ) || defined ( __CYGWIN32__ )
315 ntg4tmp=getenv(
"G4TMP");
318 fprintf(stderr,
" ERROR: Cannot find environment variable G4TMP\n");
321 ntg4tmp1=strdup(ntg4tmp);
326 fp=fopen(rargv[i],
"r");
329 #if defined ( _WIN32 ) || defined ( __CYGWIN__ ) || defined ( __CYGWIN32__ )
330 ptr=strchr(ntg4tmp1,
':');
332 while ( ptr=strchr(buffer,
'\\') ) *ptr=
'/';
334 while (ntg4tmp1!=NULL && (ptr=strstr(buffer,ntg4tmp1))!=NULL )
336 for(nti=0;nti<strlen(ntg4tmp1);nti++) ptr[nti]=
' ';
341 ptr=strtok(buffer,
":");
344 for(libmapPtr=libmap;libmapPtr;libmapPtr=libmapPtr->next)
346 if(strlen(libmapPtr->lib)>256)
348 fprintf(stderr,
" ERROR: String overflow for: %s\n", libmapPtr->lib);
351 strcpy(workbuf,libmapPtr->lib);
353 strncat(workbuf,
"/",1);
354 if(strstr(ptr,workbuf))
break;
358 userLibmapPtr=libmapPtr;
368 bufferPtr=strtok(NULL,
"\n");
371 fprintf(stderr,
" WARNING: It seems there is nothing after \':\' in dependency file %s.\n", rargv[i]);
376 for(libmapPtr=libmap;libmapPtr;libmapPtr=libmapPtr->next)
379 if(strlen(libmapPtr->trigger)>256)
381 fprintf(stderr,
" ERROR: String overflow for: %s\n", libmapPtr->trigger);
384 strcpy(workbuf,libmapPtr->trigger);
385 strncat(workbuf,
"/include",8);
386 ptr=strstr(bufferPtr,workbuf);
387 if(ptr && (userLibmapPtr != libmapPtr))
392 for(pp=userLibmapPtr->uses;*pp;pp++)
394 if(strcmp(*pp,libmapPtr->lib)==0)
break;
396 if(!*pp)*pp=libmapPtr->lib;
405 if(strlen(libmapPtr->lib)>256)
407 fprintf(stderr,
" ERROR: String overflow for: %s\n", libmapPtr->lib);
410 strcpy(workbuf,libmapPtr->lib);
411 strncat(workbuf,
"/",1);
412 ptr=strstr(bufferPtr,workbuf);
413 if(ptr && (userLibmapPtr != libmapPtr))
418 for(pp=userLibmapPtr->uses;*pp;pp++)
420 if(strcmp(*pp,libmapPtr->lib)==0)
break;
422 if(!*pp)*pp=libmapPtr->lib;
429 #if defined ( _WIN32 ) || defined ( __CYGWIN__ ) || defined ( __CYGWIN32__ )
430 while ( ptr=strchr(buffer,
'\\') ) *ptr=
'/';
432 while (ntg4tmp1 && (ptr=strstr(buffer,ntg4tmp1)) )
434 for(nti=0;nti<strlen(ntg4tmp1);nti++) ptr[nti]=
' ';
444 #if defined ( _WIN32 ) || defined ( __CYGWIN__ ) || defined ( __CYGWIN32__ )
451 fprintf(stderr,
" Checking for circular dependencies...\n");
452 for(libmapPtr=libmap;libmapPtr;libmapPtr=libmapPtr->next)
454 for(pp=libmapPtr->uses;*pp;pp++)
456 for(libmapPtr1=libmap;libmapPtr1!=libmapPtr;
457 libmapPtr1=libmapPtr1->next)
459 if(strcmp(libmapPtr1->lib,*pp)==0)
461 for(pp1=libmapPtr1->uses;*pp1;pp1++)
463 if(strcmp(*pp1,libmapPtr->lib)==0)
break;
469 " WARNING: %s and %s use each other.\n",
501 fprintf(stderr,
" Reordering according to dependencies...\n");
506 for(libmapPtr=libmap;libmapPtr;libmapPtr=libmapPtr->next)
508 for(pp=libmapPtr->uses;*pp;pp++)
511 for(libmapPtr1=libmap;libmapPtr1!=libmapPtr;
512 libmapPtr1=libmapPtr1->next)
514 if(strcmp(libmapPtr1->lib,*pp)==0)
517 for(pp1=libmapPtr1->uses;*pp1;pp1++)
519 if(strcmp(*pp1,libmapPtr->lib)==0)
break;
527 prevPtr1->next=libmapPtr;
536 tmpp=libmapPtr->next;
537 if(libmapPtr1->next==libmapPtr)
539 libmapPtr->next=libmapPtr1;
543 libmapPtr->next=libmapPtr1->next;
547 if(libmapPtr1->next!=libmapPtr)
549 prevPtr2->next=libmapPtr1;
552 libmapPtr1->next=tmpp;
565 fprintf(stderr,
" Writing new library map file...\n");
566 for(libmapPtr=libmap;libmapPtr;libmapPtr=libmapPtr->next)
568 printf(
"%s:",libmapPtr->lib);
569 for(pp=libmapPtr->uses;*pp;pp++)
574 printf(
"source/%s/GNUmakefile\n",libmapPtr->trigger);
580 int libname_usable_size=24;
581 if ( ! libname ) libname=malloc(libname_usable_size+16);
584 for(libmapPtr=libmap;libmapPtr;libmapPtr=libmapPtr->next)
586 if ( strlen(libpath)+strlen(libmapPtr->lib) > libname_usable_size ) {
587 libname_usable_size=(strlen(libpath)+strlen(libmapPtr->lib))*2;
589 libname=malloc(libname_usable_size+16);
594 sprintf(libname,
"%s/lib%s.a", libpath, libmapPtr->lib);
595 if (access(libname,R_OK))
597 sprintf(libname,
"%s/lib%s.so", libpath, libmapPtr->lib);
598 if (!access(libname,R_OK))
600 printf(
"-l%s ",libmapPtr->lib);
604 sprintf(libname,
"%s/lib%s.dylib", libpath, libmapPtr->lib);
605 if (!access(libname,R_OK))
607 printf(
"-l%s ",libmapPtr->lib);
613 printf(
"-l%s ",libmapPtr->lib);
615 libmapPtr=libmapPtr->next;
621 for(libmapPtr=libmap;libmapPtr;libmapPtr=libmapPtr->next)
625 for(pp=libmapPtr->uses;*pp;pp++)
627 for(libmapPtr1=libmap;libmapPtr1;libmapPtr1=libmapPtr1->next)
629 if(strcmp(libmapPtr1->lib,*pp)==0)
639 for(libmapPtr=libmap;libmapPtr;libmapPtr=libmapPtr->next)
643 printf(
"-l%s ",libmapPtr->lib);