Home | History | Annotate | Download | only in os400
      1 /* Copyright (C) 2011 IBM Corporation and Others. All Rights Reserved */
      2 
      3 /**
      4    Input:
      5        -o makeconv  makeconv.o ucnvstat.o ../../lib/libicuuc48.so -qOPTION='*DUPPROC *DUPVAR*'
      6 
      7 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)
      8 
      9 Handles  .o ( modules ), .so ( srvpgm ), .a ( bnddir ).
     10 
     11 TODO:
     12 
     13  - cleanup
     14  - much better error handling
     15  - factor common code
     16  - 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.
     17 
     18 */
     19 
     20 #include <stdio.h>
     21 #include <stdlib.h>
     22 #include <string.h>
     23 #include <errno.h>
     24 
     25 #ifndef TEST_MODE
     26 #define TEST_MODE 0
     27 #endif
     28 
     29 
     30 #if !TEST_MODE
     31 #include <qp0z1170.h>
     32 #else
     33 static int Qp0zSystem(const char *cmd) {
     34   printf("CL: %s\n", cmd);
     35   return 0;
     36 }
     37 #endif
     38 
     39 static int runcmd(const char *cmd) {
     40   int rc;
     41   printf("%s\n", cmd);
     42   rc = Qp0zSystem(cmd);
     43   if(rc==0) {
     44     printf("..ok\n");
     45     return 0;
     46   } else if(rc<0){
     47     printf("..Qp0zSystem failed.\n");
     48     return 1;
     49   } else {
     50     printf("..System call failed.\n");
     51     return 1;
     52   }
     53 }
     54 
     55 int main(int argc, const char *argv[]) {
     56   int i;
     57 
     58   char buf[8048];
     59   char opt[4100];
     60   char objs[4024];
     61   char libs[4024];
     62   char bnddirs[4024];
     63   const char *prog="";
     64   const char *progshort=prog;
     65   const char *outputdir=getenv("OUTPUTDIR");
     66 
     67   printf("# OUTPUTDIR=%s ",outputdir);
     68   for(i=0;i<argc;i++) {
     69     printf("%s ", argv[i]);
     70   }
     71   printf("\n");
     72 
     73   buf[0]=0;
     74   opt[0]=0;
     75   objs[0]=0;
     76   libs[0]=0;
     77   bnddirs[0]=0;
     78 
     79   for(i=1;i<argc;i++) {
     80     if(argv[i][0]=='-') {
     81       switch(argv[i][1]) {
     82       case 'O':
     83         printf(".. ignoring optimization: %s\n", argv[i]);
     84         break;
     85       case 'g':
     86         printf(".. ignoring debugging: %s\n", argv[i]);
     87         break;
     88       case 'l':
     89         printf(".. ignoring lib: %s\n", argv[i]);
     90         break;
     91       case 'v':
     92         printf(".. already verbose\n");
     93         break;
     94       case 'o':
     95         i++;
     96         prog=argv[i];
     97         progshort=strrchr(prog,'/');
     98         if(!progshort) {
     99           progshort=prog;
    100         } else {
    101           progshort++; /*  / */
    102         }
    103         break;
    104       case 'q':
    105         if(!strncmp(argv[i]+2,"OPTION=",7)) {
    106           strcat(opt,argv[i]+9);
    107         } else {
    108           printf("Unknown -q option: %s\n", argv[i]);
    109           return 1;
    110         }
    111         break;
    112       default:
    113         printf("Unknown option: %s\n", argv[i]);
    114         return 1;
    115       }
    116     } else {
    117       int n = strlen(argv[i]);
    118       if(argv[i][n-1]=='o' &&
    119          argv[i][n-2]=='.') {
    120         const char *b = argv[i];
    121         char linkbuf[200];
    122         char outbuf[100];
    123         int nlen = n-2;
    124 
    125         if(nlen >= 10) {
    126           nlen = 10;
    127         }
    128 
    129         if(readlink(b,linkbuf,200)>0) {
    130           /* printf("linkbuf %s for %s\n", linkbuf, b); */
    131           /* /qsys.lib/srlicu.lib/currtest.module */
    132           char *mend = strrchr(linkbuf,'.');
    133           if(mend) {
    134             *mend=0;
    135             mend = strrchr(linkbuf,'/');
    136             if(mend) {
    137               mend++;
    138               strcpy(outbuf,mend);
    139               b=outbuf;
    140               nlen=strlen(b);
    141             }
    142           }
    143         } else {
    144           /* perror("readlink");
    145              puts(b); */
    146         }
    147 
    148         strcat(objs,outputdir);
    149         strcat(objs,"/");
    150         strncat(objs,b,nlen);
    151         strcat(objs, " ");
    152       } else if(argv[i][n-1]=='a' &&
    153          argv[i][n-2]=='.') {
    154         const char *b = argv[i];
    155         char linkbuf[200];
    156         char outbuf[100];
    157         int nlen = n-2;
    158 
    159         if(nlen >= 10) {
    160           nlen = 10;
    161         }
    162 
    163         if(readlink(b,linkbuf,200)>0) {
    164           /* printf("linkbuf %s for %s\n", linkbuf, b); */
    165           /* /qsys.lib/srlicu.lib/currtest.srvpgm */
    166           char *mend = strrchr(linkbuf,'.');
    167           if(mend) {
    168             *mend=0;
    169             mend = strrchr(linkbuf,'/');
    170             if(mend) {
    171               mend++;
    172               strcpy(outbuf,mend);
    173               b=outbuf;
    174               nlen=strlen(b);
    175             }
    176           }
    177         } else {
    178           /* perror("readlink");
    179              puts(b); */
    180         }
    181 
    182         strcat(bnddirs,outputdir);
    183         strcat(bnddirs,"/");
    184         strncat(bnddirs,b,nlen);
    185         strcat(bnddirs, " ");
    186       } else if(argv[i][n-1]=='o' &&
    187          argv[i][n-2]=='s' &&
    188          argv[i][n-3]=='.') {
    189         const char *p = strrchr(argv[i],'/');
    190         if(!p) {
    191           printf("Can't find trailing slash in %s\n", argv[i]);
    192           return 1;
    193         }
    194         strcat(libs,outputdir);
    195         strcat(libs,"/");
    196         strncat(libs,p+1,strlen(p)-4);
    197         strcat(libs," ");
    198       } else {
    199         printf("Unknown input file: %s\n", argv[i]);
    200         return 1;
    201       }
    202     }
    203   }
    204 
    205   if(prog[0]==0) {
    206     printf("no program (-o) option specified.\n");
    207     return 1;
    208   }
    209 
    210   sprintf(buf,"CRTPGM PGM(%s/%s) MODULE(%s) BNDSRVPGM(%s) BNDDIR(%s) OPTION(%s) REPLACE(*YES)",
    211           outputdir,progshort,
    212 
    213           objs,
    214 
    215           libs,
    216 
    217           bnddirs,
    218 
    219           opt);
    220 
    221 
    222   if(runcmd(buf)) {
    223     return 1;
    224   }
    225 
    226   /* -- OK */
    227   {
    228     char path1[1000];
    229     sprintf(path1,"/qsys.lib/%s.lib/%s.pgm",
    230             outputdir,
    231             progshort);
    232     printf("# ln -s %s %s\n", path1, prog);
    233     if((!TEST_MODE) && symlink(path1,prog)) {
    234       perror("symlink");
    235       if(errno!=EEXIST) { /* ignored */
    236         return 1;
    237       }
    238     }
    239   }
    240   return 0;
    241 }
    242 
    243 
    244 
    245 
    246 
    247 
    248 
    249 
    250