- # Install OpenBLAS
-
- OpenBLAS can be installed through package managers or from source. If you only
- want to use OpenBLAS rather than make changes to it, we recommend installing a
- pre-built binary package with your package manager of choice.
-
- This page contains an overview of installing with package managers as well as
- from source. For the latter, see [further down on this page](#building-from-source).
-
-
- ## Installing with a package manager
-
- !!! note
- Almost every package manager provides OpenBLAS packages; the list on this
- page is not comprehensive. If your package manager of choice isn't shown
- here, please search its package database for `openblas` or `libopenblas`.
-
-
- ### Linux
-
- On Linux, OpenBLAS can be installed with the system package manager, or with a
- package manager like [Conda](https://docs.conda.io/en/latest/)
- (or alternative package managers for the conda-forge ecosystem, like
- [Mamba](https://mamba.readthedocs.io/en/latest/),
- [Micromamba](https://mamba.readthedocs.io/en/latest/user_guide/micromamba.html),
- or [Pixi](https://pixi.sh/latest/#windows-installer)),
- [Spack](https://spack.io/), or [Nix](https://nixos.org/). For the latter set of
- tools, the package name in all cases is `openblas`. Since package management in
- quite a few of these tools is declarative (i.e., managed by adding `openblas`
- to a metadata file describing the dependencies for your project or
- environment), we won't attempt to give detailed instructions for these tools here.
-
- Linux distributions typically split OpenBLAS up in two packages: one containing
- the library itself (typically named `openblas` or `libopenblas`), and one containing headers,
- pkg-config and CMake files (typically named the same as the package for the
- library with `-dev` or `-devel` appended; e.g., `openblas-devel`). Please keep
- in mind that if you want to install OpenBLAS in order to use it directly in
- your own project, you will need to install both of those packages.
-
- Distro-specific installation commands:
-
- === "Debian/Ubuntu/Mint/Kali"
-
- ```bash
- $ sudo apt update
- $ sudo apt install libopenblas-dev
- ```
- OpenBLAS can be configured as the default BLAS through the `update-alternatives` mechanism:
-
- ```bash
- $ sudo update-alternatives --config libblas.so.3
- ```
-
- === "openSUSE/SLE"
-
- ```bash
- $ sudo zypper refresh
- $ sudo zypper install openblas-devel
- ```
-
- OpenBLAS can be configured as the default BLAS through the `update-alternatives` mechanism:
- ```bash
- $ sudo update-alternatives --config libblas.so.3
- ```
-
- === "Fedora/CentOS/RHEL"
-
- ```bash
- $ dnf check-update
- $ dnf install openblas-devel
- ```
-
- !!! warning
-
- Fedora does not ship the pkg-config files for OpenBLAS. Instead, it wants you to
- link against [FlexiBLAS](https://www.mpi-magdeburg.mpg.de/projects/flexiblas) (which
- uses OpenBLAS by default as its backend on Fedora), which you can install with:
-
- ```bash
- $ dnf install flexiblas-devel
- ```
-
- For CentOS and RHEL, OpenBLAS packages are provided via the [Fedora EPEL repository](https://fedoraproject.org/wiki/EPEL).
- After adding that repository and its repository keys, you can install
- `openblas-devel` with either `dnf` or `yum`.
-
- === "Arch/Manjaro/Antergos"
-
- ```bash
- $ sudo pacman -S openblas
- ```
-
-
- ### Windows
-
- === "Conda-forge"
-
- OpenBLAS can be installed with `conda` (or `mamba`, `micromamba`, or
- `pixi`) from conda-forge:
- ```
- conda install openblas
- ```
-
- Conda-forge provides a method for switching the default BLAS implementation
- used by all packages. To use that for OpenBLAS, install `libblas=*=*openblas`
- (see [the docs on this mechanism](https://conda-forge.org/docs/maintainer/knowledge_base/#switching-blas-implementation)
- for more details).
-
- === "vcpkg"
-
- OpenBLAS can be installed with vcpkg:
- ```cmd
- # In classic mode:
- vcpkg install openblas
-
- # Or in manifest mode:
- vcpkg add port openblas
- ```
-
- === "OpenBLAS releases"
-
- Windows is the only platform for which binaries are made available by the
- OpenBLAS project itself. They can be downloaded from the GitHub
- Releases](https://github.com/OpenMathLib/OpenBLAS/releases) page. These
- binaries are built with MinGW, using the following build options:
- ```
- NUM_THREADS=64 TARGET=GENERIC DYNAMIC_ARCH=1 DYNAMIC_OLDER=1 CONSISTENT_FPCSR=1 INTERFACE=0
- ```
- There are separate packages for x86-64 and x86. The zip archive contains
- the include files, static and shared libraries, as well as configuration
- files for getting them found via CMake or pkg-config. To use these
- binaries, create a suitable folder for your OpenBLAS installation and unzip
- the `.zip` bundle there (note that you will need to edit the provided
- `openblas.pc` and `OpenBLASConfig.cmake` to reflect the installation path
- on your computer, as distributed they have "win" or "win64" reflecting the
- local paths on the system they were built on).
-
- Note that the same binaries can be downloaded
- [from SourceForge](http://sourceforge.net/projects/openblas/files); this is
- mostly of historical interest.
-
-
- ### macOS
-
- To install OpenBLAS with a package manager on macOS, run:
-
- === "Homebrew"
-
- ```zsh
- % brew install openblas
- ```
-
- === "MacPorts"
-
- ```zsh
- % sudo port install OpenBLAS-devel
- ```
-
- === "Conda-forge"
-
- ```zsh
- % conda install openblas
- ```
-
- Conda-forge provides a method for switching the default BLAS implementation
- used by all packages. To use that for OpenBLAS, install `libblas=*=*openblas`
- (see [the docs on this mechanism](https://conda-forge.org/docs/maintainer/knowledge_base/#switching-blas-implementation)
- for more details).
-
-
- ### FreeBSD
-
- You can install OpenBLAS from the FreeBSD [Ports collection](https://www.freebsd.org/ports/index.html):
- ```
- pkg install openblas
- ```
-
-
- ## Building from source
-
- We recommend download the latest [stable version](https://github.com/OpenMathLib/OpenBLAS/releases)
- from the GitHub Releases page, or checking it out from a git tag, rather than a
- dev version from the `develop` branch.
-
- !!! tip
-
- The User manual contains [a section with detailed information on compiling OpenBLAS](user_manual.md#compiling-openblas),
- including how to customize builds and how to cross-compile. Please read
- that documentation first. This page contains only platform-specific build
- information, and assumes you already understand the general build system
- invocations to build OpenBLAS, with the specific build options you want to
- control multi-threading and other non-platform-specific behavior).
-
-
- ### Linux and macOS
-
- Ensure you have C and Fortran compilers installed, then simply type `make` to compile the library.
- There are no other build dependencies, nor unusual platform-specific
- environment variables to set or other system setup to do.
-
- !!! note
-
- When building in an emulator (KVM, QEMU, etc.), please make sure that the combination of CPU features exposed to
- the virtual environment matches that of an existing CPU to allow detection of the CPU model to succeed.
- (With `qemu`, this can be done by passing `-cpu host` or a supported model name at invocation).
-
-
- ### Windows
-
- We support building OpenBLAS with either MinGW or Visual Studio on Windows.
- Using MSVC will yield an OpenBLAS build with the Windows platform-native ABI.
- Using MinGW will yield a different ABI. We'll describe both methods in detail
- in this section, since the process for each is quite different.
-
- #### Visual Studio & native Windows ABI
-
- For Visual Studio, you can use CMake to generate Visual Studio solution files;
- note that you will need at least CMake 3.11 for linking to work correctly).
-
- Note that you need a Fortran compiler if you plan to build and use the LAPACK
- functions included with OpenBLAS. The sections below describe using either
- `flang` as an add-on to clang/LLVM or `gfortran` as part of MinGW for this
- purpose. If you want to use the Intel Fortran compiler (`ifort` or `ifx`) for
- this, be sure to also use the Intel C compiler (`icc` or `icx`) for building
- the C parts, as the ABI imposed by `ifort` is incompatible with MSVC
-
- A fully-optimized OpenBLAS that can be statically or dynamically linked to your
- application can currently be built for the 64-bit architecture with the LLVM
- compiler infrastructure. We're going to use [Miniconda3](https://docs.anaconda.com/miniconda/)
- to grab all of the tools we need, since some of them are in an experimental
- status. Before you begin, you'll need to have Microsoft Visual Studio 2015 or
- newer installed.
-
- 1. Install Miniconda3 for 64-bit Windows using `winget install --id Anaconda.Miniconda3`,
- or easily download from [conda.io](https://docs.conda.io/en/latest/miniconda.html).
- 2. Open the "Anaconda Command Prompt" now available in the Start Menu, or at `%USERPROFILE%\miniconda3\shell\condabin\conda-hook.ps1`.
- 3. In that command prompt window, use `cd` to change to the directory where you want to build OpenBLAS.
- 4. Now install all of the tools we need:
- ```
- conda update -n base conda
- conda config --add channels conda-forge
- conda install -y cmake flang clangdev perl libflang ninja
- ```
- 5. Still in the Anaconda Command Prompt window, activate the 64-bit MSVC environment with `vcvarsall x64`.
- On Windows 11 with Visual Studio 2022, this would be done by invoking:
-
- ```shell
- "c:\Program Files\Microsoft Visual Studio\2022\Community\vc\Auxiliary\Build\vcvars64.bat"
- ```
-
- With VS2019, the command should be the same (except for the year number of course).
- For other versions of MSVC, please check the Visual Studio documentation for
- exactly how to invoke the `vcvars64.bat` script.
-
- Confirm that the environment is active by typing `link`. This should return
- a long list of possible options for the `link` command. If it just returns
- _"command not found"_ or similar, review and retype the call to `vcvars64.bat`.
-
- !!! note
-
- if you are working from a Visual Studio command prompt window instead
- (so that you do not have to do the `vcvars` call), you need to invoke
- `conda activate` so that `CONDA_PREFIX` etc. get set up correctly before
- proceeding to step 6. Failing to do so will lead to link errors like
- `libflangmain.lib` not getting found later in the build.
-
- 6. Now configure the project with CMake. Starting in the project directory, execute the following:
- ```
- set "LIB=%CONDA_PREFIX%\Library\lib;%LIB%"
- set "CPATH=%CONDA_PREFIX%\Library\include;%CPATH%"
- mkdir build
- cd build
- cmake .. -G "Ninja" -DCMAKE_CXX_COMPILER=clang-cl -DCMAKE_C_COMPILER=clang-cl -DCMAKE_Fortran_COMPILER=flang -DCMAKE_MT=mt -DBUILD_WITHOUT_LAPACK=no -DNOFORTRAN=0 -DDYNAMIC_ARCH=ON -DCMAKE_BUILD_TYPE=Release
- ```
-
- You may want to add further options in the `cmake` command here. For
- instance, the default only produces a static `.lib` version of the library.
- If you would rather have a DLL, add `-DBUILD_SHARED_LIBS=ON` above. Note that
- this step only creates some command files and directories, the actual build
- happens next.
-
- 7. Build the project:
-
- ```
- cmake --build . --config Release
- ```
- This step will create the OpenBLAS library in the `lib` directory, and
- various build-time tests in the `test`, `ctest` and `openblas_utest`
- directories. However it will not separate the header files you might need
- for building your own programs from those used internally. To put all
- relevant files in a more convenient arrangement, run the next step.
-
- 8. Install all relevant files created by the build:
-
- ```
- cmake --install . --prefix c:\opt -v
- ```
- This will copy all files that are needed for building and running your own
- programs with OpenBLAS to the given location, creating appropriate
- subdirectories for the individual kinds of files. In the case of `C:\opt` as
- given above, this would be:
-
- - `C:\opt\include\openblas` for the header files,
- - `C:\opt\bin` for the `libopenblas.dll` shared library,
- - `C:\opt\lib` for the static library, and
- - `C:\opt\share` holds various support files that enable other cmake-based
- build scripts to find OpenBLAS automatically.
-
-
- !!! tip "Change in complex types for Visual Studio 2017 and up"
-
- In newer Visual Studio versions, Microsoft has changed
- [how it handles complex types](https://docs.microsoft.com/en-us/cpp/c-runtime-library/complex-math-support?view=msvc-170#types-used-in-complex-math).
- Even when using a precompiled version of OpenBLAS, you might need to define
- `LAPACK_COMPLEX_CUSTOM` in order to define complex types properly for MSVC.
- For example, some variant of the following might help:
-
- ```c
- #if defined(_MSC_VER)
- #include <complex.h>
- #define LAPACK_COMPLEX_CUSTOM
- #define lapack_complex_float _Fcomplex
- #define lapack_complex_double _Dcomplex
- #endif
- ```
-
- For reference, see
- [openblas#3661](https://github.com/OpenMathLib/OpenBLAS/issues/3661),
- [lapack#683](https://github.com/Reference-LAPACK/lapack/issues/683), and
- [this Stack Overflow question](https://stackoverflow.com/questions/47520244/using-openblas-lapacke-in-visual-studio).
-
-
- !!! warning "Building 32-bit binaries with MSVC"
-
- This method may produce binaries which demonstrate significantly lower
- performance than those built with the other methods. The Visual Studio
- compiler does not support the dialect of assembly used in the cpu-specific
- optimized files, so only the "generic" `TARGET` which is written in pure C
- will get built. For the same reason it is not possible (and not necessary)
- to use `-DDYNAMIC_ARCH=ON` in a Visual Studio build. You may consider
- building for the 32-bit architecture using the GNU (MinGW) ABI instead.
-
- ##### CMake & Visual Studio integration
-
- To generate Visual Studio solution files, ensure CMake is installed and then run:
- ```
- # Do this from Powershell so cmake can find visual studio
- cmake -G "Visual Studio 14 Win64" -DCMAKE_BUILD_TYPE=Release .
- ```
-
- To then build OpenBLAS using those solution files from within Visual Studio, we
- also need Perl. Please install it and ensure it's on the `PATH` (see, e.g.,
- [this Stack Overflow question for how](http://stackoverflow.com/questions/3051049/active-perl-installation-on-windows-operating-system)).
-
- If you build from within Visual Studio, the dependencies may not be
- automatically configured: if you try to build `libopenblas` directly, it may
- fail with a message saying that some `.obj` files aren't found. If this
- happens, you can work around the problem by building the projects that
- `libopenblas` depends on before building `libopenblas` itself.
-
- ###### Build OpenBLAS for Universal Windows Platform
-
- OpenBLAS can be built targeting [Universal Windows Platform](https://en.wikipedia.org/wiki/Universal_Windows_Platform)
- (UWP) like this:
-
- 1. Follow the steps above to build the Visual Studio solution files for
- Windows. This builds the helper executables which are required when building
- the OpenBLAS Visual Studio solution files for UWP in step 2.
- 2. Remove the generated `CMakeCache.txt` and the `CMakeFiles` directory from
- the OpenBLAS source directory, then re-run CMake with the following options:
-
- ```
- # do this to build UWP compatible solution files
- cmake -G "Visual Studio 14 Win64" -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION="10.0" -DCMAKE_SYSTEM_PROCESSOR=AMD64 -DVS_WINRT_COMPONENT=TRUE -DCMAKE_BUILD_TYPE=Release .
- ```
- 3. Now build the solution with Visual Studio.
-
-
- #### MinGW & GNU ABI
-
- !!! note
-
- The resulting library from building with MinGW as described below can be
- used in Visual Studio, but it can only be linked dynamically. This
- configuration has not been thoroughly tested and should be considered
- experimental.
-
-
- To build OpenBLAS on Windows with MinGW:
-
- 1. Install the MinGW (GCC) compiler suite, either the 32-bit
- [MinGW]((http://www.mingw.org/) or the 64-bit
- [MinGW-w64](http://mingw-w64.sourceforge.net/) toolchain. Be sure to install
- its `gfortran` package as well (unless you really want to build the BLAS part
- of OpenBLAS only) and check that `gcc` and `gfortran` are the same version.
- In addition, please install MSYS2 with MinGW.
- 2. Build OpenBLAS in the MSYS2 shell. Usually, you can just type `make`.
- OpenBLAS will detect the compiler and CPU automatically.
- 3. After the build is complete, OpenBLAS will generate the static library
- `libopenblas.a` and the shared library `libopenblas.dll` in the folder. You
- can type `make PREFIX=/your/installation/path install` to install the
- library to a certain location.
-
- Note that OpenBLAS will generate the import library `libopenblas.dll.a` for
- `libopenblas.dll` by default.
-
- If you want to generate Windows-native PDB files from a MinGW build, you can
- use the [cv2pdb](https://github.com/rainers/cv2pdb) tool to do so.
-
- To then use the built OpenBLAS shared library in Visual Studio:
-
- 1. Copy the import library (`OPENBLAS_TOP_DIR/libopenblas.dll.a`) and the
- shared library (`libopenblas.dll`) into the same folder (this must be the
- folder of your project that is going to use the BLAS library. You may need
- to add `libopenblas.dll.a` to the linker input list: `properties->Linker->Input`).
- 2. Please follow the Visual Studio documentation about using third-party .dll
- libraries, and make sure to link against a library for the correct
- architecture.[^1]
- 3. If you need CBLAS, you should include `cblas.h` in
- `/your/installation/path/include` in Visual Studio. Please see
- [openblas#95](http://github.com/OpenMathLib/OpenBLAS/issues/95) for more details.
-
- [^1]:
- If the OpenBLAS DLLs are not linked correctly, you may see an error like
- _"The application was unable to start correctly (0xc000007b)"_, which typically
- indicates a mismatch between 32-bit and 64-bit libraries.
-
- !!! info "Limitations of using the MinGW build within Visual Studio"
-
- - Both static and dynamic linking are supported with MinGW. With Visual
- Studio, however, only dynamic linking is supported and so you should use
- the import library.
- - Debugging from Visual Studio does not work because MinGW and Visual
- Studio have incompatible formats for debug information (PDB vs.
- DWARF/STABS). You should either debug with GDB on the command line or
- with a visual frontend, for instance [Eclipse](http://www.eclipse.org/cdt/) or
- [Qt Creator](http://qt.nokia.com/products/developer-tools/).
-
-
- #### Windows on Arm
-
- The following tools needs to be installed to build for Windows on Arm (WoA):
-
- - Clang for Windows on Arm.
- Find the latest LLVM build for WoA from [LLVM release page](https://releases.llvm.org/).
- E.g: LLVM 12 build for WoA64 can be found [here](https://github.com/llvm/llvm-project/releases/download/llvmorg-12.0.0/LLVM-12.0.0-woa64.exe)
- Run the LLVM installer and ensure that LLVM is added to environment PATH.
- - Download and install classic Flang for Windows on Arm.
- Classic Flang is the only available Fortran compiler for Windows on Arm for now.
- A pre-release build can be found [here](https://github.com/kaadam/flang/releases/tag/v0.1)
- There is no installer for classic flang and the zip package can be
- extracted and the path needs to be added to environment `PATH`.
- E.g., in PowerShell:
- ```
- $env:Path += ";C:\flang_woa\bin"
- ```
-
- The following steps describe how to build the static library for OpenBLAS with and without LAPACK:
-
- 1. Build OpenBLAS static library with BLAS and LAPACK routines with Make:
-
- ```bash
- $ make CC="clang-cl" HOSTCC="clang-cl" AR="llvm-ar" BUILD_WITHOUT_LAPACK=0 NOFORTRAN=0 DYNAMIC_ARCH=0 TARGET=ARMV8 ARCH=arm64 BINARY=64 USE_OPENMP=0 PARALLEL=1 RANLIB="llvm-ranlib" MAKE=make F_COMPILER=FLANG FC=FLANG FFLAGS_NOOPT="-march=armv8-a -cpp" FFLAGS="-march=armv8-a -cpp" NEED_PIC=0 HOSTARCH=arm64 libs netlib
- ```
-
- 2. Build static library with BLAS routines using CMake:
-
- Classic Flang has compatibility issues with CMake, hence only BLAS routines can be compiled with CMake:
-
- ```bash
- $ mkdir build
- $ cd build
- $ cmake .. -G Ninja -DCMAKE_C_COMPILER=clang -DBUILD_WITHOUT_LAPACK=1 -DNOFORTRAN=1 -DDYNAMIC_ARCH=0 -DTARGET=ARMV8 -DARCH=arm64 -DBINARY=64 -DUSE_OPENMP=0 -DCMAKE_SYSTEM_PROCESSOR=ARM64 -DCMAKE_CROSSCOMPILING=1 -DCMAKE_SYSTEM_NAME=Windows
- $ cmake --build . --config Release
- ```
-
- !!! tip "`getarch.exe` execution error"
-
- If you notice that platform-specific headers by `getarch.exe` are not
- generated correctly, this could be due to a known debug runtime DLL issue for
- arm64 platforms. Please check out [this page](https://linaro.atlassian.net/wiki/spaces/WOAR/pages/28677636097/Debug+run-time+DLL+issue#Workaround)
- for a workaround.
-
-
- #### Generating an import library
-
- Microsoft Windows has this thing called "import libraries". You need it for
- MSVC; you don't need it for MinGW because the `ld` linker is smart enough -
- however, you may still want it for some reason, so we'll describe the process
- for both MSVC and MinGW.
-
- Import libraries are compiled from a list of what symbols to use, which are
- contained in a `.def` file. A `.def` file should be already be present in the
- `exports` directory under the top-level OpenBLAS directory after you've run a build.
- In your shell, move to this directory: `cd exports`.
-
- === "MSVC"
-
- Unlike MinGW, MSVC absolutely requires an import library. Now the C ABI of
- MSVC and MinGW are actually identical, so linking is actually okay (any
- incompatibility in the C ABI would be a bug).
-
- The import libraries of MSVC have the suffix `.lib`. They are generated
- from a `.def` file using MSVC's `lib.exe`. See [the MSVC instructions](use_visual_studio.md#generate-import-library-before-0210-version).
-
- === "MinGW"
-
- MinGW import libraries have the suffix `.a`, just like static libraries.
- Our goal is to produce the file `libopenblas.dll.a`.
-
- You need to first insert a line `LIBRARY libopenblas.dll` in `libopenblas.def`:
- ```
- cat <(echo "LIBRARY libopenblas.dll") libopenblas.def > libopenblas.def.1
- mv libopenblas.def.1 libopenblas.def
- ```
-
- Now the `.def` file probably looks like:
- ```
- LIBRARY libopenblas.dll
- EXPORTS
- caxpy=caxpy_ @1
- caxpy_=caxpy_ @2
- ...
- ```
- Then, generate the import library: `dlltool -d libopenblas.def -l libopenblas.dll.a`
-
- _Again, there is basically **no point** in making an import library for use in MinGW. It actually slows down linking._
-
-
- ### Android
-
- To build OpenBLAS for Android, you will need the following tools installed on your machine:
-
- - [The Android NDK](https://developer.android.com/ndk/)
- - Perl
- - Clang compiler on the build machine
-
- The next two sections below describe how to build with Clang for ARMV7 and
- ARMV8 targets, respectively. The same basic principles as described below for
- ARMV8 should also apply to building an x86 or x86-64 version (substitute
- something like `NEHALEM` for the target instead of `ARMV8`, and replace all the
- `aarch64` in the toolchain paths with `x86` or `x96_64` as appropriate).
-
- !!! info "Historic note"
-
- Since NDK version 19, the default toolchain is provided as a standalone
- toolchain, so building one yourself following
- [building a standalone toolchain](http://developer.android.com/ndk/guides/standalone_toolchain.html)
- should no longer be necessary.
-
-
- #### Building for ARMV7
-
- ```bash
- # Set path to ndk-bundle
- export NDK_BUNDLE_DIR=/path/to/ndk-bundle
-
- # Set the PATH to contain paths to clang and arm-linux-androideabi-* utilities
- export PATH=${NDK_BUNDLE_DIR}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:${NDK_BUNDLE_DIR}/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
-
- # Set LDFLAGS so that the linker finds the appropriate libgcc
- export LDFLAGS="-L${NDK_BUNDLE_DIR}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x"
-
- # Set the clang cross compile flags
- export CLANG_FLAGS="-target arm-linux-androideabi -marm -mfpu=vfp -mfloat-abi=softfp --sysroot ${NDK_BUNDLE_DIR}/platforms/android-23/arch-arm -gcc-toolchain ${NDK_BUNDLE_DIR}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/"
-
- #OpenBLAS Compile
- make TARGET=ARMV7 ONLY_CBLAS=1 AR=ar CC="clang ${CLANG_FLAGS}" HOSTCC=gcc ARM_SOFTFP_ABI=1 -j4
- ```
-
- On macOS, it may also be necessary to give the complete path to the `ar`
- utility in the make command above, like so:
- ```bash
- AR=${NDK_BUNDLE_DIR}/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc-ar
- ```
- otherwise you may get a linker error complaining like `malformed archive header
- name at 8` when the native macOS `ar` command was invoked instead.
-
-
- #### Building for ARMV8
-
- ```bash
- # Set path to ndk-bundle
- export NDK_BUNDLE_DIR=/path/to/ndk-bundle/
-
- # Export PATH to contain directories of clang and aarch64-linux-android-* utilities
- export PATH=${NDK_BUNDLE_DIR}/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/:${NDK_BUNDLE_DIR}/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
-
- # Setup LDFLAGS so that loader can find libgcc and pass -lm for sqrt
- export LDFLAGS="-L${NDK_BUNDLE_DIR}/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/lib/gcc/aarch64-linux-android/4.9.x -lm"
-
- # Setup the clang cross compile options
- export CLANG_FLAGS="-target aarch64-linux-android --sysroot ${NDK_BUNDLE_DIR}/platforms/android-23/arch-arm64 -gcc-toolchain ${NDK_BUNDLE_DIR}/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/"
-
- # Compile
- make TARGET=ARMV8 ONLY_CBLAS=1 AR=ar CC="clang ${CLANG_FLAGS}" HOSTCC=gcc -j4
- ```
- Note: using `TARGET=CORTEXA57` in place of `ARMV8` will pick up better
- optimized routines. Implementations for the `CORTEXA57` target are compatible
- with all other `ARMV8` targets.
-
- Note: for NDK 23b, something as simple as:
- ```bash
- export PATH=/opt/android-ndk-r23b/toolchains/llvm/prebuilt/linux-x86_64/bin/:$PATH
- make HOSTCC=gcc CC=/opt/android-ndk-r23b/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android31-clang ONLY_CBLAS=1 TARGET=ARMV8
- ```
- appears to be sufficient on Linux.
-
-
- ??? note "Alternative build script for 3 architectures"
-
- This script will build OpenBLAS for 3 architecture (`ARMV7`, `ARMV8`, `X86`) and install them to `/opt/OpenBLAS/lib`.
- It was tested on macOS with NDK version 21.3.6528147.
-
- ```bash
- export NDK=YOUR_PATH_TO_SDK/Android/sdk/ndk/21.3.6528147
- export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
-
- make clean
- make \
- TARGET=ARMV7 \
- ONLY_CBLAS=1 \
- CC="$TOOLCHAIN"/bin/armv7a-linux-androideabi21-clang \
- AR="$TOOLCHAIN"/bin/arm-linux-androideabi-ar \
- HOSTCC=gcc \
- ARM_SOFTFP_ABI=1 \
- -j4
- sudo make install
-
- make clean
- make \
- TARGET=CORTEXA57 \
- ONLY_CBLAS=1 \
- CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang \
- AR=$TOOLCHAIN/bin/aarch64-linux-android-ar \
- HOSTCC=gcc \
- -j4
- sudo make install
-
- make clean
- make \
- TARGET=ATOM \
- ONLY_CBLAS=1 \
- CC="$TOOLCHAIN"/bin/i686-linux-android21-clang \
- AR="$TOOLCHAIN"/bin/i686-linux-android-ar \
- HOSTCC=gcc \
- ARM_SOFTFP_ABI=1 \
- -j4
- sudo make install
-
- ## This will build for x86_64
- make clean
- make \
- TARGET=ATOM BINARY=64\
- ONLY_CBLAS=1 \
- CC="$TOOLCHAIN"/bin/x86_64-linux-android21-clang \
- AR="$TOOLCHAIN"/bin/x86_64-linux-android-ar \
- HOSTCC=gcc \
- ARM_SOFTFP_ABI=1 \
- -j4
- sudo make install
- ```
- You can find full list of target architectures in [TargetList.txt](https://github.com/OpenMathLib/OpenBLAS/blob/develop/TargetList.txt)
-
-
- ### iPhone/iOS
-
- As none of the current developers uses iOS, the following instructions are what
- was found to work in our Azure CI setup, but as far as we know this builds a
- fully working OpenBLAS for this platform.
-
- Go to the directory where you unpacked OpenBLAS,and enter the following commands:
- ```bash
- CC=/Applications/Xcode_12.4.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
-
- CFLAGS= -O2 -Wno-macro-redefined -isysroot /Applications/Xcode_12.4.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.4.sdk -arch arm64 -miphoneos-version-min=10.0
-
- make TARGET=ARMV8 DYNAMIC_ARCH=1 NUM_THREADS=32 HOSTCC=clang NOFORTRAN=1
- ```
- Adjust `MIN_IOS_VERSION` as necessary for your installation. E.g., change the version number
- to the minimum iOS version you want to target and execute this file to build the library.
-
-
- ### MIPS
-
- For MIPS targets you will need latest toolchains:
-
- - P5600 - MTI GNU/Linux Toolchain
- - I6400, P6600 - IMG GNU/Linux Toolchain
-
- You can use following commandlines for builds:
-
- ```bash
- IMG_TOOLCHAIN_DIR={full IMG GNU/Linux Toolchain path including "bin" directory -- for example, /opt/linux_toolchain/bin}
- IMG_GCC_PREFIX=mips-img-linux-gnu
- IMG_TOOLCHAIN=${IMG_TOOLCHAIN_DIR}/${IMG_GCC_PREFIX}
-
- # I6400 Build (n32):
- make BINARY=32 BINARY32=1 CC=$IMG_TOOLCHAIN-gcc AR=$IMG_TOOLCHAIN-ar FC="$IMG_TOOLCHAIN-gfortran -EL -mabi=n32" RANLIB=$IMG_TOOLCHAIN-ranlib HOSTCC=gcc CFLAGS="-EL" FFLAGS=$CFLAGS LDFLAGS=$CFLAGS TARGET=I6400
-
- # I6400 Build (n64):
- make BINARY=64 BINARY64=1 CC=$IMG_TOOLCHAIN-gcc AR=$IMG_TOOLCHAIN-ar FC="$IMG_TOOLCHAIN-gfortran -EL" RANLIB=$IMG_TOOLCHAIN-ranlib HOSTCC=gcc CFLAGS="-EL" FFLAGS=$CFLAGS LDFLAGS=$CFLAGS TARGET=I6400
-
- # P6600 Build (n32):
- make BINARY=32 BINARY32=1 CC=$IMG_TOOLCHAIN-gcc AR=$IMG_TOOLCHAIN-ar FC="$IMG_TOOLCHAIN-gfortran -EL -mabi=n32" RANLIB=$IMG_TOOLCHAIN-ranlib HOSTCC=gcc CFLAGS="-EL" FFLAGS=$CFLAGS LDFLAGS=$CFLAGS TARGET=P6600
-
- # P6600 Build (n64):
- make BINARY=64 BINARY64=1 CC=$IMG_TOOLCHAIN-gcc AR=$IMG_TOOLCHAIN-ar FC="$IMG_TOOLCHAIN-gfortran -EL" RANLIB=$IMG_TOOLCHAIN-ranlib HOSTCC=gcc CFLAGS="-EL" FFLAGS="$CFLAGS" LDFLAGS="$CFLAGS" TARGET=P6600
-
- MTI_TOOLCHAIN_DIR={full MTI GNU/Linux Toolchain path including "bin" directory -- for example, /opt/linux_toolchain/bin}
- MTI_GCC_PREFIX=mips-mti-linux-gnu
- MTI_TOOLCHAIN=${IMG_TOOLCHAIN_DIR}/${IMG_GCC_PREFIX}
-
- # P5600 Build:
-
- make BINARY=32 BINARY32=1 CC=$MTI_TOOLCHAIN-gcc AR=$MTI_TOOLCHAIN-ar FC="$MTI_TOOLCHAIN-gfortran -EL" RANLIB=$MTI_TOOLCHAIN-ranlib HOSTCC=gcc CFLAGS="-EL" FFLAGS=$CFLAGS LDFLAGS=$CFLAGS TARGET=P5600
- ```
-
-
- ### FreeBSD
-
- You will need to install the following tools from the FreeBSD ports tree:
-
- * lang/gcc
- * lang/perl5.12
- * ftp/curl
- * devel/gmake
- * devel/patch
-
- To compile run the command:
- ```bash
- $ gmake CC=gcc FC=gfortran
- ```
-
-
- ### Cortex-M
-
- Cortex-M is a widely used microcontroller that is present in a variety of
- industrial and consumer electronics. A common variant of the Cortex-M is the
- `STM32F4xx` series. Here, we will give instructions for building for that
- series.
-
- First, install the embedded Arm GCC compiler from the Arm website. Then, create
- the following `toolchain.cmake` file:
-
- ```cmake
- set(CMAKE_SYSTEM_NAME Generic)
- set(CMAKE_SYSTEM_PROCESSOR arm)
-
- set(CMAKE_C_COMPILER "arm-none-eabi-gcc.exe")
- set(CMAKE_CXX_COMPILER "arm-none-eabi-g++.exe")
-
- set(CMAKE_EXE_LINKER_FLAGS "--specs=nosys.specs" CACHE INTERNAL "")
-
- set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
- set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
- set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
- set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
- ```
-
- Then build OpenBLAS with:
- ```bash
- $ cmake .. -G Ninja -DCMAKE_C_COMPILER=arm-none-eabi-gcc -DCMAKE_TOOLCHAIN_FILE:PATH="toolchain.cmake" -DNOFORTRAN=1 -DTARGET=ARMV5 -DEMBEDDED=1
- ```
-
- In your embedded application, the following functions need to be provided for OpenBLAS to work correctly:
- ```C
- void free(void* ptr);
- void* malloc(size_t size);
- ```
-
- !!! note
-
- If you are developing for an embedded platform, it is your responsibility
- to make sure that the device has sufficient memory for `malloc` calls.
- [Libmemory](https://github.com/embeddedartistry/libmemory)
- provides one implementation of `malloc` for embedded platforms.
|