Skip to content

Instantly share code, notes, and snippets.

@eddiezato
Last active December 13, 2023 16:16
Show Gist options
  • Save eddiezato/2bd8d021d06281dc47b77d5e61a3994e to your computer and use it in GitHub Desktop.
Save eddiezato/2bd8d021d06281dc47b77d5e61a3994e to your computer and use it in GitHub Desktop.
Build qimgv in msys2/ucrt64
#!/bin/bash
while getopts 'csajpeoqd' flag ; do
case "${flag}" in
c) CLR=1 ;; # remove ucrt folder
s) DSRC=1 ;; # download source-code
a) BAVIF=1 ;; # build libavif
j) BJXL=1 ;; # build libjxl
p) BPLGS=1 ;; # build plugins
e) BEXIV=1 ;; # build exiv2
o) BOPCV=1 ;; # build opencv
q) BQMGV=1 ;; # build qimgv
d) DQMGV=1 ;; # deploy qimgv
esac
done
if [[ $OPTIND == 1 ]]; then
printf '\nOptions:\n'
printf ' -c remove ucrt folder\n'
printf ' -s download source-code\n'
printf ' -a build libavif\n'
printf ' -j build libjxl\n'
printf ' -p build plugins\n'
printf ' -e build exiv2\n'
printf ' -o build opencv\n'
printf ' -q build qimgv\n'
printf ' -d deploy qimgv\n'
exit
fi
if [[ $MSYSTEM != 'UCRT64' ]] ; then
printf '\e[1;31mNot UCRT64 environment\e[0m\n'
exit 1
fi
set -e
MGNT='\e[1;35m'
RST='\e[0m'
export CC=clang CXX=clang++
CFL='-fuse-ld=lld -flto=thin -ffunction-sections -fdata-sections -march=native -mtune=native -O3 -pipe'
LFL='-fuse-ld=lld -flto=thin -Wl,--gc-sections'
if [[ $CLR == 1 ]] ; then
printf "\n${MGNT}:: Remove ucrt folder ::${RST}\n"
rm -rf ucrt
fi
mkdir -p ucrt/install
EXTDIR=$(realpath ucrt/install)
cd ucrt
# download source-code
if [[ $DSRC == 1 ]] ; then
# download libavif
if [[ ! -d libavif ]]; then
printf "\n${MGNT}:: Download libavif ::${RST}\n"
git clone --depth 1 --branch v1.0.3 https://github.com/AOMediaCodec/libavif.git
cd libavif/ext
if [[ ! -d dav1d ]]; then
branch=($(grep -i "git clone" dav1d.cmd))
git clone -b ${branch[3]} --depth 1 https://code.videolan.org/videolan/dav1d.git
mkdir -p dav1d/build
fi
if [[ ! -d libyuv ]]; then
branch=($(grep -i "git checkout" libyuv.cmd))
git clone --single-branch https://chromium.googlesource.com/libyuv/libyuv
cd libyuv
git checkout ${branch[2]}
cd ..
fi
cd ..
sed -i 's|${AVIF_LIBRARY_PREFIX}yuv${AVIF_LIBRARY_SUFFIX}|libyuv.a|' CMakeLists.txt
cd ..
fi
# download libjxl
if [[ ! -d libjxl ]]; then
printf "\n${MGNT}:: Download libjxl ::${RST}\n"
git clone --branch v0.8.2 --depth 1 https://github.com/libjxl/libjxl.git
cd libjxl/third_party
if [[ -z "$(ls -A skcms)" ]]; then git clone --single-branch https://skia.googlesource.com/skcms; cd skcms; git checkout '568ad63'; cd ..; fi
if [[ -z "$(ls -A sjpeg)" ]]; then git clone --depth 1 https://github.com/webmproject/sjpeg.git; fi
cd ..
if [[ -z "$(ls -A testdata)" ]]; then git clone --depth 1 https://github.com/libjxl/testdata; fi
cd ..
fi
# download qavif
if [[ ! -d qt-avif-image-plugin ]]; then
printf "\n${MGNT}:: Download qavif ::${RST}\n"
git clone --depth 1 https://github.com/novomesk/qt-avif-image-plugin.git
cd qt-avif-image-plugin
sed -i 's|set(REQUIRED_QT_VERSION 5.14.0)|set(REQUIRED_QT_VERSION 6.5.1)|' CMakeLists.txt
sed -i 's|${QT_MAJOR_VERSION}|6|' CMakeLists.txt
sed -i 's|${QT_MAJOR_VERSION}|6|' src/CMakeLists.txt
cd ..
fi
# download qjpegxl
if [[ ! -d qt-jpegxl-image-plugin ]]; then
printf "\n${MGNT}:: Download qjpegxl ::${RST}\n"
git clone --depth 1 https://github.com/novomesk/qt-jpegxl-image-plugin.git
cd qt-jpegxl-image-plugin
sed -i 's|set(REQUIRED_QT_VERSION 5.14.0)|set(REQUIRED_QT_VERSION 6.5.1)|' CMakeLists.txt
sed -i 's|${QT_MAJOR_VERSION}|6|' CMakeLists.txt
sed -i 's|${QT_MAJOR_VERSION}|6|' src/CMakeLists.txt
cd ..
fi
# download exif
if [[ ! -d exiv2 ]]; then
printf "\n${MGNT}:: Download exiv2 ::${RST}\n"
git clone --branch '0.27-maintenance' --depth 1 https://github.com/Exiv2/exiv2.git
fi
# download opencv
if [[ ! -d opencv ]]; then
printf "\n${MGNT}:: Download opencv ::${RST}\n"
git clone --depth 1 --branch '4.8.1' https://github.com/opencv/opencv.git
fi
# download qimgv
if [[ ! -d qimgv ]]; then
printf "\n${MGNT}:: Download qimgv ::${RST}\n"
git clone https://github.com/easymodo/qimgv.git
cd qimgv
sed -i 's|opencv4/||' qimgv/3rdparty/QtOpenCV/cvmatandqimage.{h,cpp}
sed -i 's|^find_package(Qt5|find_package(Qt6|;s|^if(Qt5_FOUND)|if(NOT Qt6_FOUND)|' CMakeLists.txt
sed -i 's|Exiv2::Error|Exiv2::AnyError|' qimgv/sourcecontainers/documentinfo.cpp
cd ..
fi
fi
# build libavif
if [[ $BAVIF == 1 ]] ; then
printf "\n${MGNT}:: Build libavif ::${RST}\n"
cd libavif/ext
# build dav1d
cd dav1d
rm -rf build
CFLAGS="$CFL" CXXFLAGS="$CFL" LDFLAGS="$LFL" meson setup --default-library=static --buildtype=release -Denable_tools=false -Denable_tests=false build ./
ninja -C build
cd ..
# build libyuv
cd libyuv
rm -rf build
cmake -B build -G Ninja -S ./ \
-DBUILD_SHARED_LIBS=OFF \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_FLAGS="$CFL" -DCMAKE_CXX_FLAGS="$CFL" -DCMAKE_EXE_LINKER_FLAGS="$LFL" \
-Wno-dev
ninja -C build yuv
cd ../..
# build libavif
rm -rf build
cmake -B build -G Ninja -S ./ \
-DCMAKE_INSTALL_PREFIX="$EXTDIR" \
-DCMAKE_BUILD_TYPE=Release \
-DAVIF_CODEC_DAV1D=ON \
-DAVIF_LOCAL_DAV1D=ON \
-DAVIF_LOCAL_LIBYUV=ON \
-DCMAKE_C_FLAGS="$CFL" -DCMAKE_CXX_FLAGS="$CFL" -DCMAKE_EXE_LINKER_FLAGS="$LFL"
ninja install -C build
cd ..
fi
# build libjxl
if [[ $BJXL == 1 ]] ; then
printf "\n${MGNT}:: Build libjxl ::${RST}\n"
cd libjxl
rm -rf build
cmake -B build -G Ninja -S ./ \
-DCMAKE_INSTALL_PREFIX="$EXTDIR" \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_TESTING=OFF \
-DJPEGXL_ENABLE_TOOLS=OFF \
-DJPEGXL_ENABLE_DOXYGEN=OFF \
-DJPEGXL_ENABLE_MANPAGES=OFF \
-DJPEGXL_ENABLE_BENCHMARK=OFF \
-DJPEGXL_ENABLE_EXAMPLES=OFF \
-DJPEGXL_ENABLE_JNI=OFF \
-DJPEGXL_ENABLE_OPENEXR=OFF \
-DJPEGXL_WARNINGS_AS_ERRORS=OFF \
-DJPEGXL_FORCE_SYSTEM_BROTLI=ON \
-DJPEGXL_FORCE_SYSTEM_LCMS2=ON \
-DJPEGXL_FORCE_SYSTEM_HWY=ON \
-DCMAKE_C_FLAGS="$CFL" -DCMAKE_CXX_FLAGS="$CFL" -DCMAKE_EXE_LINKER_FLAGS="$LFL" \
-Wno-dev
ninja install -C build
cd ..
fi
# build plugins
if [[ $BPLGS == 1 ]] ; then
# build qavif
printf "\n${MGNT}:: Build qavif ::${RST}\n"
cd qt-avif-image-plugin
rm -rf build
cmake -B build -G Ninja -S ./ -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="$EXTDIR" \
-DCMAKE_C_FLAGS="$CFL" -DCMAKE_CXX_FLAGS="$CFL" -DCMAKE_EXE_LINKER_FLAGS="$LFL"
ninja -C build
cd ..
# build qjpegxl
printf "\n${MGNT}:: Build qjpegxl ::${RST}\n"
cd qt-jpegxl-image-plugin
rm -rf build
cmake -B build -G Ninja -S ./ -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="$EXTDIR" \
-DCMAKE_C_FLAGS="$CFL" -DCMAKE_CXX_FLAGS="$CFL" -DCMAKE_EXE_LINKER_FLAGS="$LFL"
ninja -C build
cd ..
fi
# build exiv2
if [[ $BEXIV == 1 ]] ; then
printf "\n${MGNT}:: Build exiv2 ::${RST}\n"
cd exiv2
rm -rf build
cmake -B build -G Ninja -S ./ \
-DCMAKE_INSTALL_PREFIX="$EXTDIR" \
-DCMAKE_BUILD_TYPE=Release \
-DEXIV2_ENABLE_WIN_UNICODE=ON \
-DEXIV2_ENABLE_BMFF=ON \
-DEXIV2_BUILD_SAMPLES=OFF \
-DCMAKE_C_FLAGS="$CFL" -DCMAKE_CXX_FLAGS="$CFL -pthread" -DCMAKE_EXE_LINKER_FLAGS="$LFL"
ninja install -C build
cd ..
fi
# build opencv
if [[ $BOPCV == 1 ]] ; then
printf "\n${MGNT}:: Build opencv ::${RST}\n"
cd opencv
rm -rf build
cmake -B build -G Ninja -S ./ \
-DCMAKE_INSTALL_PREFIX="$EXTDIR" \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_LIST='core,imgproc' \
-DWITH_1394=OFF \
-DWITH_VTK=OFF \
-DWITH_FFMPEG=OFF \
-DWITH_GSTREAMER=OFF \
-DWITH_DSHOW=OFF \
-DWITH_QUIRC=OFF \
-DBUILD_SHARED_LIBS=ON \
-DCMAKE_C_FLAGS="$CFL" -DCMAKE_CXX_FLAGS="$CFL" -DCMAKE_EXE_LINKER_FLAGS="$LFL"
ninja install -C build
cd ..
fi
# build qimgv
if [[ $BQMGV == 1 ]] ; then
printf "\n${MGNT}:: Build qimgv ::${RST}\n"
cd qimgv
rm -rf build
cmake -B build -G Ninja -S ./ \
-DCMAKE_BUILD_TYPE=Release \
-DVIDEO_SUPPORT=OFF \
-DOPENCV_SUPPORT=ON \
-DEXIV2=ON \
-DCMAKE_PREFIX_PATH="$EXTDIR" \
-DCMAKE_C_FLAGS="$CFL" -DCMAKE_CXX_FLAGS="$CFL" -DCMAKE_EXE_LINKER_FLAGS="$LFL"
ninja -C build
cd ..
fi
# deploy qimgv
if [[ $DQMGV == 1 ]] ; then
# copying dependencies
printf "\n${MGNT}:: Deploy portable qimgv ::${RST}\n"
rm -rf qimgv_w64
mkdir qimgv_w64
cp qimgv/build/qimgv/qimgv.exe qimgv_w64/
windeployqt-qt6 qimgv_w64/qimgv.exe \
--compiler-runtime \
--no-system-d3d-compiler \
--no-translations \
--skip-plugin-types generic,networkinformation,tls \
--qtpaths "/ucrt64/bin/qtpaths-qt6.exe"
printf 'Copying dependencies '
cp install/{bin/lib{avif,exiv2,jxl,jxl_threads}.dll,x64/mingw/bin/libopencv_{core481,imgproc481}.dll} qimgv_w64/ && printf '.'
cp qt-avif-image-plugin/build/bin/imageformats/libqavif*.dll qimgv_w64/imageformats/qavif.dll && printf '.'
cp qt-jpegxl-image-plugin/build/bin/imageformats/libqjpegxl*.dll qimgv_w64/imageformats/qjpegxl.dll && printf '.'
mkdir -p qimgv_w64/data/mime/packages && cp libjxl/plugins/mime/image-jxl.xml qimgv_w64/data/mime/packages/ && printf '.'
while
files2=$files1
files1=$(ldd qimgv_w64/{*.{exe,dll},imageformats/*.dll} | grep "/ucrt64/bin/" | grep -v 'Qt6' | sed 's/.* => //;s/ (.*//' | sort -u)
printf '.'
for f in $files1; do
cp -u $f qimgv_w64/
done
[[ $files1 != $files2 ]]
do :; done
echo 'ok'
# strip size
printf 'Reduce file sizes .'
strip -s qimgv_w64/{qimgv.exe,{./,*/}*.dll}
printf 'ok\n'
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment