2015-11-15 16:45:13 +01:00
|
|
|
/*
|
2017-03-16 00:50:42 +01:00
|
|
|
Silent installer script
|
2015-11-15 16:45:13 +01:00
|
|
|
|
2017-03-16 00:50:42 +01:00
|
|
|
Known to work with Qt 5.8.0 and QtIFW 2.0.5
|
2015-11-15 16:45:13 +01:00
|
|
|
|
2017-03-16 00:50:42 +01:00
|
|
|
Test with:
|
|
|
|
$ ./qt-opensource-windows-x86-mingw530-5.8.0.exe --verbose --script ../librepilot/make/tool_install/qt-install.qs
|
|
|
|
|
|
|
|
Known issues:
|
2016-03-24 16:11:52 +01:00
|
|
|
- silent but not headless (QtIFW 2.1.0 should support gui.setSilent(true))
|
2015-11-15 16:45:13 +01:00
|
|
|
- cannot disable forced components (QtCreator, ...)
|
|
|
|
- cannot disable virtual components (doc, examples, ...)
|
|
|
|
- cannot disable shortcuts creation
|
|
|
|
- if user presses the 'Show Details' button then the installer does not end automatically
|
|
|
|
*/
|
|
|
|
function Controller()
|
|
|
|
{
|
|
|
|
console.log("*** Silent Installer ***");
|
|
|
|
console.log("Installing on " + installer.value("os"));
|
|
|
|
|
|
|
|
var qtInstallTargetDir = installer.environmentVariable("QT_INSTALL_TARGET_DIR");
|
|
|
|
if (qtInstallTargetDir == "") {
|
2017-03-16 00:50:42 +01:00
|
|
|
qtInstallTargetDir = installer.environmentVariable("PWD") + "/tools/qt-5.8.0";
|
2015-11-15 16:45:13 +01:00
|
|
|
console.log("Environment variable QT_INSTALL_TARGET_DIR not set, using default " + qtInstallTargetDir);
|
|
|
|
}
|
|
|
|
installer.setValue("TargetDir", qtInstallTargetDir);
|
|
|
|
console.log("Installing to " + installer.value("TargetDir"));
|
|
|
|
|
|
|
|
installer.autoRejectMessageBoxes();
|
|
|
|
installer.setMessageBoxAutomaticAnswer("OverwriteTargetDirectory", QMessageBox.Yes);
|
|
|
|
installer.setMessageBoxAutomaticAnswer("stopProcessesForUpdates", QMessageBox.Ignore);
|
|
|
|
|
|
|
|
// pages that are not visible are actually removed from the wizard
|
|
|
|
// some pages must not be removed otherwise the installer starts to mishbehave
|
|
|
|
installer.setDefaultPageVisible(QInstaller.Welcome, false);
|
|
|
|
installer.setDefaultPageVisible(QInstaller.Credentials, false); // QInstaller.Credentials is 0... so this is a NOP!
|
|
|
|
//installer.setDefaultPageVisible(QInstaller.Introduction, false); // Fails to skip Credentials if Introduction is removed?
|
|
|
|
installer.setDefaultPageVisible(QInstaller.TargetDirectory, false);
|
|
|
|
//installer.setDefaultPageVisible(QInstaller.ComponentSelection, false);
|
|
|
|
//installer.setDefaultPageVisible(QInstaller.LicenseAgreementCheck, false);
|
|
|
|
//installer.setDefaultPageVisible(QInstaller.StartMenuSelection, false);
|
|
|
|
installer.setDefaultPageVisible(QInstaller.ReadyForInstallation, false);
|
|
|
|
//installer.setDefaultPageVisible(QInstaller.PerformInstallation, false);
|
|
|
|
installer.setDefaultPageVisible(QInstaller.FinishedPage, false);
|
|
|
|
|
|
|
|
installer.componentAdded.connect(onComponentAdded);
|
|
|
|
installer.aboutCalculateComponentsToInstall.connect(onAboutCalculateComponentsToInstall);
|
|
|
|
installer.finishedCalculateComponentsToInstall.connect(onFinishedCalculateComponentsToInstall);
|
|
|
|
}
|
|
|
|
|
|
|
|
// installer callbacks
|
|
|
|
|
|
|
|
onComponentAdded = function(component)
|
|
|
|
{
|
|
|
|
console.log("Component added: " + component.name);
|
|
|
|
dumpComponents();
|
|
|
|
}
|
|
|
|
|
|
|
|
onAboutCalculateComponentsToInstall = function()
|
|
|
|
{
|
|
|
|
console.log("onAboutCalculateComponentsToInstall");
|
|
|
|
//dumpComponents();
|
|
|
|
}
|
|
|
|
|
|
|
|
onFinishedCalculateComponentsToInstall = function()
|
|
|
|
{
|
|
|
|
console.log("onFinishedCalculateComponentsToInstall");
|
|
|
|
//dumpComponents();
|
|
|
|
}
|
|
|
|
|
2017-03-16 00:50:42 +01:00
|
|
|
function disableComponent(componentName)
|
|
|
|
{
|
|
|
|
component = installer.componentByName(componentName)
|
|
|
|
component.enabled = false
|
|
|
|
component.forcedInstallation = false
|
|
|
|
//component.setValue("ForcedInstallation", "false");
|
|
|
|
}
|
|
|
|
|
2015-11-15 16:45:13 +01:00
|
|
|
// page callbacks
|
|
|
|
// used to setup wizard pages and move the wizard forward
|
|
|
|
|
|
|
|
Controller.prototype.WelcomePageCallback = function()
|
|
|
|
{
|
|
|
|
logCallback();
|
|
|
|
|
|
|
|
gui.clickButton(buttons.NextButton);
|
|
|
|
}
|
|
|
|
|
|
|
|
Controller.prototype.CredentialsPageCallback = function()
|
|
|
|
{
|
|
|
|
logCallback();
|
|
|
|
|
|
|
|
gui.clickButton(buttons.NextButton);
|
|
|
|
}
|
|
|
|
|
|
|
|
Controller.prototype.IntroductionPageCallback = function()
|
|
|
|
{
|
|
|
|
logCallback();
|
|
|
|
|
|
|
|
gui.clickButton(buttons.NextButton);
|
|
|
|
}
|
|
|
|
|
|
|
|
Controller.prototype.ComponentSelectionPageCallback = function()
|
|
|
|
{
|
|
|
|
logCallback();
|
|
|
|
|
|
|
|
var page = gui.currentPageWidget();
|
|
|
|
page.deselectAll()
|
|
|
|
if (installer.value("os") == "win") {
|
2017-03-16 00:50:42 +01:00
|
|
|
selectComponent(page, "qt.58.win32_mingw53");
|
|
|
|
selectComponent(page, "qt.tools.win32_mingw530");
|
2015-11-15 16:45:13 +01:00
|
|
|
}
|
|
|
|
else if (installer.value("os") == "x11") {
|
2017-03-16 00:50:42 +01:00
|
|
|
selectComponent(page, "qt.58.gcc");
|
|
|
|
selectComponent(page, "qt.58.gcc_64");
|
2015-11-15 16:45:13 +01:00
|
|
|
}
|
|
|
|
else if (installer.value("os") == "mac") {
|
2017-03-16 00:50:42 +01:00
|
|
|
selectComponent(page, "qt.58.clang_64");
|
2015-11-15 16:45:13 +01:00
|
|
|
}
|
2017-03-16 00:50:42 +01:00
|
|
|
//selectComponent(page, "qt.58.qtquickcontrols");
|
|
|
|
selectComponent(page, "qt.58.qtscript");
|
2015-11-15 16:45:13 +01:00
|
|
|
|
|
|
|
gui.clickButton(buttons.NextButton);
|
|
|
|
}
|
|
|
|
|
|
|
|
function selectComponent(page, name)
|
|
|
|
{
|
|
|
|
component = installer.componentByName(name);
|
|
|
|
if (component) {
|
|
|
|
console.log("component " + name + " : " + component);
|
|
|
|
page.selectComponent(name);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
console.log("Failed to find component " + name + "!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Controller.prototype.LicenseAgreementPageCallback = function()
|
|
|
|
{
|
|
|
|
logCallback();
|
|
|
|
|
|
|
|
setChecked("AcceptLicenseRadioButton", true);
|
|
|
|
|
|
|
|
gui.clickButton(buttons.NextButton);
|
|
|
|
}
|
|
|
|
|
|
|
|
Controller.prototype.StartMenuDirectoryPageCallback = function()
|
|
|
|
{
|
|
|
|
logCallback();
|
|
|
|
|
|
|
|
gui.clickButton(buttons.NextButton);
|
|
|
|
}
|
|
|
|
|
|
|
|
Controller.prototype.PerformInstallationPageCallback = function()
|
|
|
|
{
|
|
|
|
logCallback();
|
|
|
|
|
|
|
|
// show details and hide button
|
|
|
|
click("DetailsButton");
|
|
|
|
setVisible("DetailsButton", false);
|
|
|
|
|
|
|
|
// showing details will disable automated page switch, so re-enable it
|
|
|
|
installer.setAutomatedPageSwitchEnabled(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
Controller.prototype.FinishedPageCallback = function()
|
|
|
|
{
|
|
|
|
logCallback();
|
|
|
|
|
|
|
|
setChecked("launchQtCreatorCheckBox", false);
|
|
|
|
|
|
|
|
gui.clickButton(buttons.FinishButton);
|
|
|
|
}
|
|
|
|
|
|
|
|
// utilities
|
|
|
|
|
|
|
|
function logCallback()
|
|
|
|
{
|
|
|
|
var page = gui.currentPageWidget();
|
|
|
|
console.log(">>> " + page.objectName + "Callback");
|
|
|
|
}
|
|
|
|
|
|
|
|
function dumpComponents()
|
|
|
|
{
|
|
|
|
dumpComponentsArray(installer.components());
|
|
|
|
}
|
|
|
|
|
|
|
|
function dumpComponentsArray(components)
|
|
|
|
{
|
|
|
|
var arrayLength = components.length;
|
|
|
|
for (var i = 0; i < arrayLength; i++) {
|
|
|
|
dumpComponent(components[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function dumpComponent(component)
|
|
|
|
{
|
|
|
|
console.log(component.name + " (" + component.displayName + ")");
|
|
|
|
console.log(" Virtual: " + component.value("Virtual", "false"));
|
|
|
|
console.log(" ForcedInstallation: " + component.value("ForcedInstallation", "false"));
|
|
|
|
console.log(" Default: " + component.default);
|
|
|
|
console.log(" Enabled: " + component.enabled);
|
|
|
|
}
|
|
|
|
|
|
|
|
// UI utilities
|
|
|
|
|
|
|
|
function click(name)
|
|
|
|
{
|
|
|
|
var page = gui.currentPageWidget();
|
|
|
|
var button = gui.findChild(page, name);
|
|
|
|
if (button) {
|
|
|
|
console.log("button " + name + " : " + button);
|
|
|
|
button.click();
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
console.log("Failed to find button " + name + "!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function setVisible(name, visible)
|
|
|
|
{
|
|
|
|
var page = gui.currentPageWidget();
|
|
|
|
var button = gui.findChild(page, name);
|
|
|
|
if (button) {
|
|
|
|
console.log("button " + name + " : " + button);
|
|
|
|
button.visible = visible;
|
|
|
|
console.log("button " + name + " visible : " + button.visible);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
console.log("Failed to find button " + name + "!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function setEnabled(name, enabled)
|
|
|
|
{
|
|
|
|
var page = gui.currentPageWidget();
|
|
|
|
var button = gui.findChild(page, name);
|
|
|
|
if (button) {
|
|
|
|
console.log("button " + name + " : " + button);
|
|
|
|
button.enabled = enabled;
|
|
|
|
console.log("button " + name + " enabled : " + button.enabled);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
console.log("Failed to find button " + name + "!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function setChecked(name, checked)
|
|
|
|
{
|
|
|
|
var page = gui.currentPageWidget();
|
|
|
|
var button = gui.findChild(page, name);
|
|
|
|
if (button) {
|
|
|
|
console.log("button " + name + " : " + button);
|
|
|
|
button.checked = checked;
|
|
|
|
console.log("button " + name + " checked : " + button.checked);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
console.log("Failed to find button " + name + "!");
|
|
|
|
}
|
|
|
|
}
|