diff --git a/mingw-w64-openblas/006-fix-cmake-detect-clang-64-bits.patch b/mingw-w64-openblas/006-fix-cmake-detect-clang-64-bits.patch new file mode 100644 index 0000000000..0125213825 --- /dev/null +++ b/mingw-w64-openblas/006-fix-cmake-detect-clang-64-bits.patch @@ -0,0 +1,31 @@ +From efd7ac241dc7de94b3a6e660599df795e2320828 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?=D9=85=D9=87=D8=AF=D9=8A=20=D8=B4=D9=8A=D9=86=D9=88=D9=86?= + =?UTF-8?q?=20=28Mehdi=20Chinoune=29?= + <79349457+MehdiChinoune@users.noreply.github.com> +Date: Sat, 16 Oct 2021 07:55:10 +0100 +Subject: [PATCH] Fix MinGW/Clang 64 bits detection. + +CMAKE_COMPILER_IS_GNUCC is only valid for GCC. +--- + cmake/system_check.cmake | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/cmake/system_check.cmake b/cmake/system_check.cmake +index 8d0558c0e..72c48db37 100644 +--- a/cmake/system_check.cmake ++++ b/cmake/system_check.cmake +@@ -20,11 +20,11 @@ endif() + + + +-if(CMAKE_COMPILER_IS_GNUCC AND WIN32) ++if(MINGW) + execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpmachine +- OUTPUT_VARIABLE OPENBLAS_GCC_TARGET_MACHINE ++ OUTPUT_VARIABLE OPENBLAS_MINGW_TARGET_MACHINE + OUTPUT_STRIP_TRAILING_WHITESPACE) +- if(OPENBLAS_GCC_TARGET_MACHINE MATCHES "amd64|x86_64|AMD64") ++ if(OPENBLAS_MINGW_TARGET_MACHINE MATCHES "amd64|x86_64|AMD64") + set(MINGW64 1) + endif() + endif() diff --git a/mingw-w64-openblas/007-support-building-both-static-shared.patch b/mingw-w64-openblas/007-support-building-both-static-shared.patch new file mode 100644 index 0000000000..217f4c4af8 --- /dev/null +++ b/mingw-w64-openblas/007-support-building-both-static-shared.patch @@ -0,0 +1,176 @@ +From 5e1ed25c9a45f2a76348e2d6dae3f93ba6f84008 Mon Sep 17 00:00:00 2001 +From: Mehdi Chinoune +Date: Sat, 16 Oct 2021 08:33:47 +0100 +Subject: [PATCH] Support building both static and shared libraries + +--- + CMakeLists.txt | 89 ++++++++++++++++++++++++++++++++++++++++---------- + 1 file changed, 71 insertions(+), 18 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index a18a7adc3..61d8cc895 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -34,6 +34,10 @@ set(NO_AFFINITY 1) + endif() + option(CPP_THREAD_SAFETY_TEST "Run a massively parallel DGEMM test to confirm thread safety of the library (requires OpenMP and about 1.3GB of RAM)" OFF) + option(CPP_THREAD_SAFETY_GEMV "Run a massively parallel DGEMV test to confirm thread safety of the library (requires OpenMP)" OFF) ++option(BUILD_STATIC_LIBS "Build static library" ON) ++if(NOT BUILD_STATIC_LIBS AND NOT BUILD_SHARED_LIBS) ++ set(BUILD_STATIC_LIBS ON CACHE BOOL "Build static library" FORCE) ++endif() + + # Add a prefix or suffix to all exported symbol names in the shared library. + # Avoids conflicts with other BLAS libraries, especially when using +@@ -183,12 +187,45 @@ if (${DYNAMIC_ARCH}) + endif () + + # add objects to the openblas lib +-add_library(${OpenBLAS_LIBNAME} ${LA_SOURCES} ${LAPACKE_SOURCES} ${RELA_SOURCES} ${TARGET_OBJS} ${OpenBLAS_DEF_FILE}) +-target_include_directories(${OpenBLAS_LIBNAME} INTERFACE $) ++if(NOT NO_LAPACK) ++ add_library(LAPACK OBJECT ${LA_SOURCES}) ++ list(APPEND TARGET_OBJS "$") ++endif() ++if(NOT NO_LAPACKE) ++ add_library(LAPACKE OBJECT ${LAPACKE_SOURCES}) ++ list(APPEND TARGET_OBJS "$") ++endif() ++if(BUILD_RELAPACK) ++ add_library(RELAPACK OBJECT ${RELA_SOURCES}) ++ list(APPEND TARGET_OBJS "$") ++endif() ++set(OpenBLAS_LIBS "") ++if(BUILD_STATIC_LIBS) ++ add_library(${OpenBLAS_LIBNAME}_static STATIC ${TARGET_OBJS} ${OpenBLAS_DEF_FILE}) ++ target_include_directories(${OpenBLAS_LIBNAME}_static INTERFACE $) ++ list(APPEND OpenBLAS_LIBS ${OpenBLAS_LIBNAME}_static) ++endif() ++if(BUILD_SHARED_LIBS) ++ add_library(${OpenBLAS_LIBNAME}_shared SHARED ${TARGET_OBJS} ${OpenBLAS_DEF_FILE}) ++ target_include_directories(${OpenBLAS_LIBNAME}_shared INTERFACE $) ++ list(APPEND OpenBLAS_LIBS ${OpenBLAS_LIBNAME}_shared) ++endif() ++if(BUILD_STATIC_LIBS) ++ add_library(${OpenBLAS_LIBNAME} ALIAS ${OpenBLAS_LIBNAME}_static) ++else() ++ add_library(${OpenBLAS_LIBNAME} ALIAS ${OpenBLAS_LIBNAME}_shared) ++endif() ++ ++set_target_properties(${OpenBLAS_LIBS} PROPERTIES OUTPUT_NAME ${OpenBLAS_LIBNAME}) + + # Android needs to explicitly link against libm + if(ANDROID) +- target_link_libraries(${OpenBLAS_LIBNAME} m) ++ if(BUILD_STATIC_LIBS) ++ target_link_libraries(${OpenBLAS_LIBNAME}_static m) ++ endif() ++ if(BUILD_SHARED_LIBS) ++ target_link_libraries(${OpenBLAS_LIBNAME}_shared m) ++ endif() + endif() + + # Handle MSVC exports +@@ -197,21 +234,21 @@ if(MSVC AND BUILD_SHARED_LIBS) + include("${PROJECT_SOURCE_DIR}/cmake/export.cmake") + else() + # Creates verbose .def file (51KB vs 18KB) +- set_target_properties(${OpenBLAS_LIBNAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS true) ++ set_target_properties(${OpenBLAS_LIBNAME}_shared PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS true) + endif() + endif() + + # Set output for libopenblas +-set_target_properties( ${OpenBLAS_LIBNAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) +-set_target_properties( ${OpenBLAS_LIBNAME} PROPERTIES LIBRARY_OUTPUT_NAME_DEBUG "${OpenBLAS_LIBNAME}_d") +-set_target_properties( ${OpenBLAS_LIBNAME} PROPERTIES EXPORT_NAME "OpenBLAS") ++set_target_properties( ${OpenBLAS_LIBS} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) ++set_target_properties( ${OpenBLAS_LIBS} PROPERTIES LIBRARY_OUTPUT_NAME_DEBUG "${OpenBLAS_LIBNAME}_d") ++set_target_properties( ${OpenBLAS_LIBS} PROPERTIES EXPORT_NAME "OpenBLAS") + + foreach (OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) + string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG ) + +- set_target_properties( ${OpenBLAS_LIBNAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_BINARY_DIR}/lib/${OUTPUTCONFIG} ) +- set_target_properties( ${OpenBLAS_LIBNAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_BINARY_DIR}/lib/${OUTPUTCONFIG} ) +- set_target_properties( ${OpenBLAS_LIBNAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_BINARY_DIR}/lib/${OUTPUTCONFIG} ) ++ set_target_properties( ${OpenBLAS_LIBS} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_BINARY_DIR}/lib/${OUTPUTCONFIG} ) ++ set_target_properties( ${OpenBLAS_LIBS} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_BINARY_DIR}/lib/${OUTPUTCONFIG} ) ++ set_target_properties( ${OpenBLAS_LIBS} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${PROJECT_BINARY_DIR}/lib/${OUTPUTCONFIG} ) + endforeach() + + enable_testing() +@@ -220,10 +257,21 @@ if (USE_THREAD) + # Add threading library to linker + find_package(Threads) + if (THREADS_HAVE_PTHREAD_ARG) +- set_property(TARGET ${OpenBLAS_LIBNAME} PROPERTY COMPILE_OPTIONS "-pthread") +- set_property(TARGET ${OpenBLAS_LIBNAME} PROPERTY INTERFACE_COMPILE_OPTIONS "-pthread") ++ if(BUILD_STATIC_LIBS) ++ set_property(TARGET ${OpenBLAS_LIBNAME}_static PROPERTY COMPILE_OPTIONS "-pthread") ++ set_property(TARGET ${OpenBLAS_LIBNAME}_static PROPERTY INTERFACE_COMPILE_OPTIONS "-pthread") ++ endif() ++ if(BUILD_SHARED_LIBS) ++ set_property(TARGET ${OpenBLAS_LIBNAME}_shared PROPERTY COMPILE_OPTIONS "-pthread") ++ set_property(TARGET ${OpenBLAS_LIBNAME}_shared PROPERTY INTERFACE_COMPILE_OPTIONS "-pthread") ++ endif() ++ endif() ++ if(BUILD_STATIC_LIBS) ++ target_link_libraries(${OpenBLAS_LIBNAME}_static ${CMAKE_THREAD_LIBS_INIT}) ++ endif() ++ if(BUILD_SHARED_LIBS) ++ target_link_libraries(${OpenBLAS_LIBNAME}_shared ${CMAKE_THREAD_LIBS_INIT}) + endif() +- target_link_libraries(${OpenBLAS_LIBNAME} ${CMAKE_THREAD_LIBS_INIT}) + endif() + + #if (MSVC OR NOT NOFORTRAN) +@@ -244,14 +292,14 @@ if (NOT NOFORTRAN) + endif() + endif() + +-set_target_properties(${OpenBLAS_LIBNAME} PROPERTIES ++set_target_properties(${OpenBLAS_LIBS} PROPERTIES + VERSION ${OpenBLAS_MAJOR_VERSION}.${OpenBLAS_MINOR_VERSION} + SOVERSION ${OpenBLAS_MAJOR_VERSION} + ) + + if (BUILD_SHARED_LIBS AND BUILD_RELAPACK) + if (NOT MSVC) +- target_link_libraries(${OpenBLAS_LIBNAME} "-Wl,-allow-multiple-definition") ++ target_link_libraries(${OpenBLAS_LIBNAME}_shared "-Wl,-allow-multiple-definition") + else() + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /FORCE:MULTIPLE") + endif() +@@ -314,7 +362,7 @@ endif() + if (NOT ${SYMBOLSUFFIX} STREQUAL "") + message(STATUS "adding suffix ${SYMBOLSUFFIX} to names of exported symbols in ${OpenBLAS_LIBNAME}") + endif() +- add_custom_command(TARGET ${OpenBLAS_LIBNAME} POST_BUILD ++ add_custom_command(TARGET ${OpenBLAS_LIBNAME}_shared POST_BUILD + COMMAND perl ${PROJECT_SOURCE_DIR}/exports/gensymbol "objcopy" "${ARCH}" "${BU}" "${EXPRECISION_IN}" "${NO_CBLAS_IN}" "${NO_LAPACK_IN}" "${NO_LAPACKE_IN}" "${NEED2UNDERSCORES_IN}" "${ONLY_CBLAS_IN}" \"${SYMBOLPREFIX}\" \"${SYMBOLSUFFIX}\" "${BUILD_LAPACK_DEPRECATED}" > ${PROJECT_BINARY_DIR}/objcopy.def + COMMAND objcopy -v --redefine-syms ${PROJECT_BINARY_DIR}/objcopy.def ${PROJECT_BINARY_DIR}/lib/lib${OpenBLAS_LIBNAME}.so + COMMENT "renaming symbols" +@@ -325,7 +373,7 @@ endif() + # Install project + + # Install libraries +-install(TARGETS ${OpenBLAS_LIBNAME} ++install(TARGETS ${OpenBLAS_LIBS} + EXPORT "OpenBLAS${SUFFIX64}Targets" + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} +@@ -387,7 +435,12 @@ endif() + + if(NOT NO_LAPACKE) + message (STATUS "Copying LAPACKE header files to ${CMAKE_INSTALL_INCLUDEDIR}") +- add_dependencies( ${OpenBLAS_LIBNAME} genlapacke) ++ if(BUILD_STATIC_LIBS) ++ add_dependencies( ${OpenBLAS_LIBNAME}_static genlapacke) ++ endif() ++ if(BUILD_SHARED_LIBS) ++ add_dependencies( ${OpenBLAS_LIBNAME}_shared genlapacke) ++ endif() + FILE(GLOB_RECURSE INCLUDE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/lapack-netlib/LAPACKE/*.h") + install (FILES ${INCLUDE_FILES} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + diff --git a/mingw-w64-openblas/PKGBUILD b/mingw-w64-openblas/PKGBUILD index c46beaffd5..d47792f4b8 100644 --- a/mingw-w64-openblas/PKGBUILD +++ b/mingw-w64-openblas/PKGBUILD @@ -5,7 +5,7 @@ _realname=OpenBLAS pkgbase=mingw-w64-openblas pkgname="${MINGW_PACKAGE_PREFIX}-openblas" pkgver=0.3.18 -pkgrel=1 +pkgrel=2 pkgdesc="An optimized BLAS library based on GotoBLAS2 1.13 BSD, providing optimized blas, lapack, and cblas (mingw-w64)" arch=('any') mingw_arch=('mingw32' 'mingw64' 'ucrt64' 'clang64' 'clang32') @@ -19,8 +19,8 @@ depends=("${MINGW_PACKAGE_PREFIX}-gcc-libs" "${MINGW_PACKAGE_PREFIX}-libwinpthread" $([[ ${MINGW_PACKAGE_PREFIX} == *-clang-* ]] || echo "${MINGW_PACKAGE_PREFIX}-gcc-libgfortran") ) -makedepends=("perl" - #"${MINGW_PACKAGE_PREFIX}-cmake" +makedepends=("${MINGW_PACKAGE_PREFIX}-cmake" + "${MINGW_PACKAGE_PREFIX}-ninja" $([[ ${MINGW_PACKAGE_PREFIX} == *-clang-* ]] || echo "${MINGW_PACKAGE_PREFIX}-gcc-fortran") ) options=('!buildflags') @@ -28,109 +28,75 @@ source=(${_realname}-${pkgver}.tar.gz::https://github.com/xianyi/OpenBLAS/archiv 001-defaultlib-not-for-gcc.patch 002-lgfortran-requires-lquadmath.patch 004-fix-generate-cmake-config.patch - 005-fix-clang32-compile-flags.patch) + 005-fix-clang32-compile-flags.patch + 006-fix-cmake-detect-clang-64-bits.patch + 007-support-building-both-static-shared.patch) install=${_realname}.install sha256sums=('1632c1e8cca62d8bed064b37747e331a1796fc46f688626337362bf0d16aeadb' '6a73ee677d8d37509cd08f380b0359ee7fac2595fd64695dd054e838380a6a33' 'bad670a1a7b6482c9c4264c4457e34307b084e7e1a1dabb9ddbfcf49346bc705' 'cdef4aa30254b23a682ae90fd6db1e03f77c8f073fc00892371745d07ffc79a2' - '7c7910039746b505ae182ef5f0e6f18c7ffdfc47e9d11f529840cda25fefc367') + '7c7910039746b505ae182ef5f0e6f18c7ffdfc47e9d11f529840cda25fefc367' + '238c57cd3d72c04d8322ba0e9dd148c68f5665776b3fcd51a047c45573d8baf4' + '5db3d553b5cd9539f03b0a5d9820a6da91d4f57e5501ba565741a12a4efeeb8b') + +# Helper macros to help make tasks easier # +apply_patch_with_msg() { + for _patch in "$@" + do + msg2 "Applying $_patch" + patch -Np1 -i "${srcdir}/$_patch" + done +} prepare() { cd ${srcdir}/${_realname}-${pkgver} - patch -p1 -i ${srcdir}/001-defaultlib-not-for-gcc.patch - patch -p1 -i ${srcdir}/002-lgfortran-requires-lquadmath.patch - patch -p1 -i ${srcdir}/004-fix-generate-cmake-config.patch - patch -p1 -i ${srcdir}/005-fix-clang32-compile-flags.patch + apply_patch_with_msg \ + 001-defaultlib-not-for-gcc.patch \ + 002-lgfortran-requires-lquadmath.patch \ + 004-fix-generate-cmake-config.patch \ + 005-fix-clang32-compile-flags.patch + # https://github.com/xianyi/OpenBLAS/pull/3410 + apply_patch_with_msg \ + 006-fix-cmake-detect-clang-64-bits.patch + # https://github.com/xianyi/OpenBLAS/pull/3411 + apply_patch_with_msg \ + 007-support-building-both-static-shared.patch } build() { - cp -rf "${srcdir}"/${_realname}-${pkgver} "${srcdir}"/build-${MSYSTEM} - cd "${srcdir}"/build-${MSYSTEM} + [[ -d "${srcdir}/build-${MSYSTEM}" ]] && rm -rf "${srcdir}/build-${MSYSTEM}" + mkdir -p "${srcdir}/build-${MSYSTEM}" && cd "${srcdir}/build-${MSYSTEM}" + + declare -a _build_type + if check_option "debug" "n"; then + _build_type+=("Release") + else + _build_type+=("Debug") + fi unset CFLAGS unset CXXFLAGS - local -a _no_lapack - local -a _c_compiler - if [[ ${MINGW_PACKAGE_PREFIX} != *-clang-* ]]; then - _no_lapack=0 - _c_compiler=gcc - export FC=${MINGW_PREFIX}/bin/gfortran - else - _no_lapack=1 - _c_compiler=clang - fi + MSYS2_ARG_CONV_EXCL="-DCMAKE_INSTALL_PREFIX=" \ + ${MINGW_PREFIX}/bin/cmake \ + -G"Ninja" \ + -DCMAKE_INSTALL_PREFIX=${MINGW_PREFIX} \ + -DCMAKE_BUILD_TYPE=${_build_type} \ + -DBUILD_SHARED_LIBS=ON \ + -DDYNAMIC_ARCH=ON \ + -DUSE_THREAD=ON \ + -DNUM_THREADS=64 \ + -DTARGET=CORE2 \ + ../${_realname}-${pkgver} - make LIBNAME=libopenblasp.a NO_LAPACK=${_no_lapack} DYNAMIC_ARCH=1 \ - CC=${MINGW_PREFIX}/bin/${_c_compiler} \ - OPENBLAS_INCLUDE_DIR=${MINGW_PREFIX}/include/${_realname} \ - USE_THREAD=1 NUM_THREADS=64 TARGET=CORE2 - - # [[ -d build-${MSYSTEM} ]] && rm -rf build-${MSYSTEM} - # mkdir -p build-${MSYSTEM} && cd build-${MSYSTEM} - - # MSYS2_ARG_CONV_EXCL="-DCMAKE_INSTALL_PREFIX=" \ - # ${MINGW_PREFIX}/bin/cmake \ - # -G"MSYS Makefiles" \ - # -DCMAKE_INSTALL_PREFIX=${MINGW_PREFIX} \ - # -DDYNAMIC_ARCH=ON \ - # -DCMAKE_BUILD_TYPE=Release \ - # ../${_realname}-${pkgver} - # make + cmake --build . } package() { cd "${srcdir}"/build-${MSYSTEM} - #make DESTDIR=${pkgdir} install - if [ -f libopenblas.dll ]; then - if [ -f exports/libopenblas.def ]; then - dlltool -D libopenblas.dll -d exports/libopenblas.def -l libopenblas.dll.a - else - echo "Cannot build export library" >&2 - exit 1 - fi - else - echo "DLL not found" >&2 - exit 1 - fi - mkdir -p "${pkgdir}${MINGW_PREFIX}/bin" - mkdir -p "${pkgdir}${MINGW_PREFIX}/lib" - - make LIBNAME=libopenblasp.a \ - DESTDIR="${pkgdir}" PREFIX="${MINGW_PREFIX}" \ - OPENBLAS_INCLUDE_DIR=${MINGW_PREFIX}/include/${_realname} \ - install - - if [ -f libopenblas.dll ]; then - cp -f libopenblas.dll "${pkgdir}${MINGW_PREFIX}/bin/" - else - echo "DLL not found" >&2 - exit 1 - fi - - if [ -f libopenblas.dll.a ]; then - cp -f libopenblas.dll.a "${pkgdir}${MINGW_PREFIX}/lib/" - else - echo "Export library not found" >&2 - exit 1 - fi - - if [ -f libopenblasp.a ]; then - rm -f "${pkgdir}${MINGW_PREFIX}/lib/libopenblasp.a" - rm -f "${pkgdir}${MINGW_PREFIX}/lib/libopenblas.a" - cp -f libopenblasp.a "${pkgdir}${MINGW_PREFIX}/lib/libopenblas.a" - else - echo "Static library not found" >&2 - exit 1 - fi - - local PREFIX_WIN=$(cygpath -wm ${MINGW_PREFIX}) - for _f in "${pkgdir}${MINGW_PREFIX}"/lib/cmake/openblas/*.cmake; do - sed -e "s|${PREFIX_WIN}|\$\{_IMPORT_PREFIX\}|g" -i ${_f} - sed -e "s|${MINGW_PREFIX}|\$\{_IMPORT_PREFIX\}|g" -i ${_f} - done + DESTDIR=${pkgdir} cmake --install . # Install License install -Dm0644 ${srcdir}/${_realname}-${pkgver}/LICENSE ${pkgdir}${MINGW_PREFIX}/share/licenses/${_realname}/LICENSE