Related Projects
ATLAS/LAPACK Cygwin Build Script

Project Lead:

cuda (0 credits)

 

Bounty:

US $0.00(Sponsor Project)

Goal funding:

More Less
Building ATLAS (http://math-atlas.sourceforge.net) on Windows is difficult, building it without depending on the Cygwin runtime is even more difficult. This bounty is for creating a shell script that builds a combined ATLAS/LAPACK library inside Cygwin 1.7.7-1 or newer on Windows 7 (32 and 64 bit)/Vista/XP using MinGW. Its purpose is to make building ATLAS on Windows easier. The script will be added to the Math.NET Numerics project under an X11/MIT license (http://mathnetnumerics.codeplex.com/).

Status:

[COMPLETE]

The final payment was made to whaley on Mon, Jun 18, 2012. This project is complete; no new sponsorships or submissions will be accepted. You can continue to use the forums for discussion purposes.

Note: You can propose changes using the forum below.
Building ATLAS (http://math-atlas.sourceforge.net) on Windows is difficult, building it without depending on the Cygwin runtime is even more difficult. This bounty is for creating a shell script that builds a combined ATLAS/LAPACK library inside Cygwin 1.7.7-1 or newer on Windows 7 (32 and 64 bit)/Vista/XP using MinGW. Its purpose is to make building ATLAS on Windows easier. The script will be added to the Math.NET Numerics project under an X11/MIT license (http://mathnetnumerics.codeplex.com/).

The script should do the following:
1) Downloads ATLAS 3.9.35 from SourceForge if it doesn't exist in the current directory - http://sourceforge.net/projects/math-atlas/files/Developer%20%28unstable%29/3.9.35/atlas3.9.35.tar.bz2/download

2) Downloads LAPACK 3.3 from Netlib if it doesn't exist in the current directory - http://www.netlib.org/lapack/lapack-3.3.0.tgz

3) Build a combined ATLAS/LAPACK library. The script should build at static version of the library by default but have an option to build a DLL (if it is not possible to build a static version, then only building a DLL version is fine).

4) The script should build a parallel version of the library that DOES NOT use Cygwin's version pthreads (the Cygwin runtime), either use Windows threads or Mingw's version of pthreads.

5) The script must be able to build 32 bit and 64 bit versions of the combined library.

6) The resulting library must be able to link to a standard Windows program or DLL without any Cygwin dependencies.

7) The script can use the version of MinGW that ships with Cygwin, the TDM-GCC version (http://tdm-gcc.tdragon.net/), or the MinGW project (www.mingw.org).

Posts in the ATLAS Windows forum might be helpful (http://sourceforge.net/projects/math-atlas/forums/forum/1026734). Below is a script that was started but never completed. Feel free to use any part that is helpful.

#!/bin/bash
# Requires cygwin's gcc-4, gfortran, patch, wget, make
#
#
# Please modify this variables
#
# ATLAS source
ATLAS_SRC="http://downloads.sourceforge.net/project/math-atlas/Developer%20%28unstable%29/3.9.24/atlas3.9.24.tar.bz2"
ATLAS_LOCAL_SRC="`echo ${ATLAS_SRC}|awk -F'/' '{ print $NF }'`"

# LAPACK source
LAPACK_SRC="http://www.netlib.org/lapack/lapack.tgz";
LAPACK_LOCAL_SRC="`echo ${LAPACK_SRC}|awk -F'/' '{ print $NF }'`"

# Winthreads patch
# This patch no longer exists, but I think it was based on patches here:
# http://sourceforge.net/projects/math-atlas/forums/forum/1026734/topic/3440080
WTHPATCH_SRC="http://xxx.xxx.xxx/winthreads.patch";
WTHPATCH_LOCAL_SRC="`echo ${WTHPATCH_SRC}|awk -F'/' '{ print $NF }'`"

# Attention! These directories should be the same! Otherwise MinGW will execution will fail!
# e.g. C:/path1/path2/path3 -> /path1/path2/path3
BUILD_DIRECTORY_WIN="E:/build"
BUILD_DIRECTORY_CYG="/build"

# MinGW installation path
MINGW_PATH="/cygdrive/e/MinGW"

# MSVC path (optional)
MSVC_PATH=""
#MSVC_PATH="/cygdrive/e/Program Files/Microsoft Visual Studio 8"

# It is suggested that a valid frequency value was supplied while building.
# However you can leave it empty.
FREQ="2200"

#
# End of configuration
#

PATH="${MINGW_PATH}/bin:$PATH"
if [ ! -z "${MSVC_PATH}" ]; then
         PATH="${MSVC_PATH}/VC/bin:$PATH"
         PATH="${MSVC_PATH}/Common7/IDE:$PATH"
fi
export PATH="${PATH}"

do_cleanup() {
         cd ${BUILD_DIRECTORY_CYG} && rm -rf *
}

do_download() {
         echo "Downloading source"
         if [ "$1" != "" ]; then
                 echo "Cleaning up"
                 do_cleanup
         fi

         if [ ! -f ${ATLAS_LOCAL_SRC} ]; then
                 wget "${ATLAS_SRC}" -O "${ATLAS_LOCAL_SRC}"
         fi

         if [ ! -f ${LAPACK_LOCAL_SRC} ]; then
                 wget "${LAPACK_SRC}" -O "${LAPACK_LOCAL_SRC}"
         fi

         if [ ! -f ${WTHPATCH_LOCAL_SRC} ]; then
                 wget "${WTHPATCH_SRC}" -O "${WTHPATCH_LOCAL_SRC}"
         fi
}

do_unpack() {
         echo "Unpacking sources"
         tar jxf ${ATLAS_LOCAL_SRC}
         patch -p0 < ${WTHPATCH_LOCAL_SRC}
}

prepare() {
         echo "Setting up build env"
         umount ${BUILD_DIRECTORY_CYG}
         mkdir -p ${BUILD_DIRECTORY_WIN}
         mkdir -p ${BUILD_DIRECTORY_CYG}
         mount ${BUILD_DIRECTORY_WIN} ${BUILD_DIRECTORY_CYG}
         cd ${BUILD_DIRECTORY_CYG}
         do_download
         do_unpack
         mkdir build
         cd build && rm -rf *
}

make_msvc_implibs() {
         if [ ! -z "`which lib.exe`" ]; then
                 for i in `ls *.def`; do
                         lib /MACHINE:x86 /def:"$i"
                 done
         fi
}

build_dlls() {
         echo "Building libraries"
         cd lib
         cp libatlas.a libatlas.a.bak
         ar d libatlas.a ATL_{s,d,c,z}pt{gescal,geadd,trscal,hescal,gezero}.o

         # dynamic gcc
         mkdir dynamic_gcc
         cd dynamic_gcc && rm -rf *
         cp ../*.a ./

         FORTRAN_LIB="gfortran"
         gcc -shared -shared-libgcc -o libatlas.dll -Wl,--allow-multiple-definition -Wl,--whole-archive libatlas.a -Wl,--no-whole-archive   -Wl,--output-def,libatlas.def -Wl,--out-implib,libatlas_gcc.lib
         gcc -shared -shared-libgcc -o libcblas.dll -Wl,--allow-multiple-definition -Wl,--whole-archive libcblas.a -Wl,--no-whole-archive libatlas_gcc.lib   -Wl,--output-def,libcblas.def,--out-implib,libcblas_gcc.lib
         gcc -shared -shared-libgcc -o libf77blas.dll -Wl,--allow-multiple-definition -Wl,--whole-archive libf77blas.a -Wl,--no-whole-archive libatlas_gcc.lib -l${FORTRAN_LIB}   -Wl,--output-def,libf77blas.def,--out-implib,libf77blas_gcc.lib
         gcc -shared -shared-libgcc -o libf77refblas.dll -Wl,--allow-multiple-definition -Wl,--whole-archive libf77refblas.a -Wl,--no-whole-archive libatlas_gcc.lib -l${FORTRAN_LIB}   -Wl,--output-def,libf77refblas.def,--out-implib,libf77refblas_gcc.lib
         gcc -shared -shared-libgcc -o liblapack.dll -Wl,--allow-multiple-definition -Wl,--whole-archive liblapack.a -Wl,--no-whole-archive libcblas_gcc.lib libf77blas_gcc.lib libatlas_gcc.lib   -l${FORTRAN_LIB} -Wl,--output-def,liblapack.def,--out-implib,liblapack_gcc.lib
         gcc -shared -shared-libgcc -o atlas.dll -Wl,--allow-multiple-definition -Wl,--whole-archive *.a --Wl,--no-whole-archive -l${FORTRAN_LIB} -Wl,--output-def,atlas_gcc.def,--out-implib,atlas_gcc.lib

         rm *.a
         make_msvc_implibs
         cd ../

         # static gcc
         mkdir static_gcc
         cd static_gcc && rm -rf *
         cp ../*.a ./
         gcc -shared -o libatlas.dll -Wl,--allow-multiple-definition -Wl,--whole-archive libatlas.a -Wl,--no-whole-archive -Wl,--output-def,libatlas.def -Wl,--out-implib,libatlas_gcc.lib
         gcc -shared -o libcblas.dll -Wl,--allow-multiple-definition -Wl,--whole-archive libcblas.a -Wl,--no-whole-archive libatlas_gcc.lib   -Wl,--output-def,libcblas.def,--out-implib,libcblas_gcc.lib
         gcc -shared -o libf77blas.dll -Wl,--allow-multiple-definition -Wl,--whole-archive libf77blas.a -Wl,--no-whole-archive libatlas_gcc.lib -lgfortran -Wl,--output-def,libf77blas.def,--out-implib,libf77blas_gcc.lib
         gcc -shared -o libf77refblas.dll -Wl,--allow-multiple-definition -Wl,--whole-archive libf77refblas.a -Wl,--no-whole-archive libatlas_gcc.lib -lgfortran -Wl,--output-def,libf77refblas.def,--out-implib,libf77refblas_gcc.lib
         gcc -shared -o liblapack.dll -Wl,--allow-multiple-definition -Wl,--whole-archive liblapack.a -Wl,--no-whole-archive libcblas_gcc.lib libf77blas_gcc.lib libatlas_gcc.lib   -lgfortran -Wl,--output-def,liblapack.def,--out-implib,liblapack_gcc.lib
         gcc -shared -o atlas.dll -Wl,--allow-multiple-definition -Wl,--whole-archive *.a --Wl,--no-whole-archive -l${FORTRAN_LIB} -Wl,--output-def,atlas_gcc.def,--out-implib,atlas_gcc.lib

         rm *.a
         make_msvc_implibs
         cd ../

}

build_main() {
         prepare

         OPTS="\"-march=native -fno-common -mpreferred-stack-boundary=2\""
         CONF_PARAMS="-b 32 -D c -DWALL --with-netlib-lapack-tarfile=../${LAPACK_LOCAL_SRC} -Si latune 0 --cc=/usr/bin/gcc-4 -C xc /usr/bin/gcc-4 --shared -Fa ic ${OPTS} -Fa sk ${OPTS} -Fa dk ${OPTS} -Fa sm ${OPTS} -Fa dm ${OPTS} -Fa if ${OPTS}"

         if [ ! -z "${FREQ}" ]; then
                 CONF_PARAMS="-m ${FREQ} -D c -DPentiumCPS=\"${FREQ}\" ${CONF_PARAMS}"
         fi
        
         echo "Beginning configuration"

         ../ATLAS/configure ${CONF_PARAMS}

         echo "Executing make"

         make

         build_dlls

         echo "Complete!"
         echo "You can find dlls and static libraries in ${BUILD_DIRECTORY_WIN}/build/lib"
}

build_main
No subject by davispuh on Sun, Feb 27, 2011 @ 19:00 EST (11 replies)
Strategic use of FOSS Factory by jjgignac on Fri, Mar 25, 2011 @ 16:56 EDT
Can you check a library? by jrobcary on Mon, Feb 20, 2012 @ 10:05 EST (2 replies)
FOSS Factory Source