Merge pull request #9778 from MehdiChinoune/openblas-cmake

openblas: use cmake to fix building on clang32
This commit is contained in:
Christoph Reiter
2021-10-18 23:05:04 +02:00
committed by GitHub
3 changed files with 258 additions and 85 deletions

View File

@@ -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()

View File

@@ -0,0 +1,176 @@
From 5e1ed25c9a45f2a76348e2d6dae3f93ba6f84008 Mon Sep 17 00:00:00 2001
From: Mehdi Chinoune <mehdi.chinoune@hotmail.com>
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 $<INSTALL_INTERFACE:include/openblas${SUFFIX64}>)
+if(NOT NO_LAPACK)
+ add_library(LAPACK OBJECT ${LA_SOURCES})
+ list(APPEND TARGET_OBJS "$<TARGET_OBJECTS:LAPACK>")
+endif()
+if(NOT NO_LAPACKE)
+ add_library(LAPACKE OBJECT ${LAPACKE_SOURCES})
+ list(APPEND TARGET_OBJS "$<TARGET_OBJECTS:LAPACKE>")
+endif()
+if(BUILD_RELAPACK)
+ add_library(RELAPACK OBJECT ${RELA_SOURCES})
+ list(APPEND TARGET_OBJS "$<TARGET_OBJECTS:RELAPACK>")
+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 $<INSTALL_INTERFACE:include/openblas${SUFFIX64}>)
+ 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 $<INSTALL_INTERFACE:include/openblas${SUFFIX64}>)
+ 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})

View File

@@ -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