From c26982be3e31c99a6125b0f10e49e91038494322 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sun, 18 Feb 2024 20:48:05 +0300 Subject: [PATCH] Added support for AVIF, HEIF and JPEG XL on macOS. --- .github/workflows/mac.yml | 2 +- Telegram/build/prepare/prepare.py | 234 +++++++++++++++++++++--------- docs/building-mac.md | 2 +- 3 files changed, 169 insertions(+), 69 deletions(-) diff --git a/.github/workflows/mac.yml b/.github/workflows/mac.yml index 8e99d7162..68bab389c 100644 --- a/.github/workflows/mac.yml +++ b/.github/workflows/mac.yml @@ -64,7 +64,7 @@ jobs: - name: First set up. run: | sudo chown -R `whoami`:admin /usr/local/share - brew install automake ninja pkg-config + brew install automake ninja pkg-config nasm meson # Disable spotlight. sudo mdutil -a -i off diff --git a/Telegram/build/prepare/prepare.py b/Telegram/build/prepare/prepare.py index fceedf2b5..30d5084f4 100644 --- a/Telegram/build/prepare/prepare.py +++ b/Telegram/build/prepare/prepare.py @@ -202,6 +202,11 @@ def removeDir(folder): return 'if exist ' + folder + ' rmdir /Q /S ' + folder + '\nif exist ' + folder + ' exit /b 1' return 'rm -rf ' + folder +def setVar(key, value): + if win: + return 'SET ' + key + '="' + value + '"'; + return key + '="' + value + '"'; + def filterByPlatform(commands): commands = commands.split('\n') result = '' @@ -690,10 +695,9 @@ mac: """) stage('dav1d', """ -win: git clone -b 1.2.1 --depth 1 https://code.videolan.org/videolan/dav1d.git cd dav1d - +win: if "%X8664%" equ "x64" ( SET "TARGET=x86_64" ) else ( @@ -709,7 +713,7 @@ win: echo system = 'windows' >> %FILE% echo cpu_family = '%TARGET%' >> %FILE% echo cpu = '%TARGET%' >> %FILE% - echo endian = 'little'>> %FILE% + echo endian = 'little' >> %FILE% depends:python/Scripts/activate.bat %THIRDPARTY_DIR%\\python\\Scripts\\activate.bat @@ -723,12 +727,55 @@ release: win: copy %LIBS_DIR%\\local\\lib\\libdav1d.a %LIBS_DIR%\\local\\lib\\dav1d.lib deactivate +mac: + buildOneArch() { + arch=$1 + folder=`pwd`/$2 + + TARGET="\'${arch}\'" + MIN="\'${MIN_VER}\'" + FILE=cross-file.txt + echo "[binaries]" > $FILE + echo "c = ['clang', '-arch', ${TARGET}]" >> $FILE + echo "cpp = ['clang++', '-arch', ${TARGET}]" >> $FILE + echo "ar = 'ar'" >> $FILE + echo "strip = 'strip'" >> $FILE + echo "[built-in options]" >> $FILE + echo "c_args = [${MIN}]" >> $FILE + echo "cpp_args = [${MIN}]" >> $FILE + echo "c_link_args = [${MIN}]" >> $FILE + echo "cpp_link_args = [${MIN}]" >> $FILE + echo "[host_machine]" >> $FILE + echo "system = 'darwin'" >> $FILE + echo "subsystem = 'macos'" >> $FILE + echo "cpu_family = ${TARGET}" >> $FILE + echo "cpu = ${TARGET}" >> $FILE + echo "endian = 'little'" >> $FILE + + meson setup \\ + --cross-file $FILE \\ + --prefix ${USED_PREFIX} \\ + --default-library=static \\ + --buildtype=minsize \\ + -Denable_tools=false \\ + -Denable_tests=false \\ + ${folder} + meson compile -C ${folder} + meson install -C ${folder} + + mv ${USED_PREFIX}/lib/libdav1d.a ${folder}/libdav1d.a + } + + buildOneArch arm64 build.arm64 + buildOneArch x86_64 build + + lipo -create build.arm64/libdav1d.a build/libdav1d.a -output ${USED_PREFIX}/lib/libdav1d.a """) stage('libavif', """ -win: git clone -b v0.11.1 --depth 1 https://github.com/AOMediaCodec/libavif.git cd libavif +win: cmake . ^ -A %WIN32X64% ^ -DCMAKE_INSTALL_PREFIX=%LIBS_DIR%/local ^ @@ -743,12 +790,22 @@ win: release: cmake --build . --config Release cmake --install . --config Release +mac: + cmake . \\ + -D CMAKE_OSX_ARCHITECTURES="x86_64;arm64" \\ + -D CMAKE_OSX_DEPLOYMENT_TARGET:STRING=$MACOSX_DEPLOYMENT_TARGET \\ + -D CMAKE_INSTALL_PREFIX:STRING=$USED_PREFIX \\ + -D BUILD_SHARED_LIBS=OFF \\ + -D AVIF_ENABLE_WERROR=OFF \\ + -D AVIF_CODEC_DAV1D=ON + cmake --build . --config MinSizeRel $MAKE_THREADS_CNT + cmake --install . --config MinSizeRel """) stage('libde265', """ -win: git clone --depth 1 -b v1.0.12 https://github.com/strukturag/libde265.git cd libde265 +win: cmake . ^ -A %WIN32X64% ^ -DCMAKE_INSTALL_PREFIX=%LIBS_DIR%/local ^ @@ -768,12 +825,63 @@ win: release: cmake --build . --config Release cmake --install . --config Release +mac: + cmake . \\ + -D CMAKE_OSX_ARCHITECTURES="x86_64;arm64" \\ + -D CMAKE_OSX_DEPLOYMENT_TARGET:STRING=$MACOSX_DEPLOYMENT_TARGET \\ + -D CMAKE_INSTALL_PREFIX:STRING=$USED_PREFIX \\ + -D DISABLE_SSE=ON \\ + -D BUILD_SHARED_LIBS=OFF \\ + -D ENABLE_DECODER=ON \\ + -D ENABLE_ENCODER=OFF + cmake --build . --config MinSizeRel $MAKE_THREADS_CNT + cmake --install . --config MinSizeRel +""") + +stage('libwebp', """ + git clone -b v1.3.2 https://github.com/webmproject/libwebp.git + cd libwebp +win: + nmake /f Makefile.vc CFG=debug-static OBJDIR=out RTLIBCFG=static all + nmake /f Makefile.vc CFG=release-static OBJDIR=out RTLIBCFG=static all + copy out\\release-static\\$X8664\\lib\\libwebp.lib out\\release-static\\$X8664\\lib\\webp.lib + copy out\\release-static\\$X8664\\lib\\libwebpdemux.lib out\\release-static\\$X8664\\lib\\webpdemux.lib + copy out\\release-static\\$X8664\\lib\\libwebpmux.lib out\\release-static\\$X8664\\lib\\webpmux.lib +mac: + buildOneArch() { + arch=$1 + folder=$2 + + CFLAGS=$UNGUARDED cmake -B $folder -G Ninja . \\ + -D CMAKE_BUILD_TYPE=Release \\ + -D CMAKE_INSTALL_PREFIX=$USED_PREFIX \\ + -D CMAKE_OSX_DEPLOYMENT_TARGET:STRING=$MACOSX_DEPLOYMENT_TARGET \\ + -D CMAKE_OSX_ARCHITECTURES=$arch \\ + -D WEBP_BUILD_ANIM_UTILS=OFF \\ + -D WEBP_BUILD_CWEBP=OFF \\ + -D WEBP_BUILD_DWEBP=OFF \\ + -D WEBP_BUILD_GIF2WEBP=OFF \\ + -D WEBP_BUILD_IMG2WEBP=OFF \\ + -D WEBP_BUILD_VWEBP=OFF \\ + -D WEBP_BUILD_WEBPMUX=OFF \\ + -D WEBP_BUILD_WEBPINFO=OFF \\ + -D WEBP_BUILD_EXTRAS=OFF + cmake --build $folder $MAKE_THREADS_CNT + } + buildOneArch arm64 build.arm64 + buildOneArch x86_64 build + + lipo -create build.arm64/libsharpyuv.a build/libsharpyuv.a -output build/libsharpyuv.a + lipo -create build.arm64/libwebp.a build/libwebp.a -output build/libwebp.a + lipo -create build.arm64/libwebpdemux.a build/libwebpdemux.a -output build/libwebpdemux.a + lipo -create build.arm64/libwebpmux.a build/libwebpmux.a -output build/libwebpmux.a + cmake --install build """) stage('libheif', """ -win: git clone --depth 1 -b v1.16.2 https://github.com/strukturag/libheif.git cd libheif +win: %THIRDPARTY_DIR%\\msys64\\usr\\bin\\sed.exe -i 's/LIBHEIF_EXPORTS/LIBDE265_STATIC_BUILD/g' libheif/CMakeLists.txt %THIRDPARTY_DIR%\\msys64\\usr\\bin\\sed.exe -i 's/HAVE_VISIBILITY/LIBHEIF_STATIC_BUILD/g' libheif/CMakeLists.txt cmake . ^ @@ -797,12 +905,55 @@ win: release: cmake --build . --config Release cmake --install . --config Release +mac: + cmake . \\ + -D CMAKE_OSX_ARCHITECTURES="x86_64;arm64" \\ + -D CMAKE_OSX_DEPLOYMENT_TARGET:STRING=$MACOSX_DEPLOYMENT_TARGET \\ + -D CMAKE_INSTALL_PREFIX:STRING=$USED_PREFIX \\ + -D BUILD_SHARED_LIBS=OFF \\ + -D ENABLE_PLUGIN_LOADING=OFF \\ + -D WITH_AOM_ENCODER=OFF \\ + -D WITH_AOM_DECODER=OFF \\ + -D WITH_X265=OFF \\ + -D WITH_SvtEnc=OFF \\ + -D WITH_RAV1E=OFF \\ + -D WITH_DAV1D=ON \\ + -D WITH_LIBDE265=ON \\ + -D LIBDE265_INCLUDE_DIR=$USED_PREFIX/include/ \\ + -D LIBDE265_LIBRARY=$USED_PREFIX/lib/libde265.a \\ + -D LIBSHARPYUV_INCLUDE_DIR=$USED_PREFIX/include/webp/ \\ + -D LIBSHARPYUV_LIBRARY=$USED_PREFIX/lib/libsharpyuv.a \\ + -D WITH_EXAMPLES=OFF + cmake --build . --config MinSizeRel $MAKE_THREADS_CNT + cmake --install . --config MinSizeRel """) stage('libjxl', """ -win: git clone -b v0.8.2 --depth 1 --recursive --shallow-submodules https://github.com/libjxl/libjxl.git cd libjxl +""" + setVar("cmake_defines", ' '.join(""" + -DBUILD_SHARED_LIBS=OFF + -DBUILD_TESTING=OFF + -DJPEGXL_ENABLE_FUZZERS=OFF + -DJPEGXL_ENABLE_DEVTOOLS=OFF + -DJPEGXL_ENABLE_TOOLS=OFF + -DJPEGXL_ENABLE_DOXYGEN=OFF + -DJPEGXL_ENABLE_MANPAGES=OFF + -DJPEGXL_ENABLE_EXAMPLES=OFF + -DJPEGXL_ENABLE_JNI=OFF + -DJPEGXL_ENABLE_JPEGLI_LIBJPEG=OFF + -DJPEGXL_ENABLE_SJPEG=OFF + -DJPEGXL_ENABLE_OPENEXR=OFF + -DJPEGXL_ENABLE_SKCMS=ON + -DJPEGXL_BUNDLE_SKCMS=ON + -DJPEGXL_ENABLE_VIEWERS=OFF + -DJPEGXL_ENABLE_TCMALLOC=OFF + -DJPEGXL_ENABLE_PLUGINS=OFF + -DJPEGXL_ENABLE_COVERAGE=OFF + -DJPEGXL_ENABLE_PROFILER=OFF + -DJPEGXL_WARNINGS_AS_ERRORS=OFF +""".replace('\n', '').split())) + """ +win: cmake . ^ -A %WIN32X64% ^ -DCMAKE_INSTALL_PREFIX=%LIBS_DIR%/local ^ @@ -813,31 +964,20 @@ win: -DCMAKE_CXX_FLAGS_DEBUG="/MTd /Zi /Ob0 /Od /RTC1" ^ -DCMAKE_C_FLAGS_RELEASE="/MT /O2 /Ob2 /DNDEBUG" ^ -DCMAKE_CXX_FLAGS_RELEASE="/MT /O2 /Ob2 /DNDEBUG" ^ - -DBUILD_SHARED_LIBS=OFF ^ - -DBUILD_TESTING=OFF ^ - -DJPEGXL_ENABLE_FUZZERS=OFF ^ - -DJPEGXL_ENABLE_DEVTOOLS=OFF ^ - -DJPEGXL_ENABLE_TOOLS=OFF ^ - -DJPEGXL_ENABLE_DOXYGEN=OFF ^ - -DJPEGXL_ENABLE_MANPAGES=OFF ^ - -DJPEGXL_ENABLE_EXAMPLES=OFF ^ - -DJPEGXL_ENABLE_JNI=OFF ^ - -DJPEGXL_ENABLE_JPEGLI_LIBJPEG=OFF ^ - -DJPEGXL_ENABLE_SJPEG=OFF ^ - -DJPEGXL_ENABLE_OPENEXR=OFF ^ - -DJPEGXL_ENABLE_SKCMS=ON ^ - -DJPEGXL_BUNDLE_SKCMS=ON ^ - -DJPEGXL_ENABLE_VIEWERS=OFF ^ - -DJPEGXL_ENABLE_TCMALLOC=OFF ^ - -DJPEGXL_ENABLE_PLUGINS=OFF ^ - -DJPEGXL_ENABLE_COVERAGE=OFF ^ - -DJPEGXL_ENABLE_PROFILER=OFF ^ - -DJPEGXL_WARNINGS_AS_ERRORS=OFF + %cmake_defines% cmake --build . --config Debug cmake --install . --config Debug release: cmake --build . --config Release cmake --install . --config Release +mac: + cmake . \\ + -D CMAKE_OSX_ARCHITECTURES="x86_64;arm64" \\ + -D CMAKE_OSX_DEPLOYMENT_TARGET:STRING=$MACOSX_DEPLOYMENT_TARGET \\ + -D CMAKE_INSTALL_PREFIX:STRING=$USED_PREFIX \\ + ${cmake_defines} + cmake --build . --config MinSizeRel $MAKE_THREADS_CNT + cmake --install . --config MinSizeRel """) stage('libvpx', """ @@ -906,46 +1046,6 @@ depends:yasm/yasm make install """) -stage('libwebp', """ - git clone -b v1.3.2 https://github.com/webmproject/libwebp.git - cd libwebp -win: - nmake /f Makefile.vc CFG=debug-static OBJDIR=out RTLIBCFG=static all - nmake /f Makefile.vc CFG=release-static OBJDIR=out RTLIBCFG=static all - copy out\\release-static\\$X8664\\lib\\libwebp.lib out\\release-static\\$X8664\\lib\\webp.lib - copy out\\release-static\\$X8664\\lib\\libwebpdemux.lib out\\release-static\\$X8664\\lib\\webpdemux.lib - copy out\\release-static\\$X8664\\lib\\libwebpmux.lib out\\release-static\\$X8664\\lib\\webpmux.lib -mac: - buildOneArch() { - arch=$1 - folder=$2 - - CFLAGS=$UNGUARDED cmake -B $folder -G Ninja . \\ - -D CMAKE_BUILD_TYPE=Release \\ - -D CMAKE_INSTALL_PREFIX=$USED_PREFIX \\ - -D CMAKE_OSX_DEPLOYMENT_TARGET:STRING=$MACOSX_DEPLOYMENT_TARGET \\ - -D CMAKE_OSX_ARCHITECTURES=$arch \\ - -D WEBP_BUILD_ANIM_UTILS=OFF \\ - -D WEBP_BUILD_CWEBP=OFF \\ - -D WEBP_BUILD_DWEBP=OFF \\ - -D WEBP_BUILD_GIF2WEBP=OFF \\ - -D WEBP_BUILD_IMG2WEBP=OFF \\ - -D WEBP_BUILD_VWEBP=OFF \\ - -D WEBP_BUILD_WEBPMUX=OFF \\ - -D WEBP_BUILD_WEBPINFO=OFF \\ - -D WEBP_BUILD_EXTRAS=OFF - cmake --build $folder $MAKE_THREADS_CNT - } - buildOneArch arm64 build.arm64 - buildOneArch x86_64 build - - lipo -create build.arm64/libsharpyuv.a build/libsharpyuv.a -output build/libsharpyuv.a - lipo -create build.arm64/libwebp.a build/libwebp.a -output build/libwebp.a - lipo -create build.arm64/libwebpdemux.a build/libwebpdemux.a -output build/libwebpdemux.a - lipo -create build.arm64/libwebpmux.a build/libwebpmux.a -output build/libwebpmux.a - cmake --install build -""") - stage('nv-codec-headers', """ win: git clone https://github.com/FFmpeg/nv-codec-headers.git diff --git a/docs/building-mac.md b/docs/building-mac.md index d357c66c1..11435a8dd 100644 --- a/docs/building-mac.md +++ b/docs/building-mac.md @@ -13,7 +13,7 @@ You will require **api_id** and **api_hash** to access the Telegram API servers. Go to ***BuildPath*** and run ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" - brew install git automake cmake wget pkg-config gnu-tar ninja + brew install git automake cmake wget pkg-config gnu-tar ninja nasm meson sudo xcode-select -s /Applications/Xcode.app/Contents/Developer