diff options
| author | Ethan Morgan <ethan@gweithio.com> | 2026-02-14 16:44:06 +0000 |
|---|---|---|
| committer | Ethan Morgan <ethan@gweithio.com> | 2026-02-14 16:44:06 +0000 |
| commit | 54409423f767d8b1cf30cb7d0efca6b4ca138823 (patch) | |
| tree | d915ac7828703ce4b963efdd9728a1777ba18c1e /vcpkg/ports/openblas | |
Diffstat (limited to 'vcpkg/ports/openblas')
| -rw-r--r-- | vcpkg/ports/openblas/cmake-project-include.cmake | 66 | ||||
| -rw-r--r-- | vcpkg/ports/openblas/disable-testing.diff | 20 | ||||
| -rw-r--r-- | vcpkg/ports/openblas/getarch.diff | 73 | ||||
| -rw-r--r-- | vcpkg/ports/openblas/openblas_common.h | 60 | ||||
| -rw-r--r-- | vcpkg/ports/openblas/portfile.cmake | 75 | ||||
| -rw-r--r-- | vcpkg/ports/openblas/system-check-msvc.diff | 21 | ||||
| -rw-r--r-- | vcpkg/ports/openblas/vcpkg.json | 50 | ||||
| -rw-r--r-- | vcpkg/ports/openblas/win32-uwp.diff | 67 |
8 files changed, 432 insertions, 0 deletions
diff --git a/vcpkg/ports/openblas/cmake-project-include.cmake b/vcpkg/ports/openblas/cmake-project-include.cmake new file mode 100644 index 0000000..574073b --- /dev/null +++ b/vcpkg/ports/openblas/cmake-project-include.cmake @@ -0,0 +1,66 @@ +# TARGET: The target architecture +# +# Originally, OpenBLAS tries to optimize for the host CPU unless +# - being given an explixit TARGET, and +# - CMAKE_CROSSCOMPILING, and +# - not building for uwp (aka WINDOWSSTORE) +# For this optimization, it runs 'getarch' and 'getarch_2nd' which it builds +# from source. The getarch executables are not built when not optimizing. +# +# Consequences: +# - The port must ensure that TARGET is set when cross compiling for a different CPU or OS. +# - The port must install getarch executables when possible. +# +# DYNAMIC_ARCH enables support "for multiple targets with runtime detection". +# (But not for MSVC, https://github.com/OpenMathLib/OpenBLAS/wiki/How-to-use-OpenBLAS-in-Microsoft-Visual-Studio#cmake-and-visual-studio.) +# The OpenBLAS README.md suggests that this shall be used with TARGET being +# set "to the oldest model you expect to encounter". This affects "all the +# common code in the library". + +set(need_target 0) +if(NOT "${TARGET}" STREQUAL "") + message(STATUS "TARGET: ${TARGET} (user-defined)") +elseif(DYNAMIC_ARCH) + message(STATUS "DYNAMIC_ARCH: ${DYNAMIC_ARCH}") + set(need_target 1) # for C +elseif(CMAKE_CROSSCOMPILING AND NOT GETARCH_BINARY_DIR) + set(need_target 1) # for C and for optimized kernel +else() + message(STATUS "TARGET: <native> (OpenBLAS getarch/getarch_2nd)") +endif() + +if(need_target) + set(target_default "GENERIC") + if(MSVC) + # "does not support the dialect of assembly used in the cpu-specific optimized files" + # https://github.com/OpenMathLib/OpenBLAS/wiki/How-to-use-OpenBLAS-in-Microsoft-Visual-Studio#cmake-and-visual-studio + elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "^x64|^x86") + set(target_default "ATOM") + elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "^arm64") + set(target_default "ARMV8") + elseif(VCPKG_TARGET_ARCHITECTURE MATCHES "^arm") + set(target_default "ARMV7") + endif() + set(TARGET "${target_default}" CACHE STRING "") + message(STATUS "TARGET: ${TARGET}") +endif() + +# NUM_THREADS: The number of threads expected to be used. +# +# This setting affects both the configuration with USE_THREAD enabled +# (multithreaded OpenBLAS) and disabled (multithreaded access to OpenBLAS). +# This shouldn't be set too low for generic packages. But it comes with a +# memory footprint. + +if(DEFINED NUM_THREADS) + message(STATUS "NUM_THREADS: ${NUM_THREADS} (user-defined)") +elseif(EMSCRIPTEN) + message(STATUS "NUM_THREADS: <default> (for EMSCRIPTEN)") +elseif(need_target) + set(num_threads_default 24) + if(ANDROID OR IOS) + set(num_threads_default 8) + endif() + set(NUM_THREADS "${num_threads_default}" CACHE STRING "") + message(STATUS "NUM_THREADS: ${NUM_THREADS}") +endif() diff --git a/vcpkg/ports/openblas/disable-testing.diff b/vcpkg/ports/openblas/disable-testing.diff new file mode 100644 index 0000000..2214be9 --- /dev/null +++ b/vcpkg/ports/openblas/disable-testing.diff @@ -0,0 +1,20 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 2006604..c9fedb9 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -323,6 +323,7 @@ if (USE_THREAD) + endif() + endif() + ++if(BUILD_TESTING) + #if (MSVC OR NOT NOFORTRAN) + if (NOT NO_CBLAS) + if (NOT ONLY_CBLAS) +@@ -348,6 +349,7 @@ endif() + if (CPP_THREAD_SAFETY_TEST OR CPP_THREAD_SAFETY_GEMV) + add_subdirectory(cpp_thread_test) + endif() ++endif() + + if (NOT FIXED_LIBNAME) + set_target_properties(${OpenBLAS_LIBS} PROPERTIES diff --git a/vcpkg/ports/openblas/getarch.diff b/vcpkg/ports/openblas/getarch.diff new file mode 100644 index 0000000..a2c7150 --- /dev/null +++ b/vcpkg/ports/openblas/getarch.diff @@ -0,0 +1,73 @@ +diff --git a/cmake/prebuild.cmake b/cmake/prebuild.cmake +index 609fbe2..daeb25c 100644 +--- a/cmake/prebuild.cmake ++++ b/cmake/prebuild.cmake +@@ -95,7 +95,7 @@ else () + endif () + + # Cannot run getarch on target if we are cross-compiling +-if (DEFINED CORE AND CMAKE_CROSSCOMPILING AND NOT (${HOST_OS} STREQUAL "WINDOWSSTORE")) ++if(CMAKE_CROSSCOMPILING AND NOT DEFINED GETARCH_BINARY_DIR) + # Write to config as getarch would + if (DEFINED TARGET_CORE) + set(TCORE ${TARGET_CORE}) +@@ -1373,7 +1373,11 @@ endif () + file(MAKE_DIRECTORY ${TARGET_CONF_DIR}) + file(RENAME ${TARGET_CONF_TEMP} "${TARGET_CONF_DIR}/${TARGET_CONF}") + +-else(NOT CMAKE_CROSSCOMPILING) ++else() ++ if(NOT CMAKE_CROSSCOMPILING) ++ set(GETARCH_BINARY_DIR "${PROJECT_BINARY_DIR}") ++ endif() ++ + # compile getarch + set(GETARCH_SRC + ${PROJECT_SOURCE_DIR}/getarch.c +@@ -1420,6 +1424,7 @@ else(NOT CMAKE_CROSSCOMPILING) + if (NOT ${GETARCH_RESULT}) + MESSAGE(FATAL_ERROR "Compiling getarch failed ${GETARCH_LOG}") + endif () ++ install(PROGRAMS "${PROJECT_BINARY_DIR}/${GETARCH_BIN}" DESTINATION bin) + endif () + unset (HAVE_AVX2) + unset (HAVE_AVX) +@@ -1439,8 +1444,8 @@ else(NOT CMAKE_CROSSCOMPILING) + message(STATUS "Running getarch") + + # use the cmake binary w/ the -E param to run a shell command in a cross-platform way +-execute_process(COMMAND "${PROJECT_BINARY_DIR}/${GETARCH_BIN}" 0 OUTPUT_VARIABLE GETARCH_MAKE_OUT) +-execute_process(COMMAND "${PROJECT_BINARY_DIR}/${GETARCH_BIN}" 1 OUTPUT_VARIABLE GETARCH_CONF_OUT) ++execute_process(COMMAND "${GETARCH_BINARY_DIR}/${GETARCH_BIN}" 0 OUTPUT_VARIABLE GETARCH_MAKE_OUT) ++execute_process(COMMAND "${GETARCH_BINARY_DIR}/${GETARCH_BIN}" 1 OUTPUT_VARIABLE GETARCH_CONF_OUT) + + message(STATUS "GETARCH results:\n${GETARCH_MAKE_OUT}") + +@@ -1463,11 +1468,12 @@ execute_process(COMMAND "${PROJECT_BINARY_DIR}/${GETARCH_BIN}" 1 OUTPUT_VARIABLE + if (NOT ${GETARCH2_RESULT}) + MESSAGE(FATAL_ERROR "Compiling getarch_2nd failed ${GETARCH2_LOG}") + endif () ++ install(PROGRAMS "${PROJECT_BINARY_DIR}/${GETARCH2_BIN}" DESTINATION bin) + endif () + + # use the cmake binary w/ the -E param to run a shell command in a cross-platform way +-execute_process(COMMAND "${PROJECT_BINARY_DIR}/${GETARCH2_BIN}" 0 OUTPUT_VARIABLE GETARCH2_MAKE_OUT) +-execute_process(COMMAND "${PROJECT_BINARY_DIR}/${GETARCH2_BIN}" 1 OUTPUT_VARIABLE GETARCH2_CONF_OUT) ++execute_process(COMMAND "${GETARCH_BINARY_DIR}/${GETARCH2_BIN}" 0 OUTPUT_VARIABLE GETARCH2_MAKE_OUT) ++execute_process(COMMAND "${GETARCH_BINARY_DIR}/${GETARCH2_BIN}" 1 OUTPUT_VARIABLE GETARCH2_CONF_OUT) + + # append config data from getarch_2nd to the TARGET file and read in CMake vars + file(APPEND "${TARGET_CONF_TEMP}" ${GETARCH2_CONF_OUT}) +diff --git a/cmake/system.cmake b/cmake/system.cmake +index eae7436..b2a6da7 100644 +--- a/cmake/system.cmake ++++ b/cmake/system.cmake +@@ -13,7 +13,7 @@ if(CMAKE_CROSSCOMPILING AND NOT DEFINED TARGET) + set(TARGET "ARMV8") + elseif(ARM) + set(TARGET "ARMV7") # TODO: Ask compiler which arch this is +- else() ++ elseif(NOT DEFINED GETARCH_BINARY_DIR) + message(FATAL_ERROR "When cross compiling, a TARGET is required.") + endif() + endif() diff --git a/vcpkg/ports/openblas/openblas_common.h b/vcpkg/ports/openblas/openblas_common.h new file mode 100644 index 0000000..9b798e5 --- /dev/null +++ b/vcpkg/ports/openblas/openblas_common.h @@ -0,0 +1,60 @@ +#pragma once +#include "openblas/openblas_config.h" + +#if defined(OPENBLAS_OS_WINNT) || defined(OPENBLAS_OS_CYGWIN_NT) || defined(OPENBLAS_OS_INTERIX) +#define OPENBLAS_WINDOWS_ABI +#define OPENBLAS_OS_WINDOWS + +#ifdef DOUBLE +#define DOUBLE_DEFINED DOUBLE +#undef DOUBLE +#endif +#endif + +#ifdef NEEDBUNDERSCORE +#define BLASFUNC(FUNC) FUNC##_ + +#else +#define BLASFUNC(FUNC) FUNC +#endif + + +#ifdef OPENBLAS_QUAD_PRECISION +typedef struct { + unsigned long x[2]; +} xdouble; +#elif defined OPENBLAS_EXPRECISION +#define xdouble long double +#else +#define xdouble double +#endif + +#if defined(OS_WINNT) && defined(__64BIT__) +typedef long long BLASLONG; +typedef unsigned long long BLASULONG; +#else +typedef long BLASLONG; +typedef unsigned long BLASULONG; +#endif + +#ifdef OPENBLAS_USE64BITINT +typedef BLASLONG blasint; +#else +typedef int blasint; +#endif + +#if defined(XDOUBLE) || defined(DOUBLE) +#define FLOATRET FLOAT +#else +#ifdef NEED_F2CCONV +#define FLOATRET double +#else +#define FLOATRET float +#endif +#endif + + +/* Inclusion of a standard header file is needed for definition of __STDC_* + predefined macros with some compilers (e.g. GCC 4.7 on Linux). This occurs + as a side effect of including either <features.h> or <stdc-predef.h>. */ +#include <stdio.h> diff --git a/vcpkg/ports/openblas/portfile.cmake b/vcpkg/ports/openblas/portfile.cmake new file mode 100644 index 0000000..07c9ad4 --- /dev/null +++ b/vcpkg/ports/openblas/portfile.cmake @@ -0,0 +1,75 @@ +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO OpenMathLib/OpenBLAS + REF "v${VERSION}" + SHA512 046316b4297460bffca09c890ecad17ea39d8b3db92ff445d03b547dd551663d37e40f38bce8ae11e2994374ff01e622b408da27aa8e40f4140185ee8f001a60 + HEAD_REF develop + PATCHES + disable-testing.diff + getarch.diff + system-check-msvc.diff + win32-uwp.diff +) + +vcpkg_check_features(OUT_FEATURE_OPTIONS OPTIONS + FEATURES + threads USE_THREAD + simplethread USE_SIMPLE_THREADED_LEVEL3 + dynamic-arch DYNAMIC_ARCH +) + +# If not explicitly configured for a cross build, OpenBLAS wants to run +# getarch executables in order to optimize for the target. +# Adapting this to vcpkg triplets: +# - install-getarch.diff introduces and uses GETARCH_BINARY_DIR, +# - architecture and system name are required to match for GETARCH_BINARY_DIR, but +# - uwp (aka WindowsStore) may run windows getarch. +string(REPLACE "WindowsStore_" "_" SYSTEM_KEY "${VCPKG_CMAKE_SYSTEM_NAME}_${VCPKG_TARGET_ARCHITECTURE}") +set(GETARCH_BINARY_DIR "${CURRENT_HOST_INSTALLED_DIR}/manual-tools/${PORT}/${SYSTEM_KEY}") +if(EXISTS "${GETARCH_BINARY_DIR}") + message(STATUS "OpenBLAS cross build, but may use ${PORT}:${HOST_TRIPLET} getarch") + list(APPEND OPTIONS "-DGETARCH_BINARY_DIR=${GETARCH_BINARY_DIR}") +elseif(VCPKG_CROSSCOMPILING) + message(STATUS "OpenBLAS cross build, may not be able to use getarch") +else() + message(STATUS "OpenBLAS native build") +endif() + +if(VCPKG_TARGET_IS_EMSCRIPTEN) + # Only the riscv64 kernel with riscv64_generic target is supported. + # Cf. https://github.com/OpenMathLib/OpenBLAS/issues/3640#issuecomment-1144029630 et al. + list(APPEND OPTIONS + -DEMSCRIPTEN_SYSTEM_PROCESSOR=riscv64 + -DTARGET=RISCV64_GENERIC + ) +endif() + +vcpkg_cmake_configure( + SOURCE_PATH "${SOURCE_PATH}" + OPTIONS + ${OPTIONS} + "-DCMAKE_PROJECT_INCLUDE=${CURRENT_PORT_DIR}/cmake-project-include.cmake" + -DBUILD_TESTING=OFF + -DBUILD_WITHOUT_LAPACK=ON + -DNOFORTRAN=ON + MAYBE_UNUSED_VARIABLES + GETARCH_BINARY_DIR +) + +vcpkg_cmake_install() +vcpkg_copy_pdbs() +vcpkg_cmake_config_fixup(CONFIG_PATH lib/cmake/OpenBLAS) +vcpkg_fixup_pkgconfig() + +# Required from native builds, optional from cross builds. +if(NOT VCPKG_CROSSCOMPILING OR EXISTS "${CURRENT_PACKAGES_DIR}/bin/getarch${VCPKG_TARGET_EXECUTABLE_SUFFIX}") + vcpkg_copy_tools( + TOOL_NAMES getarch getarch_2nd + DESTINATION "${CURRENT_PACKAGES_DIR}/manual-tools/${PORT}/${SYSTEM_KEY}" + AUTO_CLEAN + ) +endif() + +file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include" "${CURRENT_PACKAGES_DIR}/debug/share") + +vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE") diff --git a/vcpkg/ports/openblas/system-check-msvc.diff b/vcpkg/ports/openblas/system-check-msvc.diff new file mode 100644 index 0000000..f1c395e --- /dev/null +++ b/vcpkg/ports/openblas/system-check-msvc.diff @@ -0,0 +1,21 @@ +diff --git a/cmake/system_check.cmake b/cmake/system_check.cmake +index e94497a..d884727 100644 +--- a/cmake/system_check.cmake ++++ b/cmake/system_check.cmake +@@ -36,6 +36,16 @@ if(CMAKE_CL_64 OR MINGW64) + else() + set(X86_64 1) + endif() ++elseif(MSVC) ++ if(CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64") ++ set(X86_64 1) ++ elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM") ++ set(ARM 1) ++ elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64") ++ set(ARM64 1) ++ else() ++ set(X86 1) ++ endif() + elseif(MINGW OR (MSVC AND NOT CMAKE_CROSSCOMPILING)) + set(X86 1) + elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc.*|power.*|Power.*" OR (CMAKE_SYSTEM_NAME MATCHES "Darwin" AND CMAKE_OSX_ARCHITECTURES MATCHES "ppc.*")) diff --git a/vcpkg/ports/openblas/vcpkg.json b/vcpkg/ports/openblas/vcpkg.json new file mode 100644 index 0000000..9a22b2e --- /dev/null +++ b/vcpkg/ports/openblas/vcpkg.json @@ -0,0 +1,50 @@ +{ + "name": "openblas", + "version": "0.3.29", + "description": "OpenBLAS is an optimized BLAS library based on GotoBLAS2 1.13 BSD version.", + "homepage": "https://github.com/OpenMathLib/OpenBLAS", + "license": "BSD-3-Clause", + "dependencies": [ + { + "name": "openblas", + "host": true + }, + { + "name": "vcpkg-cmake", + "host": true + }, + { + "name": "vcpkg-cmake-config", + "host": true + } + ], + "features": { + "dynamic-arch": { + "description": "Support for multiple targets in a single library", + "supports": "!windows | mingw" + }, + "simplethread": { + "description": [ + "Use simple thread safety for level3 functions", + "Alternative to serialization of concurrent access to parallelized level3 functions." + ], + "dependencies": [ + { + "name": "openblas", + "features": [ + "threads" + ] + } + ] + }, + "threads": { + "description": "Enable multi-threading", + "dependencies": [ + { + "name": "pthreads", + "platform": "!windows" + } + ] + } + } +} diff --git a/vcpkg/ports/openblas/win32-uwp.diff b/vcpkg/ports/openblas/win32-uwp.diff new file mode 100644 index 0000000..fdf9c63 --- /dev/null +++ b/vcpkg/ports/openblas/win32-uwp.diff @@ -0,0 +1,67 @@ +diff --git a/cmake/os.cmake b/cmake/os.cmake +index 2effbe0..538ede2 100644 +--- a/cmake/os.cmake ++++ b/cmake/os.cmake +@@ -18,7 +18,7 @@ if (${CMAKE_SYSTEM_NAME} STREQUAL "AIX") + endif () + + # TODO: this is probably meant for mingw, not other windows compilers +-if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows") ++if (WIN32) + + set(NEED_PIC 0) + set(NO_EXPRECISION 1) +@@ -69,7 +69,7 @@ if (CYGWIN) + set(NO_EXPRECISION 1) + endif () + +-if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows" AND NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Interix" AND NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Android") ++if (NOT WIN32 AND NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Interix" AND NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Android") + if (USE_THREAD) + set(EXTRALIB "${EXTRALIB} -lpthread") + endif () +diff --git a/cmake/system.cmake b/cmake/system.cmake +index 683c318..eae7436 100644 +--- a/cmake/system.cmake ++++ b/cmake/system.cmake +@@ -507,7 +507,7 @@ if (USE_SIMPLE_THREADED_LEVEL3) + set(CCOMMON_OPT "${CCOMMON_OPT} -DUSE_SIMPLE_THREADED_LEVEL3") + endif () + +-if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows") ++if (NOT WIN32) + if (DEFINED MAX_STACK_ALLOC) + if (NOT ${MAX_STACK_ALLOC} EQUAL 0) + set(CCOMMON_OPT "${CCOMMON_OPT} -DMAX_STACK_ALLOC=${MAX_STACK_ALLOC}") +@@ -516,7 +516,7 @@ else () + set(CCOMMON_OPT "${CCOMMON_OPT} -DMAX_STACK_ALLOC=2048") + endif () + endif () +-if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows") ++if (NOT WIN32) + if (DEFINED BLAS3_MEM_ALLOC_THRESHOLD) + if (NOT ${BLAS3_MEM_ALLOC_THRESHOLD} EQUAL 32) + set(CCOMMON_OPT "${CCOMMON_OPT} -DBLAS3_MEM_ALLOC_THRESHOLD=${BLAS3_MEM_ALLOC_THRESHOLD}") +@@ -633,7 +633,7 @@ endif() + set(LAPACK_FPFLAGS "${LAPACK_FPFLAGS} ${FPFLAGS}") + + #Disable -fopenmp for LAPACK Fortran codes on Windows. +-if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows") ++if (WIN32) + set(FILTER_FLAGS "-fopenmp;-mp;-openmp;-xopenmp=parallel") + foreach (FILTER_FLAG ${FILTER_FLAGS}) + string(REPLACE ${FILTER_FLAG} "" LAPACK_FFLAGS ${LAPACK_FFLAGS}) +@@ -665,11 +665,11 @@ if (INTERFACE64) + set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DLAPACK_ILP64") + endif () + +-if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows") ++if (WIN32) + set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DOPENBLAS_OS_WINDOWS") + endif () + +-if (${CMAKE_C_COMPILER} STREQUAL "LSB" OR ${CMAKE_SYSTEM_NAME} STREQUAL "Windows") ++if (${CMAKE_C_COMPILER} STREQUAL "LSB" OR WIN32) + set(LAPACK_CFLAGS "${LAPACK_CFLAGS} -DLAPACK_COMPLEX_STRUCTURE") + endif () + if (${CMAKE_C_COMPILER_ID} MATCHES "IntelLLVM" AND ${CMAKE_SYSTEM_NAME} STREQUAL "Windows") |