install script errors

The install script goes wrong when there is an existing installation on Linux x86_64 with no 32-bit glibc. Tested on RHEL 6.4 patched to 2013-05-22.

This results in (v. 13.5) :

Do you accept these terms? (accept,decline) accept
Installing software into /usr/local/pgi (this may take some time).
##############./install: line 431: cd: /usr/local/pgi/linux86/13.5: No such file or directory
#./install: line 431: cd: /usr/local/pgi/linux86/13.5: No such file or directory
tar: doc/pgdbg13ug.pdf: file changed as we read it
tar: doc/pgdbginstall135.pdf: file changed as we read it
tar: doc/pgiinstall135.pdf: file changed as we read it
tar: doc/pgicudaforug.pdf: file changed as we read it
tar: doc/pgi13ref.pdf: file changed as we read it
tar: doc/pgirn135.pdf: file changed as we read it
tar: doc/pgdbgrn135.pdf: file changed as we read it
tar: doc/acml.pdf: file changed as we read it
tar: doc/pgifortref.pdf: file changed as we read it
tar: doc/pgi13ug.pdf: file changed as we read it
tar: doc/pgprof13ug.pdf: file changed as we read it
tar: doc: file changed as we read it
#./install: line 431: cd: /usr/local/pgi/linux86/13.5: No such file or directory
tar: EXAMPLES/MPI/NPB2.3/FT: file changed as we read it
tar: EXAMPLES/MPI/NPB2.3/MG: file changed as we read it
tar: EXAMPLES/MPI/NPB2.3/MPI_dummy: file changed as we read it
tar: EXAMPLES/MPI/NPB2.3/LU: file changed as we read it
tar: EXAMPLES/MPI/NPB2.3/SP: file changed as we read it
tar: EXAMPLES/MPI/NPB2.3/BT: file changed as we read it
tar: EXAMPLES/MPI/NPB2.3: file changed as we read it
tar: EXAMPLES/MPI/hpfnpb/bt/src: file changed as we read it
tar: EXAMPLES/MPI/hpfnpb/bt: file changed as we read it
tar: EXAMPLES/MPI/hpfnpb/sp/src: file changed as we read it
tar: EXAMPLES/MPI/hpfnpb: file changed as we read it
tar: EXAMPLES/MPI/mpi: file changed as we read it
tar: EXAMPLES/MPI/scalapack: file changed as we read it
tar: EXAMPLES/MPI/blacs/blacstest.f: file changed as we read it
tar: EXAMPLES/MPI/blacs: file changed as we read it
tar: EXAMPLES/fftpde/STEPS: file changed as we read it
tar: EXAMPLES/fftpde: file changed as we read it
#./install: line 431: cd: /usr/local/pgi/linux86/13.5: No such file or directory
#./install: line 431: cd: /usr/local/pgi/linux86/13.5: No such file or directory
#./install: line 431: cd: /usr/local/pgi/linux86/13.5: No such file or directory
#./install: line 431: cd: /usr/local/pgi/linux86/13.5: No such file or directory
#./install: line 431: cd: /usr/local/pgi/linux86/13.5: No such file or directory
#./install: line 431: cd: /usr/local/pgi/linux86/13.5: No such file or directory
#./install: line 431: cd: /usr/local/pgi/linux86/13.5: No such file or directory
###########

then e.g.

Installing PGI JAVA components into /usr/local/pgi
This might take awhile ...
./install: line 626: cd: /usr/local/pgi/linux86/13.5/lib: No such file or directory
./install: line 630: cd: /usr/local/pgi/linux86/13.5/include: No such file or directory
Installing PGI CUDA components into /usr/local/pgi

The code at fault includes

    428 if test -d $INSTALL_DIR/linux86 ; then
    429   for i in `cat $COMMON` ; do
    430     x=`basename $i`
    431     tar cf - $x | ( cd $INSTALL_DIR/linux86/$release; tar xf - )
    432     echo -n \#
    433   done
    434 fi

which

i) tries to change to a directory it has not checked exists, then
ii) extracts files where it thinks it should be.

As can be seen, the test (line 428) will always succeed when an existing installation means $INSTALL_DIR/linux86 exists, so the block is executed.

However, $INSTALL_DIR/linux86/$release will never exist because the install script does not create it if /usr/lib/libcrt1.o does not exist - so then the install script just uses tar to write a bunch of files on top of themselves.

Better would be e.g.

    428 if test -d $INSTALL_DIR/linux86/$release ; then
    429   for i in `cat $COMMON` ; do
    430     x=`basename $i`
    431     tar cf - $x | ( cd $INSTALL_DIR/linux86/$release && tar xf - )
    432     echo -n \#
    433   done
    434 fi

or perhaps (?)

    428   if test $support_32_bit -eq 1; then
    429   for i in `cat $COMMON` ; do
    430     x=`basename $i`
    431     tar cf - $x | ( cd $INSTALL_DIR/linux86/$release && tar xf - )
    432     echo -n \#
    433   done
    434 fi

and for the script to create $INSTALL_DIR/linux86/$release on 64-bit platforms if it is needed!

This block:

    141 # Do not copy linux86 directory if x86-64 and no 32-bit support.
    142 
    143 support_32_bit=1
    144 if test "$target" = "linux86-64" ; then
    145   if test ! -f /usr/lib/crt1.o -a ! -f /usr/lib32/crt1.o ; then
    146     support_32_bit=0
[...]
    159   fi
    160   if test $support_32_bit -eq 1; then
    161     PART2=`cat $SRC/.parts/linux86`
    162     PART="$PART $PART2"
    163   fi
    164 fi

is perhaps questionable, because the directories in $PART2 are the ones written to in later lines in the script.

It all works properly if glibc-devel.i686 is installed (RHEL), because then support_32_bit=1, so the linux86 directories do get included in $PART, and then the bits of script that try to write to those directories don’t fall over.

The script should be fixed, though.

Hi gormanly,

I sent this over to our Manufacturing folks. They think they have fix in place for the 13.6 release.

Best Regards,
Mat