6f29cdeee4
Buildroot would automatically enable multithreading in OpenBLAS if the architecture supports it. However, one may want to avoid OpenBLAS creating threads itself and configure single-threaded operation. To accommodate this use case, add a config option for multithreading. When multithreading is disabled but OpenBLAS functions are called in the same application by multiple threads, then locking is mandatory. The USE_LOCKING flag was added in version 0.3.7 with following release note: a new option USE_LOCKING was added to ensure thread safety when OpenBLAS itself is built without multithreading but will be called from multiple threads. However, if one knows that OpenBLAS will only be called from single-threaded applications, then passing USE_LOCKING is not necessary, so make it a config option too. When multithreading is enabled, locking is implicitly enabled inside openblas, so only provide the locking option when multithreading is disabled. Signed-off-by: Thomas De Schampheleire <thomas.de_schampheleire@nokia.com> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
80 lines
2.3 KiB
Makefile
80 lines
2.3 KiB
Makefile
################################################################################
|
|
#
|
|
# openblas
|
|
#
|
|
################################################################################
|
|
|
|
OPENBLAS_VERSION = 0.3.9
|
|
OPENBLAS_SITE = $(call github,xianyi,OpenBLAS,v$(OPENBLAS_VERSION))
|
|
OPENBLAS_LICENSE = BSD-3-Clause
|
|
OPENBLAS_LICENSE_FILES = LICENSE
|
|
OPENBLAS_INSTALL_STAGING = YES
|
|
|
|
# Initialise OpenBLAS make options to $(TARGET_CONFIGURE_OPTS)
|
|
OPENBLAS_MAKE_OPTS = $(TARGET_CONFIGURE_OPTS)
|
|
|
|
# Enable cross-compiling
|
|
OPENBLAS_MAKE_OPTS += CROSS=1
|
|
|
|
# Set OpenBLAS target
|
|
OPENBLAS_MAKE_OPTS += TARGET=$(BR2_PACKAGE_OPENBLAS_TARGET)
|
|
|
|
# When Fortran is not available, only build the C version of BLAS
|
|
ifeq ($(BR2_TOOLCHAIN_HAS_FORTRAN),)
|
|
OPENBLAS_MAKE_OPTS += ONLY_CBLAS=1
|
|
endif
|
|
|
|
# Enable/Disable multi-threading (not for static-only since it uses dlfcn.h)
|
|
ifeq ($(BR2_PACKAGE_OPENBLAS_USE_THREAD),y)
|
|
OPENBLAS_MAKE_OPTS += USE_THREAD=1
|
|
else
|
|
OPENBLAS_MAKE_OPTS += USE_THREAD=0
|
|
endif
|
|
|
|
ifeq ($(BR2_PACKAGE_OPENBLAS_USE_LOCKING),y)
|
|
OPENBLAS_MAKE_OPTS += USE_LOCKING=1
|
|
else
|
|
# not passing USE_LOCKING=0 as this could be confusing: its effect is implicit
|
|
# in case of USE_THREAD=1.
|
|
endif
|
|
|
|
# We don't know if OpenMP is available or not, so disable
|
|
OPENBLAS_MAKE_OPTS += USE_OPENMP=0
|
|
|
|
# Static-only/Shared-only toggle
|
|
ifeq ($(BR2_STATIC_LIBS),y)
|
|
OPENBLAS_MAKE_OPTS += NO_SHARED=1
|
|
else ifeq ($(BR2_SHARED_LIBS),y)
|
|
OPENBLAS_MAKE_OPTS += NO_STATIC=1
|
|
endif
|
|
|
|
# binutils version <= 2.23.2 has a bug
|
|
# (https://sourceware.org/bugzilla/show_bug.cgi?id=14887) where
|
|
# whitespaces in ARM register specifications such as [ r1, #12 ] or [
|
|
# r2 ] cause the assembler to reject the code. Since there are
|
|
# numerous instances of such cases in the code, we use sed rather than
|
|
# a patch. We simply replace [ foobar ] by [foobar] to work around the
|
|
# problem.
|
|
define OPENBLAS_FIXUP_ARM_ASSEMBLY
|
|
$(SED) 's%\[\s*%\[%;s%\s*\]%\]%' $(@D)/kernel/arm/*.S
|
|
endef
|
|
|
|
OPENBLAS_POST_PATCH_HOOKS += OPENBLAS_FIXUP_ARM_ASSEMBLY
|
|
|
|
define OPENBLAS_BUILD_CMDS
|
|
$(TARGET_MAKE_ENV) $(MAKE) $(OPENBLAS_MAKE_OPTS) \
|
|
-C $(@D)
|
|
endef
|
|
|
|
define OPENBLAS_INSTALL_STAGING_CMDS
|
|
$(TARGET_MAKE_ENV) $(MAKE) $(OPENBLAS_MAKE_OPTS) \
|
|
-C $(@D) install PREFIX=$(STAGING_DIR)/usr
|
|
endef
|
|
|
|
define OPENBLAS_INSTALL_TARGET_CMDS
|
|
$(TARGET_MAKE_ENV) $(MAKE) $(OPENBLAS_MAKE_OPTS) \
|
|
-C $(@D) install PREFIX=$(TARGET_DIR)/usr
|
|
endef
|
|
|
|
$(eval $(generic-package))
|