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