1#!/bin/sh -e
2abspath() {
3    if [ -d "$1" ]; then
4        (cd "$1"; pwd)
5    elif [ -f "$1" ]; then
6        if [ -z "${1##*/*}" ]; then
7            echo "$(cd "${1%/*}"; pwd)/${1##*/}"
8        else
9            echo "$(pwd)/$1"
10        fi
11    elif [ -d "$(dirname "$1")" ]; then
12        echo "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")"
13    fi
14}
15
16REPO="$(abspath "$1")"
17BUILD="$(abspath "$2")"
18BINARY_NAME="${3:-mmseqs}"
19CPUS=${4:-$(nproc --all 2>/dev/null || sysctl -n hw.ncpu)}
20
21if [ ! -d "$REPO" ]; then
22    echo "${BINARY_NAME} repository missing"
23    exit 1
24fi
25
26export MACOSX_DEPLOYMENT_TARGET=10.12
27
28mkdir -p "$BUILD/build_libomp" && cd "$BUILD/build_libomp"
29wget -qO- http://github.com/llvm/llvm-project/releases/download/llvmorg-11.0.0/openmp-11.0.0.src.tar.xz | tar xvf -
30cd openmp-11.0.0.src
31wget https://raw.githubusercontent.com/Homebrew/formula-patches/7e2ee1d7/libomp/arm.patch
32patch -p1 < arm.patch
33
34mkdir -p "$BUILD/build_libomp/openmp-11.0.0.src/build-amd64" && cd "$BUILD/build_libomp/openmp-11.0.0.src/build-amd64"
35cmake -DLIBOMP_ENABLE_SHARED=OFF -DLIBOMP_INSTALL_ALIASES=OFF -DLIBOMP_ARCH=x86_64 -DCMAKE_CXX_FLAGS="-arch x86_64" ..
36make -j${CPUS}
37export LIBOMP_AMD64="$BUILD/build_libomp/openmp-11.0.0.src/build-amd64/runtime/src"
38
39mkdir -p "$BUILD/build_sse41" && cd "$BUILD/build_sse41"
40cmake -DCMAKE_BUILD_TYPE=Release -DHAVE_TESTS=0 -DHAVE_MPI=0 -DHAVE_SSE4_1=1 -DCMAKE_C_FLAGS="-arch x86_64" -DCMAKE_CXX_FLAGS="-arch x86_64" -DBUILD_SHARED_LIBS=OFF -DCMAKE_FIND_LIBRARY_SUFFIXES=".a" -DOpenMP_C_FLAGS="-Xpreprocessor -fopenmp -I${LIBOMP_AMD64}" -DOpenMP_C_LIB_NAMES=omp -DOpenMP_CXX_FLAGS="-Xpreprocessor -fopenmp -I${LIBOMP_AMD64}" -DOpenMP_CXX_LIB_NAMES=omp -DOpenMP_omp_LIBRARY=${LIBOMP_AMD64}/libomp.a "$REPO"
41make -j${CPUS}
42
43if [ "$(echo $(otool -L "src/${BINARY_NAME}" | wc -l))" != 5 ]; then
44    echo "Too many linked libraries found in ${BINARY_NAME} binary. Build is not static!"
45    exit 1
46fi
47
48mkdir -p "$BUILD/build_avx2" && cd "$BUILD/build_avx2"
49cmake -DCMAKE_BUILD_TYPE=Release -DHAVE_TESTS=0 -DHAVE_MPI=0 -DHAVE_AVX2=1 -DCMAKE_C_FLAGS="-arch x86_64h" -DCMAKE_CXX_FLAGS="-arch x86_64h" -DBUILD_SHARED_LIBS=OFF -DCMAKE_FIND_LIBRARY_SUFFIXES=".a" -DOpenMP_C_FLAGS="-Xpreprocessor -fopenmp -I${LIBOMP_AMD64}" -DOpenMP_C_LIB_NAMES=omp -DOpenMP_CXX_FLAGS="-Xpreprocessor -fopenmp -I${LIBOMP_AMD64}" -DOpenMP_CXX_LIB_NAMES=omp -DOpenMP_omp_LIBRARY=${LIBOMP_AMD64}/libomp.a "$REPO"
50make -j${CPUS}
51
52if [ "$(echo $(otool -L "src/${BINARY_NAME}" | wc -l))" != 5 ]; then
53    echo "Too many linked libraries found in ${BINARY_NAME} binary. Build is not static!"
54    exit 1
55fi
56
57export MACOSX_DEPLOYMENT_TARGET=11.0
58
59mkdir -p "$BUILD/build_libomp/openmp-11.0.0.src/build-arm64" && cd "$BUILD/build_libomp/openmp-11.0.0.src/build-arm64"
60cmake -DLIBOMP_ENABLE_SHARED=OFF -DLIBOMP_INSTALL_ALIASES=OFF -DLIBOMP_ARCH=aarch64 -DCMAKE_CXX_FLAGS="-arch arm64" -DLIBOMP_ASMFLAGS="-arch arm64" ..
61make -j${CPUS}
62export LIBOMP_AARCH64="$BUILD/build_libomp/openmp-11.0.0.src/build-arm64/runtime/src"
63
64mkdir -p "$BUILD/build_arm64" && cd "$BUILD/build_arm64"
65cmake -DCMAKE_BUILD_TYPE=Release -DHAVE_TESTS=0 -DHAVE_MPI=0 -DHAVE_ARM8=1 -DCMAKE_C_FLAGS="-arch arm64" -DCMAKE_CXX_FLAGS="-arch arm64" -DBUILD_SHARED_LIBS=OFF -DCMAKE_FIND_LIBRARY_SUFFIXES=".a" -DOpenMP_C_FLAGS="-Xpreprocessor -fopenmp -I${LIBOMP_AARCH64}" -DOpenMP_C_LIB_NAMES=omp -DOpenMP_CXX_FLAGS="-Xpreprocessor -fopenmp -I${LIBOMP_AARCH64}" -DOpenMP_CXX_LIB_NAMES=omp -DOpenMP_omp_LIBRARY=${LIBOMP_AARCH64}/libomp.a "$REPO"
66make -j${CPUS}
67if [ "$(echo $(otool -L "src/${BINARY_NAME}" | wc -l))" != 5 ]; then
68    echo "Too many linked libraries found in ${BINARY_NAME} binary. Build is not static!"
69    exit 1
70fi
71
72lipo -create -arch x86_64 "$BUILD/build_sse41/src/${BINARY_NAME}" -arch x86_64h "$BUILD/build_avx2/src/${BINARY_NAME}" -arch arm64 "$BUILD/build_arm64/src/${BINARY_NAME}" -output "$BUILD/${BINARY_NAME}"
73