[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[ccp4bb]: Portland Group Fortran compilers - the 99% solution



***  For details on how to be removed from this list visit the  ***
***    CCP4 home page http://www.dl.ac.uk/CCP/CCP4/main.html    ***

Folks:

Several people have asked about using the Portland Group pgf77
compiler to build the CCP4 package.  I happen to be in the process
of configuring a new workstation, so this time I kept more complete 
notes on what I did, which I summarize here.

Caveats:
	1) This machine is running Mandrake 8.0(beta2) with the 2.4.2
	   kernel.  Some oddities in the end result may be due to bugs
	   in the distribution support libraries or even the kernel, 
	   not the pgf77+CCP4 combination.
	2) As you will see, there is some remaining funny stuff having
	   to do with file handling. After a bit of poking around, I
	   discovered this is an ugly can of worms involving M4 (which
	   I don't grok), lib/src/library.c, lib/src/unix.m4, 
	   lib/src/unix.dir/ccpdpn.f, and possibly the libhtml routines.
	   I hope the info I give at the end is sufficient for someone
	   more familiar than I am with arcane details of CCP4
	   file handling to suggest appropriate modifications to unix.m4
	3) I haven't given this particular installation a lot of testing, 
	   since I just built it over the weekend.  But I've had only a
	   few problems using pgf77+CCP4 on my older linux boxes.

OK, here we go.

.../include/ccp4.setup 
--------------------
	I distrust the use of environment variables LD_LIBARY_PATH and
	MAN_PATH, because I've had trouble with them in the past. 
	I commented out both, and instead added the full path name of
	the CCP4 man directory to /etc/man.config, and the full path
	name of the CCP4 lib directory to /etc/ld.so.config
	Later on (after installing the libraries) you will need to run
	/sbin/ldconfig

.../configure
-----------

	I added a configuration option for linux_pgf77.  What I actually
	did was to replace the linux_compaq_compilers keyword sections 
	with a linux_pgf77 keyword instead.  The important definitions 
	are FC FOPTIM M4 XFFLAGS. 
	The key portion of this change is as follows:

linux_pgf77)
# Added by Ethan Merritt March 2001
    echo "! This is a new option and is relatively untested!"
    echo "! March 2001"
  case `uname -sr` in
    Linux*)

       ;;
    *)
       echo "! This doesn't appear to be a Linux system. You should run"
       echo "! configure on a machine of the correct type."
       exit 1 ;;
  esac
  case `which pgf77` in
    *pgf77)

       ;;
    *)
       echo "! You don't appear to have the Portland Group compiler (pgf77). "
       echo "! Either fix that first, or use ./configure linux to compile with g77. "
       exit 1 ;;
  esac
  FC=${FC-pgf77}
  CC=${CC-gcc}
  M4=${M4-"m4 -D_pgf77=1"}
  FOPTIM=${FOPTIM-"-O"}
  COPTIM=${COPTIM-"-O"}
  XFFLAGS=${XFFLAGS-"-g77libs"}
  XCFLAGS=${XCFLAGS-"-DPROTOTYPE "}
  INSTALL_DATA=${INSTALL_DATA-"cp"}
  INSTALL_PROGRAM=${INSTALL_PROGRAM-"cp"}
  SETFLAGS=${SETFLAGS-"amore_FLAGS='-O' rsps_FLAGS='-O' \
                   sftools_FLAGS='$XFFLAGS $FOPTIM' \
               arp_warp_FLAGS='$XFFLAGS $FOPTIM -C -static' \
               mosflm_FFLAGS='$XFFLAGS $FOPTIM -w' \
               mosflm_LDFLAGS='-s' \
               filec_CFLAGS='$XCFLAGS $FOPTIM -Dlinux' "}
  XDL_LIB=${XDL_LIB-"-L${CCP4_LIB} -lxdl_view"}
  XWIN_LIB=${XWIN_LIB-"-L/usr/X11R6/lib -lXt -lSM -lX11 -lICE"}
  XTYPE=${XTYPE-"LINUX"}
  TIDY=${TIDY-"rm -f sta*"}
  if test "$shared_lib" = yes; then
    SHARE_LIB=${SHARE_LIB-'ld -shared -soname libccp4.so --whole-archive -o libccp4.so libccp4.a'}
    SHARE_INST='$(INSTALL_DATA) `pwd`/libccp4.so $(libdir)/libccp4.so'
  fi
  ;;




lib/src/unix.m4
---------------
	The platform-specific configuration stuff for file handling is 
	controlled here, so far as I can work out.  Unfortunately, I do not
	speak M4, so I was reluctant to experiment very much with 
	modifying this file.  I added two lines to lib/src/unix.m4 in an
	attempt to force the use of the READONLY option in Fortran open
	statements.  As you will see, this may or may not have worked.
	Anyhow, the lines were

	_pgf77,1,
	  [define(_readonly,[READONLY,])],

 	added right before the equivalent pair of lines for sgi installations

Building and installing the package
-----------------------------------
	Having now modified ./configure and lib/src/unix.m4, I proceeded to
	build the package

	./configure --with-x --with-shared-lib linux_pgf77
	make >& make_log
	make install >& install_log

	Once the shared libraries are installed in $CCP4/lib, we need to 
	add them to the system ld.so database.  I had already added the
	directory to /etc/ld.so.conf, but the database cannot be updated
	until the libraries are actually there.  So now run

	/sbin/ldconfig

Testing
-------
	I have been using pgf77+CCP4 on my older linux machines (Mandrake 7.1)
	for a while now, so I know that it basically works.  The major problem
	I've encountered has been that scratch files don't delete themselves
	as they are supposed to, which has the unfortunate effect of filling up
	the $CCP4_SCR directory with old scratch files.  I've had to install
	a cron job to clear it out every day, and even then I've had problems
	with running out of disk space if the system is heavily used.
	More on this later.

	To add a bit more testing, I ran the scripts in ./examples/unix/runnable
	run-all >& run-all.log

	Two failures were reported:  lsqkab and refmac5_tls

Residual problems
-----------------
	So it's only a 99% solution to using pgf77. There are still some
	problems with file handling.  I'm pretty sure these are fixable,
	but I haven't worked out exactly where/what to add to unix.m4

	1) The lsqkab_exam failure is due to the program attempting to 
	open the same file twice:  HKLIN1 rnase.pdb HKLIN2 rnase.pdb
	I can understand why this would be illegal without the READONLY
	flag, but I _thought_ that I had correctly added READONLY support.
	So I don't understand why it's still failing.  Just as a side note,
	I don't understand how this example ever works on a system that 
	doesn't support READONLY.

	2) The problem with accumulation of scratch files is because
	the DISPOSE=DELETE file handling option is not configured for
	pgf77 in unix.m4.   However, when I tried to add this based on
	similar lines already in the file for other platforms I ended
	up with really strange errors from the libhtml routines at
	runtime.  The error messages seemed to indicate that the code was
	trying to delete STDOUT (alias LPT), which of course is not a
	good idea.   But I couldn't find any actual cases of that in the
	code, so I'm not really sure what's going on.  I settled for
	installing without the DISPOSE=DELETE support and hoping my cron
	job can delete scratch files faster than they accumulate.

	3) The refmac_tls_exam error is another file open failure.
	It occurs at the very end, after the program has basically 
	finished refining.

	  Last system error message:
	  No such file or directory
	  Refmac_5.0.36:   Open failed: File: /home/tmp/merritt/test-results/refmac5_temp.14022_BOND_R

	This file actually does exist, so I'm guessing that here we have
	another case of a file being opened twice by the program without
	proper READONLY protection.

	4) Not so much a problem, just a comment.  For some reason code
	in the xdl_view directory gets built using the g77 compiler even 
	though ./configure should no longer mention g77 at all when 
	constructing Makefiles.  I don't think this hurts anything on my 
	system, but if you didn't have a working g77 compiler....

Fairly painless, especially on this new (fast!) machine.
Compile+install time about 10 minutes.
If someone can suggest how to correct the file opening options, 
I'd be happy to try it out and report back.


				happy computing!

					Ethan A Merritt
					merritt@u.washington.edu