diff --git a/S/Sundials@5/build_tarballs.jl b/S/Sundials@5/build_tarballs.jl new file mode 100644 index 00000000000..a448ae8391f --- /dev/null +++ b/S/Sundials@5/build_tarballs.jl @@ -0,0 +1,86 @@ +using BinaryBuilder + +name = "Sundials" +version = v"5.1.0" + +# Collection of sources required to build SundialsBuilder +sources = [ + "https://github.com/LLNL/sundials/archive/v$(version).tar.gz" => + "101be83221f9a0ab185ecce04d003ba38660cc71eb81b8a7cf96d1cc08b3d7f9", + "./bundled", +] + +# Bash recipe for building across all platforms +script = raw""" +cd $WORKSPACE/srcdir/sundials-*/ +if [[ "${target}" == *-mingw* ]]; then + atomic_patch -p1 $WORKSPACE/srcdir/patches/Sundials_windows.patch +fi + +CMAKE_FLAGS=(-DCMAKE_INSTALL_PREFIX=${prefix} -DCMAKE_TOOLCHAIN_FILE="${CMAKE_TARGET_TOOLCHAIN}") +CMAKE_FLAGS+=(-DCMAKE_BUILD_TYPE=Release -DEXAMPLES_ENABLE_C=OFF) +CMAKE_FLAGS+=(-DKLU_ENABLE=ON -DKLU_INCLUDE_DIR="$prefix/include" -DKLU_LIBRARY_DIR="$libdir") +CMAKE_FLAGS+=(-DLAPACK_ENABLE=ON) + +if [[ ${nbits} == 64 ]] && [[ ${target} != aarch64* ]]; then + atomic_patch -p1 $WORKSPACE/srcdir/patches/Sundials_Fortran.patch + CMAKE_FLAGS+=(-DLAPACK_LIBRARIES="${libdir}/libopenblas64_.${dlext}") +else + CMAKE_FLAGS+=(-DLAPACK_LIBRARIES="${libdir}/libopenblas.${dlext}") +fi +export CFLAGS="-lgfortran" +if [[ "${target}" == i686-* ]] || [[ "${target}" == x86_64-* ]]; then + export CFLAGS="${CFLAGS} -lquadmath" +elif [[ "${target}" == powerpc64le-* ]]; then + export CFLAGS="${CFLAGS} -lgomp -ldl -lm -lpthread -Wl,-rpath-link,/opt/${target}/${target}/lib64" +fi + +mkdir build +cd build +cmake "${CMAKE_FLAGS[@]}" .. +make -j${nproc} +make install + +# Move libraries to ${libdir} on Windows +if [[ "${target}" == *-mingw* ]]; then + mv ${prefix}/lib/libsundials_*.${dlext} "${libdir}" +fi +""" + +# We attempt to build for all defined platforms +platforms = supported_platforms() +platforms = expand_gfortran_versions(platforms) + +products = [ + LibraryProduct("libsundials_arkode", :libsundials_arkode), + LibraryProduct("libsundials_cvode", :libsundials_cvode), + LibraryProduct("libsundials_cvodes", :libsundials_cvodes), + LibraryProduct("libsundials_ida", :libsundials_ida), + LibraryProduct("libsundials_idas", :libsundials_idas), + LibraryProduct("libsundials_kinsol", :libsundials_kinsol), + LibraryProduct("libsundials_nvecmanyvector", :libsundials_nvecmanyvector), + LibraryProduct("libsundials_nvecserial", :libsundials_nvecserial), + LibraryProduct("libsundials_sunlinsolband", :libsundials_sunlinsolband), + LibraryProduct("libsundials_sunlinsoldense", :libsundials_sunlinsoldense), + LibraryProduct("libsundials_sunlinsolklu", :libsundials_sunlinsolklu), + LibraryProduct("libsundials_sunlinsollapackband", :libsundials_sunlinsollapackband), + LibraryProduct("libsundials_sunlinsollapackdense", :libsundials_sunlinsollapackdense), + LibraryProduct("libsundials_sunlinsolpcg", :libsundials_sunlinsolpcg), + LibraryProduct("libsundials_sunlinsolspbcgs", :libsundials_sunlinsolspbcgs), + LibraryProduct("libsundials_sunlinsolspfgmr", :libsundials_sunlinsolspfgmr), + LibraryProduct("libsundials_sunlinsolspgmr", :libsundials_sunlinsolspgmr), + LibraryProduct("libsundials_sunlinsolsptfqmr", :libsundials_sunlinsolsptfqmr), + LibraryProduct("libsundials_sunmatrixband", :libsundials_sunmatrixband), + LibraryProduct("libsundials_sunmatrixdense", :libsundials_sunmatrixdense), + LibraryProduct("libsundials_sunmatrixsparse", :libsundials_sunmatrixsparse), + LibraryProduct("libsundials_sunnonlinsolfixedpoint", :libsundials_sunnonlinsolfixedpoint), + LibraryProduct("libsundials_sunnonlinsolnewton", :libsundials_sunnonlinsolnewton), +] + +dependencies = [ + "OpenBLAS_jll", + "SuiteSparse_jll", +] + +# Build the tarballs, and possibly a `build.jl` as well. +build_tarballs(ARGS, name, version, sources, script, platforms, products, dependencies; preferred_gcc_version = v"6") diff --git a/S/Sundials@5/bundled/patches/Sundials_Fortran.patch b/S/Sundials@5/bundled/patches/Sundials_Fortran.patch new file mode 100644 index 00000000000..6320e3c9e9c --- /dev/null +++ b/S/Sundials@5/bundled/patches/Sundials_Fortran.patch @@ -0,0 +1,103 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt + +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -757,27 +757,27 @@ if(SUNDIALS_F77_FUNC_CASE AND SUNDIALS_F77_FUNC_UNDERSCORES) + # (e.g. g77 mangles mysub to mysub_ and my_sub to my_sub__) + if(SUNDIALS_F77_FUNC_CASE MATCHES "LOWER") + if(SUNDIALS_F77_FUNC_UNDERSCORES MATCHES "NONE") +- set(F77_MANGLE_MACRO1 "#define SUNDIALS_F77_FUNC(name,NAME) name") +- set(F77_MANGLE_MACRO2 "#define SUNDIALS_F77_FUNC_(name,NAME) name") ++ set(F77_MANGLE_MACRO1 "#define SUNDIALS_F77_FUNC(name,NAME) name ## _64") ++ set(F77_MANGLE_MACRO2 "#define SUNDIALS_F77_FUNC_(name,NAME) name ## _64") + elseif(SUNDIALS_F77_FUNC_UNDERSCORES MATCHES "ONE") +- set(F77_MANGLE_MACRO1 "#define SUNDIALS_F77_FUNC(name,NAME) name ## _") +- set(F77_MANGLE_MACRO2 "#define SUNDIALS_F77_FUNC_(name,NAME) name ## _") ++ set(F77_MANGLE_MACRO1 "#define SUNDIALS_F77_FUNC(name,NAME) name ## _64_") ++ set(F77_MANGLE_MACRO2 "#define SUNDIALS_F77_FUNC_(name,NAME) name ## _64_") + elseif(SUNDIALS_F77_FUNC_UNDERSCORES MATCHES "TWO") +- set(F77_MANGLE_MACRO1 "#define SUNDIALS_F77_FUNC(name,NAME) name ## __") +- set(F77_MANGLE_MACRO2 "#define SUNDIALS_F77_FUNC_(name,NAME) name ## __") ++ set(F77_MANGLE_MACRO1 "#define SUNDIALS_F77_FUNC(name,NAME) name ## _64__") ++ set(F77_MANGLE_MACRO2 "#define SUNDIALS_F77_FUNC_(name,NAME) name ## _64__") + else() + message(FATAL_ERROR "Invalid SUNDIALS_F77_FUNC_UNDERSCORES option.") + endif() + elseif(SUNDIALS_F77_FUNC_CASE MATCHES "UPPER") + if(SUNDIALS_F77_FUNC_UNDERSCORES MATCHES "NONE") +- set(F77_MANGLE_MACRO1 "#define SUNDIALS_F77_FUNC(name,NAME) NAME") +- set(F77_MANGLE_MACRO2 "#define SUNDIALS_F77_FUNC_(name,NAME) NAME") ++ set(F77_MANGLE_MACRO1 "#define SUNDIALS_F77_FUNC(name,NAME) NAME ## _64") ++ set(F77_MANGLE_MACRO2 "#define SUNDIALS_F77_FUNC_(name,NAME) NAME ## _64") + elseif(SUNDIALS_F77_FUNC_UNDERSCORES MATCHES "ONE") +- set(F77_MANGLE_MACRO1 "#define SUNDIALS_F77_FUNC(name,NAME) NAME ## _") +- set(F77_MANGLE_MACRO2 "#define SUNDIALS_F77_FUNC_(name,NAME) NAME ## _") ++ set(F77_MANGLE_MACRO1 "#define SUNDIALS_F77_FUNC(name,NAME) NAME ## _64_") ++ set(F77_MANGLE_MACRO2 "#define SUNDIALS_F77_FUNC_(name,NAME) NAME ## _64_") + elseif(SUNDIALS_F77_FUNC_UNDERSCORES MATCHES "TWO") +- set(F77_MANGLE_MACRO1 "#define SUNDIALS_F77_FUNC(name,NAME) NAME ## __") +- set(F77_MANGLE_MACRO2 "#define SUNDIALS_F77_FUNC_(name,NAME) NAME ## __") ++ set(F77_MANGLE_MACRO1 "#define SUNDIALS_F77_FUNC(name,NAME) NAME ## _64__") ++ set(F77_MANGLE_MACRO2 "#define SUNDIALS_F77_FUNC_(name,NAME) NAME ## _64__") + else() + message(FATAL_ERROR "Invalid SUNDIALS_F77_FUNC_UNDERSCORES option.") + endif() +diff --git a/config/SundialsFortran.cmake b/config/SundialsFortran.cmake +index 9ad6151..5111f47 100644 +--- a/config/SundialsFortran.cmake ++++ b/config/SundialsFortran.cmake +@@ -291,42 +291,42 @@ if(NEED_FORTRAN_NAME_MANGLING) + + # Symbols NO underscores + if(${CMAKE_Fortran_SCHEME_NO_UNDERSCORES} MATCHES "mysub") +- set(F77_MANGLE_MACRO1 "#define SUNDIALS_F77_FUNC(name,NAME) name") ++ set(F77_MANGLE_MACRO1 "#define SUNDIALS_F77_FUNC(name,NAME) name ## _64") + endif() + if(${CMAKE_Fortran_SCHEME_NO_UNDERSCORES} MATCHES "mysub_") +- set(F77_MANGLE_MACRO1 "#define SUNDIALS_F77_FUNC(name,NAME) name ## _") ++ set(F77_MANGLE_MACRO1 "#define SUNDIALS_F77_FUNC(name,NAME) name ## _64_") + endif() + if(${CMAKE_Fortran_SCHEME_NO_UNDERSCORES} MATCHES "mysub__") +- set(F77_MANGLE_MACRO1 "#define SUNDIALS_F77_FUNC(name,NAME) name ## __") ++ set(F77_MANGLE_MACRO1 "#define SUNDIALS_F77_FUNC(name,NAME) name ## _64__") + endif() + if(${CMAKE_Fortran_SCHEME_NO_UNDERSCORES} MATCHES "MYSUB") +- set(F77_MANGLE_MACRO1 "#define SUNDIALS_F77_FUNC(name,NAME) NAME") ++ set(F77_MANGLE_MACRO1 "#define SUNDIALS_F77_FUNC(name,NAME) NAME ## _64") + endif() + if(${CMAKE_Fortran_SCHEME_NO_UNDERSCORES} MATCHES "MYSUB_") +- set(F77_MANGLE_MACRO1 "#define SUNDIALS_F77_FUNC(name,NAME) NAME ## _") ++ set(F77_MANGLE_MACRO1 "#define SUNDIALS_F77_FUNC(name,NAME) NAME ## _64_") + endif() + if(${CMAKE_Fortran_SCHEME_NO_UNDERSCORES} MATCHES "MYSUB__") +- set(F77_MANGLE_MACRO1 "#define SUNDIALS_F77_FUNC(name,NAME) NAME ## __") ++ set(F77_MANGLE_MACRO1 "#define SUNDIALS_F77_FUNC(name,NAME) NAME ## _64__") + endif() + + # Symbols WITH underscores + if(${CMAKE_Fortran_SCHEME_WITH_UNDERSCORES} MATCHES "my_sub") +- set(F77_MANGLE_MACRO2 "#define SUNDIALS_F77_FUNC_(name,NAME) name") ++ set(F77_MANGLE_MACRO2 "#define SUNDIALS_F77_FUNC_(name,NAME) name ## _64") + endif() + if(${CMAKE_Fortran_SCHEME_WITH_UNDERSCORES} MATCHES "my_sub_") +- set(F77_MANGLE_MACRO2 "#define SUNDIALS_F77_FUNC_(name,NAME) name ## _") ++ set(F77_MANGLE_MACRO2 "#define SUNDIALS_F77_FUNC_(name,NAME) name ## _64_") + endif() + if(${CMAKE_Fortran_SCHEME_WITH_UNDERSCORES} MATCHES "my_sub__") +- set(F77_MANGLE_MACRO2 "#define SUNDIALS_F77_FUNC_(name,NAME) name ## __") ++ set(F77_MANGLE_MACRO2 "#define SUNDIALS_F77_FUNC_(name,NAME) name ## _64__") + endif() + if(${CMAKE_Fortran_SCHEME_WITH_UNDERSCORES} MATCHES "MY_SUB") +- set(F77_MANGLE_MACRO2 "#define SUNDIALS_F77_FUNC_(name,NAME) NAME") ++ set(F77_MANGLE_MACRO2 "#define SUNDIALS_F77_FUNC_(name,NAME) NAME ## _64") + endif() + if(${CMAKE_Fortran_SCHEME_WITH_UNDERSCORES} MATCHES "MY_SUB_") +- set(F77_MANGLE_MACRO2 "#define SUNDIALS_F77_FUNC_(name,NAME) NAME ## _") ++ set(F77_MANGLE_MACRO2 "#define SUNDIALS_F77_FUNC_(name,NAME) NAME ## _64_") + endif() + if(${CMAKE_Fortran_SCHEME_WITH_UNDERSCORES} MATCHES "MY_SUB__") +- set(F77_MANGLE_MACRO2 "#define SUNDIALS_F77_FUNC_(name,NAME) NAME ## __") ++ set(F77_MANGLE_MACRO2 "#define SUNDIALS_F77_FUNC_(name,NAME) NAME ## _64__") + endif() + + # name-mangling scheme has been set diff --git a/S/Sundials@5/bundled/patches/Sundials_windows.patch b/S/Sundials@5/bundled/patches/Sundials_windows.patch new file mode 100644 index 00000000000..ab9694404d1 --- /dev/null +++ b/S/Sundials@5/bundled/patches/Sundials_windows.patch @@ -0,0 +1,15 @@ +diff --git a/config/FindKLU.cmake b/config/FindKLU.cmake + +--- a/config/FindKLU.cmake ++++ b/config/FindKLU.cmake +@@ -60,10 +60,6 @@ endif () + + if (NOT SUITESPARSECONFIG_LIBRARY) + set(SUITESPARSECONFIG_LIBRARY_NAME suitesparseconfig) +- # NOTE: no prefix for this library on windows +- if(WIN32 AND NOT MSYS) +- set(CMAKE_FIND_LIBRARY_PREFIXES "") +- endif() + find_library( SUITESPARSECONFIG_LIBRARY ${SUITESPARSECONFIG_LIBRARY_NAME} ${KLU_LIBRARY_DIR} NO_DEFAULT_PATH) + mark_as_advanced(SUITESPARSECONFIG_LIBRARY) + endif ()