12e5b6d6dSopenharmony_ci// Copyright (C) 2016 and later: Unicode, Inc. and others. 22e5b6d6dSopenharmony_ci// License & terms of use: http://www.unicode.org/copyright.html 32e5b6d6dSopenharmony_ci/* Copyright (C) 2011 IBM Corporation and Others. All Rights Reserved */ 42e5b6d6dSopenharmony_ci 52e5b6d6dSopenharmony_ci/** 62e5b6d6dSopenharmony_ci Input: 72e5b6d6dSopenharmony_ci -o makeconv makeconv.o ucnvstat.o ../../lib/libicuuc48.so -qOPTION='*DUPPROC *DUPVAR*' 82e5b6d6dSopenharmony_ci 92e5b6d6dSopenharmony_ciCRTPGM PGM(SRLICU/MAKECONV) MODULE(SRLICU/MAKECONV SRLICU/UCNVSTAT SRLICU/GENMBCS SRLICU/GENCNVEX) BNDSRVPGM(SRLICU/LIBICUUC48 SRLICU/LIBICUTU48 SRLICU/LIBICUIN48) OPTION(*DUPPROC *DUPVAR) REPLACE(*YES) 102e5b6d6dSopenharmony_ci 112e5b6d6dSopenharmony_ciHandles .o ( modules ), .so ( srvpgm ), .a ( bnddir ). 122e5b6d6dSopenharmony_ci 132e5b6d6dSopenharmony_ciTODO: 142e5b6d6dSopenharmony_ci 152e5b6d6dSopenharmony_ci - cleanup 162e5b6d6dSopenharmony_ci - much better error handling 172e5b6d6dSopenharmony_ci - factor common code 182e5b6d6dSopenharmony_ci - 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. 192e5b6d6dSopenharmony_ci 202e5b6d6dSopenharmony_ci*/ 212e5b6d6dSopenharmony_ci 222e5b6d6dSopenharmony_ci#include <stdio.h> 232e5b6d6dSopenharmony_ci#include <stdlib.h> 242e5b6d6dSopenharmony_ci#include <string.h> 252e5b6d6dSopenharmony_ci#include <errno.h> 262e5b6d6dSopenharmony_ci 272e5b6d6dSopenharmony_ci#ifndef TEST_MODE 282e5b6d6dSopenharmony_ci#define TEST_MODE 0 292e5b6d6dSopenharmony_ci#endif 302e5b6d6dSopenharmony_ci 312e5b6d6dSopenharmony_ci 322e5b6d6dSopenharmony_ci#if !TEST_MODE 332e5b6d6dSopenharmony_ci#include <qp0z1170.h> 342e5b6d6dSopenharmony_ci#else 352e5b6d6dSopenharmony_cistatic int Qp0zSystem(const char *cmd) { 362e5b6d6dSopenharmony_ci printf("CL: %s\n", cmd); 372e5b6d6dSopenharmony_ci return 0; 382e5b6d6dSopenharmony_ci} 392e5b6d6dSopenharmony_ci#endif 402e5b6d6dSopenharmony_ci 412e5b6d6dSopenharmony_cistatic int runcmd(const char *cmd) { 422e5b6d6dSopenharmony_ci int rc; 432e5b6d6dSopenharmony_ci printf("%s\n", cmd); 442e5b6d6dSopenharmony_ci rc = Qp0zSystem(cmd); 452e5b6d6dSopenharmony_ci if(rc==0) { 462e5b6d6dSopenharmony_ci printf("..ok\n"); 472e5b6d6dSopenharmony_ci return 0; 482e5b6d6dSopenharmony_ci } else if(rc<0){ 492e5b6d6dSopenharmony_ci printf("..Qp0zSystem failed.\n"); 502e5b6d6dSopenharmony_ci return 1; 512e5b6d6dSopenharmony_ci } else { 522e5b6d6dSopenharmony_ci printf("..System call failed.\n"); 532e5b6d6dSopenharmony_ci return 1; 542e5b6d6dSopenharmony_ci } 552e5b6d6dSopenharmony_ci} 562e5b6d6dSopenharmony_ci 572e5b6d6dSopenharmony_ciint main(int argc, const char *argv[]) { 582e5b6d6dSopenharmony_ci int i; 592e5b6d6dSopenharmony_ci 602e5b6d6dSopenharmony_ci char buf[8048]; 612e5b6d6dSopenharmony_ci char opt[4100]; 622e5b6d6dSopenharmony_ci char objs[4024]; 632e5b6d6dSopenharmony_ci char libs[4024]; 642e5b6d6dSopenharmony_ci char bnddirs[4024]; 652e5b6d6dSopenharmony_ci const char *prog=""; 662e5b6d6dSopenharmony_ci const char *progshort=prog; 672e5b6d6dSopenharmony_ci const char *outputdir=getenv("OUTPUTDIR"); 682e5b6d6dSopenharmony_ci 692e5b6d6dSopenharmony_ci printf("# OUTPUTDIR=%s ",outputdir); 702e5b6d6dSopenharmony_ci for(i=0;i<argc;i++) { 712e5b6d6dSopenharmony_ci printf("%s ", argv[i]); 722e5b6d6dSopenharmony_ci } 732e5b6d6dSopenharmony_ci printf("\n"); 742e5b6d6dSopenharmony_ci 752e5b6d6dSopenharmony_ci buf[0]=0; 762e5b6d6dSopenharmony_ci opt[0]=0; 772e5b6d6dSopenharmony_ci objs[0]=0; 782e5b6d6dSopenharmony_ci libs[0]=0; 792e5b6d6dSopenharmony_ci bnddirs[0]=0; 802e5b6d6dSopenharmony_ci 812e5b6d6dSopenharmony_ci for(i=1;i<argc;i++) { 822e5b6d6dSopenharmony_ci if(argv[i][0]=='-') { 832e5b6d6dSopenharmony_ci switch(argv[i][1]) { 842e5b6d6dSopenharmony_ci case 'O': 852e5b6d6dSopenharmony_ci printf(".. ignoring optimization: %s\n", argv[i]); 862e5b6d6dSopenharmony_ci break; 872e5b6d6dSopenharmony_ci case 'g': 882e5b6d6dSopenharmony_ci printf(".. ignoring debugging: %s\n", argv[i]); 892e5b6d6dSopenharmony_ci break; 902e5b6d6dSopenharmony_ci case 'l': 912e5b6d6dSopenharmony_ci printf(".. ignoring lib: %s\n", argv[i]); 922e5b6d6dSopenharmony_ci break; 932e5b6d6dSopenharmony_ci case 'v': 942e5b6d6dSopenharmony_ci printf(".. already verbose\n"); 952e5b6d6dSopenharmony_ci break; 962e5b6d6dSopenharmony_ci case 'o': 972e5b6d6dSopenharmony_ci i++; 982e5b6d6dSopenharmony_ci prog=argv[i]; 992e5b6d6dSopenharmony_ci progshort=strrchr(prog,'/'); 1002e5b6d6dSopenharmony_ci if(!progshort) { 1012e5b6d6dSopenharmony_ci progshort=prog; 1022e5b6d6dSopenharmony_ci } else { 1032e5b6d6dSopenharmony_ci progshort++; /* / */ 1042e5b6d6dSopenharmony_ci } 1052e5b6d6dSopenharmony_ci break; 1062e5b6d6dSopenharmony_ci case 'q': 1072e5b6d6dSopenharmony_ci if(!strncmp(argv[i]+2,"OPTION=",7)) { 1082e5b6d6dSopenharmony_ci strcat(opt,argv[i]+9); 1092e5b6d6dSopenharmony_ci } else { 1102e5b6d6dSopenharmony_ci printf("Unknown -q option: %s\n", argv[i]); 1112e5b6d6dSopenharmony_ci return 1; 1122e5b6d6dSopenharmony_ci } 1132e5b6d6dSopenharmony_ci break; 1142e5b6d6dSopenharmony_ci default: 1152e5b6d6dSopenharmony_ci printf("Unknown option: %s\n", argv[i]); 1162e5b6d6dSopenharmony_ci return 1; 1172e5b6d6dSopenharmony_ci } 1182e5b6d6dSopenharmony_ci } else { 1192e5b6d6dSopenharmony_ci int n = strlen(argv[i]); 1202e5b6d6dSopenharmony_ci if(argv[i][n-1]=='o' && 1212e5b6d6dSopenharmony_ci argv[i][n-2]=='.') { 1222e5b6d6dSopenharmony_ci const char *b = argv[i]; 1232e5b6d6dSopenharmony_ci char linkbuf[200]; 1242e5b6d6dSopenharmony_ci char outbuf[100]; 1252e5b6d6dSopenharmony_ci int nlen = n-2; 1262e5b6d6dSopenharmony_ci 1272e5b6d6dSopenharmony_ci if(nlen >= 10) { 1282e5b6d6dSopenharmony_ci nlen = 10; 1292e5b6d6dSopenharmony_ci } 1302e5b6d6dSopenharmony_ci 1312e5b6d6dSopenharmony_ci if(readlink(b,linkbuf,200)>0) { 1322e5b6d6dSopenharmony_ci /* printf("linkbuf %s for %s\n", linkbuf, b); */ 1332e5b6d6dSopenharmony_ci /* /qsys.lib/srlicu.lib/currtest.module */ 1342e5b6d6dSopenharmony_ci char *mend = strrchr(linkbuf,'.'); 1352e5b6d6dSopenharmony_ci if(mend) { 1362e5b6d6dSopenharmony_ci *mend=0; 1372e5b6d6dSopenharmony_ci mend = strrchr(linkbuf,'/'); 1382e5b6d6dSopenharmony_ci if(mend) { 1392e5b6d6dSopenharmony_ci mend++; 1402e5b6d6dSopenharmony_ci strcpy(outbuf,mend); 1412e5b6d6dSopenharmony_ci b=outbuf; 1422e5b6d6dSopenharmony_ci nlen=strlen(b); 1432e5b6d6dSopenharmony_ci } 1442e5b6d6dSopenharmony_ci } 1452e5b6d6dSopenharmony_ci } else { 1462e5b6d6dSopenharmony_ci /* perror("readlink"); 1472e5b6d6dSopenharmony_ci puts(b); */ 1482e5b6d6dSopenharmony_ci } 1492e5b6d6dSopenharmony_ci 1502e5b6d6dSopenharmony_ci strcat(objs,outputdir); 1512e5b6d6dSopenharmony_ci strcat(objs,"/"); 1522e5b6d6dSopenharmony_ci strncat(objs,b,nlen); 1532e5b6d6dSopenharmony_ci strcat(objs, " "); 1542e5b6d6dSopenharmony_ci } else if(argv[i][n-1]=='a' && 1552e5b6d6dSopenharmony_ci argv[i][n-2]=='.') { 1562e5b6d6dSopenharmony_ci const char *b = argv[i]; 1572e5b6d6dSopenharmony_ci char linkbuf[200]; 1582e5b6d6dSopenharmony_ci char outbuf[100]; 1592e5b6d6dSopenharmony_ci int nlen = n-2; 1602e5b6d6dSopenharmony_ci 1612e5b6d6dSopenharmony_ci if(nlen >= 10) { 1622e5b6d6dSopenharmony_ci nlen = 10; 1632e5b6d6dSopenharmony_ci } 1642e5b6d6dSopenharmony_ci 1652e5b6d6dSopenharmony_ci if(readlink(b,linkbuf,200)>0) { 1662e5b6d6dSopenharmony_ci /* printf("linkbuf %s for %s\n", linkbuf, b); */ 1672e5b6d6dSopenharmony_ci /* /qsys.lib/srlicu.lib/currtest.srvpgm */ 1682e5b6d6dSopenharmony_ci char *mend = strrchr(linkbuf,'.'); 1692e5b6d6dSopenharmony_ci if(mend) { 1702e5b6d6dSopenharmony_ci *mend=0; 1712e5b6d6dSopenharmony_ci mend = strrchr(linkbuf,'/'); 1722e5b6d6dSopenharmony_ci if(mend) { 1732e5b6d6dSopenharmony_ci mend++; 1742e5b6d6dSopenharmony_ci strcpy(outbuf,mend); 1752e5b6d6dSopenharmony_ci b=outbuf; 1762e5b6d6dSopenharmony_ci nlen=strlen(b); 1772e5b6d6dSopenharmony_ci } 1782e5b6d6dSopenharmony_ci } 1792e5b6d6dSopenharmony_ci } else { 1802e5b6d6dSopenharmony_ci /* perror("readlink"); 1812e5b6d6dSopenharmony_ci puts(b); */ 1822e5b6d6dSopenharmony_ci } 1832e5b6d6dSopenharmony_ci 1842e5b6d6dSopenharmony_ci strcat(bnddirs,outputdir); 1852e5b6d6dSopenharmony_ci strcat(bnddirs,"/"); 1862e5b6d6dSopenharmony_ci strncat(bnddirs,b,nlen); 1872e5b6d6dSopenharmony_ci strcat(bnddirs, " "); 1882e5b6d6dSopenharmony_ci } else if(argv[i][n-1]=='o' && 1892e5b6d6dSopenharmony_ci argv[i][n-2]=='s' && 1902e5b6d6dSopenharmony_ci argv[i][n-3]=='.') { 1912e5b6d6dSopenharmony_ci const char *p = strrchr(argv[i],'/'); 1922e5b6d6dSopenharmony_ci if(!p) { 1932e5b6d6dSopenharmony_ci printf("Can't find trailing slash in %s\n", argv[i]); 1942e5b6d6dSopenharmony_ci return 1; 1952e5b6d6dSopenharmony_ci } 1962e5b6d6dSopenharmony_ci strcat(libs,outputdir); 1972e5b6d6dSopenharmony_ci strcat(libs,"/"); 1982e5b6d6dSopenharmony_ci strncat(libs,p+1,strlen(p)-4); 1992e5b6d6dSopenharmony_ci strcat(libs," "); 2002e5b6d6dSopenharmony_ci } else { 2012e5b6d6dSopenharmony_ci printf("Unknown input file: %s\n", argv[i]); 2022e5b6d6dSopenharmony_ci return 1; 2032e5b6d6dSopenharmony_ci } 2042e5b6d6dSopenharmony_ci } 2052e5b6d6dSopenharmony_ci } 2062e5b6d6dSopenharmony_ci 2072e5b6d6dSopenharmony_ci if(prog[0]==0) { 2082e5b6d6dSopenharmony_ci printf("no program (-o) option specified.\n"); 2092e5b6d6dSopenharmony_ci return 1; 2102e5b6d6dSopenharmony_ci } 2112e5b6d6dSopenharmony_ci 2122e5b6d6dSopenharmony_ci sprintf(buf,"CRTPGM PGM(%s/%s) MODULE(%s) BNDSRVPGM(%s) BNDDIR(%s) OPTION(%s) REPLACE(*YES)", 2132e5b6d6dSopenharmony_ci outputdir,progshort, 2142e5b6d6dSopenharmony_ci 2152e5b6d6dSopenharmony_ci objs, 2162e5b6d6dSopenharmony_ci 2172e5b6d6dSopenharmony_ci libs, 2182e5b6d6dSopenharmony_ci 2192e5b6d6dSopenharmony_ci bnddirs, 2202e5b6d6dSopenharmony_ci 2212e5b6d6dSopenharmony_ci opt); 2222e5b6d6dSopenharmony_ci 2232e5b6d6dSopenharmony_ci 2242e5b6d6dSopenharmony_ci if(runcmd(buf)) { 2252e5b6d6dSopenharmony_ci return 1; 2262e5b6d6dSopenharmony_ci } 2272e5b6d6dSopenharmony_ci 2282e5b6d6dSopenharmony_ci /* -- OK */ 2292e5b6d6dSopenharmony_ci { 2302e5b6d6dSopenharmony_ci char path1[1000]; 2312e5b6d6dSopenharmony_ci sprintf(path1,"/qsys.lib/%s.lib/%s.pgm", 2322e5b6d6dSopenharmony_ci outputdir, 2332e5b6d6dSopenharmony_ci progshort); 2342e5b6d6dSopenharmony_ci printf("# ln -s %s %s\n", path1, prog); 2352e5b6d6dSopenharmony_ci if((!TEST_MODE) && symlink(path1,prog)) { 2362e5b6d6dSopenharmony_ci perror("symlink"); 2372e5b6d6dSopenharmony_ci if(errno!=EEXIST) { /* ignored */ 2382e5b6d6dSopenharmony_ci return 1; 2392e5b6d6dSopenharmony_ci } 2402e5b6d6dSopenharmony_ci } 2412e5b6d6dSopenharmony_ci } 2422e5b6d6dSopenharmony_ci return 0; 2432e5b6d6dSopenharmony_ci} 2442e5b6d6dSopenharmony_ci 2452e5b6d6dSopenharmony_ci 2462e5b6d6dSopenharmony_ci 2472e5b6d6dSopenharmony_ci 2482e5b6d6dSopenharmony_ci 2492e5b6d6dSopenharmony_ci 2502e5b6d6dSopenharmony_ci 2512e5b6d6dSopenharmony_ci 252