To build cernlib from the source files you need to install, the imake command, the motif and the compatibility libraries.
$ su
# apt-get update
# apt-get install imake openMotif-devel Libcompat
# apt-get clean
If you just want to use precompiled binary packages, go directly to Installation subsection.
MacOS X Release 10.6My gfortran-related changes have been sent to a CERNLIB maintainer and adopted in CERNLIB v.2006 so the building of CERNLIB on MacOS X is now much easier than before.
gcc-4.5.1-4osx10.6
imake-1.0.2-10.6hepx12c.i386
Libcompat-14.1-10.6hepx12b
openMotif-2.3.0-10.6hepx12c
[0] Preparation
In the following, <somewhere> stands for a directory into which you downloaded necessary tarballs or patches, while <user name> means your login name. Replace them as needed according to your environment.
# cd /
# rm cern
# mkdir /Users/cernlib
# ln -s /Users/cernlib cern
# cd /cern
# tar -zxvf 2006_src.tar.gz
# ln -s 2006 new
# ln -s 2006 pro
# mkdir -p 2006/work
# chown <user name> 2006/work
# chown <user name> 2006
# cd 2006/src
# patch -p1 -s < <somewhere>/cernlib-2006-macosx10.6-gcc451.patch
where the patch is to work around some minor remaining problems.
Then exit the super user mode:
# exit
[1] Build
$ cd /cern/2006/
$ mkdir lib
$ ln -s /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib lib/liblapack3.a
$ ln -s /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib lib/libblas.a
$ cd work
$ export CVSCOSRC=/cern/2006/src
$ mkdir ../bin
$ cp $CVSCOSRC/scripts/cernlib ../bin/
$ $CVSCOSRC/config/imake_boot
$ export PATH=$PATH:/cern/2006/bin
$ mkdir ../logs
$ make tree HAVE_MOTIF='YES' >& ../logs/tree.log &
$ tail -f ../logs/tree.log
^C
$ pushd packlib/kuip/programs/kuipc
$ make
$ make install.bin
$ popd
$ make HAVE_MOTIF='YES' >& ../logs/make.log &
$ tail -f ../logs/make.log
^C
$ cd packlib
$ make install.bin HAVE_MOTIF=YES PACKAGE_LIB='/cern/pro/lib/libpacklib.a' EXTRA_LOAD_FLAGS='-L/usr/osxws/lib -lgfortran' >&
../../logs/packlib.bin.log &
$ tail -f ../../logs/packlib.bin.log
$ cd ../pawlib
$ make install.bin HAVE_MOTIF=YES PACKAGE_LIB='/cern/pro/lib/libpawlib.a' >&
../../logs/pawlib.bin.log &
$ tail -f ../../logs/pawlib.bin.log
$ cd ../graflib
$ make install.bin HAVE_MOTIF=YES PACKAGE_LIB='/cern/pro/lib/libgraflib.a' >&
../../logs/graflib.bin.log &
$ tail -f ../../logs/graflib.bin.log
$ cd ../scripts
$ make install.bin HAVE_MOTIF='YES' >&
../../logs/scripts.bin.log &
$ tail -f ../../logs/scripts.bin.log
$ cd ..
$ make install.include CERN_INCLUDEDIR=/cern/new/include \
>& ../logs/install.include.log &
$ tail -f ../logs/install.include.log
[2] Tests
$ cd packlib
$ make test PACKAGE_LIB='/cern/pro/lib/libpacklib.a' >& ../../logs/packlib.test.log &
$ tail -f ../../logs/packlib.test.log
ALL TESTS PASSED
$ cd ../mathlib
$ make test PACKAGE_LIB='/cern/pro/lib/libmathlib.a' >& ../../logs/mathlib.test.log &
$ tail -f ../../logs/mathlib.test.log
ALL TESTS but C208 and C327 PASSED
$ cd ../graflib/higz/examples
$ make higzex PACKAGE_LIB='/cern/pro/lib/libgraflib.a'
$ ./higzex
OK!
$ cd ../../../../src/pawlib/paw/demo
$ paw all.kumac
...
go
...
OK!
$ cd ../../../../work/mclibs
$ C='gfortran-32 -O0' make test >& ../../logs/mclibs.test.log &
$ tail -f ../../logs/mclibs.test.log
ALL but the
ISAJET test PASSED
$ cd ../phtools
$ make test >& ../../logs/phtools.test.log &
$ tail -f ../../logs/phtools.test.log
ALL TESTS
PASSED
$ cd ../geant321
$ make test EXTRA_LOAD_FLAGS='-undefined dynamic_lookup' >& ../../logs/geant321.test.log &
$ tail -f ../../logs/geant321.test.log
ALL TESTS
PASSED
1. Mathlib problem with C208 (quartic equation solver) is new and is
due to csqrt in libm: csqrt selects the solution for the return value
by looking at the sign of the imaginary part of the argument, which
causes some unexpected behavior like:
$ cat test.cxx
#include <cmath>
#include <complex>
#include <iostream>
int main()
{
using namespace std;
complex<double> z1 = -1.;
complex<double> z2 = 1.;
z2 = -z2;
cerr << "z1 = " << z1 << " sqrt(z1) = " << sqrt(z1) << endl;
cerr << "z2 = " << z2 << " sqrt(z2) = " << sqrt(z2) << endl;
return 0;
}
$ g++ test.cxx
$ ./a.out
z1 = (-1,0) sqrt(z1) = (0,1)
z2 = (-1,-0) sqrt(z2) = (0,-1)
where I expect naively that both of z1 and z2 to be (0, 1). The quartic equation solver (drteq4) returns correct solutions but in different order because of this behavior.
2. Mathlib problem with C327 has been there since 10.3, a precision problem for modified Bessel functions (tsbvsl).
3. Mclibs problem with isajet has been there since 10.3 but
overseen, since the nonzero exit code from g77's stop statement has not
been treated as an error unlike gfortran.
# apt-get update
# apt-get install cernlib
# apt-get clean
# ln -s 2006 /cern/pro
By default cernlib will be installed under /cern. Add /cern/pro/bin to your PATH in order to use PAW, PAW++, etc.