.ENABLE SUBSTITUTION .DISABLE DISPLAY .; .; W. Dwyne STELCO DEC-82 LINK.CMD .; .; Modified to work a disk other than system. W.T.D Feb/83 .; Modified to handle onerr correctly. W.T.D Feb/83 .; Modified to exclude a TKB instruction where the comment .; is followed by a - (ie C- LIBR will be ignored) W.T.D MAR/83 .; Modified to check for the task being active. W.T.D MAY/83 .; Modified to check for the parameter NOLIST and W.T.D AUG/83 .; if found to suppress the listing. .; Modified N parameter to be NOASK W.T.D AUG/83 .; .; .; INSTRUCTIONS FOR USING .; .; To use this command file your source program must contain .; the compile and task build commands starting within the first .; 25 lines. .; These commands lines must be a valid COMMENT LINE followed by a tab .; IE .;C FOR PROG,TI:=PROG ! for fortran .;(; MAC PROG,NL:=PROG) ! for macro .;C PROG/CP,NL:=PROG,LB:[1,1]FOROTS/LB ! for taskbuild .;C / .;C COMMON = .;C SUPLIB = .;C UNITS = .;C // .; .; NOTE: .; A) The compiler command must begin with the name of the compiler ie FOR .; .; B) The last TKB instruction must be // even if you enter no options. .; .; C) Any TKB instructions that have a - (minus sign) attached to the .; comment will be ignored. (ie C- LIBR = ) .; .; D) If you are working on a disk other than the system disk issue the .; local assignment YOURDISK:=SY: ie ASN DK1:=SY: .; .; .; USING LINK.CMD .; .; LINK.CMD CAN BE STARTED BY .; 1) ENTERING @[1,3]LINK PROMPTS FOR PROGRAM NAME .; 2) ENTERING @[1,3]LINK PROG.EXT .; 3) ENTERING @[1,3]LINK PROG IN WHICH CASE THIS .CMD WILL SEARCH .; FOR A .FTN .COM .MAC .F77 .; .; 4) ENTERING LIN WHICH RUNS LINK.FTN TO SPAWN LINK.CMD .; 5) ENTERING LIN PROG LINK.FTN WILL PASS PROGRAM NAME TO .; LINK.CMD .; 6) ENTERING LIN PROG.EXT " " " " " .; .; NOTE: ADDING THE PARAMETER (NOASK) TO THE FILE SPECIFICATION WILL .; DISABLE ALL .ASK WITHIN LINK.CMD .; ie. @LINK PROG.FTN NOASK .; .; ADDING THE PARAMETER (NOLIST) TO THE FILE SPECIFICATION WILL .; DISABLE LISTINGS (source code only) .; ie. @LINK PROG.FTN NOASK .; .ONERR 9000 ; CATCH ANY IND ERRORS .SETS DISK "'''':" ; THE DEFAULT DISK .SETS UIC ; GET THE UIC IN CASE USER CHANGES .SETF WARN ; INDICATES COMPILER ENCOUNTERED WARNINGS .SETF PILER ; INDICATOR FOR A FAILED COMPILE .SETF DOER ; INDICATOR FOR A FAILED TASK BUILD .SETT ASKHIM ; USED TO CONDITIONALLY ISSUE .ASK .SETS NOASK "NOASK" .SETF LISTNO ; USED TO SUPPRESS LISTING FILE .SETS NOLIST "NOLIST" .SETS BLANK "" ; check for blanks .SETS NOCOM "-" ; Indicates that tkb instruction not to be used. .; ; ie C- LIBR = will not be passed to task builder .SETF RUNING ; Used to indicate that the task being built is running .SETS APROG "" ; The name (if any) of the active task. .SETS LIST "" .SETN LCNT 0 .SETN MAX 25 ; MAX # OF LINES TO CHECK FOR COMPILER TKB INSTRUCTIONS .; .; LINE NUMBERS FOR COMPILER # 1 1000 - 1999 .SETS FOR "FOR" .SETS COMP1 "'FOR'" ; COMPILER # 1 .SETS TYPE1 "FTN" ; FILE EXTENSION TYPE FOR COMPILER # 1 .SETS TYPE1A "CON" ; ALTERNATE FILE EXTENSION FOR COMPILER # 1 .; .; LINE NUMBERS FOR COMPILER # 2 2000 - 2999 .SETS MAC "MAC" .SETS COMP2 "'MAC'" ; COMPILER # 2 .SETS TYPE2 "MAC" ; FILE EXTENSION TYPE FOR COMPILER # 2 .; .; LINE NUMBERS FOR COMPILER # 3 3000 - 3999 .SETS F77 "F77" .SETS COMP3 "'F77'" ; COMPILER # 3 .SETS TYPE3 "F77" ; FILE EXTENSION TYPE FOR COMPILER # 3 .; .SETS TASK "TASK" .SETS NAME "Q1Q" .SETF INSTAL ! FOR INSTALLED TEST .; .; .; CHECK TO SEE IF THE SECOUND PARAMETER IS A N IF IT IS WE WILL NOT ASK .; ANY QUESTIONS. .; .IF P2 EQ NOASK .OR .IF P3 EQ NOASK .SETF ASKHIM .IF P2 EQ NOLIST .OR .IF P3 EQ NOLIST .SETT LISTNO .; .; CHECK TO SEE IF THE FILE NAME HAS BEEN PASSED BY LINK.FTN OR LINK.CMD .; IF NOT ASK FOR IT. .; .SETS PROG "'P1'" .; .IF P1 EQ BLANK .ASKS PROG Whats the name of your source program .; .; .; TEST FOR VALID FILE .; .; WAS THE PROGRAM NAME ENTERED WITH AN EXTENSION IE PROG.FTN .; .PARSE PROG "." FILE EXT .IF EXT EQ BLANK .GOTO 9 .TESTFILE 'DISK''UIC''PROG' .IF NE 1 .GOTO 15 .SETS PROG "'FILE'" .SETS TYPE "'EXT'" .GOTO 10 .9: .; .TESTFILE 'DISK''UIC''PROG'.'TYPE1' .IF NE 1 .GOTO 1010 .SETS TYPE "'TYPE1'" .GOTO 10 .1010:.; CHECK THE ALTERNATE FILE EXTENSION .TESTFILE 'DISK''UIC''PROG'.'TYPE1A' .IF NE 1 .GOTO 2000 .SETS TYPE "'TYPE1'" .GOTO 10 .2000: .TESTFILE 'DISK''UIC''PROG'.'TYPE2' .IF NE 1 .GOTO 3000 .SETS TYPE "'TYPE2'" .GOTO 10 .; .3000: .TESTFILE 'DISK''UIC''PROG'.'TYPE3' .IF NE 1 .GOTO 15 .SETS TYPE "'TYPE3'" .GOTO 10 ; .15: ; ; SOURCE PROGRAM 'PROG' NOT FOUND ; ; ; SUPPORTED SOURCE TYPES ARE .'TYPE1' .'TYPE2' AND .'TYPE3' ; .'TYPE1A' ; ; FOR COMPILERS 'COMP1' 'COMP2' AND 'COMP3' .EXIT .10: .; .; OPEN THE SOURCE FILE .; .OPENR #0 'DISK''UIC''PROG'.'TYPE' .; .; .1: .; .; CHECK FOR COMPILE LINE WHICH MUST BEGIN WITH A COMPILER NAME ALLOW 25 .; COMMENT LINES TO PROCEED COMPILER, TASKBUILD INSTRUCTIONS. .; .READ #0 RECORD .IFT .GOTO 4 .INC LCNT .PARSE RECORD " " WORD1 WORD2 .PARSE WORD2 " " WORD1 WORD3 .IF WORD1 EQ 'COMP1' .GOTO 5 .IF WORD1 EQ 'COMP2' .GOTO 5 .IF WORD1 EQ 'COMP3' .GOTO 5 .IF LCNT GT MAX .GOTO 4 .GOTO 1 .4: ; ; ; FAILED TO FIND CMP TKB INSTRUCTIONS IN SOURCE PROGRAM 'PROG' ; .GOTO 99 .; .; SUBMIT COMMAND LINE TO COMPILER .; .5:.IFF LISTNO .GOTO COMPIL .; Option NOLIST is true get the comiler object .; file and source file names. .PARSE WORD2 " " CMP NULL ! Compiler .PARSE NULL "," OBJ NULL1 ! Object .PARSE WORD2 "=" NULL SOURCE ! Source .; Compile with nolist 'CMP' 'OBJ',NL:='SOURCE' .GOTO 6 .COMPIL:'WORD2' .6:.; .; .; CHECK THE STATUS OF COMPILER FOR ERRORS IF TRUE SKIP TKB .; .IF EQ 1 .GOTO 30 .; .IF NE 0 .GOTO 21 .SETT WARN ; ; ; WARNINGS REPORTED BY COMPILER ; .GOTO 25 .21:.IF NE 2 .GOTO 22 ; ; ; ERRORS REPORTED BY COMPILER ; .GOTO 25 .22:; SEVERE OR UNDEFINED ERROR. UNABLE TO CONTINUE .GOTO 99 ; .25: ; .IFT ASKHIM .ASKS list If reqd enter terminal # for list of 'prog'.'type' (IE ti ) ; .IF LIST EQ BLANK .GOTO 30 .PARSE WORD1 " " COMPIL .IF 'COMPIL' EQ COMP1 'COMPIL' ,'LIST':/DI/LI:0='DISK''UIC''PROG'.'TYPE' .IF 'COMPIL' NE COMP1 'COMPIL' ,'LIST':='DISK''UIC''PROG'.'TYPE' .29:.IFF WARN .GOTO 99 ; ; .SETF CONT .IFT ASKHIM .ASK CONT Continue ; .IFF CONT .GOTO 99 .; .30:.SETN LCNT 0 .SETT PILER ; COMPILE MUST BE OK .; .; OPEN THE TEMPORARY FILE X'PROG'.CMD FOR TASK BUILDING .; .OPEN #1 'DISK''UIC''PROG'.BLD .; .; READ THE SOURCE CODE FOR TKB INSTRUCTIONS MAX OF 25 LINES .; .100: .READ #0 RECORD .IFT .GOTO 99 .INC LCNT .; READ FOR TKB 'RECORD' .PARSE RECORD " " WORD1 WORD2 .; .; CHECK THE COMMENT FIELD IF THE 2nd POSITION IS - DO NOT INCLUDE IN .; IN BUILD FILE. .; .SETS COM WORD1[2:2] .; COM IS 'COM' .IF COM NE NOCOM .DATA #1 'WORD2' .; .; CHECK OPTIONS FOR A TASK INSTALLED BY A NAME OTHER THAN ITS OWN. .; .PARSE WORD2 " " OPTION EQUAL VALUE .; OPTION 'OPTION' .; EQUAL 'EQUAL' .; VALUE 'VALUE' .IF OPTION NE TASK .GOTO 101 .SETS NAME "'VALUE'" .101: .; .; CHECK FOR DOUBLE SLASH WHICH INDICATES THE END OF TKB INSTRUCTIONS .; .IF LCNT GT MAX .GOTO 99 .IF WORD2 NE "//" .GOTO 100 .CLOSE #1 .; .; PASS PROG.BLD TO TKB .; TKB @'DISK''UIC''PROG'.BLD .; .; CHECK THE EXIT STATUS OF TKB .; .IF NE 0 .GOTO 40 ; ; ; TASK BUILDER REPORTS WARNINGS. EXIT STATUS = '' ; .GOTO 50 .40:.IF EQ 1 .GOTO 50 ; ; ; TASK BUILD FAILED USING. EXIT STATUS = '' ; ; 'PROG'.TSK WILL NOT BE REMOVED , INSTALLED OR PURGED ; .ENABLE QUIET .; .WAIT PIP PIP TI:='DISK''UIC''PROG'.BLD .DISABLE QUIET .GOTO 99 .50: .SETT DOER .; .; Check if the task is active. If it is we will ask if the task should be .; aborted removed installed and run. If the task is not to be aborted we .; will delete the new version in order to protect the running copy. .; .IFNACT 'NAME' .GOTO 60 ! The task is not active. This is the check .; ! for a TKB TASK = option .SETS APROG "'NAME'" ! get the name of the active task. .SETT RUNING ! flag to indicate that the task is active. .GOTO .ACTIVE .60:.; Make sure that the task name is only six characters then check to see .; if the task is active. .SETS TRPROG PROG[1:6] .IFNACT 'TRPROG' .GOTO ACTNOT .SETS APROG "'TRPROG'" .SETT RUNING .ACTIVE: ; ; The program 'PROG' is ACTIVE ? You have two choices ; ; A) ABORT REMOVE INSTALL and RUN program ; or ; B) Leave the current running version alone and delete the new .TSK ; .SETF ACT .IFT ASKHIM .ASK ACT ABORT REMOVE INSTALL and RUN .IFT ACT .GOTO ABORT .; .; Rename the new version then delete. .; ; ; The new 'APROG'.TSK is being deleted. ; ; Your source code probably does not reflect the current task image. ; This is your problem not mine. However your source has not been purged. ; .ENABLE QUIET ; Delete the new task PIP 'APROG'.TSK;0/DE/NM .DISABLE QUIET .SETF DOER ; Disable the purge. .SETF RUNING ; Indicate that the task is not active .; ; so that it will not be re run. .GOTO 99 ; No need to check if active. ; ; ABORTING the task. It will be restarted. ; .ABORT:.; ABORT 'APROG' .ACTNOT:.; .; .; .; CHECK IF TASK WAS INSTALLED IF TRUE REMOVE AND REINSTALL .; .SETF INSTAL .IFINS 'NAME' .SETT INSTAL ; NAME is a task= .IFINS 'NAME' REM 'NAME' .IFINS 'PROG' .SETT INSTAL .IFINS 'PROG' REM 'PROG' .IFT INSTAL INS 'DISK''UIC''PROG' .; .99:.IFF PILER .SETF DOER ; CLEAN UP AND EXIT .ENABLE QUIET PIP 'DISK''UIC''PROG'.OBJ;*/DE/NM,'PROG'.BLD;*,'PROG'.MAP;* .WAIT PIP .IFT DOER PIP 'DISK''UIC''PROG'.*/PU/NM .IFT RUNING RUN 'APROG' .CLOSE #0 .CLOSE #1 .DISABLE QUIET .IFT PILER .AND .IFT DOER .GOTO 150 ; ;?????????????? LINK FAILED FOR 'DISK''UIC''PROG'.'TYPE' ????????????? .GOTO 160 .150: ;************** LINK COMPLETE FOR 'DISK''UIC''PROG'.'TYPE' ************* .160:; ; .EXIT .9000:.DISABLE QUIET ;*************************************************************************** ; ; LINK EXITING DUE TO INDIRECT COMMAND FILE ERROR ; ;?????? STATE OF PROGRAM 'DISK' 'UIC''PROG'.'TYPE' IS UNKNOWN ?????? ; ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^