From 458965425c51a11a93c0c2f8081cda5bc6c15ed6 Mon Sep 17 00:00:00 2001 From: kleuter Date: Thu, 26 Sep 2024 11:55:20 +0200 Subject: [PATCH] qt6: compile_win.pl with pdf and multimedia support --- 6.7.2/compile_win.pl | 48 ++++- 6.7.2/compile_win_x64_pdf_multimedia.bat | 1 + 6.7.2/compile_win_x64_webengine_pdf_only.bat | 14 -- 6.7.2/compile_win_x64_with_multimedia.bat | 1 - 6.8.0/compile_win.pl | 189 +++++++++++++++++++ 6.8.0/compile_win_x64.bat | 1 + 6.8.0/compile_win_x64_pdf_multimedia.bat | 1 + 6.8.0/compile_win_x86.bat | 1 + 8 files changed, 238 insertions(+), 18 deletions(-) create mode 100644 6.7.2/compile_win_x64_pdf_multimedia.bat delete mode 100644 6.7.2/compile_win_x64_webengine_pdf_only.bat delete mode 100644 6.7.2/compile_win_x64_with_multimedia.bat create mode 100644 6.8.0/compile_win.pl create mode 100644 6.8.0/compile_win_x64.bat create mode 100644 6.8.0/compile_win_x64_pdf_multimedia.bat create mode 100644 6.8.0/compile_win_x86.bat diff --git a/6.7.2/compile_win.pl b/6.7.2/compile_win.pl index 8b9a214..651fc9b 100644 --- a/6.7.2/compile_win.pl +++ b/6.7.2/compile_win.pl @@ -19,10 +19,14 @@ my $arch = $ARGV[0]; my $install_dir = $ARGV[1]; my $vcpkg_dir; my $build_multimedia = 0; +my $build_graphs = 0; +my $build_pdf = 0; GetOptions( 'vcpkg-dir=s' => \$vcpkg_dir, 'build-multimedia' => \$build_multimedia, + 'build-graphs' => \$build_graphs, + 'build-pdf' => \$build_pdf, ) or die "Error in command line arguments\n"; $arch = "amd64" if ($arch eq ''); # amd64 is nothing is specified, can be x86 @@ -101,8 +105,24 @@ printLineToBat (":OPENSSL_ALREAD_COMPILED"); # openssl: see https://bugreports.qt.io/browse/QTBUG-65501 -my $skipped_modules = "qtlocation qtspeech qt3d qtactiveqt qtcharts qtcoap qtconnectivity qtdatavis3d qtdoc qtlottie qtmqtt qtnetworkauth qtopcua qtpositioning qtquicktimeline qtremoteobjects qtscxml qtsensors qtserialbus qtserialport qtsvg qttranslations qtvirtualkeyboard qtwayland qtwebchannel qtwebengine qtwebsockets qtwebview"; +my $skipped_modules = "qthttpserver qtlocation qtspeech qtgrpc qt3d qtactiveqt qtcharts qtcoap qtconnectivity qtdatavis3d qtdoc qtlottie qtmqtt qtnetworkauth qtopcua qtpositioning qtremoteobjects qtscxml qtsensors qtserialbus qtserialport qtsvg qttranslations qtvirtualkeyboard qtwayland qtwebchannel qtwebengine qtwebsockets qtwebview"; +$skipped_modules .= " qtquickeffectmaker qtquicktimeline qtquick3d qtquick3dphysics"; + $skipped_modules.=' qtmultimedia' if (!$build_multimedia); +$skipped_modules.=' qtgraphs' if (!$build_graphs); + +if ($build_pdf && $arch eq 'x86') +{ + # This version of the script is not able to build x86 qtwebengine on a 64-bit machine" + # need to override target_cpu='x86' somehow: https://www.chromium.org/developers/gn-build-configuration/ + + $build_pdf = 0; +} + +if (!$build_pdf) +{ + $skipped_modules .= ' qtdeclarative'; +} my $skipped_modules_cmd; @@ -110,7 +130,15 @@ foreach (split(/\s/, $skipped_modules)) { $skipped_modules_cmd .= "-skip $_ "; } -my $configure_cmd = "..\\configure -prefix $install_dir -opensource -debug-and-release -confirm-license -opengl desktop -nomake tests -nomake examples $skipped_modules_cmd -openssl-linked -- -DOPENSSL_ROOT_DIR=\"$openssl_dir\\build\" -DOPENSSL_INCLUDE_DIR=\"$openssl_dir\\build\\include\" -DOPENSSL_USE_STATIC_LIBS=ON"; +my $configure_cmd = "..\\configure -prefix $install_dir -opensource -debug-and-release -confirm-license -opengl desktop -nomake tests -nomake examples"; + +# append skip modules +$configure_cmd .= " $skipped_modules_cmd"; + +# append openssl related parameters +$configure_cmd .= " -openssl-linked -- -DOPENSSL_ROOT_DIR=\"$openssl_dir\\build\" -DOPENSSL_INCLUDE_DIR=\"$openssl_dir\\build\\include\" -DOPENSSL_USE_STATIC_LIBS=ON"; + +# append ffmpeg dir when building multimedia $configure_cmd .= " -DFFMPEG_DIR=$vcpkg_dir" if ($build_multimedia); printLineToBat ($configure_cmd); @@ -134,6 +162,19 @@ printLineToBat ("cmake --install . --config Debug"); printLineToBat ("cd .."); # since we're now in 'qt6-build' for some reason printLineToBat ("rmdir $build_dir /s /q"); +# remove _tools folder from the installation directory +printLineToBat ("rmdir $install_dir\\_tools /s /q"); + +# NEW: let's build the PDF module + +if ($build_pdf) +{ + printLineToBat ("mkdir _qtwebengine-pdf-build-$arch"); + printLineToBat ("cd _qtwebengine-pdf-build-$arch"); + + printLineToBat ("$install_dir\\bin\\qt-configure-module.bat ../qtwebengine -- -DFEATURE_qtwebengine_build=OFF && cmake --build . --parallel && cmake --install . --config Release && cmake --install . --config Debug") +} + close BAT; system ($batfile); @@ -144,4 +185,5 @@ system ("pause"); sub printLineToBat { print BAT "$_[0]\n"; -} \ No newline at end of file +} + diff --git a/6.7.2/compile_win_x64_pdf_multimedia.bat b/6.7.2/compile_win_x64_pdf_multimedia.bat new file mode 100644 index 0000000..b79d89b --- /dev/null +++ b/6.7.2/compile_win_x64_pdf_multimedia.bat @@ -0,0 +1 @@ +perl compile_win.pl amd64 C:\qt6_x64 --vcpkg-dir=G:\Projects\vcpkg --build-pdf --build-multimedia \ No newline at end of file diff --git a/6.7.2/compile_win_x64_webengine_pdf_only.bat b/6.7.2/compile_win_x64_webengine_pdf_only.bat deleted file mode 100644 index be71299..0000000 --- a/6.7.2/compile_win_x64_webengine_pdf_only.bat +++ /dev/null @@ -1,14 +0,0 @@ -rem: https://wiki.qt.io/QtPDF_Build_Instructions - -rem requirements: -rem 1. Python and html5lib package (pip3 install html5lib) -rem 2. node.js -rem 3. gperf.exe on PATH - -SET PATH=%PATH%;%cd%\_tools;%cd%\_tools\cmake\bin -CALL "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64 -SET _ROOT=%cd% -SET PATH=%_ROOT%\qtbase\bin;%_ROOT%\gnuwin32\bin;%PATH% -mkdir qtwebengine-pdf-build -cd qtwebengine-pdf-build -C:\qt6_x64\bin\qt-configure-module.bat ../qtwebengine -- -DFEATURE_qtwebengine_build=OFF && cmake --build . --parallel && cmake --install . --config Release && cmake --install . --config Debug && pause \ No newline at end of file diff --git a/6.7.2/compile_win_x64_with_multimedia.bat b/6.7.2/compile_win_x64_with_multimedia.bat deleted file mode 100644 index 9046148..0000000 --- a/6.7.2/compile_win_x64_with_multimedia.bat +++ /dev/null @@ -1 +0,0 @@ -perl compile_win.pl amd64 C:\qt6_x64 --vcpkg_dir=G:\Projects\vcpkg --build-multimedia \ No newline at end of file diff --git a/6.8.0/compile_win.pl b/6.8.0/compile_win.pl new file mode 100644 index 0000000..651fc9b --- /dev/null +++ b/6.8.0/compile_win.pl @@ -0,0 +1,189 @@ +# from https://wiki.qt.io/Building_Qt_Multimedia_with_FFmpeg +# vcpkg install ffmpeg[core,swresample,swscale,avdevice]:x64-windows + +use strict; +use Cwd; +use Path::Tiny; +use IPC::Cmd qw[can_run run]; +use Getopt::Long; + +# check requirements: +die "Cannot proceed without the '_tools' folder'" if (!-e "_tools"); + +my $current_dir = getcwd; +my $prefix_dir = path($current_dir)->parent(1); # one level up +$current_dir =~ s#/#\\#g; # convert separators to Windows-style +$prefix_dir =~ s#/#\\#g; # convert separators to Windows-style + +my $arch = $ARGV[0]; +my $install_dir = $ARGV[1]; +my $vcpkg_dir; +my $build_multimedia = 0; +my $build_graphs = 0; +my $build_pdf = 0; + +GetOptions( + 'vcpkg-dir=s' => \$vcpkg_dir, + 'build-multimedia' => \$build_multimedia, + 'build-graphs' => \$build_graphs, + 'build-pdf' => \$build_pdf, +) or die "Error in command line arguments\n"; + +$arch = "amd64" if ($arch eq ''); # amd64 is nothing is specified, can be x86 + +die "Error: Please specify architecture (x86 or amd64)" if ($arch ne "x86" && $arch ne "amd64"); # die if user specified anything except x86 or amd64 +die "Error: Please specify install dir as second parameter" if (!$install_dir); +die "Error: istall dir '$install_dir' already exists" if (-d $install_dir); + +my $build_dir = "_qt6-build-$arch"; + +die "Error: build dir '$build_dir' already exists" if (-d $build_dir); + +if (defined $vcpkg_dir) +{ + $vcpkg_dir .= "\\installed\\x64-windows" if ($arch eq 'amd64'); + $vcpkg_dir .= "\\installed\\x86-windows" if ($arch eq 'x86'); + + die "vcpkg dir $vcpkg_dir doesn't exist" if (!-e "$vcpkg_dir"); +} + +die "vcpkg_dir dir is required to build multimedia" if ($build_multimedia && !defined $vcpkg_dir); + +my $openssl_version = "3.0.13"; # supported until 7th September 2026 +my $openssl_download = "https://www.openssl.org/source/openssl-$openssl_version.tar.gz"; +my $openssl_arch = $arch eq "amd64" ? "WIN64A" : "WIN32"; +my $openssl_dir = "$current_dir\\openssl-$openssl_version-$openssl_arch"; +my $openssl_7z = "openssl-$openssl_version-$openssl_arch.7z"; + +# will create a batch file + +my $batfile = 'compile_win.bat'; + +open BAT, '>', $batfile; + +printLineToBat ("SET PATH=%PATH%;%cd%\\_tools;%cd%\\_tools\\cmake\\bin"); # add folders to the path for 7z, wget, cmake, etc +printLineToBat ("CALL \"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat\" $arch"); +printLineToBat ("SET _ROOT=%cd%"); +printLineToBat ("SET PATH=%_ROOT%\\qtbase\\bin;%_ROOT%\\gnuwin32\\bin;%PATH%"); # http://doc.qt.io/qt-5/windows-building.html +printLineToBat ("SET OPENSSL_LIBS=-lUser32 -lAdvapi32 -lGdi32 -llibcrypto -llibssl"); + +printLineToBat ("cd _tools"); +printLineToBat ("7z x cmake.7z -aoa -y"); + +printLineToBat ("7z x $openssl_7z -o$openssl_dir -y") if (-e "_tools\\$openssl_7z"); +printLineToBat ("cd .."); + +printLineToBat ("IF EXIST $build_dir GOTO SECOND_STEP"); +printLineToBat ("mkdir $build_dir"); +printLineToBat (":SECOND_STEP"); +printLineToBat ("cd $build_dir"); + +printLineToBat ("if \"%~1\"==\"step2\" goto step2"); + +# step1: compile openssl and do configure. For some reason, can't continue script execution after configure, have to make step2 +printLineToBat ("IF EXIST $openssl_dir\\build GOTO OPENSSL_ALREAD_COMPILED"); +printLineToBat ("wget --no-check-certificate $openssl_download"); +printLineToBat ("7z x openssl-$openssl_version.tar.gz"); +printLineToBat ("7z x openssl-$openssl_version.tar -o$openssl_dir -y"); +printLineToBat ("mv $openssl_dir\\openssl-$openssl_version\\* $openssl_dir"); +printLineToBat ("rmdir $openssl_dir\\openssl-$openssl_version"); # empty now +printLineToBat ("rm openssl-$openssl_version.tar.gz"); +printLineToBat ("rm openssl-$openssl_version.tar"); +printLineToBat ("cd $openssl_dir"); # go to openssl dir +printLineToBat ("perl Configure VC-$openssl_arch no-asm no-shared no-tests --prefix=%cd%\\build --openssldir=%cd%\\build"); +printLineToBat ("nmake"); +printLineToBat ("nmake install"); +# do some clean up: +printLineToBat ("rm test\\*.exe"); +printLineToBat ("rm test\\*.pdb"); +printLineToBat ("rm test\\*.obj"); +printLineToBat ("del /s /f /q out32"); +printLineToBat ("del /s /f /q out32.dbg"); +printLineToBat ("cd .."); # go back to qtbase + +printLineToBat (":OPENSSL_ALREAD_COMPILED"); + +# openssl: see https://bugreports.qt.io/browse/QTBUG-65501 + +my $skipped_modules = "qthttpserver qtlocation qtspeech qtgrpc qt3d qtactiveqt qtcharts qtcoap qtconnectivity qtdatavis3d qtdoc qtlottie qtmqtt qtnetworkauth qtopcua qtpositioning qtremoteobjects qtscxml qtsensors qtserialbus qtserialport qtsvg qttranslations qtvirtualkeyboard qtwayland qtwebchannel qtwebengine qtwebsockets qtwebview"; +$skipped_modules .= " qtquickeffectmaker qtquicktimeline qtquick3d qtquick3dphysics"; + +$skipped_modules.=' qtmultimedia' if (!$build_multimedia); +$skipped_modules.=' qtgraphs' if (!$build_graphs); + +if ($build_pdf && $arch eq 'x86') +{ + # This version of the script is not able to build x86 qtwebengine on a 64-bit machine" + # need to override target_cpu='x86' somehow: https://www.chromium.org/developers/gn-build-configuration/ + + $build_pdf = 0; +} + +if (!$build_pdf) +{ + $skipped_modules .= ' qtdeclarative'; +} + +my $skipped_modules_cmd; + +foreach (split(/\s/, $skipped_modules)) { + $skipped_modules_cmd .= "-skip $_ "; +} + +my $configure_cmd = "..\\configure -prefix $install_dir -opensource -debug-and-release -confirm-license -opengl desktop -nomake tests -nomake examples"; + +# append skip modules +$configure_cmd .= " $skipped_modules_cmd"; + +# append openssl related parameters +$configure_cmd .= " -openssl-linked -- -DOPENSSL_ROOT_DIR=\"$openssl_dir\\build\" -DOPENSSL_INCLUDE_DIR=\"$openssl_dir\\build\\include\" -DOPENSSL_USE_STATIC_LIBS=ON"; + +# append ffmpeg dir when building multimedia +$configure_cmd .= " -DFFMPEG_DIR=$vcpkg_dir" if ($build_multimedia); + +printLineToBat ($configure_cmd); + +printLineToBat ("goto :EOF"); + +# step 2: +printLineToBat (":step2"); + +printLineToBat ("cmake --build . --parallel"); + +printLineToBat ("IF ERRORLEVEL 1 ("); +printLineToBat ("echo Build failed with error %ERRORLEVEL%."); +printLineToBat ("EXIT /B %ERRORLEVEL%"); +printLineToBat (")"); + +printLineToBat ("cmake --install . --config Release"); +printLineToBat ("cmake --install . --config Debug"); + +# clean up +printLineToBat ("cd .."); # since we're now in 'qt6-build' for some reason +printLineToBat ("rmdir $build_dir /s /q"); + +# remove _tools folder from the installation directory +printLineToBat ("rmdir $install_dir\\_tools /s /q"); + +# NEW: let's build the PDF module + +if ($build_pdf) +{ + printLineToBat ("mkdir _qtwebengine-pdf-build-$arch"); + printLineToBat ("cd _qtwebengine-pdf-build-$arch"); + + printLineToBat ("$install_dir\\bin\\qt-configure-module.bat ../qtwebengine -- -DFEATURE_qtwebengine_build=OFF && cmake --build . --parallel && cmake --install . --config Release && cmake --install . --config Debug") +} + +close BAT; + +system ($batfile); +system ("$batfile step2"); + +system ("pause"); + +sub printLineToBat +{ + print BAT "$_[0]\n"; +} + diff --git a/6.8.0/compile_win_x64.bat b/6.8.0/compile_win_x64.bat new file mode 100644 index 0000000..b52ceaf --- /dev/null +++ b/6.8.0/compile_win_x64.bat @@ -0,0 +1 @@ +perl compile_win.pl amd64 C:\qt6_x64 \ No newline at end of file diff --git a/6.8.0/compile_win_x64_pdf_multimedia.bat b/6.8.0/compile_win_x64_pdf_multimedia.bat new file mode 100644 index 0000000..b79d89b --- /dev/null +++ b/6.8.0/compile_win_x64_pdf_multimedia.bat @@ -0,0 +1 @@ +perl compile_win.pl amd64 C:\qt6_x64 --vcpkg-dir=G:\Projects\vcpkg --build-pdf --build-multimedia \ No newline at end of file diff --git a/6.8.0/compile_win_x86.bat b/6.8.0/compile_win_x86.bat new file mode 100644 index 0000000..4b614c7 --- /dev/null +++ b/6.8.0/compile_win_x86.bat @@ -0,0 +1 @@ +perl compile_win.pl x86 C:\qt6 \ No newline at end of file