source: git/modules/tools/misc.cc @ 547474

fieker-DuValspielwiese
Last change on this file since 547474 was 6c8772, checked in by Kai Krüger <krueger@…>, 25 years ago
Major rewrite of modgen git-svn-id: file:///usr/local/Singular/svn/trunk@2972 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 18.8 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id: misc.cc,v 1.5 1999-03-31 22:03:22 krueger Exp $ */
5/*
6* ABSTRACT: lib parsing
7*/
8
9#include <mod2.h>
10#include <febase.h>
11#include <grammar.h>
12#include <ipid.h>
13#include <ipshell.h>
14#include <mmemory.h>
15#include <structs.h>
16#include <subexpr.h>
17#include <tok.h>
18#include <regex.h>
19
20#include "modgen.h"
21#include "typmap.h"
22
23#define NEW_PARAM 1
24
25#define SYSTYP_NONE   0
26#define SYSTYP_LINUX  1
27#define SYSTYP_HPUX9  2
28#define SYSTYP_HPUX10 3
29
30#if 1
31#  define logx printf
32#else
33#  define logx
34#endif
35
36char *DYNAinclude[] = {
37   "",
38   "#include <dlfcn.h>",
39   "#include <dl.h>",
40   "#include <dl.h>",
41   "#include <>",
42   "#include <>",
43   "#include <>",
44   NULL
45};
46
47int systyp = SYSTYP_NONE;
48
49BOOLEAN    expected_parms;
50int        cmdtok;
51BOOLEAN siq=FALSE;
52char *lastreserved=NULL;
53#define SELF_CMD MAX_TOK+1
54
55void enter_id(FILE *fp, char *name, char *value);
56void mod_write_enter_id(FILE *fp);
57
58
59/*=============== types =====================*/
60struct sValCmdTab
61{
62  short cmd;
63  short start;
64};
65
66#include "iparith.inc"
67
68/*=================== general utilities ============================*/
69int IsCmd(char *n, int & tok)
70{
71  int an=1;
72  int i,v;
73  int en=LAST_IDENTIFIER;
74 
75  if( strcmp(n, "SELF") == 0) {
76    tok = SELF_CMD;
77    logx("IsCmd: [%d] %s\n", tok, n);
78    return tok;
79  }
80 
81  if( strcmp(n, "none") == 0) {
82    tok = NONE;
83    logx("IsCmd: [%d] %s\n", tok, n);
84    return tok;
85  }
86 
87  loop
88  {
89    if(an>=en-1)
90    {
91      if (strcmp(n, cmds[an].name) == 0)
92      {
93        i=an;
94        break;
95      }
96      else if (strcmp(n, cmds[en].name) == 0)
97      {
98        i=en;
99        break;
100      }
101      else
102      {
103        return 0;
104      }
105    }
106    i=(an+en)/2;
107    v=strcmp(n,cmds[i].name);
108    if(v<0)
109    {
110      en=i;
111    }
112    else if(v>0)
113    {
114      an=i;
115    }
116    else /*v==0*/
117    {
118      break;
119    }
120  }
121  lastreserved=cmds[i].name;
122  tok=cmds[i].tokval;
123  if(cmds[i].alias==2)
124  {
125    printf("outdated identifier `%s` used - please change your code",
126    cmds[i].name);
127    cmds[i].alias=1;
128  }
129#if 0
130  if (!expected_parms)
131  {
132    switch (tok)
133    {
134      case IDEAL_CMD:
135      case INT_CMD:
136      case INTVEC_CMD:
137      case MAP_CMD:
138      case MATRIX_CMD:
139      case MODUL_CMD:
140      case POLY_CMD:
141      case PROC_CMD:
142      case RING_CMD:
143      case STRING_CMD:
144        cmdtok = tok;
145        break;
146    }
147  }
148#endif
149  logx("IsCmd: [%d] %s\n", tok, n);
150 
151  if( (cmds[i].toktype==ROOT_DECL) ||
152      (cmds[i].toktype==ROOT_DECL_LIST) ||
153      (cmds[i].toktype==RING_DECL) ||
154      ((cmds[i].toktype>=DRING_CMD) && (cmds[i].toktype<=VECTOR_CMD))) 
155    return cmds[i].toktype;
156  return 0;
157}
158
159char * decl2str(int n, char *name)
160{
161  switch(n)
162    {
163#   include "decl.inc"
164
165    /* first and last entry of tok.h cannot be grepped */
166      //case ATTRIB_CMD: strcpy(name,"ATTRIB_CMD"); break;
167    case MAX_TOK: strcpy(name,"MAX_TOK");       break;
168    default: strcpy(name,"(null)");
169  }
170#if 0
171  printf("[%d=%s]", n, name);
172  fflush(stdout);
173#endif
174  return(name);
175}
176
177#if 0
178static int iiTabIndex(const jjValCmdTab dArithTab, const int len, const int op)
179{
180  int a=0;
181  int e=len;
182  int p=len/2;
183  while ( a!=e)
184  {
185     if (op==dArithTab[p].cmd) return dArithTab[p].start;
186     else if (op<dArithTab[p].cmd)
187     { e=p; p=a+(e-a)/2;}
188     else
189     { a=p; p=p+(e-p)/2; }
190  }
191  return -1;
192}
193#endif
194
195/*========================================================================*/
196void PrintProc(
197  procdef pi
198  )
199{
200  int i;
201 
202  printf("proc: %s(", pi.procname);
203 
204  for(i=0; i<pi.paramcnt; i++) {
205    printf("%s", pi.param[i].name);
206    if(i < (pi.paramcnt-1)) printf(",");
207  }
208  printf(")\n");
209}
210
211/*========================================================================*/
212void make_version(char *p, moddefv module)
213{
214  char ver[10];
215  char date[16];
216  char libnamebuf[128];
217 
218  module->major = 0;
219  module->minor = 0;
220  module->level = 0;
221 
222  ver[0]='0'; ver[1]='.'; ver[2]='0'; ver[3]='.'; ver[4]='0'; ver[5]='\0';
223  date[0]='?'; date[1]='\0';
224  //if(what) sscanf(p,"%*[^=]= %*s %*s %10s %16s",ver,date);
225  sscanf(p,"%*s %*s %10s %16s",ver,date);
226  sscanf(ver, "%d.%d.%d", &module->major, &module->minor, &module->level);
227 
228  sprintf(libnamebuf,"(%s,%s)", ver, date);
229  if(strcmp(libnamebuf, "(0.0.0,?)")==0)
230  {
231    sscanf(p,"%*[^\"]\"%[^\"]\"",libnamebuf);
232  }
233  module->revision = (char *)malloc(strlen(libnamebuf)+1);
234  memset(module->revision, '\0', strlen(libnamebuf)+1);
235  memcpy(module->revision, libnamebuf, strlen(libnamebuf));
236}
237
238/*========================================================================*/
239void Add2files(
240  moddefv module,
241  char *name
242  )
243{
244  cfiles cfnew;
245  memset((void *)&cfnew, '\0', sizeof(cfiles));
246
247  cfnew.filename = (char *)malloc(strlen(name)+1);
248  memset(cfnew.filename, '\0', strlen(name)+1);
249  memcpy(cfnew.filename, name, strlen(name));
250
251  if(module->filecnt==0) {
252    module->files = (cfilesv)malloc(sizeof(cfiles)+1);
253  }
254  else {
255    module->files = (cfilesv)realloc(module->files,
256                                   (module->filecnt+1)*sizeof(cfiles));
257  }
258  if(module->files == NULL) { printf("ERROR\n"); return; }
259 
260  memset((void *) &module->files[module->filecnt], '\0', sizeof(cfiles));
261  memcpy((void *)(&(module->files[module->filecnt])),
262         (void *)&cfnew, sizeof(cfiles));
263  (module->filecnt)++;
264}
265
266/*========================================================================*/
267void Add2proclist(
268  moddefv module,
269  char *name,
270  char *ret_val,
271  char *ret_typname,
272  int ret_typ
273  )
274{
275  procdef pnew;
276  logx("Add2proclist(%s, %s)\n", name, ret_val);
277 
278  memset((void *)&pnew, '\0', sizeof(procdef));
279
280  pnew.procname = (char *)malloc(strlen(name)+1);
281  if(pnew.procname==NULL) printf("Error 1\n");
282  memset(pnew.procname, '\0', strlen(name)+1);
283  memcpy(pnew.procname, name, strlen(name));
284
285  pnew.funcname = (char *)malloc(strlen(name)+1);
286  if(pnew.funcname==NULL) printf("Error 1\n");
287  memset(pnew.funcname, '\0', strlen(name)+1);
288  memcpy(pnew.funcname, name, strlen(name));
289
290  pnew.param = NULL;
291  (pnew).is_static = 0;
292  (pnew).paramcnt = 0;
293  pnew.c_code = NULL;
294 
295  pnew.return_val.name = (char *)malloc(strlen(ret_val)+1);
296  memset(pnew.return_val.name, '\0', strlen(ret_val)+1);
297  memcpy(pnew.return_val.name, ret_val, strlen(ret_val));
298 
299  pnew.return_val.typname = (char *)malloc(strlen(ret_typname)+1);
300  memset(pnew.return_val.typname, '\0', strlen(ret_typname)+1);
301  memcpy(pnew.return_val.typname, ret_typname, strlen(ret_typname));
302  pnew.return_val.typ = ret_typ;
303 
304  if(module->proccnt==0) {
305    module->procs = (procdefv)malloc(sizeof(procdef)+1);
306  }
307  else {
308    module->procs = (procdefv)realloc(module->procs,
309                                   (module->proccnt+1)*sizeof(procdef));
310  }
311  if(module->procs == NULL) { printf("ERROR\n"); return; }
312 
313  memset((void *) &module->procs[module->proccnt], '\0', sizeof(procdef));
314  memcpy((void *)(&(module->procs[module->proccnt])),
315         (void *)&pnew, sizeof(procdef));
316  (module->proccnt)++;
317}
318
319/*========================================================================*/
320void AddParam(
321  moddefv module,
322  char *name,
323  char *typname,
324  int typ
325  )
326{
327  paramdef pnew;
328  int proccnt = module->proccnt-1;
329  int paramcnt = 0;
330
331  logx("AddParam(%d, %s, %s, %d)\n", module->procs[proccnt].paramcnt,
332       module->procs[proccnt].procname,
333       typname, typ);
334  memset((void *)&pnew, '\0', sizeof(paramdef));
335  pnew.name = (char *)malloc(strlen(name)+1);
336  memset(pnew.name, '\0', strlen(name)+1);
337  pnew.next = NULL;
338  memcpy(pnew.name, name, strlen(name));
339  pnew.typname = (char *)malloc(strlen(typname)+1);
340  memset(pnew.typname, '\0', strlen(typname)+1);
341  memcpy(pnew.typname, typname, strlen(typname));
342  pnew.typ = typ;
343
344  paramcnt = module->procs[proccnt].paramcnt;
345 if(module->procs[proccnt].paramcnt==0) {
346    module->procs[proccnt].param = (paramdefv)malloc(sizeof(paramdef));
347 }
348  else {
349    module->procs[proccnt].param =
350      (paramdefv)realloc(module->procs[proccnt].param,
351                         (paramcnt+1)*sizeof(paramdef));
352  }
353 
354  memcpy((void *)(&module->procs[proccnt].param[paramcnt]),
355         (void *)&pnew, sizeof(paramdef));
356  (module->procs[proccnt].paramcnt)++;
357  logx("AddParam() done\n");
358}
359
360/*========================================================================*/
361void PrintProclist(
362  moddefv module
363  )
364{
365  logx("PrintProclist()\n");
366  int j;
367  for(j=0; j<module->proccnt; j++) {
368    PrintProc(module->procs[j]);
369  }
370}
371
372/*========================================================================*/
373void generate_mod(
374  moddefv module
375  )
376{
377  procdefv v = NULL;
378  cfilesv c_filelist = NULL;
379  int proccnt;
380  FILE *fp_c, *fp_h;
381  char *filename;
382 
383  if(strcmp(S_UNAME, "ix86-Linux") == 0) {
384    systyp = SYSTYP_LINUX;
385  } else if (strcmp(S_UNAME, "HPUX-9")==0) {
386    systyp = SYSTYP_HPUX9;
387  } else if (strcmp(S_UNAME, "HPUX-10")==0) {
388    systyp = SYSTYP_HPUX10;
389  }
390  init_type_conv();
391  printf("SYSTYP:%d\n", systyp);
392 
393  filename = (char *)malloc(strlen(module->name)+5);
394  sprintf(filename, "%s.cc", module->name);
395  fp_c = fopen(filename, "w");
396  printf("Creating %s, ", filename);fflush(stdout);
397  mod_write_header(fp_c, module->name);
398  mod_write_enter_id(fp_c);
399
400  sprintf(filename, "%s.h", module->name);
401  fp_h = fopen(filename, "w");
402  write_header(fp_h, module->name);
403  printf("%s  ...", filename);fflush(stdout);
404 
405  /* building mod_init() */
406  fprintf(fp_c, "extern \"C\"\n");
407  fprintf(fp_c, "int mod_init(int(*iiAddCproc)())\n{\n");
408  fprintf(fp_c, "  idhdl h;\n\n");
409 
410  if(module->version != NULL) enter_id(fp_c, "version", module->version);
411  if(module->info != NULL) enter_id(fp_c, "info", module->info);
412  if(module->helpfile != NULL) enter_id(fp_c, "helpfile", module->helpfile);
413 
414  for(proccnt=0; proccnt<module->proccnt; proccnt++) {
415    printf("->%s, %s\n", module->procs[proccnt].procname,
416           module->procs[proccnt].funcname);
417    fprintf(fp_c, "  iiAddCproc(\"%s\",\"%s\",%s, mod_%s);\n",
418            module->name, module->procs[proccnt].procname, 
419            module->procs[proccnt].is_static ? "TRUE" : "FALSE",
420            module->procs[proccnt].funcname);
421  }
422  fprintf(fp_c, "  return 0;\n}\n\n");
423
424  /* building entry-functions */
425  for(proccnt=0; proccnt<module->proccnt; proccnt++) {
426    generate_function(&module->procs[proccnt], fp_c);
427    generate_header(&module->procs[proccnt], fp_h);
428  }
429  printf("  done.\n");fflush(stdout);
430  fclose(fp_c);
431  fclose(fp_h);
432}
433
434/*========================================================================*/
435void generate_header(procdefv pi, FILE *fp)
436{
437  int i;
438 
439  fprintf(fp, "BOOLEAN mod_%s(leftv res, leftv h);\n", pi->funcname);
440  switch( pi->return_val.typ) {
441      case SELF_CMD:
442        fprintf(fp, "BOOLEAN %s(res, ", pi->funcname);
443        break;
444
445      default:
446        fprintf(fp, "%s %s(", type_conv[pi->return_val.typ],
447                pi->funcname);
448  }
449  for (i=0;i<pi->paramcnt; i++) {
450    fprintf(fp, "%s res%d", type_conv[pi->param[i].typ], i);
451    if(i<pi->paramcnt-1) fprintf(fp, ", ");
452  }
453  fprintf(fp, ");\n\n");
454}
455
456void gen_func_param_check(
457  FILE *fp,
458  procdefv pi,
459  int i
460  )
461{
462  fprintf(fp, "  if(v==NULL) goto mod_%s_error;\n", pi->funcname);
463  fprintf(fp, "  tok = v->Typ();\n");
464  fprintf(fp, "  if((index=iiTestConvert(tok, %s))==0)\n",
465          pi->param[i].typname);
466  fprintf(fp, "     goto mod_%s_error;\n", pi->funcname);
467  fprintf(fp, "  v_save = v->next;\n");
468  fprintf(fp, "  v->next = NULL;\n");
469  fprintf(fp, "  if(iiConvert(tok, %s, index, v, res%d))\n",
470          pi->param[i].typname, i);
471  fprintf(fp, "     goto mod_%s_error;\n", pi->funcname);
472  fprintf(fp, "  v = v_save;\n");
473}
474
475void generate_function(procdefv pi, FILE *fp)
476{
477  int cnt = 0, i;
478  printf("%s has %d paramters\n", pi->funcname, pi->paramcnt);
479 
480  fprintf(fp, "BOOLEAN mod_%s(leftv res, leftv h)\n{\n", pi->funcname);
481  if(pi->paramcnt>0) {
482    if(pi->param[0].typ==SELF_CMD) {
483      if(pi->c_code != NULL) fprintf(fp, "%s\n", pi->c_code);
484 
485      fprintf(fp, "  return(%s(res,h));\n", pi->funcname);
486      fprintf(fp, "}\n\n");
487    }
488    else {
489      fprintf(fp, "  leftv v = h, v_save;\n");
490      fprintf(fp, "  int tok = NONE, index = 0;\n");
491      for (i=0;i<pi->paramcnt; i++)
492        fprintf(fp, "  leftv res%d = (leftv)Alloc0(sizeof(sleftv));\n", i);
493
494      fprintf(fp, "\n");
495   
496      if(pi->c_code != NULL) fprintf(fp, "%s\n", pi->c_code);
497 
498      for (i=0;i<pi->paramcnt; i++) gen_func_param_check(fp, pi, i);
499
500      fprintf(fp, "  if(v!=NULL) { tok = v->Typ(); goto mod_%s_error; }\n",
501              pi->funcname);
502
503      fprintf(fp, "\n");
504      switch( pi->return_val.typ) {
505          case SELF_CMD:
506            fprintf(fp, "    return(%s(res", pi->funcname);
507            for (i=0;i<pi->paramcnt; i++)
508              fprintf(fp, ", (%s) res%d->Data()",
509                      type_conv[pi->param[i].typ], i);
510            fprintf(fp, "));\n\n");
511           break;
512
513          default:
514            fprintf(fp, "  res->rtyp = %s;\n", pi->return_val.typname);
515            fprintf(fp, "  res->data = (void *)%s(", pi->funcname);
516            for (i=0;i<pi->paramcnt; i++) {
517              fprintf(fp, "(%s) res%d->Data()",
518                      type_conv[pi->param[i].typ], i);
519              if(i<pi->paramcnt-1) fprintf(fp, ", ");
520            }
521            fprintf(fp, ");\n  return FALSE;\n\n");
522      }
523     
524      fprintf(fp, "  mod_%s_error:\n", pi->funcname);
525      fprintf(fp, "    Werror(\"%s(`%%s`) is not supported\", Tok2Cmdname(tok));\n",
526              pi->procname);
527      fprintf(fp, "    Werror(\"expected %s(", pi->procname);
528      for (i=0;i<pi->paramcnt; i++) {
529        fprintf(fp, "'%s'", pi->param[i].name);
530        if(i!=pi->paramcnt-1) fprintf(fp, ",");
531      }
532      fprintf(fp, ")\");\n");
533      fprintf(fp, "    return TRUE;\n}\n\n");
534    }
535  } else {
536      switch( pi->return_val.typ) {
537          case SELF_CMD:
538            fprintf(fp, "  return(%s(res));\n}\n\n", pi->funcname);
539           break;
540
541          case NONE:
542            fprintf(fp, "  res->rtyp = %s;\n", pi->return_val.typname);
543            fprintf(fp, "  res->data = NULL;\n");
544            fprintf(fp, "  %s();\n", pi->funcname);
545            fprintf(fp, "  return FALSE;\n}\n\n");
546            break;
547           
548          default:
549            fprintf(fp, "  res->rtyp = %s;\n", pi->return_val.typname);
550            fprintf(fp, "  res->data = (void *)%s();\n", pi->funcname);
551            fprintf(fp, "  return FALSE;\n}\n\n");
552      }
553   
554  }
555     
556     
557}
558
559/*========================================================================*/
560void  mod_write_header(FILE *fp, char *module)
561{
562#if 0
563  FILE *fp;
564  char buf[BUFLEN];
565 
566  regex_t preg;
567  regmatch_t   pmatch[1];
568  size_t  nmatch = 0;
569  char *regex = "@MODULE_NAME@";
570
571  rc = regcomp(&preg, regex, REG_NOSUB);
572  if(rc) return -1;
573
574  if(!regexec(&preg, d_entry->d_name, nmatch, pmatch, REG_NOTBOL))
575    cert_count++;
576  regfree(&preg);
577 
578#else
579  write_header(fp, module);
580  fprintf(fp, "#include <stdlib.h>\n");
581  fprintf(fp, "#include <stdio.h>\n");
582  fprintf(fp, "#include <string.h>\n");
583  fprintf(fp, "#include <ctype.h>\n");
584  fprintf(fp, "%s\n", DYNAinclude[systyp]);
585  fprintf(fp, "\n");
586  fprintf(fp, "#include <locals.h>\n");
587  fprintf(fp, "#include \"%s.h\"\n", module);
588  fprintf(fp, "\n");
589#endif
590}
591
592/*========================================================================*/
593void write_header(FILE *fp, char *module, char *comment)
594{
595  fprintf(fp, "%s/*\n%s * This was automaticly generated by modgen\n",
596          comment, comment);
597  fprintf(fp, "%s * version %s\n", comment, MOD_GEN_VERSION);
598  fprintf(fp, "%s * module %s\n", comment, module);
599  fprintf(fp, "%s * Don't edit this file\n%s */\n", comment, comment);
600  fprintf(fp, "%s\n", comment);
601  fprintf(fp, "%s\n", comment);
602 
603}
604
605/*========================================================================*/
606void enter_id(FILE *fp, char *name, char *value)
607{
608  fprintf(fp, "  enter_id(\"%s\",\"%s\");\n",name, value);
609}
610
611void mod_write_enter_id(FILE *fp)
612{
613  fprintf(fp, "void enter_id(char *name, char *value)\n");
614  fprintf(fp, "{\n  idhdl h;\n\n");
615  fprintf(fp, "  h = enterid(mstrdup(name),0, STRING_CMD, &IDROOT, FALSE);\n");
616  fprintf(fp, "  if(h!=NULL) {\n");
617  fprintf(fp, "     IDSTRING(h) = mstrdup(value);\n");
618  fprintf(fp, "  }\n}\n\n");
619}
620
621static char *object_name(char *p)
622{
623  char *q = (char *)strrchr(p, '.');
624  if(q==NULL) return "";
625  *q = '\0';
626  char *r = (char *)malloc(strlen(p)+4);
627  switch(systyp) {
628      case SYSTYP_LINUX:
629        sprintf(r, "%s.lo", p);
630        break;
631       
632      case SYSTYP_HPUX9:
633        sprintf(r, "%s.o", p);
634        break;
635  }
636 
637  *q = '.';
638  return(r);
639}
640
641/*========================================================================*/
642void mod_create_makefile(moddefv module)
643{
644  FILE *fp;
645  fp = fopen("Makefile", "w");
646  cfilesv cf = module->files;
647  int i;
648 
649  printf("Creating Makefile  ...");fflush(stdout);
650  write_header(fp, module->name, "#");
651  fprintf(fp, "CC\t= gcc\n");
652  fprintf(fp, "CXX\t= gcc\n");
653  fprintf(fp, "CFLAGS\t= -DNDEBUG -DBUILD_MODULE -I. -I../include\n");
654  fprintf(fp, "#LD\t=\n");
655  fprintf(fp, "\n");
656  fprintf(fp, "SRCS\t= ");
657 
658  for(i=0; i<module->filecnt; i++)
659    fprintf(fp, "%s ", cf[i].filename);
660
661  fprintf(fp, "\nOBJS\t= ");
662  for(i=0; i<module->filecnt; i++)
663    fprintf(fp, "%s ", object_name(cf[i].filename));
664
665  fprintf(fp, "\n\n");
666  switch(systyp) {
667      case SYSTYP_LINUX:
668        fprintf(fp, "all:\t%s.so\n", module->name);
669        fprintf(fp, "\n");
670        fprintf(fp, "%%.lo: %%.cc Makefile\n");
671        fprintf(fp, "\t${CC} ${CFLAGS} -c -fPIC -DPIC $< -o $*.lo\n");
672        fprintf(fp, "\n");
673 
674        fprintf(fp, "%%.la: %%.cc Makefile\n");
675        fprintf(fp, "\t${CC} ${CFLAGS} -c $< -o $*.la\n");
676        fprintf(fp, "\n");
677
678        fprintf(fp, "%s.so: ${OBJS}\n", module->name);
679        fprintf(fp, "\t${CC} ${CFLAGS} -shared -Wl,-soname -Wl,%s.so.%d \\\n",
680                module->name, module->major);
681        fprintf(fp, "\t\t-o %s.so.%d.%d.%d ${OBJS}\n", module->name,
682                module->major, module->minor, module->level);
683        fprintf(fp, "\trm -f %s.so\n", module->name);
684        fprintf(fp, "\tln -s %s.so.%d.%d.%d %s.so\n", module->name, module->major,
685                module->minor, module->level, module->name);
686        fprintf(fp, "\n");
687        break;
688
689      case SYSTYP_HPUX9:
690        fprintf(fp, "all:\t%s.sl\n", module->name);
691        fprintf(fp, "\n");
692        fprintf(fp, "%%.o: %%.cc Makefile\n");
693        fprintf(fp, "\t${CC} ${CFLAGS} -c -fPIC -DPIC $< -o $*.o\n");
694        fprintf(fp, "\n");
695        fprintf(fp, "%s.sl: ${OBJS}\n", module->name);
696        fprintf(fp, "\t${LD} -b -o %s.sl \\\n", module->name);
697        fprintf(fp, "\t\t${OBJS}\n");
698        break;
699       
700  }
701
702  fprintf(fp, "clean:\n");
703  fprintf(fp, "\trm -f *.o *.lo *.so* *.sl *.la *~ core\n\n");
704 
705  fprintf(fp, "distclean: clean\n");
706  fprintf(fp, "\trm -f %s.cc %s.h Makefile\n\n", module->name, module->name);
707 
708  fprintf(fp, "\n");
709  fprintf(fp, "\n");
710
711  fclose(fp);
712  printf("  done.\n");
713}
714
715/*========================================================================*/
Note: See TracBrowser for help on using the repository browser.