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