Last active
December 13, 2023 16:16
-
-
Save eddiezato/2bd8d021d06281dc47b77d5e61a3994e to your computer and use it in GitHub Desktop.
Build qimgv in msys2/ucrt64
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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