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