* * $Id: makelib.F,v 1.1.1.1 1996/02/15 17:54:29 mclareni Exp $ * * $Log: makelib.F,v $ * Revision 1.1.1.1 1996/02/15 17:54:29 mclareni * Kernlib * * * This directory was created from kerndge.car patch dgemakelib PROGRAM MAKELIB C CERN PROGLIB# MAKELIB .VERSION KERNDGE 1.01 860217 C ORIG. 03/02/86 M.BERNABE, DGC MADRID + J.ZOLL, CERN C- GIVEN A FILE MAKELIB.SRC CONTAINING THE SOURCE C- OF SEVERAL ROUTINES, MAYBE MIXING FORTRAN AND ASSEMBLER, C- THIS PROGRAM WILL COMPILE ONE ROUTINE AT A TIME AND PLACE THE C- RESULTING OBJECT MODULE INTO THE LIBRARY FILE MAKELIB.LB. C- TO SEPARATE THE SOURCE DECKS FROM EACH OTHER, EACH DECK C- MUST START WITH A 'ROUTINE HEADER CARD' (WHICH CAN BE C- GENERATED WITH YPATCHY) AS FOLLOWS : C- FORTRAN : CDECKDGE, NAME [ COMMENT] C- ASSEMBLER : *DECKDGE, NAME [ COMMENT] C- THE REASON FOR THE EXISTENCE OF THIS PROGRAM IS THE ABSENCE C- ON DATA GENERAL COMPUTERS OF THE SYSTEM FUNCTION TO C- CONVERT A MANY-MODULE OBJECT FILE INTO A LIBRARY. %LIST (OFF) %INCLUDE 'QSYM.F77.IN' %LIST (ON) C- PACKET TO START A CLI PROCESS IN ORDER TO : C- COMPILE / ASSEMBLE THE SELECTED SOURCE, C- ADD THE OBJECT TO THE LIBRARY, C- DELETE SOURCE AND OBJECT. INTEGER*2 PROC_PACK(0:ISYS_PLTH-1)/ISYS_PLTH*-1/ INTEGER*2 FLAGS INTEGER*4 AD_PROG_CLI INTEGER*4 AD_INIT_IPC_HEAD EQUIVALENCE (FLAGS,PROC_PACK(ISYS_PFLG)) EQUIVALENCE (AD_PROG_CLI,PROC_PACK(ISYS_PSNM)) EQUIVALENCE (AD_INIT_IPC_HEAD,PROC_PACK(ISYS_PIPC)) C- PACKET TO HANDLE THE IPC RELATED TO PROC_PACK. C- IT WILL CONTAIN THE COMMANDS -AS AN INITIAL IPC- C- TO EXECUTE THE STEPS SPECIFIED ABOVE (COMPILE, ADD, DELETE). INTEGER*2 ISR_PACK(0:ISYS_IPLTH-1)/ISYS_IPLTH*0/ INTEGER*2 LT_INIT_IPC INTEGER*4 AD_INIT_IPC EQUIVALENCE (LT_INIT_IPC,ISR_PACK(ISYS_ILTH)) EQUIVALENCE (AD_INIT_IPC,ISR_PACK(ISYS_IPTR)) INTEGER*4 AC0,AC1,AC2 ! ACUMULATORS CHARACTER*8 CH_PROG_CLI CHARACTER*50 INIT_IPC ! WILL CONTAIN THE COMMANDS. CHARACTER*88 LINE ! ONE LINE OF DATA. CHARACTER*32 FILENAME ! THE MODULE NAME. C INTEGER*2 INZERO / 0 / CHARACTER*1 CHZERO ! TERMINATING ZERO C EQUIVALENCE (INZERO,CHZERO) DATA CHZERO / '<0>' / CH_PROG_CLI = ':CLI.PR'//CHZERO PRINT 9011 9011 FORMAT ('0MAKELIB EXECUTING' +/'0IT EXPECTS ON FILE MAKELIB.SCR THE SOUCE DECKS SEPARATED BY' +/' LINES "CDECKDGE, NAME" FOR COMPILATION, OR' +/' "*DECKDGE, NAME" FOR ASSEMBLY.' +/'0FILE MAKELIB.ERRORS MUST NOT PRE-EXIST.') OPEN (77,FILE='MAKELIB.ERRORS',STATUS='OLD',IOSTAT=IER,RECFM='DS') IF (IER.EQ.21) GO TO 14 PRINT *,'0***** MAKELIB.ERRORS EXISTS - STOP - *****' STOP C---- CREATE FILE MAKELIB.CLI TO BE EXECUTED 14 OPEN (33,FILE='MAKELIB.CLI',STATUS='FRESH') WRITE (33,9014) WRITE (33,9015) WRITE (33,9016) WRITE (33,9017) 9014 FORMAT +('DEL/1=I/2=I MAKELIB.ERR' +/'[!EQ [!EEXT %1%],.F77]' +/' X/L=MAKELIB.ERR F77/CARD/OPT/NOW/STR=ANSI [!ENAM %1%]' +/'[!ELSE]' +/' X/L=MAKELIB.ERR MASM [!ENAM %1%]' +/'[!END]' +/'[!UNE 1,[!SIZE MAKELIB.ERR]]' +/' [!EQ [!EEXT %1%],.F77]' +/' WR/L=MAKELIB.ERRORS Compilation error in %1%.' +/' [!ELSE]' +/' WR/L=MAKELIB.ERRORS Assembly error in %1%.' +/' [!END]' ) 9015 FORMAT +('[!ELSE]' +/' DEL %1%' +/' CLASS1 WARNING' +/' [!NE [!FILENAM MAKELIB.LB],=MAKELIB.LB]' +/' CLASS1 ERROR' +/' DEL/1=I/2=I MAKELIB.ERR' +/' X/L=MAKELIB.ERR LFE N MAKELIB.LB/O [!ENAM %1%].OB' +/' [!UNE 1,[!SIZE MAKELIB.ERR]]' +/' WR/L=MAKELIB.ERRORS Error creating Library.' +/' DEL/1=I/2=I MAKELIB.LB' +/' [!END]' +/' DEL [!ENAME %1%].OB' ) 9016 FORMAT +(' [!ELSE]' +/' CLASS1 ERROR' +/' RENAM MAKELIB.LB MAKELIB_OLD.LB' +/' DEL/1=I/2=I MAKELIB.ERR' +/' X/L=MAKELIB.ERR LFE I MAKELIB_OLD.LB/I &' +/' MAKELIB.LB/O [!ENAM %1%].OB' +/' [!UEQ 1,[!SIZE MAKELIB.ERR]]' +/' DEL MAKELIB_OLD.LB' +/' [!ELSE]' +/' WR/L=MAKELIB.ERRORS Cataloging error &' +/' in %1%.' +/' RENAM MAKELIB_OLD.LB MAKELIB.LB' +/' [!END]' ) 9017 FORMAT +(' DEL [!ENAM %1%].OB' +/' [!END]' +/'[!END]' +/'BYE' ) CLOSE (33) C---- SKIP LEADING LINES, BEFORE THE FIRST HEADER, IF ANY JCARD = 0 JDECK = 0 JFLEOF= 0 OPEN (44,FILE='MAKELIB.SRC',STATUS='OLD',IOINTENT='INPUT' +, PAD='YES') 24 READ (44,8024,END=98) LINE 8024 FORMAT (A) JCARD = JCARD + 1 IF (LINE(2:9).NE.'DECKDGE,') GO TO 24 C---- START NEXT DECK 31 DO 33 JA=10,32 IF (LINE(JA:JA).NE.' ') GO TO 34 33 CONTINUE 34 DO 36 JE=JA+1,JA+28 IF (LINE(JE:JE).EQ.' ') GO TO 37 36 CONTINUE 37 LT_FILENAME = JE - JA + 5 IF (LINE(1:1).EQ.'C') THEN FILENAME = LINE(JA:JE-1)//'.F77'//CHZERO ELSE FILENAME = LINE(JA:JE-1)//'.SR'//CHZERO ENDIF C-- READ FIRST TRUE LINE OF DECK, CHECK HEADER AGAIN READ (44,8024,RETURNRECL=NCHLI,END=91) LINE JCARD = JCARD + 1 IF (LINE(2:9).EQ.'DECKDGE,') GO TO 31 OPEN (55,FILE=FILENAME,STATUS='FRESH') C-- COPY COMPLETE DECK TO FILE 55 44 WRITE (55,8024) LINE(1:MAX(1,NCHLI)) READ (44,8024,RETURNRECL=NCHLI,END=48) LINE JCARD=JCARD+1 IF (LINE(2:9).EQ.'DECKDGE,') GO TO 49 GO TO 44 48 JFLEOF = 7 49 CLOSE (55) C---- COMPILE / ADD TO LIBRARY / ERASE FILES JDECK = JDECK + 1 C-- FILL THE BUFFER WITH THE COMMANDS TO BE EXECUTED : INIT_IPC = "MAKELIB.CLI "//FILENAME(1:LT_FILENAME) C-- PREPARE THE REST OF THE PACKET : FLAGS = ISYS_PFEX ! BLOCK FATHER. AD_PROG_CLI = BYTEADDR (CH_PROG_CLI) ! WILL EXECUTE CLI. AD_INIT_IPC_HEAD = WORDADDR(ISR_PACK) ! INITIAL IPC. LT_INIT_IPC = 25 ! LENGTH IN WORDS. AD_INIT_IPC = WORDADDR(INIT_IPC) ! COMMANDS TO EXECUTE. C-- SET UP ACUMULATORS AND ISSUE THE SYSTEM CALL : AC0 = 0 AC1 = 0 AC2 = WORDADDR(PROC_PACK) IER = ISYS(ISYS_PROC,AC0,AC1,AC2) ! START PROCESS. IF (IER.NE.0) THEN PRINT *,'ERROR IN PROCESS : ',IER STOP ENDIF IF (JFLEOF.EQ.0) GO TO 31 91 OPEN (77,FILE='MAKELIB.ERRORS',STATUS='OLD',IOSTAT=IER,RECFM='DS') IF (IER.EQ.0) GO TO 92 IF (IER.EQ.21) GO TO 93 PRINT *,'UNEXPECTED ERROR ',IER, + ' WHEN TRYING TO OPEN FILE MAKELIB.ERRORS.' STOP 92 PRINT 9092, JDECK, JCARD 9092 FORMAT ('0***** THERE HAVE BEEN COMPILATION ERRORS *****', +/7X,'MAKELIB HAS PLACED ONLY THE GOOD ROUTINES ONTO MAKELIB.LB,' +/7X,'FOR THE BAD ROUTINES IT HAS CREATED ONE SOURCE FILE EACH' +/7X,'AND YOU FIND THE ERROR MESSAGES ON FILE MAKELIB.ERRORS' +/,'0 PROCESSED ',I7,' CARDS IN',I5,' DECKS.') STOP 93 PRINT 9093, JDECK, JCARD 9093 FORMAT ('0MAKELIB.LB BUILT FROM',I7,' CARDS IN',I5,' DECKS.') STOP 98 PRINT 9098, JCARD 9098 FORMAT ('0*****',I7,' CARDS READ AND NO HEADER CARD FOUND,' +, ' NO COMPILATIONS *****') STOP END