| /******************************************************************************* |
| * Copyright (c) 2016 QNX Software Systems and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| *******************************************************************************/ |
| package org.eclipse.cdt.internal.qt.core.provider; |
| |
| import java.io.IOException; |
| import java.nio.file.Files; |
| import java.nio.file.Path; |
| import java.nio.file.Paths; |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.stream.Collectors; |
| |
| import org.eclipse.cdt.codan.core.cxx.Activator; |
| import org.eclipse.cdt.core.build.IToolChain; |
| import org.eclipse.cdt.internal.qt.core.QtInstall; |
| import org.eclipse.cdt.qt.core.IQtInstall; |
| import org.eclipse.cdt.qt.core.IQtInstallProvider; |
| import org.eclipse.cdt.utils.WindowsRegistry; |
| import org.eclipse.core.runtime.Platform; |
| |
| /** |
| * Qt Install provider that attempts to find the Qt package as installed using Qt's own installer. |
| */ |
| public class QtInstallProvider implements IQtInstallProvider { |
| |
| private static boolean isWin32 = Platform.getOS().equals(Platform.OS_WIN32); |
| |
| @Override |
| public Collection<IQtInstall> getInstalls() { |
| Path root = getQtRoot(); |
| Path qmake = Paths.get(isWin32 ? "bin/qmake.exe" : "bin/qmake"); //$NON-NLS-1$ //$NON-NLS-2$ |
| if (root != null && Files.exists(root)) { |
| try { |
| return Files.walk(root, 2).filter((path) -> Files.exists(path.resolve(qmake))) |
| .map((path) -> { |
| QtInstall install = new QtInstall(path.resolve(qmake)); |
| if (isWin32 && "win32-g++".equals(install.getSpec())) { //$NON-NLS-1$ |
| install.setProperty(IToolChain.ATTR_PACKAGE, "qt"); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| return install; |
| }).collect(Collectors.toList()); |
| } catch (IOException e) { |
| Activator.log(e); |
| } |
| } |
| return Collections.emptyList(); |
| } |
| |
| private Path getQtRoot() { |
| if (isWin32) { |
| WindowsRegistry registry = WindowsRegistry.getRegistry(); |
| String uninstallKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"; //$NON-NLS-1$ |
| String subkey; |
| for (int i = 0; (subkey = registry.getCurrentUserKeyName(uninstallKey, i)) != null; i++) { |
| String compKey = uninstallKey + '\\' + subkey; |
| String displayName = registry.getCurrentUserValue(compKey, "DisplayName"); //$NON-NLS-1$ |
| if ("Qt".equals(displayName)) { //$NON-NLS-1$ |
| String installLocation = registry.getCurrentUserValue(compKey, "InstallLocation"); //$NON-NLS-1$ |
| return Paths.get(installLocation); |
| } |
| } |
| } else { |
| Path qtDir = Paths.get(System.getProperty("user.home"), "Qt"); //$NON-NLS-1$ //$NON-NLS-2$ |
| if (Files.exists(qtDir)) { |
| return qtDir; |
| } |
| } |
| return null; |
| } |
| |
| // gcc is in C:\Qt\Tools\mingw492_32\bin |
| } |