Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Switch to universal binary and Qt6 #5

Open
wants to merge 14 commits into
base: master
Choose a base branch
from
4 changes: 2 additions & 2 deletions MRView.app/Contents/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
<key>CFBundlePackageType</key> <string>APPL</string>
<key>CFBundleShortVersionString</key> <string>3.0</string>
<key>CFBundleVersion</key> <string>3.0</string>
<key>NSHumanReadableCopyright</key> <string>Copyright (c) 2008-2020 the MRtrix3 contributors</string>
<key>LSMinimumSystemVersion</key> <string>10.13.0</string>
<key>NSHumanReadableCopyright</key> <string>Copyright (c) 2008-2023 the MRtrix3 contributors</string>
<key>LSMinimumSystemVersion</key> <string>10.14.0</string>
<key>LSBackgroundOnly</key> <string>0</string>
<key>NSHighResolutionCapable</key> <true/>

Expand Down
4 changes: 2 additions & 2 deletions SHView.app/Contents/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
<key>CFBundlePackageType</key> <string>APPL</string>
<key>CFBundleShortVersionString</key> <string>3.0</string>
<key>CFBundleVersion</key> <string>3.0</string>
<key>NSHumanReadableCopyright</key> <string>Copyright (c) 2008-2020 the MRtrix3 contributors</string>
<key>LSMinimumSystemVersion</key> <string>10.13.0</string>
<key>NSHumanReadableCopyright</key> <string>Copyright (c) 2008-2023 the MRtrix3 contributors</string>
<key>LSMinimumSystemVersion</key> <string>10.14.0</string>
<key>LSBackgroundOnly</key> <string>0</string>
<key>NSHighResolutionCapable</key> <true/>
</dict>
Expand Down
240 changes: 126 additions & 114 deletions build
Original file line number Diff line number Diff line change
Expand Up @@ -2,38 +2,75 @@

TAGNAME="$1"

PATH=/bin:/sbin:/usr/bin:/usr/sbin
PATH=$(getconf PATH)
export PATH
MACOSX_DEPLOYMENT_TARGET=10.13
export MACOSX_DEPLOYMENT_TARGET

EIGEN_VERSION=3.4.0
FFTW_VERSION=3.3.10
QT_VERSION=6.6.0

if [ "$(uname)" = "Linux" ]; then
OS=linux
fi
if [ "$(uname)" = "Darwin" ]; then
OS=macos
fi


ARCHS="x86_64"
THREADS=$(getconf _NPROCESSORS_ONLN)
if [ "${OS}" = "macos" ]; then
ARCHS="x86_64 arm64"
MACOS_ARCHS="-arch x86_64 -arch arm64"
MACOSX_DEPLOYMENT_TARGET=10.15
export MACOSX_DEPLOYMENT_TARGET
MACOSX_VERSION_MIN="-mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}"
fi

PLD=$(pwd)
THREADS=$(sysctl -n hw.ncpu)
PREFIX=${PLD}/mrtrix3
if [ -f "${PREFIX}-build-deps.tar.gz" ]; then
if [ -f "${PREFIX}-${OS}-build-deps.tar.gz" ]; then
DEPCACHE=1
echo "Reusing previously built dependencies"
tar xfz ${PREFIX}-build-deps.tar.gz
tar xfz ${PREFIX}-${OS}-build-deps.tar.gz
else
# Grab latest versions from git
EIGEN_VERSION=3.4.0
echo "Using eigen ${EIGEN_VERSION}"

TIFF_VERSION=$(git ls-remote --tags https://gitlab.com/libtiff/libtiff.git | awk '{print $2}' | grep -v '\^{}$' | grep -v alpha | grep -v beta | grep -v rc | grep v.* | sort -V | tail -1)
TIFF_VERSION=${TIFF_VERSION#*/*/v}
echo "Using tiff ${TIFF_VERSION}"

PNG_VERSION=$(git ls-remote --tags https://github.com/glennrp/libpng.git | awk '{print $2}' | grep -v '\^{}$' | grep -v alpha | grep -v beta | grep -v rc | grep v.* | sort -V | tail -1)
PNG_VERSION=${PNG_VERSION#*/*/v}
echo "Using png ${PNG_VERSION}"

FFTW_VERSION=$(git ls-remote --tags https://github.com/FFTW/fftw3.git | awk '{print $2}' | grep -v '\^{}$' | grep -v alpha | grep -v beta | grep -v rc | grep 'fftw-3' | sort -V | tail -1)
FFTW_VERSION=${FFTW_VERSION#*/*/fftw-}
echo "Using fftw ${FFTW_VERSION}"

QT_VERSION=$(git ls-remote --tags https://code.qt.io/qt/qt5.git | awk '{print $2}' | grep -v '\^{}$' | grep -v alpha | grep -v beta | grep -v rc | grep -v '-' | grep '5.' | sort -V | tail -1)
QT_VERSION=${QT_VERSION#*/*/v}
echo "Using eigen ${EIGEN_VERSION}"
echo "Using qt ${QT_VERSION}"

# FFTW
SECONDS=0
DNAME=fftw-${FFTW_VERSION}
FNAME=${DNAME}.tar.gz
curl -s -O http://www.fftw.org/${FNAME}
for ARCH in ${ARCHS}; do
echo "building FFTW for ${ARCH}"
SIMD=""
if [ "${ARCH}" = "x86_64" ]; then
SIMD="--enable-sse2 --enable-avx --enable-avx2"
fi
if [ "${OS}" = "macos" ]; then
MACOS_ARCH="-arch ${ARCH}"
fi
tar xf ${FNAME}
mv ${DNAME} ${DNAME}-${ARCH}
cd ${DNAME}-${ARCH}
CFLAGS="${MACOS_ARCH} ${MACOSX_VERSION_MIN}" ./configure -q -prefix ${PREFIX}-${ARCH} --disable-doc --disable-fortran --disable-debug --disable-threads --disable-dependency-tracking ${SIMD}
make install > /dev/null
cd ..
rm -r ${DNAME}-${ARCH}
done
mkdir -p ${PREFIX}/{include,lib}
cp ${PREFIX}-x86_64/include/fftw3.h ${PREFIX}/include/fftw3.h
if [ "${OS}" = "macos" ]; then
libtool -static ${PREFIX}-*/lib/libfftw3.a -o ${PREFIX}/lib/libfftw3.a
else
cp -a ${PREFIX}-x86_64/lib/libfftw3.a ${PREFIX}/lib/libfftw3.a
fi
rm -r ${PREFIX}-*/
rm ${FNAME}
FFTW_SECONDS=${SECONDS}

# EIGEN
SECONDS=0
DNAME=eigen-${EIGEN_VERSION}
Expand All @@ -46,88 +83,51 @@ else
rm -r ${FNAME} ${DNAME}
EIGEN_SECONDS=${SECONDS}

# TIFF
SECONDS=0
DNAME=tiff-${TIFF_VERSION}
FNAME=${DNAME}.tar.gz
curl -s -O -L http://download.osgeo.org/libtiff/${FNAME}
tar xf ${FNAME}
cd ${DNAME}
./configure -q -prefix ${PREFIX} --enable-shared=NO --without-x --disable-jpeg --disable-old-jpeg --disable-lzma --disable-zstd --disable-webp
make install > /dev/null
cd ..
rm -r ${FNAME} ${DNAME}
TIFF_SECONDS=${SECONDS}

# PNG
SECONDS=0
DNAME=libpng-${PNG_VERSION}
FNAME=${DNAME}.tar.xz
curl -s -O -L https://ftp.osuosl.org/pub/blfs/conglomeration/libpng/${FNAME}
tar xf ${FNAME}
cd ${DNAME}
./configure -q -prefix ${PREFIX} --enable-shared=NO
make install > /dev/null
cd ..
rm -r ${FNAME} ${DNAME}
PNG_SECONDS=${SECONDS}

# FFTW
SECONDS=0
DNAME=fftw-${FFTW_VERSION}
FNAME=${DNAME}.tar.gz
curl -s -O http://www.fftw.org/${FNAME}
tar xf ${FNAME}
cd ${DNAME}
if [ "$(arch)" != "arm64" ]; then
./configure -q -prefix ${PREFIX} --disable-doc --disable-fortran --disable-debug --enable-threads --disable-dependency-tracking --enable-sse2 --enable-avx --enable-avx2
else
./configure -q -prefix ${PREFIX} --disable-doc --disable-fortran --disable-debug --enable-threads --disable-dependency-tracking
# 7Z
if [ "${OS}" = "linux" ]; then
FNAME=7z2301-linux-x64.tar.xz
fi
make install > /dev/null
cd ..
rm -r ${FNAME} ${DNAME}
FFTW_SECONDS=${SECONDS}

# QT5 BASE
SECONDS=0
DNAME=qtbase-everywhere-src-${QT_VERSION}
FNAME=${DNAME}.tar.xz
curl -s -O http://ftp1.nluug.nl/languages/qt/archive/qt/${QT_VERSION%.*}/${QT_VERSION}/submodules/${FNAME}
tar xf ${FNAME}
cd ${DNAME}
curl -s -O https://raw.githubusercontent.com/wrobelda/vcpkg/99582d154236b0e7af70cadef8420c4f25829f61/ports/qt5-base/patches/cocoa.patch
patch -p1 < cocoa.patch
./configure -opensource -confirm-license -release -no-dbus -no-openssl -no-harfbuzz -no-freetype -no-cups -no-framework -nomake examples -prefix ${PREFIX}
make -j ${THREADS} > /dev/null
make install > /dev/null
cd ..
rm -r ${FNAME} ${DNAME}
QTBASE_SECONDS=${SECONDS}
if [ "${OS}" = "macos" ]; then
FNAME=7z2301-mac.tar.xz
fi
curl -s -O https://www.7-zip.org/a/${FNAME}
tar xf ${FNAME} 7zz
mkdir -p ${PREFIX}/bin
mv 7zz ${PREFIX}/bin/
rm ${FNAME}

# QT5 SVG
# QT6
SECONDS=0
DNAME=qtsvg-everywhere-src-${QT_VERSION}
FNAME=${DNAME}.tar.xz
curl -s -O http://ftp1.nluug.nl/languages/qt/archive/qt/${QT_VERSION%.*}/${QT_VERSION}/submodules/${FNAME}
tar xf ${FNAME}
cd ${DNAME}
${PREFIX}/bin/qmake
make -j ${THREADS} > /dev/null
make install > /dev/null
cd ..
rm -r ${FNAME} ${DNAME}
QTSVG_SECONDS=${SECONDS}
QT_MIRROR=https://ftp1.nluug.nl/languages/qt

tar cpfz ${PREFIX}-build-deps.tar.gz mrtrix3
if [ "${OS}" = "linux" ]; then
QT_URL=${QT_MIRROR}/online/qtsdkrepository/linux_x64/desktop/qt6_${QT_VERSION//./}/qt.qt6.${QT_VERSION//./}.gcc_64/
QT_COMPONENTS="qtbase qtsvg icu wayland"
fi
if [ "${OS}" = "macos" ]; then
QT_URL=${QT_MIRROR}/online/qtsdkrepository/mac_x64/desktop/qt6_${QT_VERSION//./}/qt.qt6.${QT_VERSION//./}.clang_64/
QT_COMPONENTS="qtbase qtsvg"
fi
for QT_COMPONENT in ${QT_COMPONENTS}; do
FNAME=$(curl -s -L ${QT_URL} | grep -o -E "[[:alnum:]_.\-]*7z" | grep ${QT_COMPONENT} | tail -1)
curl -s -O ${QT_URL}/${FNAME}
${PREFIX}/bin/7zz x ${FNAME} > /dev/null
rm ${FNAME}
done
ls ${QT_VERSION}
cp -a ${QT_VERSION}/*/* ${PREFIX}/
rm -r ${QT_VERSION}
QT_SECONDS=${SECONDS}

tar cpfz ${PREFIX}-${OS}-build-deps.tar.gz mrtrix3
fi

# MRTRIX3
SECONDS=0
git clone https://github.com/MRtrix3/mrtrix3.git mrtrix3-src -b ${TAGNAME}
cd ${PREFIX}-src
MRTRIX_VERSION=$(git describe --abbrev=8 | tr '-' '_')
CFLAGS="-I${PREFIX}/include" LINKFLAGS="-L${PREFIX}/lib" TIFF_LINKFLAGS="-ltiff" PATH=${PREFIX}/bin:${PATH} ./configure
CFLAGS="${MACOS_ARCHS} ${MACOSX_VERSION_MIN} -I${PREFIX}/include" LINKFLAGS="${MACOS_ARCHS} ${MACOSX_VERSION_MIN} -L${PREFIX}/lib" PNG_CFLAGS="-I${PREFIX}/include/QtPng" PNG_LINKFLAGS="-lQt6BundledLibpng" PATH=${PREFIX}/libexec:${PREFIX}/bin:${PATH} CXXSTD=c++17 ./configure
NUMBER_OF_PROCESSORS=${THREADS} ./build
cd ..
MRTRIX_SECONDS=${SECONDS}
Expand All @@ -140,35 +140,47 @@ cp -R ${PREFIX}-src/lib ${PREFIX}
cp -R ${PREFIX}-src/share ${PREFIX}
cp -R ${PREFIX}-src/matlab ${PREFIX}
rm -rf ${PREFIX}-src
cp -a ${PREFIX}_dep/lib/libQt5{Core,Gui,OpenGL,PrintSupport,Network,Svg,Widgets}.*.dylib ${PREFIX}/lib
mkdir -p ${PREFIX}/bin/plugins/{platforms,imageformats,styles}
cp -a ${PREFIX}_dep/plugins/platforms/libqcocoa.dylib ${PREFIX}/bin/plugins/platforms
cp -a ${PREFIX}_dep/plugins/imageformats/libqsvg.dylib ${PREFIX}/bin/plugins/imageformats
cp -a ${PREFIX}_dep/plugins/styles/libqmacstyle.dylib ${PREFIX}/bin/plugins/styles

if [ "${OS}" = "linux" ]; then
cp -a ${PREFIX}_dep/lib/libicu* ${PREFIX}/lib
cp -a ${PREFIX}_dep/lib/libQt6{Core,DBus,Gui,Network,OpenGL,Svg,Wayland,Widgets,XcbQpa}* ${PREFIX}/lib
mkdir -p ${PREFIX}/plugins
cp -a ${PREFIX}_dep/plugins/{imageformats,platforms,wayland-decoration-client,wayland-graphics-integration-client,wayland-shell-integration,xcbglintegrations} ${PREFIX}/plugins
fi
if [ "${OS}" = "macos" ]; then
cp -a ${PREFIX}_dep/lib/Qt{Core,Gui,OpenGL,PrintSupport,Network,Svg,Widgets,OpenGLWidgets,DBus}.framework ${PREFIX}/lib
find ${PREFIX}/lib -name Headers -print0 | xargs -0 rm -rf
find ${PREFIX}/lib -name Current -print0 | xargs -0 rm -rf
rm -r ${PREFIX}/lib/*.framework/Qt*
rm -r ${PREFIX}/lib/*.framework/Resources
mkdir -p ${PREFIX}/bin/plugins/{platforms,imageformats,styles}
cp -a ${PREFIX}_dep/plugins/platforms/libqcocoa.dylib ${PREFIX}/bin/plugins/platforms
cp -a ${PREFIX}_dep/plugins/imageformats/libqsvg.dylib ${PREFIX}/bin/plugins/imageformats
cp -a ${PREFIX}_dep/plugins/styles/libqmacstyle.dylib ${PREFIX}/bin/plugins/styles
fi
rm -rf ${PREFIX}_dep

cp -R ${PLD}/MRView.app ${PREFIX}/bin
mkdir -p ${PREFIX}/bin/MRView.app/Contents/MacOS/
mv ${PREFIX}/bin/mrview ${PREFIX}/bin/MRView.app/Contents/MacOS/
cp ${PLD}/mrview ${PREFIX}/bin
if [ "${OS}" = "macos" ]; then
cp -R ${PLD}/MRView.app ${PREFIX}/bin
mkdir -p ${PREFIX}/bin/MRView.app/Contents/MacOS/
mv ${PREFIX}/bin/mrview ${PREFIX}/bin/MRView.app/Contents/MacOS/
cp ${PLD}/mrview ${PREFIX}/bin

cp -R ${PLD}/SHView.app ${PREFIX}/bin
mkdir -p ${PREFIX}/bin/SHView.app/Contents/MacOS/
mv ${PREFIX}/bin/shview ${PREFIX}/bin/SHView.app/Contents/MacOS/
cp ${PLD}/shview ${PREFIX}/bin
cp -R ${PLD}/SHView.app ${PREFIX}/bin
mkdir -p ${PREFIX}/bin/SHView.app/Contents/MacOS/
mv ${PREFIX}/bin/shview ${PREFIX}/bin/SHView.app/Contents/MacOS/
cp ${PLD}/shview ${PREFIX}/bin
fi

cd ${PREFIX}/..
tar cfz mrtrix3-macos-${TAGNAME}.tar.gz mrtrix3
tar cfz mrtrix3-${OS}-${TAGNAME}.tar.gz mrtrix3
rm -rf ${PREFIX}

TOTAL_SECONDS=$((EIGEN_SECONDS + TIFF_SECONDS + PNG_SECONDS + FFTW_SECONDS + QTBASE_SECONDS + QTSVG_SECONDS + MRTRIX_SECONDS))
TOTAL_SECONDS=$((FFTW_SECONDS + EIGEN_SECONDS + QT_SECONDS + MRTRIX_SECONDS))
if [[ ! -n "$DEPCACHE" ]]; then
echo "eigen ${EIGEN_VERSION}: ${EIGEN_SECONDS} s"
echo "tiff ${TIFF_VERSION}: ${TIFF_SECONDS} s"
echo "png ${PNG_VERSION}: ${PNG_SECONDS} s"
echo "fftw ${FFTW_VERSION}: ${FFTW_SECONDS} s"
echo "qtbase ${QT_VERSION}: ${QTBASE_SECONDS} s"
echo "qtsvg ${QT_VERSION}: ${QTSVG_SECONDS} s"
echo "eigen ${EIGEN_VERSION}: ${EIGEN_SECONDS} s"
echo "qt ${QT_VERSION}: ${QT_SECONDS} s"
fi
echo "mrtrix ${MRTRIX_VERSION}: ${MRTRIX_SECONDS} s"
echo "total : ${TOTAL_SECONDS} s"