| // Copyright (C) 2016 and later: Unicode, Inc. and others. |
| // License & terms of use: http://www.unicode.org/copyright.html |
| /* Copyright (C) 2011 IBM Corporation and Others. All Rights Reserved */ |
| |
| /** |
| Input: |
| -o makeconv makeconv.o ucnvstat.o ../../lib/libicuuc48.so -qOPTION='*DUPPROC *DUPVAR*' |
| |
| CRTPGM PGM(SRLICU/MAKECONV) MODULE(SRLICU/MAKECONV SRLICU/UCNVSTAT SRLICU/GENMBCS SRLICU/GENCNVEX) BNDSRVPGM(SRLICU/LIBICUUC48 SRLICU/LIBICUTU48 SRLICU/LIBICUIN48) OPTION(*DUPPROC *DUPVAR) REPLACE(*YES) |
| |
| Handles .o ( modules ), .so ( srvpgm ), .a ( bnddir ). |
| |
| TODO: |
| |
| - cleanup |
| - much better error handling |
| - factor common code |
| - instead of caring about .o vs .so vs .a, just read the link - if it ends in .srvpgm then treat it as a service program, etc. |
| |
| */ |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <errno.h> |
| |
| #ifndef TEST_MODE |
| #define TEST_MODE 0 |
| #endif |
| |
| |
| #if !TEST_MODE |
| #include <qp0z1170.h> |
| #else |
| static int Qp0zSystem(const char *cmd) { |
| printf("CL: %s\n", cmd); |
| return 0; |
| } |
| #endif |
| |
| static int runcmd(const char *cmd) { |
| int rc; |
| printf("%s\n", cmd); |
| rc = Qp0zSystem(cmd); |
| if(rc==0) { |
| printf("..ok\n"); |
| return 0; |
| } else if(rc<0){ |
| printf("..Qp0zSystem failed.\n"); |
| return 1; |
| } else { |
| printf("..System call failed.\n"); |
| return 1; |
| } |
| } |
| |
| int main(int argc, const char *argv[]) { |
| int i; |
| |
| char buf[8048]; |
| char opt[4100]; |
| char objs[4024]; |
| char libs[4024]; |
| char bnddirs[4024]; |
| const char *prog=""; |
| const char *progshort=prog; |
| const char *outputdir=getenv("OUTPUTDIR"); |
| |
| printf("# OUTPUTDIR=%s ",outputdir); |
| for(i=0;i<argc;i++) { |
| printf("%s ", argv[i]); |
| } |
| printf("\n"); |
| |
| buf[0]=0; |
| opt[0]=0; |
| objs[0]=0; |
| libs[0]=0; |
| bnddirs[0]=0; |
| |
| for(i=1;i<argc;i++) { |
| if(argv[i][0]=='-') { |
| switch(argv[i][1]) { |
| case 'O': |
| printf(".. ignoring optimization: %s\n", argv[i]); |
| break; |
| case 'g': |
| printf(".. ignoring debugging: %s\n", argv[i]); |
| break; |
| case 'l': |
| printf(".. ignoring lib: %s\n", argv[i]); |
| break; |
| case 'v': |
| printf(".. already verbose\n"); |
| break; |
| case 'o': |
| i++; |
| prog=argv[i]; |
| progshort=strrchr(prog,'/'); |
| if(!progshort) { |
| progshort=prog; |
| } else { |
| progshort++; /* / */ |
| } |
| break; |
| case 'q': |
| if(!strncmp(argv[i]+2,"OPTION=",7)) { |
| strcat(opt,argv[i]+9); |
| } else { |
| printf("Unknown -q option: %s\n", argv[i]); |
| return 1; |
| } |
| break; |
| default: |
| printf("Unknown option: %s\n", argv[i]); |
| return 1; |
| } |
| } else { |
| int n = strlen(argv[i]); |
| if(argv[i][n-1]=='o' && |
| argv[i][n-2]=='.') { |
| const char *b = argv[i]; |
| char linkbuf[200]; |
| char outbuf[100]; |
| int nlen = n-2; |
| |
| if(nlen >= 10) { |
| nlen = 10; |
| } |
| |
| if(readlink(b,linkbuf,200)>0) { |
| /* printf("linkbuf %s for %s\n", linkbuf, b); */ |
| /* /qsys.lib/srlicu.lib/currtest.module */ |
| char *mend = strrchr(linkbuf,'.'); |
| if(mend) { |
| *mend=0; |
| mend = strrchr(linkbuf,'/'); |
| if(mend) { |
| mend++; |
| strcpy(outbuf,mend); |
| b=outbuf; |
| nlen=strlen(b); |
| } |
| } |
| } else { |
| /* perror("readlink"); |
| puts(b); */ |
| } |
| |
| strcat(objs,outputdir); |
| strcat(objs,"/"); |
| strncat(objs,b,nlen); |
| strcat(objs, " "); |
| } else if(argv[i][n-1]=='a' && |
| argv[i][n-2]=='.') { |
| const char *b = argv[i]; |
| char linkbuf[200]; |
| char outbuf[100]; |
| int nlen = n-2; |
| |
| if(nlen >= 10) { |
| nlen = 10; |
| } |
| |
| if(readlink(b,linkbuf,200)>0) { |
| /* printf("linkbuf %s for %s\n", linkbuf, b); */ |
| /* /qsys.lib/srlicu.lib/currtest.srvpgm */ |
| char *mend = strrchr(linkbuf,'.'); |
| if(mend) { |
| *mend=0; |
| mend = strrchr(linkbuf,'/'); |
| if(mend) { |
| mend++; |
| strcpy(outbuf,mend); |
| b=outbuf; |
| nlen=strlen(b); |
| } |
| } |
| } else { |
| /* perror("readlink"); |
| puts(b); */ |
| } |
| |
| strcat(bnddirs,outputdir); |
| strcat(bnddirs,"/"); |
| strncat(bnddirs,b,nlen); |
| strcat(bnddirs, " "); |
| } else if(argv[i][n-1]=='o' && |
| argv[i][n-2]=='s' && |
| argv[i][n-3]=='.') { |
| const char *p = strrchr(argv[i],'/'); |
| if(!p) { |
| printf("Can't find trailing slash in %s\n", argv[i]); |
| return 1; |
| } |
| strcat(libs,outputdir); |
| strcat(libs,"/"); |
| strncat(libs,p+1,strlen(p)-4); |
| strcat(libs," "); |
| } else { |
| printf("Unknown input file: %s\n", argv[i]); |
| return 1; |
| } |
| } |
| } |
| |
| if(prog[0]==0) { |
| printf("no program (-o) option specified.\n"); |
| return 1; |
| } |
| |
| sprintf(buf,"CRTPGM PGM(%s/%s) MODULE(%s) BNDSRVPGM(%s) BNDDIR(%s) OPTION(%s) REPLACE(*YES)", |
| outputdir,progshort, |
| |
| objs, |
| |
| libs, |
| |
| bnddirs, |
| |
| opt); |
| |
| |
| if(runcmd(buf)) { |
| return 1; |
| } |
| |
| /* -- OK */ |
| { |
| char path1[1000]; |
| sprintf(path1,"/qsys.lib/%s.lib/%s.pgm", |
| outputdir, |
| progshort); |
| printf("# ln -s %s %s\n", path1, prog); |
| if((!TEST_MODE) && symlink(path1,prog)) { |
| perror("symlink"); |
| if(errno!=EEXIST) { /* ignored */ |
| return 1; |
| } |
| } |
| } |
| return 0; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |