use strict; use Cwd; use Path::Tiny; use IPC::Cmd qw[can_run run]; # check requirements: die "Cannot proceed without the 'bin' folder'" if (!-e "bin"); can_run('cmake') or die 'cmake is not installed!'; 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 $openssl_v_major = "1.1.1"; # The 1.1.1 series is Long Term Support (LTS) release, supported until 11th September 2023 my $openssl_v_minor = "k"; my $openssl_version = "$openssl_v_major$openssl_v_minor"; my $openssl_dir = "$current_dir\\openssl-$openssl_version"; my $openssl_download = "https://www.openssl.org/source/openssl-$openssl_version.tar.gz"; my $openssl_arch = $arch eq "amd64" ? "WIN64A" : "WIN32"; $arch = "x86" if ($arch eq ''); # specify x86 is nothing is specified die "Please specify architecture (x86 or amd64)" if ($arch ne "x86" && $arch ne "amd64"); # die if user specified anything except x86 or amd64 # will create a batch file my $batfile = 'compile_win.bat'; open BAT, '>', $batfile; printLineToBat ("SET PATH=%PATH%;%cd%\\bin"); # add bin folder to the path for 7z and wget printLineToBat ("CALL \"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\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 ("IF EXIST qt6-build GOTO SECOND_STEP"); printLineToBat ("mkdir qt6-build"); printLineToBat (":SECOND_STEP"); printLineToBat ("cd qt6-build"); 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"); 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 = "qt3d qt5compat qtactiveqt qtcharts qtcoap qtconnectivity qtdatavis3d qtdeclarative qtdoc qtlottie qtmqtt qtmultimedia qtnetworkauth qtopcua qtpositioning qtquick3d qtquicktimeline qtremoteobjects qtscxml qtsensors qtserialbus qtserialport qtshadertools qtsvg qttranslations qtvirtualkeyboard qtwayland qtwebchannel qtwebengine qtwebsockets qtwebview"; my $skipped_modules_cmd; foreach (split(/\s/, $skipped_modules)) { $skipped_modules_cmd .= "-skip $_ "; } # -developer-build creates an in-source build for developer usage. # -developer-build adds /WX (treat warning as error) and Qt fails to be compiled # in this case add extra -no-warnings-are-errors parameter printLineToBat ("..\\configure -opensource -debug-and-release -confirm-license -opengl desktop -mp -nomake tests -nomake examples -prefix $prefix_dir $skipped_modules_cmd -openssl-linked -- -DOPENSSL_ROOT_DIR=\"$openssl_dir\\build\" -DOPENSSL_INCLUDE_DIR=\"$openssl_dir\\build\\include\" -DOPENSSL_USE_STATIC_LIBS=ON"); printLineToBat ("goto :EOF"); # step 2: printLineToBat (":step2"); printLineToBat ("cmake --build . --parallel"); printLineToBat ("cmake --install . --config Release"); printLineToBat ("cmake --install . --config Debug"); # clean up printLineToBat ("rmdir qt6-build /s /q"); close BAT; system ($batfile); system ("$batfile step2"); system ("pause"); sub printLineToBat { print BAT "$_[0]\n"; }