The CERNLIB directory structure is basically the same for Unix, VMS and VM/CMS systems. We describe below the structure for Unix systems and note the differences for VMS and VM/CMS systems.
The directory tree for CERNLIB files begins at /cern. This may be a filesystem or a link. Below this top level directory are a number of subdirectories which fall into one of three categories:
zfatal:/cern (76) ls /cern 93c 94a cmz new patchy pro 93d WWW mad old phigs # # zfatal:/cern (80) ls -l total 24 drwxrwxr-x 7 cpl-main asis 512 Jul 05 22:32 93c drwxrwxr-x 6 cpl-main asis 512 Nov 10 18:13 93d drwxr-xr-x 4 cernlib asis 512 Oct 21 03:53 94a drwxrwxr-x 3 cpl-gean asis 512 Feb 23 1993 WWW drwxrwxr-x 5 cpl-hist asis 512 Oct 28 09:14 cmz drwxrwxr-x 4 8120 asis 512 Nov 08 1992 mad lrwxrwxrwx 1 cpl-main asis 3 Jun 14 13:16 new -> 93d lrwxrwxrwx 1 cpl-main asis 3 Sep 23 09:02 old -> 93c drwxrwxr-x 3 8117 asis 512 Nov 26 1992 patchy drwxrwxr-x 4 cpl-main asis 512 Jun 10 15:24 phigs lrwxrwxrwx 1 cernlib asis 3 Oct 28 14:14 pro -> 93d
On VMS systems, the logical name CERN points to the root directory for the CERNLIB tree, as shown below. The CERN logical name
VXCRNA? sh log cern "CERN" = "_$22$DUS206:[CERN.]" (LNM$SYSTEM_TABLE)
This directory contains subdirectories as in the Unix case, as shown below. CERNLIB subdirectory structure
VXCRNA? dir $22$dus206:[cern] Directory $22$DUS206:[CERN] 000000.DIR;1 92B.DIR;1 93C.DIR;1 93D.DIR;1 94A.DIR;1 CMZ.DIR;1 DECW.DIR;1 FATMEN.DIR;1 GKS.DIR;1 HEPDB.DIR;1 HISTORIAN.DIR;1 HYDRA.DIR;1 LAPACK.DIR;1 MAD.DIR;1 NAG.DIR;1 NEW.DIR;1 OLD.DIR;1 PATCHY.DIR;1 PHIGS.DIR;1 PRO.DIR;1 RELEASE.LEVEL;8 WWW.DIR;1
On VXCERN, the logical name CERN is a search list. It is composed of three individual logical names, as follows:
$! $! CERN library tree is on DISK$CERNLIB volume set $! $ if f$logical("disk$cernlib").nes."" $ then $ cernlib_disk = F$getdvi("disk$cernlib","FULLDEVNAM") $ def/sys/exec/tran=(term,conc) cernaxp 'cernlib_disk'[cernaxp.] $ def/sys/exec/tran=(term,conc) cernvax 'cernlib_disk'[cern.] $ endif $! $! Now mount the /asis/share file system $! $ nfsmount/soft asis01:"/asis/share" ASIS_SHARE $ nfsdev=F$GETDVI("ASIS_SHARE","FULLDEVNAM") $ If nfsdev.nes."" Then - assign/sys/exec/trans=(conc,term) 'nfsdev'[cern.] NFSCERN $ If nfsdev.nes."" Then - assign/sys/exec/trans=(conc,term) 'nfsdev'[cern.] CERNNFS $ Endif $! $! Now define the CERNlib logical names as a function of the above $! $ @cern:[new.mgr]cern\_logicals
At the time of writing, some directories exist only in the CERNVAX tree. However, it is planned that all files shared between the VAX and Alpha architectures be moved progressively to the asis01 server.
N.B. the binaries and libraries are incompatible between VAX and Alpha systems. Thus, if you wish to copy the VAX executables over DECnet, use
COPY VXCERN::CERNVAX:[PRO.EXE]*.*
Similarly, to get the Alpha versions of the libraries, use
COPY VXCERN::CERNAXP:[PRO.LIB]*.*
On VXCERN, the NEW, PRO and OLD subdirectories are pointers to other subdirectories, created using the VMS command SET FILE/ENTER.
On VXCERN, much of the system wide login procedure is performed using CLUSTER$MANAGER:EXSYLOGIN.EXE. This is done to speed up logins. The symbols definitions for the CERNLIB commands are defined in the program CERN_ROOT:[MGR]CERNLOGIN.FOR. You may either include this file into your own Fortran file or use the file MAIN_CERNLOGIN.FOR.
MAIN_CERNLOGIN.FOR
IMPLICIT INTEGER(A-Z) INCLUDE '($LIBCLIDEF)' CHARACTER*(*) C_EXE PARAMETER(C_EXE='CERN_ROOT:[EXE]') C I=LIB$K_CLI_GLOBAL_SYM C INCLUDE 'CERN_ROOT:[MGR]CERNLOGIN.FOR' C END
Symbol definitions on VXCERN using CERNLOGIN.FOR
C IMPLICIT INTEGER(A-Z) C INCLUDE '($LIBCLIDEF)' C CHARACTER*(*) C_EXE C PARAMETER(C_EXE='CERN_ROOT:[EXE]') C C THIS IS A FAST VERSION OF THE USUAL SYSTEM WIDE LOGIN.COM . C ALL CERN LIBRARY SYMBOL DEFINITIONS ARE CODED HERE. C C ==================================================================== C Customization section: enable if product is available at your site C f_cmz =1 ! CMZ - CODEME f_garf =1 ! GARFIELD - CERN f_gks =1 ! GKS - GTS-GRAL f_his =1 ! HISTORIAN - OPCODE f_mad =1 ! MAD - CERN f_nag =1 ! NAG - NAG Ltd f_patc =1 ! PATCHY - CERN f_rzco =1 ! RZCONV - CERN f_umon =1 ! UMON - CERN f_vaxt =1 ! VAXTAP - CERN f_www =1 ! WWW - CERN C C End of customization C ==================================================================== C C I=LIB$K_CLI_GLOBAL_SYM C RECODE=LIB$SET_SYMBOL('CERNLIB','$'//C_EXE//'CERNLIB' ,I) RECODE=LIB$SET_SYMBOL('CERN_LEVEL','PRO' ,I) C C--- PATCHY Symbols C IF(F_PATC.EQ.1) THEN RECODE= + LIB$SET_SYMBOL('FCASPLIT','$CERN:[patchy.4_15.EXE]FCASPLIT',I) C RECODE= + LIB$SET_SYMBOL('YCOM*PAR','$CERN:[patchy.4_15.EXE]YCOMPAR',I) RECODE= + LIB$SET_SYMBOL('YEDI*T' ,'$CERN:[patchy.4_15.EXE]YEDIT' ,I) RECODE= + LIB$SET_SYMBOL('YFRC*ETA','$CERN:[patchy.4_15.EXE]YFRCETA',I) RECODE= + LIB$SET_SYMBOL('YIND*EX' ,'$CERN:[patchy.4_15.EXE]YINDEX' ,I) RECODE= + LIB$SET_SYMBOL('YLIS*T' ,'$CERN:[patchy.4_15.EXE]YLIST' ,I) C RECODE= + LIB$SET_SYMBOL('YPAT*CHY','$CERN:[patchy.4_15.EXE]YPATCHY',I) RECODE= + LIB$SET_SYMBOL('YSEA*RCH','$CERN:[patchy.4_15.EXE]YSEARCH',I) RECODE= + LIB$SET_SYMBOL('YSHI*FT' ,'$CERN:[patchy.4_15.EXE]YSHIFT' ,I) RECODE= + LIB$SET_SYMBOL('YTOBC*D' ,'$CERN:[patchy.4_15.EXE]YTOBCD' ,I) RECODE= + LIB$SET_SYMBOL('YTOBI*N' ,'$CERN:[patchy.4_15.EXE]YTOBIN' ,I) RECODE= + LIB$SET_SYMBOL('YTOC*ETA','$CERN:[patchy.4_15.EXE]YTOCETA',I) C RECODE=LIB$SET_SYMBOL('YEXP*AND','@'//C_EXE//'YEXPAND',I) C ENDIF C C--- CERNlib Tools C RECODE=LIB$SET_SYMBOL('GETOPT','@'//C_EXE//'GETOPT' ,I) RECODE=LIB$SET_SYMBOL('SETENV','@'//C_EXE//'SETENV " "',I) RECODE=LIB$SET_SYMBOL('XTERM' ,'@'//C_EXE//'XTERM " "',I) RECODE=LIB$SET_SYMBOL('RESIZE','@'//C_EXE//'RESIZE' ,I) RECODE=LIB$SET_SYMBOL('MKCOMP*ILE','@'//C_EXE//'MKCOMPILE',I) C C--- CERNlib Products C RECODE=LIB$SET_SYMBOL('DZEDIT','@'//C_EXE//'DZEDIT " "',I) RECODE=LIB$SET_SYMBOL('FM','$'//C_EXE//'FATMEN' ,I) RECODE=LIB$SET_SYMBOL('HEPDB','$'//C_EXE//'HEPDB' ,I) RECODE=LIB$SET_SYMBOL('GXINT','@'//C_EXE//'GXINT " "' ,I) RECODE=LIB$SET_SYMBOL('HIGZCONV','$'//C_EXE//'HIGZCONV',I) RECODE=LIB$SET_SYMBOL('KUIPC','$'//C_EXE//'KUIPC' ,I) RECODE=LIB$SET_SYMBOL('PAW' ,'@'//C_EXE//'PAW.COM " "',I) RECODE=LIB$SET_SYMBOL('HTONEW','$'//C_EXE//'HTONEW' ,I) RECODE=LIB$SET_SYMBOL('FATSREQ','$'//C_EXE//'FATSREQ' ,I) RECODE=LIB$SET_SYMBOL('SYSREQ','$'//C_EXE//'SYSREQ' ,I) RECODE= +LIB$SET_SYMBOL('TELNETG','@'//C_EXE//'TELNETG.COM " "',I) RECODE=LIB$SET_SYMBOL('ZFTP','$'//C_EXE//'ZFTP' ,I) RECODE=LIB$SET_SYMBOL('WYLBUR','$'//C_EXE//'WYLBUR' ,I) RECODE=LIB$SET_SYMBOL('USE','$'//C_EXE//'WYLBUR' ,I) C RECODE=LIB$SET_SYMBOL('TO','$'//C_EXE//'NEWTONET.EXE' ,I) C C--- CMZ symbols C IF(F_CMZ.EQ.1) THEN RECODE=LIB$SET_SYMBOL('CMZ' ,'@'//C_EXE//'CMZ.COM " "',I) ENDIF C C--- GARFIELD symbols C IF(F_GARF.EQ.1) THEN RECODE=LIB$SET_SYMBOL('GA*RFIELD','$'//C_EXE//'GARFRUN',I) C RECODE=LIB$SET_SYMBOL('GH*ELP', C + 'HELP/NOLIBLIST/LIBRARY=HELP$GARFIELD',I) RECODE=LIB$SET_SYMBOL('GED*IT','LSE/ENV=LSE$GARFIELD',I) ENDIF C C--- GKS symbols C C IF(F_GKS.EQ.1) THEN C C ENDIF C C--- HISTORIAN symbols C IF(F_HIS.EQ.1) THEN RECODE=LIB$SET_SYMBOL('HISTE','$HISTORIAN_ROOT:[EXE]HISTE',I) RECODE=LIB$SET_SYMBOL('HISTG','$HISTORIAN_ROOT:[EXE]HISTG',I) RECODE=LIB$SET_SYMBOL('HISTO*R','$HISTORIAN_ROOT:[EXE]HISTOR',I) ENDIF C C--- MAD symbols C IF(F_MAD.EQ.1) THEN RECODE=LIB$SET_SYMBOL('MAD8','@'//C_EXE//'MAD8.COM " "',I) ENDIF C C--- NAG symbols C IF(F_NAG.EQ.1) THEN C RECODE=LIB$SET_SYMBOL('NAGH*ELP','$NAG_ROOT:[EXE]NAGHELP' ,I) RECODE=LIB$SET_SYMBOL('NAGT*EST','@NAG_ROOT:[EXE]NAGTEST " "',I) ENDIF C C--- RZCONV symbols C RECODE=LIB$SET_SYMBOL('RTOA','$'//C_EXE//'RTOA',I) RECODE=LIB$SET_SYMBOL('RTOX','$'//C_EXE//'RTOX',I) RECODE=LIB$SET_SYMBOL('RFRA','$'//C_EXE//'RFRA',I) RECODE=LIB$SET_SYMBOL('RFRX','$'//C_EXE//'RFRX',I) C C--- VAXTAP symbols C IF(F_VAXT.EQ.1) THEN RECODE=LIB$SET_SYMBOL('EINIT' ,'$'//C_EXE//'EINIT' ,I) RECODE=LIB$SET_SYMBOL('LABELDUMP','$'//C_EXE//'LABELDUMP',I) RECODE=LIB$SET_SYMBOL('SETUP' ,'$'//C_EXE//'SETUP' ,I) RECODE=LIB$SET_SYMBOL('STAGE' ,'$'//C_EXE//'STAGE' ,I) RECODE=LIB$SET_SYMBOL('TAPECOPY' ,'@'//C_EXE//'TAPECOPY' ,I) RECODE=LIB$SET_SYMBOL('WRTAPE' ,'$'//C_EXE//'WRTAPE' ,I) RECODE=LIB$SET_SYMBOL('XTAPE' ,'$'//C_EXE//'XTAPE' ,I) ENDIF C C--- WWW symbols C IF(F_WWW.EQ.1) THEN RECODE=LIB$SET_SYMBOL('WWW' ,'$CERN:[WWW.EXE]WWW' ,I) RECODE=LIB$SET_SYMBOL('WEB' ,'@CERN_ROOT:[EXE]WEB " "' ,I) C RECODE=LIB$SET_SYMBOL('XMOSAIC' ,'@CERN:[WWW.EXE]XMOSAIC' ,I) ENDIF C
The following steps must be followed before installing CERNLIB software on Unix systems.
The following steps must be followed before installing CERNLIB software on VMS systems.
The PATCHY modules are stored in the BACKUP saveset VXCERN::CERN:[PRO.BCK]CRNPAT.BCK. We can either retrieve and unpack this saveset or install PATCHY from scratch as shown below.
Installing PATCHY from scratch
VSCLIB? create/directory [.patchy] VSCLIB? create/directory [.scratch] ! work directory for patchy installation VSCLIB? set default [.patchy] VSCLIB? copy vxcern::cernvax:[patchy.src.vaxvms]*.* * VSCLIB? edit/edt patchy.com ! modify the source, work and target directories as appropriate VSCLIB? @patchy
PATCHY.COM command file
$!****************************************************************** $!* * $!* Patchy installation job * $!* * $!****************************************************************** $! $!--- Customization section ---------------------------------------- $! SDIR="CERN:[PATCHY.SRC.VAXVMS]" ! Patchy source directory $! WDIR="DISK$SCRATCH:[PUBCR.WORK]" ! working directory $ sdir="disk$user1:[jamie.patchy]" $ wdir="disk$user1:[jamie.scratch]" $!------------------------------------------------------------------ $! $ ver_imag=F$ENVIRONMENT("verify_image") $ ver_def =F$ENVIRONMENT("DEFAULT") $ ver_proc=F$VERIFY(0) $ $ SET DEFAULT 'WDIR' $ $ If F$SEARCH("P4INCETA.CET").eqs."" Then COPY 'SDIR'P4INCETA.CET *.* $!------------- $ If p1.nes."R" $ Then $ @'SDIR'rceta.sh $ differ p4boot.com 'SDIR'p4boot.sh0 $ @p4boot 0 $ Else $ copy 'SDIR'p4boot.sh0 p4boot.com $ @p4boot 1 $ @p4boot 2 $ Endif $!---------------------------------------------------------------------- $ copy/log Y*.EXE CERN_ROOT:[EXE] $ delete/log Y*.EXE;*,RCETA.*;* $! $ dummy=F$VERIFY(ver_proc,ver_imag) $ SET DEFAULT 'ver_def' $ Exit
The following example shows how one might setup the CERNLIB tree on a new system.
Example of directory setup for installing the CERNLIB software
VSCLIB? show default DISK$USER1:[CERNLIB] VSCLIB? create/directory [.cern] VSCLIB? show logical disk$user1 "DISK$USER1" = "_UXCNB1$DUA20:" (LNM$SYSTEM_TABLE) VSCLIB? def/job/tran=(conc,term) cern _uxcnb1$dua20:[cernlib.cern.] VSCLIB? create/directory cern:[cmz] ! If you wish to install CMZ VSCLIB? set default cern:[new] VSCLIB? create/directory cern:[new.src] VSCLIB? create/directory cern:[new.src.car] ! For the source files VSCLIB? create/directory cern:[new.mgr] ! for the installation command files VSCLIB? create/directory cern:[new.exe] ! required for GETOPT, SETENV etc. VSCLIB? create/directory cern:[new.lib] ! for OLBs and link options files
We now retrieve the installation files as shown below.
Retrieving the installation files
VSCLIB? set default cern:[new.mgr] VSCLIB? copy vxcern::cern:[new.mgr]*.com; * VSCLIB? copy vxcern::cern:[new.mgr]*.for; * VSCLIB? copy vxcern::cern:[new.mgr]*.c; * VSCLIB? set default [-.exe] VSCLIB? copy vxcern::cern:[new.exe]*.com; * VSCLIB? set default cern:[new.lib] VSCLIB? copy vxcern::cern:[new.lib]*.opt; * VSCLIB? create/directory cern:[decw] ! If you want to link PAW with the old version ! of DECwindows VSCLIB? set default cern:[decw] VSCLIB? copy vxcern::cernvax:[decw]*.exe *
We now compile and link the program MAIN_CERNLOGIN.FOR and customise our LOGIN.COM.
Example LOGIN.COM for the CERNLIB account
$ define cern _uxcnb1$dua20:[cernlib.cern.] /trans=(conc,term) $ run cern:[new.mgr]main_cernlogin $! $! The following symbols are defined by $! MAIN_CERNLOGIN but we chose to keep $! these modules in a different place $! $ ycompare :== $cern:[new.exe]ycompare $ yedit :== $cern:[new.exe]yedit $ yfrceta :== $cern:[new.exe]yfrceta $ yindex :== $cern:[new.exe]yindex $ ylist :== $cern:[new.exe]ylist $ ypatchy :== $cern:[new.exe]ypatchy $ ysearch :== $cern:[new.exe]ysearch $ yshift :== $cern:[new.exe]yshift $ ytobcd :== $cern:[new.exe]ytobcd $ ytobin :== $cern:[new.exe]ytobin $ ytoceta :== $cern:[new.exe]ytoceta $! $ yexp*and :== @cern:[new.exe]yexpand $! $ fcasplit :== $cern:[new.exe]fcasplit $! $ cern_level :== new $! $ @cern:[new.mgr]plienv
We can retrieve the source files as follows.
Retrieving the source files
VSCLIB? set default cern:[new.src.car] VSCLIB? copy vxcern::cern:[new.src.car]*.c%% * ! .cra and .car files
If we are in DECnet areas 22 or 23, the DECnet areas reserved for CERN, the installation procedures will automatically access the sources through VXCERN.
We are now ready to begin the CERNLIB installation. If there has been no previous installation of CERNLIB on this system, we must procede as follows:
For systems at CERN, it may be more appropriate to access the source files over NFS from asis01. In this case, we procede as above except that we do not need to copy the .cra and .car files from VXCERN or asis01. Instead, we modify our LOGIN.COM as shown below to NFS mount the appropriate asis file system.
CERNLIB LOGIN.COM to access sources over NFS from asis01
$! $! Command file to define environment for CERNLIB installation $! on AXCLIB (Alpha system) $! $! N.B. before running this command file, the following must have $! been performed: $! $! 1) The root for the CERNLIB installation must be setup. $! $! On the CNLAVC, the CERNLIB tree is installed on $! VSCLIB$USER1. $! $! e.g. CREATE/DIRECTORY VSCLIB$USER1:[CERNLIB] $! $! CREATE/DIRECTORY VSCLIB$USER1:[CERNLIB.CERNAXP] $! $! These directory names are arbitrary. One could equally $! well use $! $! CREATE/DIRECTORY VSCLIB$USER1:[FRODO] $! $! CREATE/DIRECTORY VSCLIB$USER1:[FRODO.BAGGINS] $! $! 2) The subdirectory for the appropriate version must be created. $! $! e.g. CREATE/DIRECTORY VSCLIB$USER1:[CERNLIB.CERNAXP.94A] $! $! Again, this directory name is arbitrary. One could have used $! NEW, 93D, GLONK etc. $! $! 3) The subdirectories [.MGR] and [.EXE] must be created. $! $! e.g. CREATE/DIRECTORY VSCLIB$USER1:[CERNLIB.CERNAXP.94A.MGR] $! $! e.g. CREATE/DIRECTORY VSCLIB$USER1:[CERNLIB.CERNAXP.94A.EXE] $! $! 4) The command files in VXCERN::CERN_ROOT:[EXE] and $! VXCERN::CERN_ROOT:[MGR] must be copied $! to the appropriate subdirectory. $! $! 5) Finally, the files VXCERN::CERN_ROOt:[MGR]*.FOR should $! be retrieved and compiled. MAIN_CERNLOGIN.FOR includes $! CERN_ROOT:[MGR]CERNLOGIN.FOR. As CERN_ROOT is not defined $! at this stage, simply edit the file and include CERNLOGIN.FOR $! directly. $! $! If you cannot access the CERN sources via NFS, the following $! steps are also required. $! $! a) Create the subdirectories [.SRC] and [.SRC.CAR] $! $! b) Copy the .CAR and .CRA files from asis01 or VXCERN $! to the [.SRC.CAR] directory. $! $! c) Remove all references to NFS below. $! $! =============================================================== $! $! Mount /asis/share tree using NFS. This avoids us having to copy $! the .CAR and .CRA files locally $! $ if f$trnlnm("asis_share") .eqs. "" then nfsmount/soft asis01:"/asis/share" - asis_share $ nfsdev = f$getdvi("ASIS_SHARE","FULLDEVNAM") $ define/sys/exec nfscern 'nfsdev'[cern.] /trans=(conc,term) $! $! Set the CERNLIB level $! $ cern_level :== 94a $! $! Define the CERN and CERN_ROOT logical names $! $ define/SYS/EXEC/TRANS=(CONCEALED,TERMINAL) - cern _$177$dka300:[cernlib.cernaxp.],'nfsdev'[cern.] $! $ define/SYS/EXEC/TRANS=(CONCEALED,TERMINAL) - cern_root _$177$dka300:[cernlib.cernaxp.'cern_level'.],- 'nfsdev'[cern.'cern_level'.] $! $! For Alpha, need also CERNAXP $! $ define/SYS/EXEC/TRANS=(CONCEALED,TERMINAL) - cernaxp _$177$dka300:[cernlib.cernaxp.] $! $! Define various symbols required by the CERNLIB installation $! (and CERNLIB users) $! $ run main_cernlogin $! $! Reassert the CERNLIB level (MAIN_CERNLOGIN sets it to PRO) $! $ cern_level :== 94a $! $! Set the Program Library Installation Environment $! $ @cern:['cern_level'.mgr]plienv $! $! Override the settings of the following symbols made $! by MAIN_CERNLOGIN.EXE $! $! We must also install these files... $! $ ycompare :== $cern:['cern_level'.exe]ycompare $ yedit :== $cern:['cern_level'.exe]yedit $ yfrceta :== $cern:['cern_level'.exe]yfrceta $ yindex :== $cern:['cern_level'.exe]yindex $ ylist :== $cern:['cern_level'.exe]ylist $ ypatchy :== $cern:['cern_level'.exe]ypatchy $ ysearch :== $cern:['cern_level'.exe]ysearch $ yshift :== $cern:['cern_level'.exe]yshift $ ytobcd :== $cern:['cern_level'.exe]ytobcd $ ytobin :== $cern:['cern_level'.exe]ytobin $ ytoceta :== $cern:['cern_level'.exe]ytoceta $! $ yexp*and :== @cern:['cern_level'.exe]yexpand $! $ fcasplit :== $cern:['cern_level'.exe]fcasplit $! $! Private symbols $! $ ed*it :== edit/tpu/section=sys$login:eve $ t*ype :== type/page