1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-05 15:25:49 +02:00

Bug 549014 - Manage CMake toolchain files by toolchain

Use the toolchain type and id as the key to the Map holding the
toolchain files instead of the Path to the file. Also simplifies the
build config since we can always figure out the toolchain file from
the toolchain. Deprecate getting toolchain by path since that shouldn't
be needed any more.

Also took the opportunity to add javadoc to the interfaces.

Change-Id: I11ae2ad8177a3f60399742c8c19576f85ea4b8c0
This commit is contained in:
Doug Schaefer 2019-07-05 10:25:15 -04:00 committed by Doug Schaefer
parent eb4f8e4e9b
commit e744550278
8 changed files with 172 additions and 95 deletions

View file

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: CDT CMake Core
Bundle-SymbolicName: org.eclipse.cdt.cmake.core;singleton:=true
Bundle-Version: 1.2.100.qualifier
Bundle-Version: 1.2.200.qualifier
Bundle-Activator: org.eclipse.cdt.cmake.core.internal.Activator
Bundle-Vendor: Eclipse CDT
Require-Bundle: org.eclipse.core.runtime,

View file

@ -23,12 +23,35 @@ import org.eclipse.core.runtime.CoreException;
*/
public interface ICMakeToolChainFile {
/**
* Return the path to the toolchain file.
*
* @return path to the toolchain file
*/
Path getPath();
/**
* Return the value for a property.
*
* @param key key of the property
* @return the value
*/
String getProperty(String key);
/**
* Set a property.
*
* @param key key of the property
* @param value value for the property
*/
void setProperty(String key, String value);
/**
* Return the toolchain that this toolchain file enables.
*
* @return the toolchain for the file
* @throws CoreException
*/
IToolChain getToolChain() throws CoreException;
}

View file

@ -24,22 +24,73 @@ import org.eclipse.cdt.core.build.IToolChain;
*/
public interface ICMakeToolChainManager {
/**
* Create a new toolchain file object to be added later.
*
* @param path path where the toolchain file resides.
* @return new toolchain objecta
*/
ICMakeToolChainFile newToolChainFile(Path path);
/**
* Make the given toolchain file available. Also persists the path
* and properties for the file so it's recreated on startup.
*
* @param file the toolchain file to be added
*/
void addToolChainFile(ICMakeToolChainFile file);
/**
* Remove the given toolchain file.
*
* @param file the toolchain file to be removed
*/
void removeToolChainFile(ICMakeToolChainFile file);
/**
* We no longer use Path as a key so trying to remove the use of this method.
* Get by toolchain instead.
* @deprecated
* @return just returns null
*/
@Deprecated
ICMakeToolChainFile getToolChainFile(Path path);
/**
* Return toolchain files that are applicable to toolchains with the given properties.
*
* @param properties properties to match
* @return toolchain files that do
*/
Collection<ICMakeToolChainFile> getToolChainFilesMatching(Map<String, String> properties);
/**
* Return the toolchain file for the given toolchain.
*
* @param toolchain the toolchain
* @return the toolchain file for the toolchain
*/
ICMakeToolChainFile getToolChainFileFor(IToolChain toolchain);
/**
* Return all available toolchain files.
*
* @return all toolchain files
*/
Collection<ICMakeToolChainFile> getToolChainFiles();
/**
* Add a listener
*
* @param listener the listener
*/
void addListener(ICMakeToolChainListener listener);
/**
* Remove a listener
*
* @param listener the listener
*/
void removeListener(ICMakeToolChainListener listener);
}

View file

@ -12,6 +12,12 @@ package org.eclipse.cdt.cmake.core;
public interface ICMakeToolChainProvider {
/**
* Allows the provider to add any automatic toolchain files so the user
* doesn't have to.
*
* @param manager the manager object used to add toolchain files
*/
void init(ICMakeToolChainManager manager);
}

View file

@ -15,7 +15,6 @@ import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@ -40,8 +39,6 @@ import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.jobs.Job;
import org.osgi.service.prefs.BackingStoreException;
import org.osgi.service.prefs.Preferences;
import com.google.gson.Gson;
@ -53,25 +50,13 @@ public class CMakeBuildConfiguration extends CBuildConfiguration {
public static final String BUILD_COMMAND = "cmake.command.build"; //$NON-NLS-1$
public static final String CLEAN_COMMAND = "cmake.command.clean"; //$NON-NLS-1$
private static final String TOOLCHAIN_FILE = "cdt.cmake.toolchainfile"; //$NON-NLS-1$
private ICMakeToolChainFile toolChainFile;
public CMakeBuildConfiguration(IBuildConfiguration config, String name) throws CoreException {
super(config, name);
ICMakeToolChainManager manager = Activator.getService(ICMakeToolChainManager.class);
Preferences settings = getSettings();
String pathStr = settings.get(TOOLCHAIN_FILE, ""); //$NON-NLS-1$
if (!pathStr.isEmpty()) {
Path path = Paths.get(pathStr);
toolChainFile = manager.getToolChainFile(path);
} else {
toolChainFile = manager.getToolChainFileFor(getToolChain());
if (toolChainFile != null) {
saveToolChainFile();
}
}
toolChainFile = manager.getToolChainFileFor(getToolChain());
}
public CMakeBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain) {
@ -81,27 +66,13 @@ public class CMakeBuildConfiguration extends CBuildConfiguration {
public CMakeBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain,
ICMakeToolChainFile toolChainFile, String launchMode) {
super(config, name, toolChain, launchMode);
this.toolChainFile = toolChainFile;
if (toolChainFile != null) {
saveToolChainFile();
}
}
public ICMakeToolChainFile getToolChainFile() {
return toolChainFile;
}
private void saveToolChainFile() {
Preferences settings = getSettings();
settings.put(TOOLCHAIN_FILE, toolChainFile.getPath().toString());
try {
settings.flush();
} catch (BackingStoreException e) {
Activator.log(e);
}
}
private boolean isLocal() throws CoreException {
IToolChain toolchain = getToolChain();
return (Platform.getOS().equals(toolchain.getProperty(IToolChain.ATTR_OS))
@ -225,7 +196,7 @@ public class CMakeBuildConfiguration extends CBuildConfiguration {
command.add("cmake"); //$NON-NLS-1$
command.add("--build"); //$NON-NLS-1$
command.add("."); //$NON-NLS-1$
if ("Ninja".equals(generator)) {
if ("Ninja".equals(generator)) { //$NON-NLS-1$
command.add("--"); //$NON-NLS-1$
command.add("-v"); //$NON-NLS-1$
}

View file

@ -28,6 +28,7 @@ import org.eclipse.cdt.cmake.core.ICMakeToolChainListener;
import org.eclipse.cdt.cmake.core.ICMakeToolChainManager;
import org.eclipse.cdt.cmake.core.ICMakeToolChainProvider;
import org.eclipse.cdt.core.build.IToolChain;
import org.eclipse.cdt.core.build.IToolChainManager;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
@ -40,7 +41,7 @@ import org.osgi.service.prefs.Preferences;
public class CMakeToolChainManager implements ICMakeToolChainManager {
private Map<Path, ICMakeToolChainFile> files;
private Map<String, ICMakeToolChainFile> filesByToolChain;
private static final String N = "n"; //$NON-NLS-1$
private static final String PATH = "__path"; //$NON-NLS-1$
@ -51,17 +52,29 @@ public class CMakeToolChainManager implements ICMakeToolChainManager {
return InstanceScope.INSTANCE.getNode(Activator.getId()).node("cmakeToolchains"); //$NON-NLS-1$
}
private void init() {
if (files == null) {
files = new HashMap<>();
public static String makeToolChainId(String tcType, String tcId) {
return tcType + '/' + tcId;
}
public static String makeToolChainId(IToolChain toolchain) {
return makeToolChainId(toolchain.getTypeId(), toolchain.getId());
}
private synchronized void init() {
if (filesByToolChain == null) {
filesByToolChain = new HashMap<>();
Preferences prefs = getPreferences();
try {
for (String childName : prefs.childrenNames()) {
Preferences tcNode = prefs.node(childName);
String pathStr = tcNode.get(PATH, "/"); //$NON-NLS-1$
String tcType = tcNode.get(CMakeBuildConfiguration.TOOLCHAIN_TYPE, "?"); //$NON-NLS-1$
String tcId = tcNode.get(CMakeBuildConfiguration.TOOLCHAIN_ID, "?"); //$NON-NLS-1$
Path path = Paths.get(pathStr);
if (Files.exists(path) && !files.containsKey(path)) {
IToolChainManager tcManager = Activator.getService(IToolChainManager.class);
IToolChain toolchain = tcManager.getToolChain(tcType, tcId);
if (toolchain != null && Files.exists(path)) {
ICMakeToolChainFile file = new CMakeToolChainFile(childName, path);
for (String key : tcNode.keys()) {
String value = tcNode.get(key, ""); //$NON-NLS-1$
@ -69,13 +82,13 @@ public class CMakeToolChainManager implements ICMakeToolChainManager {
file.setProperty(key, value);
}
}
files.put(path, file);
filesByToolChain.put(makeToolChainId(tcType, tcId), file);
} else {
tcNode.removeNode();
prefs.flush();
}
}
} catch (BackingStoreException e) {
} catch (BackingStoreException | CoreException e) {
Activator.log(e);
}
@ -104,42 +117,48 @@ public class CMakeToolChainManager implements ICMakeToolChainManager {
@Override
public void addToolChainFile(ICMakeToolChainFile file) {
init();
if (files.containsKey(file.getPath())) {
removeToolChainFile(file);
}
files.put(file.getPath(), file);
// save it
CMakeToolChainFile realFile = (CMakeToolChainFile) file;
Preferences prefs = getPreferences();
String n = realFile.n;
if (n == null) {
n = prefs.get(N, "0"); //$NON-NLS-1$
realFile.n = n;
}
prefs.put(N, Integer.toString(Integer.parseInt(n) + 1));
Preferences tcNode = prefs.node(n);
tcNode.put(PATH, file.getPath().toString());
for (Entry<String, String> entry : realFile.properties.entrySet()) {
tcNode.put(entry.getKey(), entry.getValue());
}
try {
prefs.flush();
} catch (BackingStoreException e) {
Activator.log(e);
}
IToolChain toolchain = file.getToolChain();
String tcId = makeToolChainId(toolchain);
if (filesByToolChain.containsKey(tcId)) {
removeToolChainFile(file);
}
filesByToolChain.put(tcId, file);
fireEvent(new CMakeToolChainEvent(CMakeToolChainEvent.ADDED, file));
// save it
CMakeToolChainFile realFile = (CMakeToolChainFile) file;
Preferences prefs = getPreferences();
String n = realFile.n;
if (n == null) {
n = prefs.get(N, "0"); //$NON-NLS-1$
realFile.n = n;
}
prefs.put(N, Integer.toString(Integer.parseInt(n) + 1));
Preferences tcNode = prefs.node(n);
tcNode.put(PATH, file.getPath().toString());
for (Entry<String, String> entry : realFile.properties.entrySet()) {
tcNode.put(entry.getKey(), entry.getValue());
}
tcNode.put(CMakeBuildConfiguration.TOOLCHAIN_TYPE, toolchain.getTypeId());
tcNode.put(CMakeBuildConfiguration.TOOLCHAIN_ID, toolchain.getId());
prefs.flush();
fireEvent(new CMakeToolChainEvent(CMakeToolChainEvent.ADDED, file));
} catch (CoreException | BackingStoreException e) {
Activator.log(e);
return;
}
}
@Override
public void removeToolChainFile(ICMakeToolChainFile file) {
init();
fireEvent(new CMakeToolChainEvent(CMakeToolChainEvent.REMOVED, file));
files.remove(file.getPath());
String tcId = makeToolChainId(file.getProperty(CMakeBuildConfiguration.TOOLCHAIN_TYPE),
file.getProperty(CMakeBuildConfiguration.TOOLCHAIN_ID));
filesByToolChain.remove(tcId);
String n = ((CMakeToolChainFile) file).n;
if (n != null) {
@ -157,13 +176,13 @@ public class CMakeToolChainManager implements ICMakeToolChainManager {
@Override
public ICMakeToolChainFile getToolChainFile(Path path) {
init();
return files.get(path);
return null;
}
@Override
public Collection<ICMakeToolChainFile> getToolChainFiles() {
init();
return Collections.unmodifiableCollection(files.values());
return Collections.unmodifiableCollection(filesByToolChain.values());
}
@Override
@ -187,15 +206,9 @@ public class CMakeToolChainManager implements ICMakeToolChainManager {
@Override
public ICMakeToolChainFile getToolChainFileFor(IToolChain toolchain) {
String id = toolchain.getId();
for (ICMakeToolChainFile file : getToolChainFiles()) {
if (id.equals(file.getProperty(CMakeBuildConfiguration.TOOLCHAIN_ID))) {
return file;
}
}
return null;
init();
String id = makeToolChainId(toolchain);
return filesByToolChain.get(id);
}
@Override

View file

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: CDT CMake UI
Bundle-SymbolicName: org.eclipse.cdt.cmake.ui;singleton:=true
Bundle-Version: 1.2.1.qualifier
Bundle-Version: 1.2.100.qualifier
Bundle-Activator: org.eclipse.cdt.cmake.ui.internal.Activator
Bundle-Vendor: Eclipse CDT
Require-Bundle: org.eclipse.core.runtime,

View file

@ -19,6 +19,7 @@ import java.util.Map;
import org.eclipse.cdt.cmake.core.ICMakeToolChainFile;
import org.eclipse.cdt.cmake.core.ICMakeToolChainManager;
import org.eclipse.cdt.cmake.core.internal.CMakeToolChainManager;
import org.eclipse.cdt.core.build.IToolChain;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.dialogs.MessageDialog;
@ -102,13 +103,18 @@ public class CMakePreferencePage extends PreferencePage implements IWorkbenchPre
NewCMakeToolChainFileWizard wizard = new NewCMakeToolChainFileWizard();
WizardDialog dialog = new WizardDialog(getShell(), wizard);
if (dialog.open() == Window.OK) {
ICMakeToolChainFile file = wizard.getNewFile();
ICMakeToolChainFile oldFile = manager.getToolChainFile(file.getPath());
if (oldFile != null) {
filesToRemove.put(oldFile.getPath(), oldFile);
try {
ICMakeToolChainFile file = wizard.getNewFile();
IToolChain oldtc = file.getToolChain();
ICMakeToolChainFile oldFile = manager.getToolChainFileFor(oldtc);
if (oldFile != null) {
filesToRemove.put(oldFile.getPath(), oldFile);
}
filesToAdd.put(file.getPath(), file);
updateTable();
} catch (CoreException ex) {
Activator.log(ex);
}
filesToAdd.put(file.getPath(), file);
updateTable();
}
}
});
@ -159,18 +165,25 @@ public class CMakePreferencePage extends PreferencePage implements IWorkbenchPre
}
}
private Map<Path, ICMakeToolChainFile> getFiles() {
Map<Path, ICMakeToolChainFile> files = new HashMap<>();
for (ICMakeToolChainFile file : manager.getToolChainFiles()) {
files.put(file.getPath(), file);
}
private Map<String, ICMakeToolChainFile> getFiles() {
Map<String, ICMakeToolChainFile> files = new HashMap<>();
try {
for (ICMakeToolChainFile file : manager.getToolChainFiles()) {
String id = CMakeToolChainManager.makeToolChainId(file.getToolChain());
files.put(id, file);
}
for (ICMakeToolChainFile file : filesToRemove.values()) {
files.remove(file.getPath());
}
for (ICMakeToolChainFile file : filesToRemove.values()) {
String id = CMakeToolChainManager.makeToolChainId(file.getToolChain());
files.remove(id);
}
for (ICMakeToolChainFile file : filesToAdd.values()) {
files.put(file.getPath(), file);
for (ICMakeToolChainFile file : filesToAdd.values()) {
String id = CMakeToolChainManager.makeToolChainId(file.getToolChain());
files.put(id, file);
}
} catch (CoreException e) {
Activator.log(e);
}
return files;