qt-build-tools/6.2.3/compile_win.pl

106 lines
4.3 KiB
Perl

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
printLineToBat ("7z x qt5compat_no_qml.7z");
my $skipped_modules = "qt3d 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";
}