Skip to content

Commit

Permalink
Use overlay ports to force x86 Windows to use clapack and openblas
Browse files Browse the repository at this point in the history
  • Loading branch information
Gold856 committed Dec 2, 2024
1 parent 18dfaf9 commit 9eab676
Show file tree
Hide file tree
Showing 9 changed files with 204 additions and 1 deletion.
8 changes: 8 additions & 0 deletions overlayPorts/blas/blas.pc.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
prefix=${pcfiledir}/../..

Name: BLAS
Description: Implementation of BLAS
Version:
Requires: @requires@
Libs: @libs@
Cflags: @cflags@
71 changes: 71 additions & 0 deletions overlayPorts/blas/portfile.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
SET(VCPKG_POLICY_EMPTY_PACKAGE enabled)

# Due to the interaction between BLAS and LAPACK, we need to choose implementations consistent with
# each other.
#
# First, if we are on Apple, we use the Accelerate framework.
#
# Then, we prefer to use openblas and lapack-reference for blas and lapack, respectively, but
# sometimes are unable.
#
# If we are on Windows and arm or uwp, that we use gfortran as our fortran compiler creates an issue
# because there is no available libgfortran. This means ew can't use lapack-reference at all.
#
# If we are on Windows and static, there is a linking problem caused by static gfortran in the same
# link as openblas, so we have to use the blas implementation from lapack-reference.
#
# That results in roughly the following decision tree:
#
# no_libgfortran = (uwp || windows)
# can_link_mixed_static_libgfortran = !windows || !static
#
# if (no_libgfortran) {
# return {
# "blas": "openblas",
# "lapack": "clapack"
# };
# } else if (can_link_mixed_static_libgfortran) {
# return {
# "blas": "openblas",
# "lapack": "lapack-reference[noblas]"
# };
# } else {
# return {
# "blas": "lapack-reference[blas]",
# "lapack": "lapack-reference[blas]"
# };
# }
#
# Scoping this to just the 'can use openblas' question, we get:
# uwp || (windows && arm) || !windows || !static
# and for lapack-reference[blas], the DeMorgan'd inverse of that:
# !uwp && !(windows && arm) && windows && static

if(VCPKG_TARGET_IS_OSX OR VCPKG_TARGET_IS_IOS)
# Use Apple's accelerate framework where available
set(BLA_VENDOR Apple)
set(requires "")
set(libs "-framework Accelerate")
set(cflags "-framework Accelerate")
elseif(VCPKG_TARGET_IS_UWP
OR VCPKG_TARGET_IS_WINDOWS
OR NOT (VCPKG_LIBRARY_LINKAGE STREQUAL "static"))
set(BLA_VENDOR OpenBLAS)
set(requires openblas)
else()
set(BLA_VENDOR Generic)
set(requires "blas-reference")
endif()

configure_file("${CMAKE_CURRENT_LIST_DIR}/blas.pc.in" "${CURRENT_PACKAGES_DIR}/lib/pkgconfig/blas.pc" @ONLY)
if(NOT VCPKG_BUILD_TYPE)
configure_file("${CMAKE_CURRENT_LIST_DIR}/blas.pc.in" "${CURRENT_PACKAGES_DIR}/debug/lib/pkgconfig/blas.pc" @ONLY)
endif()

if(VCPKG_LIBRARY_LINKAGE STREQUAL "static")
set(BLA_STATIC ON)
else()
set(BLA_STATIC OFF)
endif()

configure_file("${CMAKE_CURRENT_LIST_DIR}/vcpkg-cmake-wrapper.cmake.in" "${CURRENT_PACKAGES_DIR}/share/blas/vcpkg-cmake-wrapper.cmake" @ONLY)
9 changes: 9 additions & 0 deletions overlayPorts/blas/vcpkg-cmake-wrapper.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# BLA_VENDOR and BLA_STATIC are documented at:
# * https://cmake.org/cmake/help/latest/module/FindBLAS.html
# * https://cmake.org/cmake/help/latest/module/FindLAPACK.html

set(BLA_VENDOR @BLA_VENDOR@)
set(BLA_STATIC @BLA_STATIC@)
_find_package(${ARGS})
unset(BLA_VENDOR)
unset(BLA_STATIC)
26 changes: 26 additions & 0 deletions overlayPorts/blas/vcpkg.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"$comment": "Keep the platform expressions in sync with the wrappers installed by the portfiles!",
"name": "blas",
"version-date": "2023-04-14",
"port-version": 1,
"description": "Metapackage for packages which provide BLAS",
"license": null,
"supports": "!(android & arm32) & !(android & x64)",
"dependencies": [
{
"name": "lapack-reference",
"features": [
"cblas"
],
"platform": "!osx & !ios & !uwp & !windows & static"
},
{
"name": "openblas",
"platform": "!osx & !ios & (uwp | windows | !static)"
},
{
"name": "vcpkg-cmake",
"host": true
}
]
}
9 changes: 9 additions & 0 deletions overlayPorts/lapack/lapack.pc.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
prefix=${pcfiledir}/../..
libdir=${prefix}/lib

Name: LAPACK
Description: Implementation of LAPACK
Version:
Requires: @requires@
Libs: @libs@
Cflags: @cflags@
42 changes: 42 additions & 0 deletions overlayPorts/lapack/portfile.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
SET(VCPKG_POLICY_EMPTY_PACKAGE enabled)

if(VCPKG_LIBRARY_LINKAGE STREQUAL "static")
set(BLA_STATIC ON)
else()
set(BLA_STATIC OFF)
endif()

# See explanation of which lapack implementation is chosen in portfile.cmake in the blas port

set(BLA_VENDOR Generic)
set(installed_wrapper "${CURRENT_INSTALLED_DIR}/share/lapack/vcpkg-cmake-wrapper.cmake")
set(installed_module "${CURRENT_INSTALLED_DIR}/share/lapack/FindLAPACK.cmake")
if(VCPKG_TARGET_IS_OSX OR VCPKG_TARGET_IS_IOS)
# Use Apple's accelerate framework where available
set(BLA_VENDOR Apple)
configure_file("${CMAKE_CURRENT_LIST_DIR}/vcpkg-cmake-wrapper.cmake.in" "${CURRENT_PACKAGES_DIR}/share/lapack/vcpkg-cmake-wrapper.cmake" @ONLY)
set(libs "-framework Accelerate")
set(cflags "-framework Accelerate")
configure_file("${CMAKE_CURRENT_LIST_DIR}/lapack.pc.in" "${CURRENT_PACKAGES_DIR}/lib/pkgconfig/lapack.pc" @ONLY)
if(NOT VCPKG_BUILD_TYPE)
configure_file("${CMAKE_CURRENT_LIST_DIR}/lapack.pc.in" "${CURRENT_PACKAGES_DIR}/debug/lib/pkgconfig/lapack.pc" @ONLY)
endif()
unset(installed_module)
elseif(VCPKG_TARGET_IS_UWP OR VCPKG_TARGET_IS_WINDOWS)
configure_file("${CURRENT_INSTALLED_DIR}/share/clapack/wrapper/vcpkg-cmake-wrapper.cmake" "${CURRENT_PACKAGES_DIR}/share/lapack/vcpkg-cmake-wrapper.cmake" COPYONLY)
configure_file("${CURRENT_INSTALLED_DIR}/share/clapack/FindLAPACK.cmake" "${CURRENT_PACKAGES_DIR}/share/lapack/FindLAPACK.cmake" COPYONLY)
set(libs "-llapack -llibf2c")
configure_file("${CMAKE_CURRENT_LIST_DIR}/lapack.pc.in" "${CURRENT_PACKAGES_DIR}/lib/pkgconfig/lapack.pc" @ONLY)
if(NOT VCPKG_BUILD_TYPE)
set(libs "-llapack -llibf2c")
configure_file("${CMAKE_CURRENT_LIST_DIR}/lapack.pc.in" "${CURRENT_PACKAGES_DIR}/debug/lib/pkgconfig/lapack.pc" @ONLY)
endif()
else()
configure_file("${CURRENT_INSTALLED_DIR}/share/lapack-reference/wrapper/vcpkg-cmake-wrapper.cmake" "${CURRENT_PACKAGES_DIR}/share/lapack/vcpkg-cmake-wrapper.cmake" COPYONLY)
configure_file("${CURRENT_INSTALLED_DIR}/share/lapack-reference/FindLAPACK.cmake" "${CURRENT_PACKAGES_DIR}/share/lapack/FindLAPACK.cmake" COPYONLY)
set(requires "lapack-reference")
configure_file("${CMAKE_CURRENT_LIST_DIR}/lapack.pc.in" "${CURRENT_PACKAGES_DIR}/lib/pkgconfig/lapack.pc" @ONLY)
if(NOT VCPKG_BUILD_TYPE)
configure_file("${CMAKE_CURRENT_LIST_DIR}/lapack.pc.in" "${CURRENT_PACKAGES_DIR}/debug/lib/pkgconfig/lapack.pc" @ONLY)
endif()
endif()
15 changes: 15 additions & 0 deletions overlayPorts/lapack/vcpkg-cmake-wrapper.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# BLA_VENDOR and BLA_STATIC are documented at:
# * https://cmake.org/cmake/help/latest/module/FindBLAS.html
# * https://cmake.org/cmake/help/latest/module/FindLAPACK.html

_find_package(BLAS) # Find BLAS before setting BLA_VENDOR (Will set/unset BLA_VENDOR itself)
set(BLA_VENDOR @BLA_VENDOR@)
if(APPLE AND "@BLA_STATIC@" AND CMAKE_VERSION VERSION_LESS "3.17.0")
# avoid `-Wl,--(start|end)-group` and wrong lib suffix
set(BLA_STATIC 0)
else()
set(BLA_STATIC @BLA_STATIC@)
endif()
_find_package(${ARGS})
unset(BLA_VENDOR)
unset(BLA_STATIC)
23 changes: 23 additions & 0 deletions overlayPorts/lapack/vcpkg.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"$comment": "Keep the platform expressions in sync with the wrappers installed by the portfiles!",
"name": "lapack",
"version-date": "2023-06-10",
"port-version": 2,
"description": "Metapackage for packages which provide LAPACK",
"license": null,
"supports": "!android",
"dependencies": [
{
"name": "clapack",
"platform": "uwp | windows"
},
{
"name": "lapack-reference",
"platform": "!osx & !ios & !uwp & !windows"
},
{
"name": "vcpkg-cmake",
"host": true
}
]
}
2 changes: 1 addition & 1 deletion publish.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ ext.addTaskToCopyAllOutputs = { task ->
}

task buildVcpkg(type: Exec) {
def baseArgs = ['install']
def baseArgs = ['install', "--overlay-ports=$rootDir/overlayPorts"]
outputs.dir "vcpkg_installed/$triplet"
executable "$rootDir/vcpkg/vcpkg"
args baseArgs + "--triplet=$triplet"
Expand Down

0 comments on commit 9eab676

Please sign in to comment.