| /******************************************************************************* |
| * Copyright (c) 2003, 2018 IBM Corporation and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * IBM - Initial API and implementation |
| * Anna Dushistova (MontaVista) - [366771]Converter fails to convert a CDT makefile project |
| *******************************************************************************/ |
| package org.eclipse.cdt.managedbuilder.core; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.ByteArrayOutputStream; |
| import java.io.File; |
| import java.io.FileInputStream; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.net.URI; |
| import java.net.URL; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.HashMap; |
| import java.util.HashSet; |
| import java.util.LinkedHashSet; |
| import java.util.List; |
| import java.util.ListIterator; |
| import java.util.Map; |
| import java.util.Map.Entry; |
| import java.util.Random; |
| import java.util.Set; |
| import java.util.SortedMap; |
| import java.util.TreeMap; |
| |
| import javax.xml.parsers.DocumentBuilder; |
| import javax.xml.parsers.DocumentBuilderFactory; |
| import javax.xml.parsers.FactoryConfigurationError; |
| import javax.xml.parsers.ParserConfigurationException; |
| import javax.xml.transform.OutputKeys; |
| import javax.xml.transform.Transformer; |
| import javax.xml.transform.TransformerConfigurationException; |
| import javax.xml.transform.TransformerException; |
| import javax.xml.transform.TransformerFactory; |
| import javax.xml.transform.TransformerFactoryConfigurationError; |
| import javax.xml.transform.dom.DOMSource; |
| import javax.xml.transform.stream.StreamResult; |
| |
| import org.eclipse.cdt.core.AbstractCExtension; |
| import org.eclipse.cdt.core.CCorePlugin; |
| import org.eclipse.cdt.core.IConsoleParser; |
| import org.eclipse.cdt.core.language.settings.providers.ICBuildOutputParser; |
| import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsProvider; |
| import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsProvidersKeeper; |
| import org.eclipse.cdt.core.language.settings.providers.IWorkingDirectoryTracker; |
| import org.eclipse.cdt.core.language.settings.providers.LanguageSettingsManager; |
| import org.eclipse.cdt.core.model.CoreModel; |
| import org.eclipse.cdt.core.model.CoreModelUtil; |
| import org.eclipse.cdt.core.parser.IScannerInfo; |
| import org.eclipse.cdt.core.parser.IScannerInfoChangeListener; |
| import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; |
| import org.eclipse.cdt.core.settings.model.ICMultiConfigDescription; |
| import org.eclipse.cdt.core.settings.model.ICProjectDescription; |
| import org.eclipse.cdt.core.settings.model.ICProjectDescriptionManager; |
| import org.eclipse.cdt.core.settings.model.ICSettingEntry; |
| import org.eclipse.cdt.core.settings.model.XmlStorageUtil; |
| import org.eclipse.cdt.core.settings.model.extension.CConfigurationData; |
| import org.eclipse.cdt.managedbuilder.buildproperties.IBuildProperty; |
| import org.eclipse.cdt.managedbuilder.buildproperties.IBuildPropertyManager; |
| import org.eclipse.cdt.managedbuilder.envvar.IEnvironmentBuildPathsChangeListener; |
| import org.eclipse.cdt.managedbuilder.envvar.IEnvironmentVariableProvider; |
| import org.eclipse.cdt.managedbuilder.internal.buildproperties.BuildPropertyManager; |
| import org.eclipse.cdt.managedbuilder.internal.core.BooleanExpressionApplicabilityCalculator; |
| import org.eclipse.cdt.managedbuilder.internal.core.BuildDbgUtil; |
| import org.eclipse.cdt.managedbuilder.internal.core.BuildObject; |
| import org.eclipse.cdt.managedbuilder.internal.core.BuildSettingsUtil; |
| import org.eclipse.cdt.managedbuilder.internal.core.Builder; |
| import org.eclipse.cdt.managedbuilder.internal.core.BuilderFactory; |
| import org.eclipse.cdt.managedbuilder.internal.core.CommonBuilder; |
| import org.eclipse.cdt.managedbuilder.internal.core.Configuration; |
| import org.eclipse.cdt.managedbuilder.internal.core.DefaultManagedConfigElement; |
| import org.eclipse.cdt.managedbuilder.internal.core.FolderInfo; |
| import org.eclipse.cdt.managedbuilder.internal.core.IMatchKeyProvider; |
| import org.eclipse.cdt.managedbuilder.internal.core.InputType; |
| import org.eclipse.cdt.managedbuilder.internal.core.ManagedBuildInfo; |
| import org.eclipse.cdt.managedbuilder.internal.core.ManagedCommandLineGenerator; |
| import org.eclipse.cdt.managedbuilder.internal.core.ManagedMakeMessages; |
| import org.eclipse.cdt.managedbuilder.internal.core.ManagedProject; |
| import org.eclipse.cdt.managedbuilder.internal.core.MatchKey; |
| import org.eclipse.cdt.managedbuilder.internal.core.MultiConfiguration; |
| import org.eclipse.cdt.managedbuilder.internal.core.MultiFolderInfo; |
| import org.eclipse.cdt.managedbuilder.internal.core.MultiResourceInfo; |
| import org.eclipse.cdt.managedbuilder.internal.core.Option; |
| import org.eclipse.cdt.managedbuilder.internal.core.OptionCategory; |
| import org.eclipse.cdt.managedbuilder.internal.core.OutputType; |
| import org.eclipse.cdt.managedbuilder.internal.core.ProjectType; |
| import org.eclipse.cdt.managedbuilder.internal.core.ResourceConfiguration; |
| import org.eclipse.cdt.managedbuilder.internal.core.Target; |
| import org.eclipse.cdt.managedbuilder.internal.core.TargetPlatform; |
| import org.eclipse.cdt.managedbuilder.internal.core.Tool; |
| import org.eclipse.cdt.managedbuilder.internal.core.ToolChain; |
| import org.eclipse.cdt.managedbuilder.internal.dataprovider.BuildConfigurationData; |
| import org.eclipse.cdt.managedbuilder.internal.dataprovider.BuildEntryStorage; |
| import org.eclipse.cdt.managedbuilder.internal.dataprovider.ConfigurationDataProvider; |
| import org.eclipse.cdt.managedbuilder.internal.envvar.EnvironmentVariableProvider; |
| import org.eclipse.cdt.managedbuilder.internal.macros.BuildMacroProvider; |
| import org.eclipse.cdt.managedbuilder.internal.tcmodification.ToolChainModificationManager; |
| import org.eclipse.cdt.managedbuilder.macros.IBuildMacroProvider; |
| import org.eclipse.cdt.managedbuilder.makegen.IManagedBuilderMakefileGenerator; |
| import org.eclipse.cdt.managedbuilder.makegen.gnu.GnuMakefileGenerator; |
| import org.eclipse.cdt.managedbuilder.projectconverter.UpdateManagedProjectManager; |
| import org.eclipse.cdt.managedbuilder.tcmodification.IToolChainModificationManager; |
| import org.eclipse.core.resources.ICommand; |
| import org.eclipse.core.resources.IContainer; |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.IResourceStatus; |
| import org.eclipse.core.resources.IWorkspaceRoot; |
| import org.eclipse.core.resources.IWorkspaceRunnable; |
| import org.eclipse.core.resources.IncrementalProjectBuilder; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.Assert; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IConfigurationElement; |
| import org.eclipse.core.runtime.IExtension; |
| import org.eclipse.core.runtime.IExtensionPoint; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.NullProgressMonitor; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.core.runtime.SubProgressMonitor; |
| import org.eclipse.core.runtime.URIUtil; |
| import org.eclipse.core.runtime.jobs.Job; |
| import org.eclipse.jface.dialogs.MessageDialog; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.ui.IWorkbenchWindow; |
| import org.eclipse.ui.PlatformUI; |
| import org.osgi.framework.Bundle; |
| import org.osgi.framework.Version; |
| import org.w3c.dom.Document; |
| import org.w3c.dom.Element; |
| import org.w3c.dom.Node; |
| import org.w3c.dom.NodeList; |
| import org.w3c.dom.ProcessingInstruction; |
| |
| /** |
| * This is the main entry point for getting at the build information |
| * for the managed build system. |
| * |
| * @noextend This class is not intended to be subclassed by clients. |
| * @noinstantiate This class is not intended to be instantiated by clients. |
| */ |
| public class ManagedBuildManager extends AbstractCExtension { |
| // private static final QualifiedName buildInfoProperty = new QualifiedName(ManagedBuilderCorePlugin.PLUGIN_ID, "managedBuildInfo"); //$NON-NLS-1$ |
| private static final String ROOT_NODE_NAME = "ManagedProjectBuildInfo"; //$NON-NLS-1$ |
| public static final String SETTINGS_FILE_NAME = ".cdtbuild"; //$NON-NLS-1$ |
| private static final ITarget[] emptyTargets = new ITarget[0]; |
| public static final String INTERFACE_IDENTITY = ManagedBuilderCorePlugin.PLUGIN_ID + ".ManagedBuildManager"; //$NON-NLS-1$ |
| public static final String EXTENSION_POINT_ID = ManagedBuilderCorePlugin.PLUGIN_ID + ".buildDefinitions"; //$NON-NLS-1$ |
| public static final String EXTENSION_POINT_ID_V2 = ManagedBuilderCorePlugin.PLUGIN_ID + ".ManagedBuildInfo"; //$NON-NLS-1$ |
| private static final String REVISION_ELEMENT_NAME = "managedBuildRevision"; //$NON-NLS-1$ |
| private static final String VERSION_ELEMENT_NAME = "fileVersion"; //$NON-NLS-1$ |
| private static final String MANIFEST_VERSION_ERROR = "ManagedBuildManager.error.manifest.version.error"; //$NON-NLS-1$ |
| private static final String PROJECT_VERSION_ERROR = "ManagedBuildManager.error.project.version.error"; //$NON-NLS-1$ |
| private static final String PROJECT_FILE_ERROR = "ManagedBuildManager.error.project.file.missing"; //$NON-NLS-1$ |
| private static final String MANIFEST_ERROR_HEADER = "ManagedBuildManager.error.manifest.header"; //$NON-NLS-1$ |
| public static final String MANIFEST_ERROR_RESOLVING = "ManagedBuildManager.error.manifest.resolving"; //$NON-NLS-1$ |
| public static final String MANIFEST_ERROR_DUPLICATE = "ManagedBuildManager.error.manifest.duplicate"; //$NON-NLS-1$ |
| public static final String MANIFEST_ERROR_ICON = "ManagedBuildManager.error.manifest.icon"; //$NON-NLS-1$ |
| private static final String MANIFEST_ERROR_OPTION_CATEGORY = "ManagedBuildManager.error.manifest.option.category"; //$NON-NLS-1$ |
| private static final String MANIFEST_ERROR_OPTION_FILTER = "ManagedBuildManager.error.manifest.option.filter"; //$NON-NLS-1$ |
| private static final String MANIFEST_ERROR_OPTION_VALUEHANDLER = "ManagedBuildManager.error.manifest.option.valuehandler"; //$NON-NLS-1$ |
| private static final String MANIFEST_ERROR_READ_ONLY = "ManagedBuildManager.error.read_only"; //$NON-NLS-1$ |
| private static final String MANIFEST_ERROR_WRITE_FAILED = "ManagedBuildManager.error.write_failed"; //$NON-NLS-1$ |
| |
| // Error ID's for OptionValidError() |
| public static final int ERROR_CATEGORY = 0; |
| public static final int ERROR_FILTER = 1; |
| |
| public static final String BUILD_TYPE_PROPERTY_ID = "org.eclipse.cdt.build.core.buildType"; //$NON-NLS-1$ |
| public static final String BUILD_ARTEFACT_TYPE_PROPERTY_ID = "org.eclipse.cdt.build.core.buildArtefactType"; //$NON-NLS-1$ |
| |
| public static final String BUILD_TYPE_PROPERTY_DEBUG = "org.eclipse.cdt.build.core.buildType.debug"; //$NON-NLS-1$ |
| public static final String BUILD_TYPE_PROPERTY_RELEASE = "org.eclipse.cdt.build.core.buildType.release"; //$NON-NLS-1$ |
| public static final String BUILD_ARTEFACT_TYPE_PROPERTY_EXE = "org.eclipse.cdt.build.core.buildArtefactType.exe"; //$NON-NLS-1$ |
| public static final String BUILD_ARTEFACT_TYPE_PROPERTY_STATICLIB = "org.eclipse.cdt.build.core.buildArtefactType.staticLib"; //$NON-NLS-1$ |
| public static final String BUILD_ARTEFACT_TYPE_PROPERTY_SHAREDLIB = "org.eclipse.cdt.build.core.buildArtefactType.sharedLib"; //$NON-NLS-1$ |
| |
| public static final String CFG_DATA_PROVIDER_ID = ManagedBuilderCorePlugin.PLUGIN_ID + ".configurationDataProvider"; //$NON-NLS-1$ |
| |
| private static final String NEWLINE = System.getProperty("line.separator"); //$NON-NLS-1$ |
| |
| public static final String INTERNAL_BUILDER_ID = "org.eclipse.cdt.build.core.internal.builder"; //$NON-NLS-1$ |
| |
| private static final String os = Platform.getOS(); |
| private static final String arch = Platform.getOSArch(); |
| private static final String ALL = "all"; //$NON-NLS-1$ |
| |
| // This is the version of the manifest and project files |
| private static final Version buildInfoVersion = new Version(4, 0, 0); |
| private static final Version version = new Version(4, 0, 0); |
| private static boolean projectTypesLoaded = false; |
| private static boolean projectTypesLoading = false; |
| // Project types defined in the manifest files |
| public static SortedMap<String, IProjectType> projectTypeMap; |
| private static List<IProjectType> projectTypes; |
| // Early configuration initialization extension elements |
| private static List<IManagedConfigElement> startUpConfigElements; |
| // Configurations defined in the manifest files |
| private static Map<String, IConfiguration> extensionConfigurationMap; |
| // Resource configurations defined in the manifest files |
| private static Map<String, IResourceConfiguration> extensionResourceConfigurationMap; |
| // Tool-chains defined in the manifest files |
| private static SortedMap<String, ToolChain> extensionToolChainMap; |
| // Tools defined in the manifest files |
| private static SortedMap<String, Tool> extensionToolMap; |
| // Target Platforms defined in the manifest files |
| private static Map<String, ITargetPlatform> extensionTargetPlatformMap; |
| // Builders defined in the manifest files |
| private static SortedMap<String, Builder> extensionBuilderMap; |
| // Options defined in the manifest files |
| private static Map<String, IOption> extensionOptionMap; |
| // Option Categories defined in the manifest files |
| private static Map<String, IOptionCategory> extensionOptionCategoryMap; |
| // Input types defined in the manifest files |
| private static Map<String, IInputType> extensionInputTypeMap; |
| // Output types defined in the manifest files |
| private static Map<String, IOutputType> extensionOutputTypeMap; |
| // Targets defined in the manifest files (CDT V2.0 object model) |
| private static Map<String, ITarget> extensionTargetMap; |
| |
| // "Selected configuraton" elements defined in the manifest files. |
| // These are configuration elements that map to objects in the internal |
| // representation of the manifest files. For example, ListOptionValues |
| // and enumeratedOptionValues are NOT included. |
| // Note that these "configuration elements" are not related to the |
| // managed build system "configurations". |
| // From the PDE Guide: |
| // A configuration element, with its attributes and children, directly |
| // reflects the content and structure of the extension section within the |
| // declaring plug-in's manifest (plugin.xml) file. |
| // This map has a lifecycle corresponding to the build definitions extension loading. |
| private static Map<IBuildObject, IManagedConfigElement> configElementMap; |
| |
| // private static List sortedToolChains; |
| // private static Map builtTypeToToolChainListMap; |
| // Listeners interested in build model changes |
| private static Map<IResource, List<IScannerInfoChangeListener>> buildModelListeners; |
| // Random number for derived object model elements |
| private static Random randomNumber; |
| // Environment Build Paths Change Listener |
| private static IEnvironmentBuildPathsChangeListener fEnvironmentBuildPathsChangeListener; |
| |
| private static HashMap<MatchKey<ToolChain>, List<ToolChain>> fSortedToolChains; |
| private static HashMap<MatchKey<Tool>, List<Tool>> fSortedTools; |
| private static HashMap<MatchKey<Builder>, List<Builder>> fSortedBuilders; |
| |
| private static Map<IProject, IManagedBuildInfo> fInfoMap = new HashMap<>(); |
| |
| private static ISorter fToolChainSorter = () -> resortToolChains(); |
| private static ISorter fToolSorter = () -> resortTools(); |
| private static ISorter fBuilderSorter = () -> resortBuilders(); |
| |
| private static interface ISorter { |
| void sort(); |
| } |
| |
| static { |
| getEnvironmentVariableProvider() |
| .subscribe(fEnvironmentBuildPathsChangeListener = (configuration, buildPathType) -> { |
| // if(buildPathType == IEnvVarBuildPath.BUILDPATH_INCLUDE){ |
| // initializePathEntries(configuration,null); |
| // notifyListeners(configuration,null); |
| // } |
| }); |
| } |
| |
| /** |
| * @return the next random number as a positive integer. |
| */ |
| public static int getRandomNumber() { |
| if (randomNumber == null) { |
| // Set the random number seed |
| randomNumber = new Random(); |
| randomNumber.setSeed(System.currentTimeMillis()); |
| } |
| int i = randomNumber.nextInt(); |
| if (i < 0) { |
| i *= -1; |
| } |
| return i; |
| } |
| |
| /** |
| * @return the list of project types that are defined by this project, |
| * projects referenced by this project, and by the extensions. |
| */ |
| public static IProjectType[] getDefinedProjectTypes() { |
| try { |
| // Make sure the extensions are loaded |
| loadExtensions(); |
| } catch (BuildException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| |
| // Create the array and copy the elements over |
| int size = projectTypes != null ? projectTypes.size() : 0; |
| |
| IProjectType[] types = new IProjectType[size]; |
| |
| int n = 0; |
| for (IProjectType type : projectTypes) { |
| types[n++] = type; |
| } |
| |
| return types; |
| } |
| |
| /** |
| * @param id - id of the project type |
| * @return the project type with the passed in ID |
| */ |
| public static IProjectType getProjectType(String id) { |
| try { |
| // Make sure the extensions are loaded |
| loadExtensions(); |
| } catch (BuildException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| |
| return getExtensionProjectTypeMap().get(id); |
| } |
| |
| public static Version getVersion() { |
| return version; |
| } |
| |
| /** |
| * Safe accessor for the map of IDs to ProjectTypes |
| */ |
| public static SortedMap<String, IProjectType> getExtensionProjectTypeMap() { |
| try { |
| loadExtensions(); |
| } catch (BuildException e) { |
| } |
| if (projectTypeMap == null) { |
| projectTypeMap = new TreeMap<>(); |
| } |
| return projectTypeMap; |
| } |
| |
| /** |
| * Safe accessor for the map of IDs to Configurations |
| */ |
| protected static Map<String, IConfiguration> getExtensionConfigurationMap() { |
| if (extensionConfigurationMap == null) { |
| extensionConfigurationMap = new HashMap<>(); |
| } |
| return extensionConfigurationMap; |
| } |
| |
| /** |
| * Safe accessor for the map of IDs to Resource Configurations |
| */ |
| protected static Map<String, IResourceConfiguration> getExtensionResourceConfigurationMap() { |
| if (extensionResourceConfigurationMap == null) { |
| extensionResourceConfigurationMap = new HashMap<>(); |
| } |
| return extensionResourceConfigurationMap; |
| } |
| |
| /** |
| * Safe internal accessor for the map of IDs to ToolChains |
| */ |
| private static SortedMap<String, ToolChain> getExtensionToolChainMapInternal() { |
| try { |
| loadExtensions(); |
| } catch (BuildException e) { |
| } |
| |
| if (extensionToolChainMap == null) { |
| extensionToolChainMap = new TreeMap<>(); |
| } |
| return extensionToolChainMap; |
| } |
| |
| /** |
| * Safe accessor for the map of IDs to ToolChains |
| */ |
| public static SortedMap<String, ? extends IToolChain> getExtensionToolChainMap() { |
| return getExtensionToolChainMapInternal(); |
| } |
| |
| public static IToolChain[] getExtensionToolChains() { |
| return getExtensionToolChainMapInternal().values().toArray(new ToolChain[extensionToolChainMap.size()]); |
| } |
| |
| /** |
| * Safe internal accessor for the map of IDs to Tools |
| */ |
| private static SortedMap<String, Tool> getExtensionToolMapInternal() { |
| try { |
| loadExtensions(); |
| } catch (BuildException e) { |
| } |
| if (extensionToolMap == null) { |
| extensionToolMap = new TreeMap<>(); |
| } |
| return extensionToolMap; |
| } |
| |
| /** |
| * Safe accessor for the map of IDs to Tools |
| */ |
| public static SortedMap<String, ? extends ITool> getExtensionToolMap() { |
| return getExtensionToolMapInternal(); |
| } |
| |
| public static ITool[] getExtensionTools() { |
| return getExtensionToolMapInternal().values().toArray(new Tool[extensionToolMap.size()]); |
| } |
| |
| /** |
| * Safe accessor for the map of IDs to TargetPlatforms |
| */ |
| protected static Map<String, ITargetPlatform> getExtensionTargetPlatformMap() { |
| if (extensionTargetPlatformMap == null) { |
| extensionTargetPlatformMap = new HashMap<>(); |
| } |
| return extensionTargetPlatformMap; |
| } |
| |
| /** |
| * Safe internal accessor for the map of IDs to Builders |
| */ |
| private static SortedMap<String, Builder> getExtensionBuilderMapInternal() { |
| try { |
| loadExtensions(); |
| } catch (BuildException e) { |
| } |
| if (extensionBuilderMap == null) { |
| extensionBuilderMap = new TreeMap<>(); |
| } |
| return extensionBuilderMap; |
| } |
| |
| /** |
| * Safe accessor for the map of IDs to Builders |
| */ |
| public static SortedMap<String, ? extends IBuilder> getExtensionBuilderMap() { |
| return getExtensionBuilderMapInternal(); |
| } |
| |
| public static IBuilder[] getExtensionBuilders() { |
| return getExtensionBuilderMapInternal().values().toArray(new Builder[extensionBuilderMap.size()]); |
| } |
| |
| /** |
| * Safe accessor for the map of IDs to Options |
| */ |
| protected static Map<String, IOption> getExtensionOptionMap() { |
| if (extensionOptionMap == null) { |
| extensionOptionMap = new HashMap<>(); |
| } |
| return extensionOptionMap; |
| } |
| |
| /** |
| * Safe accessor for the map of IDs to Option Categories |
| */ |
| protected static Map<String, IOptionCategory> getExtensionOptionCategoryMap() { |
| if (extensionOptionCategoryMap == null) { |
| extensionOptionCategoryMap = new HashMap<>(); |
| } |
| return extensionOptionCategoryMap; |
| } |
| |
| /** |
| * Safe accessor for the map of IDs to InputTypes |
| */ |
| protected static Map<String, IInputType> getExtensionInputTypeMap() { |
| if (extensionInputTypeMap == null) { |
| extensionInputTypeMap = new HashMap<>(); |
| } |
| return extensionInputTypeMap; |
| } |
| |
| /** |
| * Safe accessor for the map of IDs to OutputTypes |
| */ |
| protected static Map<String, IOutputType> getExtensionOutputTypeMap() { |
| if (extensionOutputTypeMap == null) { |
| extensionOutputTypeMap = new HashMap<>(); |
| } |
| return extensionOutputTypeMap; |
| } |
| |
| /** |
| * Safe accessor for the map of IDs to Targets (CDT V2.0 object model) |
| */ |
| protected static Map<String, ITarget> getExtensionTargetMap() { |
| if (extensionTargetMap == null) { |
| extensionTargetMap = new HashMap<>(); |
| } |
| return extensionTargetMap; |
| } |
| |
| /** |
| * @return the targets owned by this resource. If none are owned, |
| * an empty array is returned. |
| */ |
| public static ITarget[] getTargets(IResource resource) { |
| IManagedBuildInfo buildInfo = getBuildInfo(resource); |
| |
| if (buildInfo != null) { |
| List<ITarget> targets = buildInfo.getTargets(); |
| return targets.toArray(new ITarget[targets.size()]); |
| } |
| return emptyTargets; |
| } |
| |
| /** |
| * @return the project type from the manifest with the ID specified in the argument |
| * or {@code null}. |
| */ |
| public static IProjectType getExtensionProjectType(String id) { |
| try { |
| // Make sure the extensions are loaded |
| loadExtensions(); |
| } catch (BuildException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| |
| return getExtensionProjectTypeMap().get(id); |
| } |
| |
| /** |
| * @return the base extension configuration from the manifest (plugin.xml) |
| * or {@code null} if not found. |
| * |
| * @since 8.0 |
| */ |
| public static IConfiguration getExtensionConfiguration(IConfiguration cfg) { |
| for (; cfg != null && !cfg.isExtensionElement(); cfg = cfg.getParent()) { |
| // empty loop to find base configuration |
| } |
| return cfg; |
| } |
| |
| /** |
| * @return the configuration from the manifest with the ID specified in the argument |
| * or {@code null}. |
| */ |
| public static IConfiguration getExtensionConfiguration(String id) { |
| try { |
| // Make sure the extensions are loaded |
| loadExtensions(); |
| } catch (BuildException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| |
| return getExtensionConfigurationMap().get(id); |
| } |
| |
| public static IConfiguration[] getExtensionConfigurations() { |
| try { |
| // Make sure the extensions are loaded |
| loadExtensions(); |
| } catch (BuildException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| |
| return getExtensionConfigurationMap().values() |
| .toArray(new Configuration[getExtensionConfigurationMap().size()]); |
| } |
| |
| /** |
| * @return the resource configuration from the manifest with the ID specified in the argument |
| * or {@code null}. |
| */ |
| public static IResourceConfiguration getExtensionResourceConfiguration(String id) { |
| try { |
| // Make sure the extensions are loaded |
| loadExtensions(); |
| } catch (BuildException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| |
| return getExtensionResourceConfigurationMap().get(id); |
| } |
| |
| /** |
| * @return the tool-chain from the manifest with the ID specified in the argument |
| * or {@code null}. |
| */ |
| public static IToolChain getExtensionToolChain(String id) { |
| return getExtensionToolChainMapInternal().get(id); |
| } |
| |
| /** |
| * @return the tool from the manifest with the ID specified in the argument |
| * or {@code null}. |
| */ |
| public static ITool getExtensionTool(String id) { |
| return getExtensionToolMapInternal().get(id); |
| } |
| |
| /** |
| * @return the target platform from the manifest with the ID specified in the argument |
| * or {@code null}. |
| */ |
| public static ITargetPlatform getExtensionTargetPlatform(String id) { |
| try { |
| // Make sure the extensions are loaded |
| loadExtensions(); |
| } catch (BuildException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| |
| return getExtensionTargetPlatformMap().get(id); |
| } |
| |
| /** |
| * @return the builder from the manifest with the ID specified in the argument |
| * or {@code null}. |
| */ |
| public static IBuilder getExtensionBuilder(String id) { |
| return getExtensionBuilderMapInternal().get(id); |
| } |
| |
| public static IBuilder getExtensionBuilder(IBuilder builder) { |
| for (; builder != null && !builder.isExtensionElement(); builder = builder.getSuperClass()) { |
| // empty loop to find parent builder |
| } |
| return builder; |
| } |
| |
| /** |
| * @return the option from the manifest with the ID specified in the argument |
| * or {@code null}. |
| */ |
| public static IOption getExtensionOption(String id) { |
| try { |
| // Make sure the extensions are loaded |
| loadExtensions(); |
| } catch (BuildException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| |
| return getExtensionOptionMap().get(id); |
| } |
| |
| /** |
| * @return the InputType from the manifest with the ID specified in the argument |
| * or {@code null}. |
| */ |
| public static IInputType getExtensionInputType(String id) { |
| try { |
| // Make sure the extensions are loaded |
| loadExtensions(); |
| } catch (BuildException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| |
| return getExtensionInputTypeMap().get(id); |
| } |
| |
| /** |
| * @return the OutputType from the manifest with the ID specified in the argument |
| * or {@code null}. |
| */ |
| public static IOutputType getExtensionOutputType(String id) { |
| try { |
| // Make sure the extensions are loaded |
| loadExtensions(); |
| } catch (BuildException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| |
| return getExtensionOutputTypeMap().get(id); |
| } |
| |
| /** |
| * @return the target from the manifest with the ID specified in the argument |
| * or {@code null} - CDT V2.0 object model. |
| */ |
| public static ITarget getExtensionTarget(String id) { |
| try { |
| // Make sure the extensions are loaded |
| loadExtensions(); |
| } catch (BuildException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| |
| return getExtensionTargetMap().get(id); |
| } |
| |
| /** |
| * @param resource to find the target |
| * @param id - ID of the target |
| * |
| * @return the result of a best-effort search to find a target with the |
| * specified ID, or {@code null} if one is not found. |
| */ |
| public static ITarget getTarget(IResource resource, String id) { |
| ITarget target = null; |
| // Check if the target is spec'd in the build info for the resource |
| if (resource != null) { |
| IManagedBuildInfo buildInfo = getBuildInfo(resource); |
| if (buildInfo != null) |
| target = buildInfo.getTarget(id); |
| } |
| // OK, check the extension map |
| if (target == null) { |
| target = getExtensionTargetMap().get(id); |
| } |
| return target; |
| } |
| |
| /** |
| * Sets the default configuration for the project. Note that this will also |
| * update the default target if needed. |
| */ |
| public static void setDefaultConfiguration(IProject project, IConfiguration newDefault) { |
| if (project == null || newDefault == null) { |
| return; |
| } |
| // Set the default in build information for the project |
| IManagedBuildInfo info = getBuildInfo(project); |
| if (info != null) { |
| info.setDefaultConfiguration(newDefault); |
| } |
| } |
| |
| /** |
| * Sets the currently selected configuration. This is used while the project |
| * property pages are displayed |
| */ |
| public static void setSelectedConfiguration(IProject project, IConfiguration config) { |
| if (project == null) { |
| return; |
| } |
| // Set the default in build information for the project |
| IManagedBuildInfo info = getBuildInfo(project); |
| if (info != null) { |
| info.setSelectedConfiguration(config); |
| } |
| } |
| |
| public static IManagedBuilderMakefileGenerator getBuildfileGenerator(IConfiguration config) { |
| IToolChain toolChain = config.getToolChain(); |
| if (toolChain != null) { |
| IBuilder builder = toolChain.getBuilder(); |
| if (builder != null) |
| return builder.getBuildFileGenerator(); |
| } |
| // If no generator is defined, return the default GNU generator |
| return new GnuMakefileGenerator(); |
| } |
| |
| /** |
| * load tool provider defined or default (if not found) command line generator special for selected tool |
| * @param toolId - id selected tool ID |
| */ |
| public static IManagedCommandLineGenerator getCommandLineGenerator(IConfiguration config, String toolId) { |
| ITool tool = config.getTool(toolId); |
| if (tool != null) { |
| return tool.getCommandLineGenerator(); |
| } |
| return ManagedCommandLineGenerator.getCommandLineGenerator(); |
| } |
| |
| /** |
| * Targets may have a scanner config discovery profile defined that knows |
| * how to discover built-in compiler defines and includes search paths. |
| * Find the profile for the target specified. |
| * |
| * @return scanner configuration discovery profile id |
| */ |
| public static String getScannerInfoProfileId(IConfiguration config) { |
| IToolChain toolChain = config.getToolChain(); |
| return toolChain.getScannerConfigDiscoveryProfileId(); |
| } |
| |
| /** |
| * Gets the currently selected target. This is used while the project |
| * property pages are displayed. |
| * |
| * @return target configuration. |
| */ |
| public static IConfiguration getSelectedConfiguration(IProject project) { |
| if (project == null) { |
| return null; |
| } |
| // Set the default in build information for the project |
| IManagedBuildInfo info = getBuildInfo(project); |
| if (info != null) { |
| return info.getSelectedConfiguration(); |
| } |
| return null; |
| } |
| |
| /* (non-Javadoc) |
| * |
| * @param config |
| * @param option |
| */ |
| /* |
| private static void notifyListeners(IConfiguration config, IOption option) { |
| // Continue if change is something that effect the scanner |
| try { |
| //an option can be null in the case of calling this method from the environment |
| //build path change listener |
| if (config.isTemporary() || |
| (option != null && option.getValueType() != IOption.INCLUDE_PATH |
| && option.getValueType() != IOption.PREPROCESSOR_SYMBOLS |
| && option.getValueType() != IOption.INCLUDE_FILES |
| && option.getValueType() != IOption.LIBRARY_PATHS |
| && option.getValueType() != IOption.LIBRARY_FILES |
| && option.getValueType() != IOption.MACRO_FILES |
| && option.getValueType() != IOption.UNDEF_INCLUDE_PATH |
| && option.getValueType() != IOption.UNDEF_PREPROCESSOR_SYMBOLS |
| && option.getValueType() != IOption.UNDEF_INCLUDE_FILES |
| && option.getValueType() != IOption.UNDEF_LIBRARY_PATHS |
| && option.getValueType() != IOption.UNDEF_LIBRARY_FILES |
| && option.getValueType() != IOption.UNDEF_MACRO_FILES |
| )) { |
| return; |
| } |
| } catch (BuildException e) {return;} |
| |
| // Figure out if there is a listener for this change |
| IResource resource = config.getOwner(); |
| List listeners = (List) getBuildModelListeners().get(resource); |
| if (listeners == null) { |
| return; |
| } |
| ListIterator iter = listeners.listIterator(); |
| while (iter.hasNext()) { |
| ((IScannerInfoChangeListener)iter.next()).changeNotification(resource, (IScannerInfo)getBuildInfo(resource)); |
| } |
| } |
| */ |
| public static void initializePathEntries(IConfiguration config, IOption option) { |
| try { |
| if (config.isTemporary() || (option != null && option.getValueType() != IOption.INCLUDE_PATH |
| && option.getValueType() != IOption.PREPROCESSOR_SYMBOLS |
| && option.getValueType() != IOption.INCLUDE_FILES && option.getValueType() != IOption.LIBRARY_PATHS |
| && option.getValueType() != IOption.LIBRARY_FILES && option.getValueType() != IOption.MACRO_FILES |
| && option.getValueType() != IOption.UNDEF_INCLUDE_PATH |
| && option.getValueType() != IOption.UNDEF_PREPROCESSOR_SYMBOLS |
| && option.getValueType() != IOption.UNDEF_INCLUDE_FILES |
| && option.getValueType() != IOption.UNDEF_LIBRARY_PATHS |
| && option.getValueType() != IOption.UNDEF_LIBRARY_FILES |
| && option.getValueType() != IOption.UNDEF_MACRO_FILES)) |
| return; |
| } catch (BuildException e) { |
| return; |
| } |
| |
| try { |
| updateCoreSettings(config); |
| } catch (CoreException e) { |
| } |
| |
| } |
| |
| public static void initializePathEntries(IResourceConfiguration resConfig, IOption option) { |
| IConfiguration cfg = resConfig.getParent(); |
| if (cfg != null) |
| initializePathEntries(cfg, option); |
| } |
| |
| private static void notifyListeners(IResourceInfo resConfig, IOption option) { |
| // Continue if change is something that effect the scanreser |
| try { |
| if (resConfig.getParent().isTemporary() || (option != null && option.getValueType() != IOption.INCLUDE_PATH |
| && option.getValueType() != IOption.PREPROCESSOR_SYMBOLS |
| && option.getValueType() != IOption.INCLUDE_FILES && option.getValueType() != IOption.LIBRARY_PATHS |
| && option.getValueType() != IOption.LIBRARY_FILES && option.getValueType() != IOption.MACRO_FILES |
| && option.getValueType() != IOption.UNDEF_INCLUDE_PATH |
| && option.getValueType() != IOption.UNDEF_PREPROCESSOR_SYMBOLS |
| && option.getValueType() != IOption.UNDEF_INCLUDE_FILES |
| && option.getValueType() != IOption.UNDEF_LIBRARY_PATHS |
| && option.getValueType() != IOption.UNDEF_LIBRARY_FILES |
| && option.getValueType() != IOption.UNDEF_MACRO_FILES && !option.isForScannerDiscovery())) { |
| return; |
| } |
| } catch (BuildException e) { |
| return; |
| } |
| |
| // Figure out if there is a listener for this change |
| IResource resource = resConfig.getParent().getOwner(); |
| List<IScannerInfoChangeListener> listeners = getBuildModelListeners().get(resource); |
| if (listeners == null) { |
| return; |
| } |
| ListIterator<IScannerInfoChangeListener> iter = listeners.listIterator(); |
| while (iter.hasNext()) { |
| iter.next().changeNotification(resource, (IScannerInfo) getBuildInfo(resource)); |
| } |
| } |
| |
| /** |
| * Adds the version of the managed build system to the project |
| * specified in the argument. |
| * |
| * @param newProject the project to version |
| */ |
| public static void setNewProjectVersion(IProject newProject) { |
| // Get the build info for the argument |
| ManagedBuildInfo info = findBuildInfo(newProject, true); |
| if (info != null) |
| info.setVersion(buildInfoVersion.toString()); |
| } |
| |
| /** |
| * Set the boolean value for an option for a given config. |
| * |
| * @param config The configuration the option belongs to. |
| * @param holder The holder/parent of the option. |
| * @param option The option to set the value for. |
| * @param value The boolean that the option should contain after the change. |
| * |
| * @return The modified option. This can be the same option or a newly created option. |
| * |
| * @since 3.0 - The type and name of the <code>ITool tool</code> parameter |
| * has changed to <code>IHoldsOptions holder</code>. Client code |
| * assuming <code>ITool</code> as type, will continue to work unchanged. |
| */ |
| public static IOption setOption(IConfiguration config, IHoldsOptions holder, IOption option, boolean value) { |
| IOption retOpt; |
| try { |
| // Request a value change and set dirty if real change results |
| retOpt = config.setOption(holder, option, value); |
| if (retOpt.getValueHandler().handleValue(config, holder, retOpt, retOpt.getValueHandlerExtraArgument(), |
| IManagedOptionValueHandler.EVENT_APPLY)) { |
| // TODO : Event is handled successfully and returned true. |
| // May need to do something here say log a message. |
| } else { |
| // Event handling Failed. |
| } |
| // initializePathEntries(config,retOpt); |
| // notifyListeners(config, retOpt); |
| } catch (BuildException e) { |
| return null; |
| } |
| return retOpt; |
| } |
| |
| /** |
| * Set the boolean value for an option for a given config. |
| * |
| * @param resConfig The resource configuration the option belongs to. |
| * @param holder The holder/parent of the option. |
| * @param option The option to set the value for. |
| * @param value The boolean that the option should contain after the change. |
| * |
| * @return The modified option. This can be the same option or a newly created option. |
| * |
| * @since 3.0 - The type and name of the <code>ITool tool</code> parameter |
| * has changed to <code>IHoldsOptions holder</code>. Client code |
| * assuming <code>ITool</code> as type, will continue to work unchanged. |
| */ |
| public static IOption setOption(IResourceInfo resConfig, IHoldsOptions holder, IOption option, boolean value) { |
| IOption retOpt; |
| try { |
| // Request a value change and set dirty if real change results |
| retOpt = resConfig.setOption(holder, option, value); |
| if (retOpt != null && retOpt.getValueHandler().handleValue(resConfig, holder, retOpt, |
| retOpt.getValueHandlerExtraArgument(), IManagedOptionValueHandler.EVENT_APPLY)) { |
| // TODO : Event is handled successfully and returned true. |
| // May need to do something here say log a message. |
| } else { |
| // Event handling Failed. |
| } |
| // initializePathEntries(resConfig,retOpt); |
| notifyListeners(resConfig, retOpt); |
| } catch (BuildException e) { |
| return null; |
| } |
| return retOpt; |
| } |
| |
| /** |
| * Set the string value for an option for a given config. |
| * |
| * @param config The configuration the option belongs to. |
| * @param holder The holder/parent of the option. |
| * @param option The option to set the value for. |
| * @param value The value that the option should contain after the change. |
| * |
| * @return The modified option. This can be the same option or a newly created option. |
| * |
| * @since 3.0 - The type and name of the <code>ITool tool</code> parameter |
| * has changed to <code>IHoldsOptions holder</code>. Client code |
| * assuming <code>ITool</code> as type, will continue to work unchanged. |
| */ |
| public static IOption setOption(IConfiguration config, IHoldsOptions holder, IOption option, String value) { |
| IOption retOpt; |
| try { |
| retOpt = config.setOption(holder, option, value); |
| if (retOpt.getValueHandler().handleValue(config, holder, retOpt, retOpt.getValueHandlerExtraArgument(), |
| IManagedOptionValueHandler.EVENT_APPLY)) { |
| // TODO : Event is handled successfully and returned true. |
| // May need to do something here say log a message. |
| } else { |
| // Event handling Failed. |
| } |
| // initializePathEntries(config,retOpt); |
| // notifyListeners(config, retOpt); |
| } catch (BuildException e) { |
| return null; |
| } |
| return retOpt; |
| } |
| |
| /** |
| * Set the string value for an option for a given resource config. |
| * |
| * @param resConfig The resource configuration the option belongs to. |
| * @param holder The holder/parent of the option. |
| * @param option The option to set the value for. |
| * @param value The value that the option should contain after the change. |
| * |
| * @return The modified option. This can be the same option or a newly created option. |
| * |
| * @since 3.0 - The type and name of the <code>ITool tool</code> parameter |
| * has changed to <code>IHoldsOptions holder</code>. Client code |
| * assuming <code>ITool</code> as type, will continue to work unchanged. |
| */ |
| public static IOption setOption(IResourceInfo resConfig, IHoldsOptions holder, IOption option, String value) { |
| IOption retOpt; |
| try { |
| retOpt = resConfig.setOption(holder, option, value); |
| if (retOpt.getValueHandler().handleValue(resConfig, holder, retOpt, retOpt.getValueHandlerExtraArgument(), |
| IManagedOptionValueHandler.EVENT_APPLY)) { |
| // TODO : Event is handled successfully and returned true. |
| // May need to do something here say log a message. |
| } else { |
| // Event handling Failed. |
| } |
| // initializePathEntries(resConfig,retOpt); |
| notifyListeners(resConfig, retOpt); |
| } catch (BuildException e) { |
| return null; |
| } |
| return retOpt; |
| } |
| |
| /** |
| * Set the string array value for an option for a given config. |
| * |
| * @param config The configuration the option belongs to. |
| * @param holder The holder/parent of the option. |
| * @param option The option to set the value for. |
| * @param value The values the option should contain after the change. |
| * |
| * @return The modified option. This can be the same option or a newly created option. |
| * |
| * @since 3.0 - The type and name of the <code>ITool tool</code> parameter |
| * has changed to <code>IHoldsOptions holder</code>. Client code |
| * assuming <code>ITool</code> as type, will continue to work unchanged. |
| */ |
| public static IOption setOption(IConfiguration config, IHoldsOptions holder, IOption option, String[] value) { |
| IOption retOpt; |
| try { |
| retOpt = config.setOption(holder, option, value); |
| if (retOpt.getValueHandler().handleValue(config, holder, retOpt, retOpt.getValueHandlerExtraArgument(), |
| IManagedOptionValueHandler.EVENT_APPLY)) { |
| // TODO : Event is handled successfully and returned true. |
| // May need to do something here say log a message. |
| } else { |
| // Event handling Failed. |
| } |
| // initializePathEntries(config,retOpt); |
| // notifyListeners(config, retOpt); |
| } catch (BuildException e) { |
| return null; |
| } |
| return retOpt; |
| } |
| |
| /** |
| * Set the string array value for an option for a given resource config. |
| * |
| * @param resConfig The resource configuration the option belongs to. |
| * @param holder The holder/parent of the option. |
| * @param option The option to set the value for. |
| * @param value The values the option should contain after the change. |
| * |
| * @return The modified option. This can be the same option or a newly created option. |
| * |
| * @since 3.0 - The type and name of the <code>ITool tool</code> parameter |
| * has changed to <code>IHoldsOptions holder</code>. Client code |
| * assuming <code>ITool</code> as type, will continue to work unchanged. |
| */ |
| public static IOption setOption(IResourceInfo resConfig, IHoldsOptions holder, IOption option, String[] value) { |
| IOption retOpt; |
| try { |
| retOpt = resConfig.setOption(holder, option, value); |
| if (retOpt.getValueHandler().handleValue(resConfig, holder, retOpt, retOpt.getValueHandlerExtraArgument(), |
| IManagedOptionValueHandler.EVENT_APPLY)) { |
| // TODO : Event is handled successfully and returned true. |
| // May need to do something here say log a message. |
| } else { |
| // Event handling Failed. |
| } |
| // initializePathEntries(resConfig,retOpt); |
| notifyListeners(resConfig, retOpt); |
| } catch (BuildException e) { |
| return null; |
| } |
| return retOpt; |
| } |
| |
| public static IOption setOption(IResourceInfo resConfig, IHoldsOptions holder, IOption option, |
| OptionStringValue[] value) { |
| IOption retOpt; |
| try { |
| retOpt = resConfig.setOption(holder, option, value); |
| if (retOpt.getValueHandler().handleValue(resConfig, holder, retOpt, retOpt.getValueHandlerExtraArgument(), |
| IManagedOptionValueHandler.EVENT_APPLY)) { |
| // TODO : Event is handled successfully and returned true. |
| // May need to do something here say log a message. |
| } else { |
| // Event handling Failed. |
| } |
| // initializePathEntries(resConfig,retOpt); |
| notifyListeners(resConfig, retOpt); |
| } catch (BuildException e) { |
| return null; |
| } |
| return retOpt; |
| } |
| |
| public static void setToolCommand(IConfiguration config, ITool tool, String command) { |
| // The tool may be a reference. |
| if (tool instanceof IToolReference) { |
| // If so, just set the command in the reference |
| ((IToolReference) tool).setToolCommand(command); |
| } else { |
| config.setToolCommand(tool, command); |
| } |
| } |
| |
| public static void setToolCommand(IResourceConfiguration resConfig, ITool tool, String command) { |
| // The tool may be a reference. |
| if (tool instanceof IToolReference) { |
| // If so, just set the command in the reference |
| ((IToolReference) tool).setToolCommand(command); |
| } else { |
| resConfig.setToolCommand(tool, command); |
| } |
| } |
| |
| public static boolean saveBuildInfoLegacy(IProject project, boolean force) { |
| // Create document |
| Exception err = null; |
| try { |
| DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); |
| Document doc = builder.newDocument(); |
| |
| // Get the build information for the project |
| ManagedBuildInfo buildInfo = (ManagedBuildInfo) getBuildInfo(project); |
| |
| // Save the build info |
| if (buildInfo != null && !buildInfo.isReadOnly() && buildInfo.isValid() |
| && (force == true || buildInfo.isDirty())) { |
| // For post-2.0 projects, there will be a version |
| String projectVersion = buildInfo.getVersion(); |
| if (projectVersion != null) { |
| ProcessingInstruction instruction = doc.createProcessingInstruction(VERSION_ELEMENT_NAME, |
| projectVersion); |
| doc.appendChild(instruction); |
| } |
| Element rootElement = doc.createElement(ROOT_NODE_NAME); |
| doc.appendChild(rootElement); |
| buildInfo.serializeLegacy(doc, rootElement); |
| |
| // Transform the document to something we can save in a file |
| ByteArrayOutputStream stream = new ByteArrayOutputStream(); |
| Transformer transformer = TransformerFactory.newInstance().newTransformer(); |
| transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$ |
| transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); //$NON-NLS-1$ |
| transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$ |
| DOMSource source = new DOMSource(doc); |
| StreamResult result = new StreamResult(stream); |
| transformer.transform(source, result); |
| |
| // Save the document |
| IFile projectFile = project.getFile(SETTINGS_FILE_NAME); |
| String utfString = stream.toString("UTF-8"); //$NON-NLS-1$ |
| |
| if (projectFile.exists()) { |
| if (projectFile.isReadOnly()) { |
| // If we are not running headless, and there is a UI Window around, grab it |
| // and the associated shell |
| IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); |
| if (window == null) { |
| IWorkbenchWindow windows[] = PlatformUI.getWorkbench().getWorkbenchWindows(); |
| window = windows[0]; |
| } |
| Shell shell = null; |
| if (window != null) { |
| shell = window.getShell(); |
| } |
| // Inform Eclipse that we are intending to modify this file |
| // This will provide the user the opportunity, via UI prompts, to fetch the file from source code control |
| // reset a read-only file protection to write etc. |
| // If there is no shell, i.e. shell is null, then there will be no user UI interaction |
| IStatus status = projectFile.getWorkspace().validateEdit(new IFile[] { projectFile }, shell); |
| // If the file is still read-only, then we should not attempt the write, since it will |
| // just fail - just throw an exception, to be caught below, and inform the user |
| // For other non-successful status, we take our chances, attempt the write, and pass |
| // along any exception thrown |
| if (!status.isOK()) { |
| if (status.getCode() == IResourceStatus.READ_ONLY_LOCAL) { |
| stream.close(); |
| throw new IOException(ManagedMakeMessages.getFormattedString(MANIFEST_ERROR_READ_ONLY, |
| projectFile.getFullPath().toString())); |
| } |
| } |
| } |
| projectFile.setContents(new ByteArrayInputStream(utfString.getBytes("UTF-8")), IResource.FORCE, //$NON-NLS-1$ |
| new NullProgressMonitor()); |
| } else { |
| projectFile.create(new ByteArrayInputStream(utfString.getBytes("UTF-8")), IResource.FORCE, //$NON-NLS-1$ |
| new NullProgressMonitor()); |
| } |
| |
| // Close the streams |
| stream.close(); |
| } |
| } catch (ParserConfigurationException e) { |
| err = e; |
| } catch (FactoryConfigurationError e) { |
| err = e.getException(); |
| } catch (TransformerConfigurationException e) { |
| err = e; |
| } catch (TransformerFactoryConfigurationError e) { |
| err = e.getException(); |
| } catch (TransformerException e) { |
| err = e; |
| } catch (IOException e) { |
| // The save failed |
| err = e; |
| } catch (CoreException e) { |
| // Save to IFile failed |
| err = e; |
| } |
| |
| if (err != null) { |
| // Put out an error message indicating that the attempted write to the .cdtbuild project file failed |
| IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); |
| if (window == null) { |
| IWorkbenchWindow windows[] = PlatformUI.getWorkbench().getWorkbenchWindows(); |
| window = windows[0]; |
| } |
| |
| final Shell shell = window.getShell(); |
| if (shell != null) { |
| final String exceptionMsg = err.getMessage(); |
| shell.getDisplay() |
| .syncExec(() -> MessageDialog.openError(shell, |
| ManagedMakeMessages.getResourceString("ManagedBuildManager.error.write_failed_title"), //$NON-NLS-1$ |
| ManagedMakeMessages.getFormattedString(MANIFEST_ERROR_WRITE_FAILED, exceptionMsg))); |
| } |
| } |
| // If we return an honest status when the operation fails, there are instances when the UI behavior |
| // is not very good |
| // Specifically, if "OK" is clicked by the user from the property page UI, and the return status |
| // from this routine is false, the property page UI will not be closed (note: this is Eclispe code) and |
| // the OK button will simply be grayed out |
| // At this point, the only way out is to click "Cancel" to get the UI to go away; note however that any |
| // property page changes will be sticky, in the UI, which is nonintuitive and confusing |
| // Therefore, just always return success, i.e. true, from this routine |
| return true; |
| } |
| |
| public static boolean saveBuildInfo(final IProject project, final boolean force) { |
| try { |
| return updateBuildInfo(project, force); |
| } catch (CoreException e) { |
| Throwable cause = e.getStatus().getException(); |
| if (cause instanceof IllegalArgumentException) { |
| //can not acquire the root rule |
| Job j = new Job("save build info job") { //$NON-NLS-1$ |
| |
| @Override |
| protected IStatus run(IProgressMonitor monitor) { |
| try { |
| updateBuildInfo(project, force); |
| } catch (CoreException e) { |
| return e.getStatus(); |
| } |
| return Status.OK_STATUS; |
| } |
| |
| }; |
| j.setRule(ResourcesPlugin.getWorkspace().getRoot()); |
| j.setSystem(true); |
| j.schedule(); |
| return true; |
| } |
| ManagedBuilderCorePlugin.log(e); |
| return false; |
| } |
| } |
| |
| /** |
| * Saves the build information associated with a project and all resources |
| * in the project to the build info file. |
| */ |
| private static boolean updateBuildInfo(IProject project, boolean force) throws CoreException { |
| IManagedBuildInfo info = getBuildInfo(project, false); |
| if (info == null) |
| return true; |
| |
| ICProjectDescription projDes = CoreModel.getDefault().getProjectDescription(project); |
| projDes = BuildSettingsUtil.synchBuildInfo(info, projDes, force); |
| |
| // try { |
| BuildSettingsUtil.checkApplyDescription(project, projDes); |
| // } catch (CoreException e) { |
| // return false; |
| // } |
| return true; |
| /* |
| // Create document |
| Exception err = null; |
| try { |
| DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); |
| Document doc = builder.newDocument(); |
| |
| // Get the build information for the project |
| ManagedBuildInfo buildInfo = (ManagedBuildInfo) getBuildInfo(project); |
| |
| // Save the build info |
| if (buildInfo != null && |
| !buildInfo.isReadOnly() && |
| buildInfo.isValid() && |
| (force == true || buildInfo.isDirty())) { |
| // For post-2.0 projects, there will be a version |
| String projectVersion = buildInfo.getVersion(); |
| if (projectVersion != null) { |
| ProcessingInstruction instruction = doc.createProcessingInstruction(VERSION_ELEMENT_NAME, projectVersion); |
| doc.appendChild(instruction); |
| } |
| Element rootElement = doc.createElement(ROOT_NODE_NAME); |
| doc.appendChild(rootElement); |
| buildInfo.serialize(doc, rootElement); |
| |
| // Transform the document to something we can save in a file |
| ByteArrayOutputStream stream = new ByteArrayOutputStream(); |
| Transformer transformer = TransformerFactory.newInstance().newTransformer(); |
| transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$ |
| transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); //$NON-NLS-1$ |
| transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$ |
| DOMSource source = new DOMSource(doc); |
| StreamResult result = new StreamResult(stream); |
| transformer.transform(source, result); |
| |
| // Save the document |
| IFile projectFile = project.getFile(SETTINGS_FILE_NAME); |
| String utfString = stream.toString("UTF-8"); //$NON-NLS-1$ |
| |
| if (projectFile.exists()) { |
| if (projectFile.isReadOnly()) { |
| // If we are not running headless, and there is a UI Window around, grab it |
| // and the associated shell |
| IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); |
| if (window == null) { |
| IWorkbenchWindow windows[] = PlatformUI.getWorkbench().getWorkbenchWindows(); |
| window = windows[0]; |
| } |
| Shell shell = null; |
| if (window != null) { |
| shell = window.getShell(); |
| } |
| // Inform Eclipse that we are intending to modify this file |
| // This will provide the user the opportunity, via UI prompts, to fetch the file from source code control |
| // reset a read-only file protection to write etc. |
| // If there is no shell, i.e. shell is null, then there will be no user UI interaction |
| IStatus status = projectFile.getWorkspace().validateEdit(new IFile[]{projectFile}, shell); |
| // If the file is still read-only, then we should not attempt the write, since it will |
| // just fail - just throw an exception, to be caught below, and inform the user |
| // For other non-successful status, we take our chances, attempt the write, and pass |
| // along any exception thrown |
| if (!status.isOK()) { |
| if (status.getCode() == IResourceStatus.READ_ONLY_LOCAL) { |
| stream.close(); |
| throw new IOException(ManagedMakeMessages.getFormattedString(MANIFEST_ERROR_READ_ONLY, projectFile.getFullPath().toString())); //$NON-NLS-1$ |
| } |
| } |
| } |
| projectFile.setContents(new ByteArrayInputStream(utfString.getBytes("UTF-8")), IResource.FORCE, new NullProgressMonitor()); //$NON-NLS-1$ |
| } else { |
| projectFile.create(new ByteArrayInputStream(utfString.getBytes("UTF-8")), IResource.FORCE, new NullProgressMonitor()); //$NON-NLS-1$ |
| } |
| |
| // Close the streams |
| stream.close(); |
| } |
| } catch (ParserConfigurationException e) { |
| err = e; |
| } catch (FactoryConfigurationError e) { |
| err = e.getException(); |
| } catch (TransformerConfigurationException e) { |
| err = e; |
| } catch (TransformerFactoryConfigurationError e) { |
| err = e.getException(); |
| } catch (TransformerException e) { |
| err = e; |
| } catch (IOException e) { |
| // The save failed |
| err = e; |
| } catch (CoreException e) { |
| // Save to IFile failed |
| err = e; |
| } |
| |
| if (err != null) { |
| // Put out an error message indicating that the attempted write to the .cdtbuild project file failed |
| IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); |
| if (window == null) { |
| IWorkbenchWindow windows[] = PlatformUI.getWorkbench().getWorkbenchWindows(); |
| window = windows[0]; |
| } |
| |
| final Shell shell = window.getShell(); |
| if (shell != null) { |
| final String exceptionMsg = err.getMessage(); |
| shell.getDisplay().syncExec( new Runnable() { |
| public void run() { |
| MessageDialog.openError(shell, |
| ManagedMakeMessages.getResourceString("ManagedBuildManager.error.write_failed_title"), //$NON-NLS-1$ |
| ManagedMakeMessages.getFormattedString(MANIFEST_ERROR_WRITE_FAILED, //$NON-NLS-1$ |
| exceptionMsg)); |
| } |
| } ); |
| } |
| } |
| // If we return an honest status when the operation fails, there are instances when the UI behavior |
| // is not very good |
| // Specifically, if "OK" is clicked by the user from the property page UI, and the return status |
| // from this routine is false, the property page UI will not be closed (note: this is Eclispe code) and |
| // the OK button will simply be grayed out |
| // At this point, the only way out is to click "Cancel" to get the UI to go away; note however that any |
| // property page changes will be sticky, in the UI, which is nonintuitive and confusing |
| // Therefore, just always return success, i.e. true, from this routine |
| return true; |
| */ |
| } |
| |
| public static void updateCoreSettings(IProject project) throws CoreException { |
| updateBuildInfo(project, true); |
| } |
| |
| public static void updateCoreSettings(IConfiguration cfg) throws CoreException { |
| IProject project = cfg.getOwner().getProject(); |
| ICProjectDescription projDes = CoreModel.getDefault().getProjectDescription(project); |
| if (projDes != null) { |
| if (BuildSettingsUtil.applyConfiguration(cfg, projDes, true)) { |
| BuildSettingsUtil.checkApplyDescription(project, projDes); |
| } |
| } |
| } |
| |
| public static void updateCoreSettings(IProject project, IConfiguration[] cfgs) throws CoreException { |
| updateCoreSettings(project, cfgs, false); |
| } |
| |
| public static void updateCoreSettings(IProject project, IConfiguration[] cfgs, boolean avoidSerialization) |
| throws CoreException { |
| if (cfgs == null) { |
| IManagedBuildInfo info = getBuildInfo(project); |
| if (info != null && info.isValid() && info.getManagedProject() != null) |
| cfgs = info.getManagedProject().getConfigurations(); |
| } |
| |
| if (cfgs == null || cfgs.length == 0) |
| return; |
| |
| ICProjectDescription projDes = CoreModel.getDefault().getProjectDescription(project); |
| boolean updated = false; |
| if (projDes != null) { |
| for (IConfiguration cfg : cfgs) { |
| if (BuildSettingsUtil.applyConfiguration(cfg, projDes, true)) { |
| updated = true; |
| } |
| } |
| if (updated) { |
| BuildSettingsUtil.checkApplyDescription(project, projDes, avoidSerialization); |
| } |
| } |
| } |
| |
| public static void removeBuildInfo(IResource resource) { |
| /* |
| IManagedBuildInfo info = findBuildInfo(resource, false); |
| if(info != null){ |
| IConfiguration[] configs = info.getManagedProject().getConfigurations(); |
| // Send an event to each configuration and if they exist, its resource configurations |
| for (int i=0; i < configs.length; i++) { |
| ManagedBuildManager.performValueHandlerEvent(configs[i], IManagedOptionValueHandler.EVENT_CLOSE); |
| } |
| |
| info.setValid(false); |
| |
| try { |
| resource.setSessionProperty(buildInfoProperty, null); |
| } catch (CoreException e) { |
| } |
| } |
| */ |
| } |
| |
| /** |
| * Resets the build information for the project and configuration specified in the arguments. |
| * The build information will contain the settings defined in the plugin manifest. |
| */ |
| public static void resetConfiguration(IProject project, IConfiguration configuration) { |
| // reset the configuration |
| if (configuration instanceof MultiConfiguration) { |
| IConfiguration[] cfs = (IConfiguration[]) ((MultiConfiguration) configuration).getItems(); |
| for (IConfiguration c : cfs) { |
| ((Configuration) c).reset(); |
| performValueHandlerEvent(c, IManagedOptionValueHandler.EVENT_SETDEFAULT, false); |
| } |
| } else { |
| ((Configuration) configuration).reset(); |
| performValueHandlerEvent(configuration, IManagedOptionValueHandler.EVENT_SETDEFAULT, false); |
| } |
| } |
| |
| public static void resetResourceConfiguration(IProject project, IResourceConfiguration resConfig) { |
| // reset the configuration |
| ((ResourceConfiguration) resConfig).reset(); |
| |
| performValueHandlerEvent(resConfig, IManagedOptionValueHandler.EVENT_SETDEFAULT); |
| |
| } |
| |
| public static void resetOptionSettings(IResourceInfo rcInfo) { |
| if (rcInfo instanceof IFileInfo) { |
| IConfiguration c = rcInfo.getParent(); |
| Configuration cfg = null; |
| IProject project = null; |
| if (c instanceof Configuration) |
| cfg = (Configuration) c; |
| else if (c instanceof MultiConfiguration) { |
| MultiConfiguration mc = (MultiConfiguration) c; |
| IConfiguration[] cfs = (IConfiguration[]) mc.getItems(); |
| cfg = (Configuration) cfs[0]; |
| } |
| if (!(cfg == null || cfg.isExtensionElement() || cfg.isPreference())) |
| project = cfg.getOwner().getProject(); |
| |
| if (rcInfo instanceof MultiResourceInfo) { |
| for (IResourceInfo ri : (IResourceInfo[]) ((MultiResourceInfo) rcInfo).getItems()) |
| resetResourceConfiguration(project, (IFileInfo) ri); |
| } else |
| resetResourceConfiguration(project, (IFileInfo) rcInfo); |
| } else { |
| if (rcInfo instanceof MultiFolderInfo) { |
| for (IFolderInfo fi : (IFolderInfo[]) ((MultiFolderInfo) rcInfo).getItems()) |
| ((FolderInfo) fi).resetOptionSettings(); |
| } else { |
| FolderInfo fo = (FolderInfo) rcInfo; |
| fo.resetOptionSettings(); |
| } |
| } |
| } |
| |
| /** |
| * Adds a ProjectType that is is specified in the manifest to the |
| * build system. It is available to any element that |
| * has a reference to it as part of its description. |
| */ |
| public static void addExtensionProjectType(ProjectType projectType) { |
| if (projectTypes == null) { |
| projectTypes = new ArrayList<>(); |
| } |
| |
| projectTypes.add(projectType); |
| IProjectType previous = getExtensionProjectTypeMap().put(projectType.getId(), projectType); |
| if (previous != null) { |
| // Report error |
| ManagedBuildManager.outputDuplicateIdError("ProjectType", //$NON-NLS-1$ |
| projectType.getId()); |
| } |
| } |
| |
| /** |
| * Adds a Configuration that is is specified in the manifest to the |
| * build system. It is available to any element that |
| * has a reference to it as part of its description. |
| */ |
| public static void addExtensionConfiguration(Configuration configuration) { |
| IConfiguration previous = getExtensionConfigurationMap().put(configuration.getId(), configuration); |
| if (previous != null) { |
| // Report error |
| ManagedBuildManager.outputDuplicateIdError("Configuration", //$NON-NLS-1$ |
| configuration.getId()); |
| } |
| } |
| |
| /** |
| * Adds a Resource Configuration that is is specified in the manifest to the |
| * build system. It is available to any element that |
| * has a reference to it as part of its description. |
| */ |
| public static void addExtensionResourceConfiguration(ResourceConfiguration resourceConfiguration) { |
| IResourceConfiguration previous = getExtensionResourceConfigurationMap().put(resourceConfiguration.getId(), |
| resourceConfiguration); |
| if (previous != null) { |
| // Report error |
| ManagedBuildManager.outputDuplicateIdError("ResourceConfiguration", //$NON-NLS-1$ |
| resourceConfiguration.getId()); |
| } |
| } |
| |
| /** |
| * Adds a ToolChain that is is specified in the manifest to the |
| * build system. It is available to any element that |
| * has a reference to it as part of its description. |
| */ |
| public static void addExtensionToolChain(ToolChain toolChain) { |
| IToolChain previous = getExtensionToolChainMapInternal().put(toolChain.getId(), toolChain); |
| if (previous != null) { |
| // Report error |
| ManagedBuildManager.outputDuplicateIdError("ToolChain", //$NON-NLS-1$ |
| toolChain.getId()); |
| } |
| } |
| |
| /** |
| * Adds a tool that is is specified in the manifest to the |
| * build system. This tool is available to any target that |
| * has a reference to it as part of its description. This |
| * permits a tool that is common to many targets to be defined |
| * only once. |
| */ |
| public static void addExtensionTool(Tool tool) { |
| ITool previous = getExtensionToolMapInternal().put(tool.getId(), tool); |
| if (previous != null) { |
| // Report error |
| ManagedBuildManager.outputDuplicateIdError("Tool", //$NON-NLS-1$ |
| tool.getId()); |
| } |
| } |
| |
| /** |
| * Adds a TargetPlatform that is is specified in the manifest to the |
| * build system. It is available to any element that |
| * has a reference to it as part of its description. |
| */ |
| public static void addExtensionTargetPlatform(TargetPlatform targetPlatform) { |
| ITargetPlatform previous = getExtensionTargetPlatformMap().put(targetPlatform.getId(), targetPlatform); |
| if (previous != null) { |
| // Report error |
| ManagedBuildManager.outputDuplicateIdError("TargetPlatform", //$NON-NLS-1$ |
| targetPlatform.getId()); |
| } |
| } |
| |
| /** |
| * Adds a Builder that is is specified in the manifest to the |
| * build system. It is available to any element that |
| * has a reference to it as part of its description. |
| */ |
| public static void addExtensionBuilder(Builder builder) { |
| IBuilder previous = getExtensionBuilderMapInternal().put(builder.getId(), builder); |
| if (previous != null) { |
| // Report error |
| ManagedBuildManager.outputDuplicateIdError("Builder", //$NON-NLS-1$ |
| builder.getId()); |
| } |
| } |
| |
| /** |
| * Adds a Option that is is specified in the manifest to the |
| * build system. It is available to any element that |
| * has a reference to it as part of its description. |
| */ |
| public static void addExtensionOption(Option option) { |
| IOption previous = getExtensionOptionMap().put(option.getId(), option); |
| if (previous != null) { |
| // Report error |
| ManagedBuildManager.outputDuplicateIdError("Option", //$NON-NLS-1$ |
| option.getId()); |
| } |
| } |
| |
| /** |
| * Adds a OptionCategory that is is specified in the manifest to the |
| * build system. It is available to any element that |
| * has a reference to it as part of its description. |
| */ |
| public static void addExtensionOptionCategory(OptionCategory optionCategory) { |
| IOptionCategory previous = getExtensionOptionCategoryMap().put(optionCategory.getId(), optionCategory); |
| if (previous != null) { |
| // Report error |
| ManagedBuildManager.outputDuplicateIdError("OptionCategory", //$NON-NLS-1$ |
| optionCategory.getId()); |
| } |
| } |
| |
| /** |
| * Adds an InputType that is is specified in the manifest to the |
| * build system. It is available to any element that |
| * has a reference to it as part of its description. |
| */ |
| public static void addExtensionInputType(InputType inputType) { |
| IInputType previous = getExtensionInputTypeMap().put(inputType.getId(), inputType); |
| if (previous != null) { |
| // Report error |
| ManagedBuildManager.outputDuplicateIdError("InputType", //$NON-NLS-1$ |
| inputType.getId()); |
| } |
| } |
| |
| /** |
| * Adds an OutputType that is is specified in the manifest to the |
| * build system. It is available to any element that |
| * has a reference to it as part of its description. |
| */ |
| public static void addExtensionOutputType(OutputType outputType) { |
| IOutputType previous = getExtensionOutputTypeMap().put(outputType.getId(), outputType); |
| if (previous != null) { |
| // Report error |
| ManagedBuildManager.outputDuplicateIdError("OutputType", //$NON-NLS-1$ |
| outputType.getId()); |
| } |
| } |
| |
| /** |
| * Adds a Target that is is specified in the manifest to the |
| * build system. It is available to any CDT 2.0 object model element that |
| * has a reference to it as part of its description. |
| */ |
| public static void addExtensionTarget(Target target) { |
| getExtensionTargetMap().put(target.getId(), target); |
| } |
| |
| /** |
| * Creates a new project instance for the resource based on the parent project type. |
| * |
| * @param parent - parent project type |
| * @return new <code>ITarget</code> with settings based on the parent passed in the arguments |
| */ |
| public static IManagedProject createManagedProject(IResource resource, IProjectType parent) throws BuildException { |
| return new ManagedProject(resource, parent); |
| } |
| |
| /** |
| * Creates a new target for the resource based on the parentTarget. |
| * |
| * @return new <code>ITarget</code> with settings based on the parent passed in the arguments |
| */ |
| public static ITarget createTarget(IResource resource, ITarget parentTarget) throws BuildException { |
| IResource owner = parentTarget.getOwner(); |
| |
| if (owner != null && owner.equals(resource)) |
| // Already added |
| return parentTarget; |
| |
| if (resource instanceof IProject) { |
| // Must be an extension target |
| if (owner != null) |
| throw new BuildException( |
| ManagedMakeMessages.getResourceString("ManagedBuildManager.error.owner_not_null")); //$NON-NLS-1$ |
| } else { |
| // Owner must be owned by the project containing this resource |
| if (owner == null) |
| throw new BuildException(ManagedMakeMessages.getResourceString("ManagedBuildManager.error.null_owner")); //$NON-NLS-1$ |
| if (!owner.equals(resource.getProject())) |
| throw new BuildException( |
| ManagedMakeMessages.getResourceString("ManagedBuildManager.error.owner_not_project")); //$NON-NLS-1$ |
| } |
| |
| // Passed validation so create the target. |
| return new Target(resource, parentTarget); |
| } |
| |
| public static IStatus initBuildInfoContainer(IResource resource) { |
| return Status.OK_STATUS; |
| /* |
| ManagedBuildInfo buildInfo = null; |
| |
| // Get the build info associated with this project for this session |
| try { |
| buildInfo = findBuildInfo(resource.getProject(), true); |
| initBuildInfoContainer(buildInfo); |
| } catch (CoreException e) { |
| return new Status(IStatus.ERROR, |
| ManagedBuilderCorePlugin.PLUGIN_ID, |
| IStatus.ERROR, |
| e.getLocalizedMessage(), |
| e); |
| } |
| return new Status(IStatus.OK, |
| ManagedBuilderCorePlugin.PLUGIN_ID, |
| IStatus.OK, |
| ManagedMakeMessages.getFormattedString("ManagedBuildInfo.message.init.ok", resource.getName()), //$NON-NLS-1$ |
| null); |
| */ |
| } |
| |
| // /** |
| // * Private helper method to initialize the path entry container once and |
| // * only once when the build info is first loaded or created. |
| // * |
| // * @param info |
| // * @throws CoreException |
| // */ |
| // private static void initBuildInfoContainer(ManagedBuildInfo info) throws CoreException { |
| // if (info == null) { |
| // throw new CoreException(new Status(IStatus.ERROR, |
| // ManagedBuilderCorePlugin.PLUGIN_ID, |
| // IStatus.ERROR, |
| // "", //$NON-NLS-1$ |
| // null)); |
| // } |
| // |
| // if (info.isContainerInited()) return; |
| // // Now associate the path entry container with the project |
| // ICProject cProject = info.getCProject(); |
| // |
| // synchronized (cProject) { |
| // |
| // // This does not block the workspace or trigger delta events |
| // IPathEntry[] entries = cProject.getRawPathEntries(); |
| // // Make sure the container for this project is in the path entries |
| // List newEntries = new ArrayList(Arrays.asList(entries)); |
| // if (!newEntries.contains(ManagedBuildInfo.containerEntry)) { |
| // // In this case we should trigger an init and deltas |
| // newEntries.add(ManagedBuildInfo.containerEntry); |
| // cProject.setRawPathEntries((IPathEntry[])newEntries.toArray(new IPathEntry[newEntries.size()]), new NullProgressMonitor()); |
| // } |
| // info.setContainerInited(true); |
| // |
| // } // end synchronized |
| // } |
| |
| private static boolean isVersionCompatible(IExtension extension) { |
| // We can ignore the qualifier |
| Version version = null; |
| |
| // Get the version of the manifest |
| IConfigurationElement[] elements = extension.getConfigurationElements(); |
| |
| // Find the version string in the manifest |
| for (IConfigurationElement element : elements) { |
| if (element.getName().equals(REVISION_ELEMENT_NAME)) { |
| version = new Version(element.getAttribute(VERSION_ELEMENT_NAME)); |
| break; |
| } |
| } |
| |
| if (version == null) { |
| // This is a 1.2 manifest and we are compatible for now |
| return true; |
| } |
| return (buildInfoVersion.compareTo(version) >= 0); |
| } |
| |
| /** |
| * Determine if the .cdtbuild file is present, which will determine if build information |
| * can be loaded externally or not. Return true if present, false otherwise. |
| */ |
| private static boolean canLoadBuildInfo(final IProject project) { |
| IFile file = project.getFile(SETTINGS_FILE_NAME); |
| if (file == null) |
| return false; |
| File cdtbuild = file.getLocation().toFile(); |
| if (cdtbuild == null) |
| return false; |
| return cdtbuild.exists(); |
| } |
| |
| /** |
| * Load the build information for the specified resource from its project |
| * file. Pay attention to the version number too. |
| */ |
| private static ManagedBuildInfo loadOldStyleBuildInfo(final IProject project) throws Exception { |
| ManagedBuildInfo buildInfo = null; |
| IFile file = project.getFile(SETTINGS_FILE_NAME); |
| File cdtbuild = file.getLocation().toFile(); |
| if (!cdtbuild.exists()) { |
| // If we cannot find the .cdtbuild project file, throw an exception and let the user know |
| throw new BuildException(ManagedMakeMessages.getFormattedString(PROJECT_FILE_ERROR, project.getName())); |
| } |
| |
| // So there is a project file, load the information there |
| try (InputStream stream = new FileInputStream(cdtbuild)) { |
| DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder(); |
| Document document = parser.parse(stream); |
| String fileVersion = null; |
| |
| // Get the first element in the project file |
| Node rootElement = document.getFirstChild(); |
| |
| // Since 2.0 this will be a processing instruction containing version |
| if (rootElement.getNodeType() != Node.PROCESSING_INSTRUCTION_NODE) { |
| // This is a 1.2 project and it must be updated |
| } else { |
| // Make sure that the version is compatible with the manager |
| fileVersion = rootElement.getNodeValue(); |
| Version version = new Version(fileVersion); |
| //if buildInfoVersion is greater than fileVersion |
| if (buildInfoVersion.compareTo(version) > 0) { |
| // This is >= 2.0 project, but earlier than the current MBS version - it may need to be updated |
| } else { |
| // This is a |
| // isCompatibleWith will return FALSE, if: |
| // o The major versions are not equal |
| // o The major versions are equal, but the remainder of the .cdtbuild version # is |
| // greater than the MBS version # |
| boolean compatible = false; |
| if (buildInfoVersion.getMajor() != version.getMajor()) |
| compatible = false; |
| if (buildInfoVersion.getMinor() > version.getMinor()) |
| compatible = true; |
| if (buildInfoVersion.getMinor() < version.getMinor()) |
| compatible = false; |
| if (buildInfoVersion.getMicro() > version.getMicro()) |
| compatible = true; |
| if (buildInfoVersion.getMicro() < version.getMicro()) |
| compatible = false; |
| if (buildInfoVersion.getQualifier().compareTo(version.getQualifier()) >= 0) |
| compatible = true; |
| if (!compatible) { |
| throw new BuildException( |
| ManagedMakeMessages.getFormattedString(PROJECT_VERSION_ERROR, project.getName())); |
| } |
| } |
| } |
| |
| // Now get the project root element (there should be only one) |
| NodeList nodes = document.getElementsByTagName(ROOT_NODE_NAME); |
| if (nodes.getLength() > 0) { |
| Node node = nodes.item(0); |
| |
| // Create the internal representation of the project's MBS information |
| buildInfo = new ManagedBuildInfo(project, XmlStorageUtil.createCStorageTree((Element) node), true, |
| fileVersion); |
| if (fileVersion != null) { |
| // buildInfo.setVersion(fileVersion); |
| Version version = new Version(fileVersion); |
| Version version21 = new Version("2.1"); //$NON-NLS-1$ |
| // CDT 2.1 is the first version using the new MBS model |
| if (version.compareTo(version21) >= 0) { |
| // Check to see if all elements could be loaded correctly - for example, |
| // if references in the project file could not be resolved to extension |
| // elements |
| if (buildInfo.getManagedProject() == null || (!buildInfo.getManagedProject().isValid())) { |
| // The load failed |
| throw new Exception(ManagedMakeMessages |
| .getFormattedString("ManagedBuildManager.error.id.nomatch", project.getName())); //$NON-NLS-1$ |
| } |
| |
| // Each ToolChain/Tool/Builder element maintain two separate |
| // converters if available |
| // 0ne for previous Mbs versions and one for current Mbs version |
| // walk through the project hierarchy and call the converters |
| // written for previous mbs versions |
| if (checkForMigrationSupport(buildInfo, false) != true) { |
| // display an error message that the project is not loadable |
| if (buildInfo.getManagedProject() == null || (!buildInfo.getManagedProject().isValid())) { |
| // The load failed |
| throw new Exception(ManagedMakeMessages |
| .getFormattedString("ManagedBuildManager.error.id.nomatch", project.getName())); //$NON-NLS-1$ |
| } |
| } |
| } |
| } |
| |
| // Upgrade the project's CDT version if necessary |
| if (!UpdateManagedProjectManager.isCompatibleProject(buildInfo)) { |
| UpdateManagedProjectManager.updateProject(project, buildInfo); |
| } |
| // Check to see if the upgrade (if required) succeeded |
| if (buildInfo.getManagedProject() == null || (!buildInfo.getManagedProject().isValid())) { |
| // The load failed |
| throw new Exception(ManagedMakeMessages.getFormattedString("ManagedBuildManager.error.id.nomatch", //$NON-NLS-1$ |
| project.getName())); |
| } |
| |
| // Walk through the project hierarchy and call the converters |
| // written for current mbs version |
| if (checkForMigrationSupport(buildInfo, true) != true) { |
| // display an error message.that the project is no loadable |
| if (buildInfo.getManagedProject() == null || (!buildInfo.getManagedProject().isValid())) { |
| // The load failed |
| throw new Exception(ManagedMakeMessages |
| .getFormattedString("ManagedBuildManager.error.id.nomatch", project.getName())); //$NON-NLS-1$ |
| } |
| } |
| |
| IConfiguration[] configs = buildInfo.getManagedProject().getConfigurations(); |
| // Send an event to each configuration and if they exist, its resource configurations |
| for (IConfiguration cfg : configs) { |
| ManagedBuildManager.performValueHandlerEvent(cfg, IManagedOptionValueHandler.EVENT_OPEN); |
| } |
| // Finish up |
| //project.setSessionProperty(buildInfoProperty, buildInfo); |
| setLoaddedBuildInfo(project, buildInfo); |
| } |
| } |
| |
| if (buildInfo != null) { |
| buildInfo.setValid(true); |
| } |
| return buildInfo; |
| } |
| |
| /** |
| * This method loads all of the managed build system manifest files |
| * that have been installed with CDT. An internal hierarchy of |
| * objects is created that contains the information from the manifest |
| * files. The information is then accessed through the ManagedBuildManager. |
| * |
| * Since the class does not have a constructor but all public methods |
| * call this method first, it is effectively a startup method |
| */ |
| private static void loadExtensions() throws BuildException { |
| if (projectTypesLoaded) |
| return; |
| |
| loadExtensionsSynchronized(); |
| } |
| |
| private synchronized static void loadExtensionsSynchronized() throws BuildException { |
| // Do this once |
| if (projectTypesLoaded) |
| return; |
| |
| // This routine gets called recursively. If so, just return |
| if (projectTypesLoading) |
| return; |
| projectTypesLoading = true; |
| |
| // scalability issue: configElementMap does not need to live past when loading is done, so we will |
| // deallocate it upon exit with a try...finally |
| |
| try { |
| |
| //The list of the IManagedBuildDefinitionsStartup callbacks |
| List<IManagedBuildDefinitionsStartup> buildDefStartupList = null; |
| // Get the extensions that use the current CDT managed build model |
| IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(EXTENSION_POINT_ID); |
| if (extensionPoint != null) { |
| IExtension[] extensions = extensionPoint.getExtensions(); |
| if (extensions != null) { |
| |
| // First call the constructors of the internal classes that correspond to the |
| // build model elements |
| for (IExtension extension : extensions) { |
| // Can we read this manifest |
| if (!isVersionCompatible(extension)) { |
| // The version of the Plug-in is greater than what the manager thinks it understands |
| // Display error message |
| IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); |
| if (window == null) { |
| IWorkbenchWindow windows[] = PlatformUI.getWorkbench().getWorkbenchWindows(); |
| window = windows[0]; |
| } |
| |
| final Shell shell = window.getShell(); |
| final String errMsg = ManagedMakeMessages.getFormattedString(MANIFEST_VERSION_ERROR, |
| extension.getUniqueIdentifier()); |
| shell.getDisplay() |
| .asyncExec(() -> MessageDialog.openError(shell, |
| ManagedMakeMessages.getResourceString( |
| "ManagedBuildManager.error.manifest_load_failed_title"), //$NON-NLS-1$ |
| errMsg)); |
| } else { |
| // Get the "configuraton elements" defined in the plugin.xml file. |
| // Note that these "configuration elements" are not related to the |
| // managed build system "configurations". |
| // From the PDE Guide: |
| // A configuration element, with its attributes and children, directly |
| // reflects the content and structure of the extension section within the |
| // declaring plug-in's manifest (plugin.xml) file. |
| IConfigurationElement[] elements = extension.getConfigurationElements(); |
| String revision = null; |
| |
| // Get the managedBuildRevsion of the extension. |
| for (IConfigurationElement element : elements) { |
| if (element.getName().equals(REVISION_ELEMENT_NAME)) { |
| revision = element.getAttribute(VERSION_ELEMENT_NAME); |
| break; |
| } |
| } |
| |
| // Get the value of 'ManagedBuildRevision' attribute |
| loadConfigElements(DefaultManagedConfigElement.convertArray(elements, extension), revision); |
| } |
| } |
| |
| // Call the start up config extensions. These may rely on the standard elements |
| // having already been loaded so we wait to call them from here. |
| if (startUpConfigElements != null) { |
| buildDefStartupList = new ArrayList<>(startUpConfigElements.size()); |
| |
| for (IManagedConfigElement startUpConfigElement : startUpConfigElements) { |
| IManagedBuildDefinitionsStartup customConfigLoader; |
| try { |
| customConfigLoader = createStartUpConfigLoader( |
| (DefaultManagedConfigElement) startUpConfigElement); |
| |
| //need to save the startup for the future notifications |
| buildDefStartupList.add(customConfigLoader); |
| |
| // Now we can perform any actions on the build configurations |
| // in an extended plugin before the build configurations have been resolved |
| customConfigLoader.buildDefsLoaded(); |
| } catch (CoreException e) { |
| } |
| } |
| } |
| |
| // Then call resolve. |
| // |
| // Here are notes on "references" within the managed build system. |
| // References are "pointers" from one model element to another. |
| // These are encoded in manifest and managed build system project files (.cdtbuild) |
| // using unique string IDs (e.g. "cdt.managedbuild.tool.gnu.c.linker"). |
| // These string IDs are "resolved" to pointers to interfaces in model |
| // elements in the in-memory represent of the managed build system information. |
| // |
| // Here are the current "rules" for references: |
| // 1. A reference is always resolved to an interface pointer in the |
| // referenced object. |
| // 2. A reference is always TO an extension object - that is, an object |
| // loaded from a manifest file or a dynamic element provider. It cannot |
| // be to an object loaded from a managed build system project file (.cdtbuild). |
| // |
| |
| Collection<IProjectType> prjTypes = getExtensionProjectTypeMap().values(); |
| for (IProjectType projectType : prjTypes) { |
| try { |
| ((ProjectType) projectType).resolveReferences(); |
| } catch (Exception ex) { |
| // TODO: log |
| ex.printStackTrace(); |
| } |
| } |
| Collection<IConfiguration> configurations = getExtensionConfigurationMap().values(); |
| for (IConfiguration configuration : configurations) { |
| try { |
| ((Configuration) configuration).resolveReferences(); |
| } catch (Exception ex) { |
| // TODO: log |
| ex.printStackTrace(); |
| } |
| } |
| Collection<IResourceConfiguration> resConfigs = getExtensionResourceConfigurationMap().values(); |
| for (IResourceConfiguration resConfig : resConfigs) { |
| try { |
| ((ResourceConfiguration) resConfig).resolveReferences(); |
| } catch (Exception ex) { |
| // TODO: log |
| ex.printStackTrace(); |
| } |
| } |
| Collection<ToolChain> toolChains = getExtensionToolChainMapInternal().values(); |
| for (ToolChain toolChain : toolChains) { |
| try { |
| toolChain.resolveReferences(); |
| } catch (Exception ex) { |
| // TODO: log |
| ex.printStackTrace(); |
| } |
| } |
| Collection<Tool> tools = getExtensionToolMapInternal().values(); |
| for (Tool tool : tools) { |
| try { |
| tool.resolveReferences(); |
| } catch (Exception ex) { |
| // TODO: log |
| ex.printStackTrace(); |
| } |
| } |
| Collection<ITargetPlatform> targetPlatforms = getExtensionTargetPlatformMap().values(); |
| for (ITargetPlatform targetPlatform : targetPlatforms) { |
| try { |
| ((TargetPlatform) targetPlatform).resolveReferences(); |
| } catch (Exception ex) { |
| // TODO: log |
| ex.printStackTrace(); |
| } |
| } |
| Collection<Builder> builders = getExtensionBuilderMapInternal().values(); |
| for (Builder builder : builders) { |
| try { |
| builder.resolveReferences(); |
| } catch (Exception ex) { |
| // TODO: log |
| ex.printStackTrace(); |
| } |
| } |
| Collection<IOption> options = getExtensionOptionMap().values(); |
| for (IOption option : options) { |
| try { |
| ((Option) option).resolveReferences(); |
| } catch (Exception ex) { |
| // TODO: log |
| ex.printStackTrace(); |
| } |
| } |
| Collection<IOptionCategory> optionCategories = getExtensionOptionCategoryMap().values(); |
| for (IOptionCategory optionCat : optionCategories) { |
| try { |
| ((OptionCategory) optionCat).resolveReferences(); |
| } catch (Exception ex) { |
| // TODO: log |
| ex.printStackTrace(); |
| } |
| } |
| } |
| } |
| |
| // Get the extensions that use the CDT 2.0 build model |
| extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(EXTENSION_POINT_ID_V2); |
| if (extensionPoint != null) { |
| IExtension[] extensions = extensionPoint.getExtensions(); |
| String revision = null; |
| |
| if (extensions != null) { |
| if (extensions.length > 0) { |
| |
| // Call the constructors of the internal classes that correspond to the |
| // V2.0 build model elements. Some of these objects are converted to new model objects. |
| // Others can use the same classes. |
| for (IExtension extension : extensions) { |
| // Can we read this manifest |
| if (!isVersionCompatible(extension)) { |
| //The version of the Plug-in is greater than what the manager thinks it understands |
| throw new BuildException(ManagedMakeMessages.getResourceString(MANIFEST_VERSION_ERROR)); |
| } |
| IConfigurationElement[] elements = extension.getConfigurationElements(); |
| |
| // Get the managedBuildRevsion of the extension. |
| for (IConfigurationElement element : elements) { |
| if (element.getName().equals(REVISION_ELEMENT_NAME)) { |
| revision = element.getAttribute(VERSION_ELEMENT_NAME); |
| break; |
| } |
| } |
| // If the "fileVersion" attribute is missing, then default revision is "1.2.0" |
| if (revision == null) |
| revision = "1.2.0"; //$NON-NLS-1$ |
| loadConfigElementsV2(DefaultManagedConfigElement.convertArray(elements, extension), |
| revision); |
| } |
| // Resolve references |
| Collection<ITarget> targets = getExtensionTargetMap().values(); |
| for (ITarget target : targets) { |
| try { |
| ((Target) target).resolveReferences(); |
| } catch (Exception ex) { |
| // TODO: log |
| ex.printStackTrace(); |
| } |
| } |
| // The V2 model can also add top-level Tools - they need to be "resolved" |
| Collection<Tool> tools = getExtensionToolMapInternal().values(); |
| for (Tool tool : tools) { |
| try { |
| tool.resolveReferences(); |
| } catch (Exception ex) { |
| // TODO: log |
| ex.printStackTrace(); |
| } |
| } |
| // Convert the targets to the new model |
| targets = getExtensionTargetMap().values(); |
| for (ITarget target : targets) { |
| try { |
| // Check to see if it has already been converted - if not, do it |
| if (target.getCreatedProjectType() == null) { |
| target.convertToProjectType(revision); |
| } |
| } catch (Exception ex) { |
| // TODO: log |
| ex.printStackTrace(); |
| } |
| } |
| // Resolve references for new ProjectTypes |
| Collection<IProjectType> prjTypes = getExtensionProjectTypeMap().values(); |
| for (IProjectType prjType : prjTypes) { |
| try { |
| ((ProjectType) prjType).resolveReferences(); |
| } catch (Exception ex) { |
| // TODO: log |
| ex.printStackTrace(); |
| } |
| } |
| |
| // TODO: Clear the target and configurationV2 maps so that the object can be garbage collected |
| // We can't do this yet, because the UpdateManagedProjectAction class may need these elements later |
| // Can we change UpdateManagedProjectAction to see the converted model elements? |
| //targetIter = getExtensionTargetMap().values().iterator(); |
| //while (targetIter.hasNext()) { |
| // try { |
| // Target target = (Target)targetIter.next(); |
| // ManagedBuildManager.removeConfigElement(target); |
| // getExtensionTargetMap().remove(target); |
| // } catch (Exception ex) { |
| // // TODO: log |
| // ex.printStackTrace(); |
| // } |
| //} |
| //getExtensionConfigurationV2Map().clear(); |
| } |
| } |
| } |
| |
| // configs resolved... |
| // Call the start up config extensions again now that configs have been resolved. |
| if (buildDefStartupList != null) { |
| for (IManagedBuildDefinitionsStartup customConfigLoader : buildDefStartupList) { |
| // Now we can perform any actions on the build configurations |
| // in an extended plugin now that all build configruations have been resolved |
| customConfigLoader.buildDefsResolved(); |
| } |
| } |
| |
| performAdjustments(); |
| projectTypesLoading = false; |
| projectTypesLoaded = true; |
| |
| ToolChainModificationManager.getInstance().start(); |
| |
| } // try |
| |
| finally { |
| configElementMap = null; |
| } |
| } |
| |
| private static void performAdjustments() { |
| IProjectType types[] = getDefinedProjectTypes(); |
| for (IProjectType type : types) { |
| IConfiguration cfgs[] = type.getConfigurations(); |
| for (IConfiguration cfg : cfgs) { |
| adjustConfig(cfg); |
| } |
| } |
| |
| for (IProjectType type : types) { |
| IConfiguration cfgs[] = type.getConfigurations(); |
| for (IConfiguration cfg : cfgs) { |
| performValueHandlerEvent(cfg, IManagedOptionValueHandler.EVENT_LOAD); |
| } |
| } |
| |
| } |
| |
| private static void adjustConfig(IConfiguration cfg) { |
| IResourceInfo rcInfos[] = cfg.getResourceInfos(); |
| for (IResourceInfo rcInfo : rcInfos) { |
| if (rcInfo instanceof IFolderInfo) { |
| IFolderInfo info = (IFolderInfo) rcInfo; |
| IToolChain tc = info.getToolChain(); |
| adjustHolder(info, tc); |
| |
| ITool tools[] = tc.getTools(); |
| for (ITool tool : tools) { |
| adjustHolder(info, tool); |
| } |
| } else if (rcInfo instanceof IFileInfo) { |
| IFileInfo info = (IFileInfo) rcInfo; |
| ITool rcTools[] = info.getTools(); |
| for (ITool rcTool : rcTools) { |
| adjustHolder(info, rcTool); |
| } |
| |
| } |
| } |
| |
| IResourceConfiguration rcCfgs[] = cfg.getResourceConfigurations(); |
| |
| // for (IResourceConfiguration rcCfg : rcCfgs) { |
| // } |
| |
| } |
| |
| private static void adjustHolder(IResourceInfo rcInfo, IHoldsOptions holder) { |
| IOption options[] = holder.getOptions(); |
| |
| for (IOption opt : options) { |
| Option option = (Option) opt; |
| BooleanExpressionApplicabilityCalculator calc = option.getBooleanExpressionCalculator(true); |
| |
| if (calc != null) |
| calc.adjustOption(rcInfo, holder, option, true); |
| } |
| } |
| |
| private static void loadConfigElements(IManagedConfigElement[] elements, String revision) { |
| for (IManagedConfigElement element : elements) { |
| try { |
| // Load the top level elements, which in turn load their children |
| if (element.getName().equals(IProjectType.PROJECTTYPE_ELEMENT_NAME)) { |
| new ProjectType(element, revision); |
| } else if (element.getName().equals(IConfiguration.CONFIGURATION_ELEMENT_NAME)) { |
| new Configuration((ProjectType) null, element, revision); |
| } else if (element.getName().equals(IToolChain.TOOL_CHAIN_ELEMENT_NAME)) { |
| new ToolChain((IFolderInfo) null, element, revision); |
| } else if (element.getName().equals(ITool.TOOL_ELEMENT_NAME)) { |
| new Tool((ProjectType) null, element, revision); |
| } else if (element.getName().equals(ITargetPlatform.TARGET_PLATFORM_ELEMENT_NAME)) { |
| new TargetPlatform((ToolChain) null, element, revision); |
| } else if (element.getName().equals(IBuilder.BUILDER_ELEMENT_NAME)) { |
| new Builder((ToolChain) null, element, revision); |
| } else if (element.getName().equals(IManagedConfigElementProvider.ELEMENT_NAME)) { |
| // don't allow nested config providers. |
| if (element instanceof DefaultManagedConfigElement) { |
| IManagedConfigElement[] providedConfigs; |
| IManagedConfigElementProvider provider = createConfigProvider( |
| (DefaultManagedConfigElement) element); |
| providedConfigs = provider.getConfigElements(); |
| loadConfigElements(providedConfigs, revision); // This must use the current build model |
| } |
| } else if (element.getName().equals(IManagedBuildDefinitionsStartup.BUILD_DEFINITION_STARTUP)) { |
| if (element instanceof DefaultManagedConfigElement) { |
| // Cache up early configuration extension elements so was can call them after |
| // other configuration elements have loaded. |
| if (startUpConfigElements == null) |
| startUpConfigElements = new ArrayList<>(); |
| startUpConfigElements.add(element); |
| } |
| } else { |
| // TODO: Report an error (log?) |
| } |
| } catch (Exception ex) { |
| // TODO: log |
| ex.printStackTrace(); |
| } |
| } |
| } |
| |
| private static void loadConfigElementsV2(IManagedConfigElement[] elements, String revision) { |
| for (IManagedConfigElement element : elements) { |
| try { |
| // Load the top level elements, which in turn load their children |
| if (element.getName().equals(ITool.TOOL_ELEMENT_NAME)) { |
| new Tool(element, revision); |
| } else if (element.getName().equals(ITarget.TARGET_ELEMENT_NAME)) { |
| new Target(element, revision); |
| } else if (element.getName().equals(IManagedConfigElementProvider.ELEMENT_NAME)) { |
| // don't allow nested config providers. |
| if (element instanceof DefaultManagedConfigElement) { |
| IManagedConfigElement[] providedConfigs; |
| IManagedConfigElementProvider provider = createConfigProvider( |
| (DefaultManagedConfigElement) element); |
| providedConfigs = provider.getConfigElements(); |
| loadConfigElementsV2(providedConfigs, revision); // This must use the 2.0 build model |
| } |
| } |
| } catch (Exception ex) { |
| // TODO: log |
| ex.printStackTrace(); |
| } |
| } |
| } |
| |
| /* |
| * Creates a new build information object and associates it with the |
| * resource in the argument. Note that the information contains no |
| * build target or configuation information. It is the responsibility |
| * of the caller to populate it. It is also important to note that the |
| * caller is responsible for associating an IPathEntryContainer with the |
| * build information after it has been populated. |
| * <p> |
| * The typical sequence of calls to add a new build information object to |
| * a managed build project is |
| * <p><pre> |
| * ManagedBuildManager.createBuildInfo(project); |
| * // Do whatever initialization you need here |
| * ManagedBuildManager.createTarget(project); |
| * ManagedBuildManager.initBuildInfoContainer(project); |
| * |
| * @param resource The resource the build information is associated with |
| */ |
| public static ManagedBuildInfo createBuildInfo(IResource resource) { |
| IProject proj = resource.getProject(); |
| ManagedBuildInfo buildInfo = new ManagedBuildInfo(proj); |
| try { |
| setLoaddedBuildInfo(proj, buildInfo); |
| } catch (CoreException e) { |
| ManagedBuilderCorePlugin.log(e); |
| buildInfo = null; |
| } |
| return buildInfo; |
| } |
| |
| public static void setLoaddedBuildInfo(IProject project, IManagedBuildInfo info) throws CoreException { |
| // Associate the build info with the project for the duration of the session |
| //project.setSessionProperty(buildInfoProperty, info); |
| // IResourceRuleFactory rcRf = ResourcesPlugin.getWorkspace().getRuleFactory(); |
| // ISchedulingRule rule = rcRf.modifyRule(project); |
| // IJobManager mngr = Job.getJobManager(); |
| |
| // try { |
| // mngr.beginRule(rule, null); |
| doSetLoaddedInfo(project, info, true); |
| // } catch (IllegalArgumentException e) { |
| // // TODO: set anyway for now |
| // doSetLoaddedInfo(project, info); |
| // }finally { |
| // mngr.endRule(rule); |
| // } |
| } |
| |
| private synchronized static void doSetLoaddedInfo(IProject project, IManagedBuildInfo info, boolean overwrite) { |
| if (!overwrite && fInfoMap.get(project) != null) |
| return; |
| |
| if (info != null) { |
| fInfoMap.put(project, info); |
| if (BuildDbgUtil.DEBUG) |
| BuildDbgUtil.getInstance().traceln(BuildDbgUtil.BUILD_INFO_LOAD, |
| "build info load: build info set for project " + project.getName()); //$NON-NLS-1$ |
| } else { |
| fInfoMap.remove(project); |
| if (BuildDbgUtil.DEBUG) |
| BuildDbgUtil.getInstance().traceln(BuildDbgUtil.BUILD_INFO_LOAD, |
| "build info load: build info CLEARED for project " + project.getName()); //$NON-NLS-1$ |
| } |
| } |
| |
| private static IManagedConfigElementProvider createConfigProvider(DefaultManagedConfigElement element) |
| throws CoreException { |
| |
| return (IManagedConfigElementProvider) element.getConfigurationElement() |
| .createExecutableExtension(IManagedConfigElementProvider.CLASS_ATTRIBUTE); |
| } |
| |
| private static IManagedBuildDefinitionsStartup createStartUpConfigLoader(DefaultManagedConfigElement element) |
| throws CoreException { |
| |
| return (IManagedBuildDefinitionsStartup) element.getConfigurationElement() |
| .createExecutableExtension(IManagedBuildDefinitionsStartup.CLASS_ATTRIBUTE); |
| } |
| |
| public static boolean manages(IResource resource) { |
| ICProjectDescription des = CoreModel.getDefault().getProjectDescription(resource.getProject(), false); |
| if (des == null) { |
| return false; |
| } |
| |
| ICConfigurationDescription cfgDes = des.getActiveConfiguration(); |
| IConfiguration cfg = ManagedBuildManager.getConfigurationForDescription(cfgDes); |
| if (cfg != null) |
| return true; |
| return false; |
| |
| // // The managed build manager manages build information for the |
| // // resource IFF it it is a project and has a build file with the proper |
| // // root element |
| // IProject project = null; |
| // if (resource instanceof IProject){ |
| // project = (IProject)resource; |
| // } else if (resource instanceof IFile) { |
| // project = ((IFile)resource).getProject(); |
| // } else { |
| // return false; |
| // } |
| // IFile file = project.getFile(SETTINGS_FILE_NAME); |
| // if (file.exists()) { |
| // try { |
| // InputStream stream = file.getContents(); |
| // DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder(); |
| // Document document = parser.parse(stream); |
| // NodeList nodes = document.getElementsByTagName(ROOT_NODE_NAME); |
| // return (nodes.getLength() > 0); |
| // } catch (Exception e) { |
| // return false; |
| // } |
| // } |
| // return false; |
| } |
| |
| /** |
| * Private helper method that first checks to see if a build information |
| * object has been associated with the project for the current workspace |
| * session. If one cannot be found, one is created from the project file |
| * associated with the argument. If there is no project file or the load |
| * fails for some reason, the method will return {@code null}. |
| */ |
| private static ManagedBuildInfo findBuildInfo(IResource rc, boolean forceLoad) { |
| |
| if (rc == null) { |
| if (BuildDbgUtil.DEBUG) |
| BuildDbgUtil.getInstance().traceln(BuildDbgUtil.BUILD_INFO_LOAD, "build info load: null resource"); //$NON-NLS-1$ |
| return null; |
| } |
| |
| ManagedBuildInfo buildInfo = null; |
| IProject proj = rc.getProject(); |
| |
| if (!proj.exists()) { |
| if (BuildDbgUtil.DEBUG) |
| BuildDbgUtil.getInstance().traceln(BuildDbgUtil.BUILD_INFO_LOAD, |
| "build info load: info is null, project does not exist"); //$NON-NLS-1$ |
| return null; |
| } |
| |
| if (BuildDbgUtil.DEBUG) |
| BuildDbgUtil.getInstance().traceln(BuildDbgUtil.BUILD_INFO_LOAD, |
| "build info load: info is null, querying the update mngr"); //$NON-NLS-1$ |
| buildInfo = UpdateManagedProjectManager.getConvertedManagedBuildInfo(proj); |
| |
| if (buildInfo != null) |
| return buildInfo; |
| |
| // Check if there is any build info associated with this project for this session |
| try { |
| buildInfo = getLoadedBuildInfo(proj); |
| } catch (CoreException e) { |
| if (BuildDbgUtil.DEBUG) |
| BuildDbgUtil.getInstance().traceln(BuildDbgUtil.BUILD_INFO_LOAD, |
| "build info load: core exception while getting the loaded info: " + e.getLocalizedMessage()); //$NON-NLS-1$ |
| return null; |
| } |
| |
| if (buildInfo == null /*&& forceLoad*/) { |
| int flags = forceLoad ? 0 : ICProjectDescriptionManager.GET_IF_LOADDED; |
| |
| if (BuildDbgUtil.DEBUG) |
| BuildDbgUtil.getInstance().traceln(BuildDbgUtil.BUILD_INFO_LOAD, |
| "build info load: build info is NOT loaded" + (forceLoad ? " forceload" : "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| ICProjectDescription projDes = CoreModel.getDefault().getProjectDescriptionManager() |
| .getProjectDescription(proj, flags); |
| if (projDes != null) { |
| if (BuildDbgUtil.DEBUG) |
| BuildDbgUtil.getInstance().traceln(BuildDbgUtil.BUILD_INFO_LOAD, |
| "build info load: project description is obtained, qwerying the loaded build info"); //$NON-NLS-1$ |
| try { |
| buildInfo = getLoadedBuildInfo(proj); |
| } catch (CoreException e) { |
| if (BuildDbgUtil.DEBUG) |
| BuildDbgUtil.getInstance().traceln(BuildDbgUtil.BUILD_INFO_LOAD, |
| "build info load: core exception while getting the loaded info (2): " //$NON-NLS-1$ |
| + e.getLocalizedMessage()); |
| return null; |
| } |
| |
| if (buildInfo == null) { |
| if (BuildDbgUtil.DEBUG) |
| BuildDbgUtil.getInstance().traceln(BuildDbgUtil.BUILD_INFO_LOAD, |
| "build info load: info is null, trying the cfg data provider"); //$NON-NLS-1$ |
| |
| buildInfo = ConfigurationDataProvider.getLoaddedBuildInfo(projDes); |
| if (buildInfo != null) { |
| if (BuildDbgUtil.DEBUG) |
| BuildDbgUtil.getInstance().traceln(BuildDbgUtil.BUILD_INFO_LOAD, |
| "build info load: info found, setting as loaded"); //$NON-NLS-1$ |
| |
| try { |
| setLoaddedBuildInfo(proj, buildInfo); |
| } catch (CoreException e) { |
| if (BuildDbgUtil.DEBUG) |
| BuildDbgUtil.getInstance().traceln(BuildDbgUtil.BUILD_INFO_LOAD, |
| "build info load: core exception while setting loaded description, ignoring; : " //$NON-NLS-1$ |
| + e.getLocalizedMessage()); |
| } |
| } |
| |
| } |
| |
| } else if (BuildDbgUtil.DEBUG) { |
| BuildDbgUtil.getInstance().traceln(BuildDbgUtil.BUILD_INFO_LOAD, |
| "build info load: project description in null"); //$NON-NLS-1$ |
| } |
| |
| // if(buildInfo == null){ |
| // if(BuildDbgUtil.DEBUG) |
| // BuildDbgUtil.getInstance().traceln(BuildDbgUtil.BUILD_INFO_LOAD, "build info load: info is null, querying the update mngr"); //$NON-NLS-1$ |
| // buildInfo = UpdateManagedProjectManager.getConvertedManagedBuildInfo(proj); |
| // } |
| } |
| // if (buildInfo == null && resource instanceof IProject) |
| // buildInfo = findBuildInfoSynchronized((IProject)resource, forceLoad); |
| /* |
| // Nothing in session store, so see if we can load it from cdtbuild |
| if (buildInfo == null && resource instanceof IProject) { |
| try { |
| buildInfo = loadBuildInfo((IProject)resource); |
| } catch (Exception e) { |
| // TODO: Issue error reagarding not being able to load the project file (.cdtbuild) |
| } |
| |
| try { |
| // Check if the project needs its container initialized |
| initBuildInfoContainer(buildInfo); |
| } catch (CoreException e) { |
| // We can live without a path entry container if the build information is valid |
| } |
| } |
| */ |
| if (buildInfo != null) |
| buildInfo.updateOwner(proj); |
| |
| if (BuildDbgUtil.DEBUG) { |
| if (buildInfo == null) |
| BuildDbgUtil.getInstance().traceln(BuildDbgUtil.BUILD_INFO_LOAD, "build info load: build info is null"); //$NON-NLS-1$ |
| // else |
| // BuildDbgUtil.getInstance().traceln(BuildDbgUtil.BUILD_INFO_LOAD, "build info load: build info found"); |
| } |
| |
| return buildInfo; |
| } |
| |
| synchronized static ManagedBuildInfo getLoadedBuildInfo(IProject project) throws CoreException { |
| // Check if there is any build info associated with this project for this session |
| ManagedBuildInfo buildInfo = (ManagedBuildInfo) fInfoMap.get(project);//project.getSessionProperty(buildInfoProperty); |
| // Make sure that if a project has build info, that the info is not corrupted |
| if (buildInfo != null) { |
| buildInfo.updateOwner(project); |
| } |
| return buildInfo; |
| } |
| |
| /** |
| * Determine if build information can be found. Various attempts are made |
| * to find the information, and if successful, true is returned; false otherwise. |
| * Typically, this routine would be called prior to findBuildInfo, to deterimine |
| * if findBuildInfo should be called to actually do the loading of build |
| * information, if possible |
| */ |
| private static boolean canFindBuildInfo(IResource resource) { |
| |
| if (resource == null) |
| return false; |
| |
| // Make sure the extension information is loaded first |
| try { |
| loadExtensions(); |
| } catch (BuildException e) { |
| e.printStackTrace(); |
| return false; |
| } |
| |
| ManagedBuildInfo buildInfo = null; |
| |
| // Check if there is any build info associated with this project for this session |
| try { |
| buildInfo = getLoadedBuildInfo(resource.getProject()); |
| } catch (CoreException e) { |
| // Continue, to see if any of the upcoming checks are successful |
| } |
| |
| if (buildInfo == null && resource instanceof IProject) { |
| // Check weather getBuildInfo is called from converter |
| buildInfo = UpdateManagedProjectManager.getConvertedManagedBuildInfo((IProject) resource); |
| if (buildInfo != null) |
| return true; |
| // Check if the build information can be loaded from the .cdtbuild file |
| return canLoadBuildInfo(((IProject) resource)); |
| } |
| |
| return (buildInfo != null); |
| } |
| |
| /** |
| * this method is called if managed build info session property |
| * was not set. The caller will use the project rule |
| * to synchronize with other callers |
| * findBuildInfoSynchronized could also be called from project converter |
| * in this case the ManagedBuildInfo saved in the converter would be returned |
| */ |
| /* synchronized private static ManagedBuildInfo findBuildInfoSynchronized(IProject project, boolean forceLoad) { |
| ManagedBuildInfo buildInfo = null; |
| |
| // Check if there is any build info associated with this project for this session |
| try { |
| buildInfo = (ManagedBuildInfo)project.getSessionProperty(buildInfoProperty); |
| // Make sure that if a project has build info, that the info is not corrupted |
| if (buildInfo != null) { |
| buildInfo.updateOwner(project); |
| } |
| } catch (CoreException e) { |
| // return null; |
| } |
| |
| if(buildInfo == null && forceLoad){ |
| // Make sure the extension information is loaded first |
| try { |
| loadExtensions(); |
| } catch (BuildException e) { |
| e.printStackTrace(); |
| return null; |
| } |
| |
| |
| // Check weather getBuildInfo is called from converter |
| buildInfo = UpdateManagedProjectManager.getConvertedManagedBuildInfo(project); |
| |
| // Nothing in session store, so see if we can load it from cdtbuild |
| if (buildInfo == null) { |
| try { |
| buildInfo = loadBuildInfo(project); |
| } catch (Exception e) { |
| // Issue error regarding not being able to load the project file (.cdtbuild) |
| if (buildInfo == null) { |
| buildInfo = createBuildInfo(project); |
| } |
| buildInfo.setValid(false); |
| // Display error message |
| IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); |
| if(window == null){ |
| IWorkbenchWindow windows[] = PlatformUI.getWorkbench().getWorkbenchWindows(); |
| window = windows[0]; |
| } |
| |
| final Shell shell = window.getShell(); |
| final String exceptionMsg = e.getMessage(); |
| //using syncExec could cause a dead-lock |
| //that is why asyncExec is used |
| shell.getDisplay().asyncExec( new Runnable() { |
| public void run() { |
| MessageDialog.openError(shell, |
| ManagedMakeMessages.getResourceString("ManagedBuildManager.error.open_failed_title"), //$NON-NLS-1$ |
| ManagedMakeMessages.getFormattedString("ManagedBuildManager.error.open_failed", //$NON-NLS-1$ |
| exceptionMsg)); |
| } |
| } ); |
| } |
| |
| if (buildInfo != null && !buildInfo.isContainerInited()) { |
| // NOTE: If this is called inside the above rule, then an IllegalArgumentException can |
| // occur when the CDT project file is saved - it uses the Workspace Root as the scheduling rule. |
| // |
| try { |
| // Check if the project needs its container initialized |
| initBuildInfoContainer(buildInfo); |
| } catch (CoreException e) { |
| // We can live without a path entry container if the build information is valid |
| } |
| } |
| } |
| } |
| |
| return buildInfo; |
| } |
| */ |
| /** |
| * Finds, but does not create, the managed build information for the |
| * argument. |
| * Loads the build info in case it is not currently loaded |
| * Calling this method is the same as calling getBuildInfo(IResource resource, boolean forceLoad) |
| * with the "forceLoad" argument set to true |
| * |
| * @param resource The resource to search for managed build information on. |
| * @return IManagedBuildInfo The build information object for the resource, or null if it doesn't exist |
| */ |
| public static IManagedBuildInfo getBuildInfo(IResource resource) { |
| return getBuildInfo(resource, true); |
| } |
| |
| public static IManagedBuildInfo getOldStyleBuildInfo(IProject project) throws CoreException { |
| IManagedBuildInfo info = null; |
| try { |
| info = getLoadedBuildInfo(project); |
| } catch (CoreException e) { |
| } |
| |
| if (info == null) { |
| try { |
| info = loadOldStyleBuildInfo(project); |
| |
| if (info != null) |
| doSetLoaddedInfo(project, info, false); |
| } catch (Exception e) { |
| throw new CoreException( |
| new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, e.getLocalizedMessage(), e)); |
| } |
| } |
| |
| return info; |
| |
| } |
| |
| public static synchronized IManagedBuildInfo getBuildInfoLegacy(IProject project) { |
| try { |
| return getOldStyleBuildInfo(project); |
| } catch (CoreException e) { |
| ManagedBuilderCorePlugin.log(e); |
| return null; |
| } |
| } |
| |
| /** |
| * Finds, but does not create, the managed build information for the |
| * argument. |
| * If the build info is not currently loaded and "forceLoad" argument is set to true, |
| * loads the build info from the .cdtbuild file |
| * In case "forceLoad" is false, does not load the build info and returns null in case it is not loaded |
| * |
| * @param resource The resource to search for managed build information on. |
| * @param forceLoad specifies whether the build info should be loaded in case it is not loaded currently. |
| * @return IManagedBuildInfo The build information object for the resource. |
| */ |
| public static IManagedBuildInfo getBuildInfo(IResource resource, boolean forceLoad) { |
| return findBuildInfo(resource.getProject(), forceLoad); |
| } |
| |
| /** |
| * Determines if the managed build information for the |
| * argument can be found. |
| * |
| * @param resource The resource to search for managed build information on. |
| * @return boolean True if the build info can be found; false otherwise. |
| */ |
| public static boolean canGetBuildInfo(IResource resource) { |
| return canFindBuildInfo(resource.getProject()); |
| } |
| |
| /** |
| * Answers the current version of the managed builder plugin. |
| * |
| * @return the current version of the managed builder plugin |
| * @since 8.0 |
| */ |
| public static Version getBuildInfoVersion() { |
| return buildInfoVersion; |
| } |
| |
| /** |
| * Get the full URL for a path that is relative to the plug-in |
| * in which .buildDefinitions are defined |
| * |
| * @return the full URL for a path relative to the .buildDefinitions |
| * plugin |
| */ |
| public static URL getURLInBuildDefinitions(DefaultManagedConfigElement element, IPath path) { |
| |
| IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(EXTENSION_POINT_ID); |
| if (extensionPoint != null) { |
| IExtension[] extensions = extensionPoint.getExtensions(); |
| if (extensions != null) { |
| |
| // Iterate over all extensions that contribute to .buildDefinitions |
| for (IExtension extension : extensions) { |
| // Determine whether the configuration element that is |
| // associated with the path, is valid for the extension that |
| // we are currently processing. |
| // |
| // Note: If not done, icon file names would have to be unique |
| // across several plug-ins. |
| if (element.getExtension().getExtensionPointUniqueIdentifier() == extension |
| .getExtensionPointUniqueIdentifier()) { |
| // Get the path-name |
| Bundle bundle = Platform.getBundle(extension.getNamespace()); |
| URL url = Platform.find(bundle, path); |
| if (url != null) { |
| try { |
| return Platform.asLocalURL(url); |
| } catch (IOException e) { |
| // Ignore the exception |
| return null; |
| } |
| } else { |
| // Print a warning |
| outputIconError(path.toString()); |
| } |
| } |
| } |
| } |
| } |
| return null; |
| } |
| |
| /* |
| * @return |
| */ |
| private static Map<IResource, List<IScannerInfoChangeListener>> getBuildModelListeners() { |
| if (buildModelListeners == null) { |
| buildModelListeners = new HashMap<>(); |
| } |
| return buildModelListeners; |
| } |
| |
| private static Map<IBuildObject, IManagedConfigElement> getConfigElementMap() { |
| if (!projectTypesLoading) |
| throw new IllegalStateException(); |
| |
| if (configElementMap == null) { |
| configElementMap = new HashMap<>(); |
| } |
| return configElementMap; |
| } |
| |
| /** |
| * @noreference This method public for implementation reasons. Not intended for use |
| * by clients. |
| * |
| */ |
| public static void putConfigElement(IBuildObject buildObj, IManagedConfigElement configElement) { |
| getConfigElementMap().put(buildObj, configElement); |
| } |
| |
| /** |
| * @noreference This method public for implementation reasons. Not intended for use |
| * by clients. |
| */ |
| public static IManagedConfigElement getConfigElement(IBuildObject buildObj) { |
| return getConfigElementMap().get(buildObj); |
| } |
| |
| public static void optionValidError(int errorId, String id) { |
| String[] msgs = new String[1]; |
| msgs[0] = id; |
| switch (errorId) { |
| case ERROR_CATEGORY: |
| ManagedBuildManager.outputManifestError( |
| ManagedMakeMessages.getFormattedString(ManagedBuildManager.MANIFEST_ERROR_OPTION_CATEGORY, msgs)); |
| break; |
| case ERROR_FILTER: |
| ManagedBuildManager.outputManifestError( |
| ManagedMakeMessages.getFormattedString(ManagedBuildManager.MANIFEST_ERROR_OPTION_FILTER, msgs)); |
| break; |
| } |
| } |
| |
| public static void optionValueHandlerError(String attribute, String id) { |
| String[] msgs = new String[2]; |
| msgs[0] = attribute; |
| msgs[1] = id; |
| ManagedBuildManager.outputManifestError( |
| ManagedMakeMessages.getFormattedString(ManagedBuildManager.MANIFEST_ERROR_OPTION_VALUEHANDLER, msgs)); |
| } |
| |
| public static void outputResolveError(String attribute, String lookupId, String type, String id) { |
| String[] msgs = new String[4]; |
| msgs[0] = attribute; |
| msgs[1] = lookupId; |
| msgs[2] = type; |
| msgs[3] = id; |
| ManagedBuildManager.outputManifestError( |
| ManagedMakeMessages.getFormattedString(ManagedBuildManager.MANIFEST_ERROR_RESOLVING, msgs)); |
| } |
| |
| public static void outputDuplicateIdError(String type, String id) { |
| String[] msgs = new String[2]; |
| msgs[0] = type; |
| msgs[1] = id; |
| ManagedBuildManager.outputManifestError( |
| ManagedMakeMessages.getFormattedString(ManagedBuildManager.MANIFEST_ERROR_DUPLICATE, msgs)); |
| } |
| |
| public static void outputManifestError(String message) { |
| System.err.println(ManagedMakeMessages.getResourceString(MANIFEST_ERROR_HEADER) + message + NEWLINE); |
| } |
| |
| public static void outputIconError(String iconLocation) { |
| String[] msgs = new String[1]; |
| msgs[0] = iconLocation; |
| ManagedBuildManager.outputManifestError( |
| ManagedMakeMessages.getFormattedString(ManagedBuildManager.MANIFEST_ERROR_ICON, msgs)); |
| } |
| |
| /** |
| * @return the instance of the Environment Variable Provider |
| */ |
| public static IEnvironmentVariableProvider getEnvironmentVariableProvider() { |
| return EnvironmentVariableProvider.getDefault(); |
| } |
| |
| /** |
| * @return the version, if 'id' contains a valid version |
| * or {@code null} otherwise. |
| */ |
| |
| public static String getVersionFromIdAndVersion(String idAndVersion) { |
| |
| // Get the index of the separator '_' in tool id. |
| int index = idAndVersion.lastIndexOf('_'); |
| |
| //Validate the version number if exists. |
| if (index != -1) { |
| // Get the version number from tool id. |
| String version = idAndVersion.substring(index + 1); |
| |
| try { |
| // If there is a valid version then return 'version' |
| Version.parseVersion(version); |
| return version; |
| } catch (IllegalArgumentException e) { |
| // ignore exception and return null |
| } |
| } |
| // If there is no version information or not a valid version, return null |
| return null; |
| } |
| |
| /** |
| * @return If the input to this function contains 'id & a valid version', it returns only the 'id' part |
| * Otherwise it returns the received input back. |
| */ |
| public static String getIdFromIdAndVersion(String idAndVersion) { |
| // If there is a valid version return only 'id' part |
| if (getVersionFromIdAndVersion(idAndVersion) != null) { |
| // Get the index of the separator '_' in tool id. |
| int index = idAndVersion.lastIndexOf('_'); |
| return idAndVersion.substring(0, index); |
| } else { |
| // if there is no version or no valid version |
| return idAndVersion; |
| } |
| } |
| |
| /** |
| * @return the instance of the Build Macro Provider |
| */ |
| public static IBuildMacroProvider getBuildMacroProvider() { |
| return BuildMacroProvider.getDefault(); |
| } |
| |
| /** |
| * Send event to value handlers of relevant configuration including |
| * all its child resource configurations, if they exist. |
| * |
| * @param config configuration for which to send the event |
| * @param event to be sent |
| * |
| * @since 3.0 |
| */ |
| public static void performValueHandlerEvent(IConfiguration config, int event) { |
| performValueHandlerEvent(config, event, true); |
| } |
| |
| /** |
| * Send event to value handlers of relevant configuration. |
| * |
| * @param config configuration for which to send the event |
| * @param event to be sent |
| * @param doChildren - if true, also perform the event for all |
| * resource configurations that are children if this configuration. |
| * |
| * @since 3.0 |
| */ |
| public static void performValueHandlerEvent(IConfiguration config, int event, boolean doChildren) { |
| |
| IToolChain toolChain = config.getToolChain(); |
| if (toolChain == null) |
| return; |
| |
| IOption[] options = toolChain.getOptions(); |
| // Get global options directly under Toolchain (not associated with a particular tool) |
| // This has to be sent to all the Options associated with this configuration. |
| for (IOption option : options) { |
| // Ignore invalid options |
| if (option.isValid()) { |
| // Call the handler |
| if (option.getValueHandler().handleValue(config, toolChain, option, |
| option.getValueHandlerExtraArgument(), event)) { |
| // TODO : Event is handled successfully and returned true. |
| // May need to do something here say logging a message. |
| } else { |
| // Event handling Failed. |
| } |
| } |
| } |
| |
| // Get options associated with tools under toolChain |
| ITool[] tools = config.getFilteredTools(); |
| for (ITool tool : tools) { |
| IOption[] toolOptions = tool.getOptions(); |
| for (IOption toolOption : toolOptions) { |
| // Ignore invalid options |
| if (toolOption.isValid()) { |
| // Call the handler |
| if (toolOption.getValueHandler().handleValue(config, tool, toolOption, |
| toolOption.getValueHandlerExtraArgument(), event)) { |
| // TODO : Event is handled successfully and returned true. |
| // May need to do something here say logging a message. |
| } else { |
| // Event handling Failed. |
| } |
| } |
| } |
| } |
| |
| // Call backs for Resource Configurations associated with this config. |
| if (doChildren == true) { |
| IResourceConfiguration[] resConfigs = config.getResourceConfigurations(); |
| for (IResourceConfiguration resConfig : resConfigs) { |
| ManagedBuildManager.performValueHandlerEvent(resConfig, event); |
| } |
| } |
| } |
| |
| /** |
| * Send event to value handlers of relevant configuration. |
| * |
| * @param config configuration for which to send the event |
| * @param event to be sent |
| * |
| * @since 3.0 |
| */ |
| public static void performValueHandlerEvent(IResourceInfo config, int event) { |
| |
| // Note: Resource configurations have no toolchain options |
| |
| // Get options associated with the resource configuration |
| ITool[] tools = config instanceof IFileInfo ? ((IFileInfo) config).getToolsToInvoke() |
| : ((IFolderInfo) config).getFilteredTools(); |
| for (ITool tool : tools) { |
| IOption[] toolOptions = tool.getOptions(); |
| for (IOption toolOption : toolOptions) { |
| // Ignore invalid options |
| if (toolOption.isValid()) { |
| // Call the handler |
| if (toolOption.getValueHandler().handleValue(config, tool, toolOption, |
| toolOption.getValueHandlerExtraArgument(), event)) { |
| // TODO : Event is handled successfully and returned true. |
| // May need to do something here say logging a message. |
| } else { |
| // Event handling Failed. |
| } |
| } |
| } |
| } |
| } |
| |
| private static boolean checkForMigrationSupport(ManagedBuildInfo buildInfo, boolean forCurrentMbsVersion) { |
| |
| IConfigurationElement element = null; |
| |
| // Get the managed project from buildInfo |
| IManagedProject managedProject = buildInfo.getManagedProject(); |
| |
| IProjectType projectType = managedProject.getProjectType(); |
| if (forCurrentMbsVersion) { |
| element = ((ProjectType) projectType).getCurrentMbsVersionConversionElement(); |
| } else { |
| element = ((ProjectType) projectType).getPreviousMbsVersionConversionElement(); |
| } |
| |
| if (element != null) { |
| // If there is a converter element for projectType, invoke it. |
| // projectType converter should take care of invoking converters of |
| // it's children |
| |
| if (invokeConverter(buildInfo, managedProject, element) == null) { |
| buildInfo.getManagedProject().setValid(false); |
| return false; |
| } |
| } else { |
| // other wise, walk through the hierarchy of the project and |
| // call the converters if available for each configuration |
| IConfiguration[] configs = managedProject.getConfigurations(); |
| for (IConfiguration configuration : configs) { |
| IToolChain toolChain = configuration.getToolChain(); |
| |
| if (forCurrentMbsVersion) { |
| element = ((ToolChain) toolChain).getCurrentMbsVersionConversionElement(); |
| } else { |
| element = ((ToolChain) toolChain).getPreviousMbsVersionConversionElement(); |
| } |
| |
| if (element != null) { |
| // If there is a converter element for toolChain, invoke it |
| // toolChain converter should take care of invoking |
| // converters of it's children |
| if (invokeConverter(buildInfo, toolChain, element) == null) { |
| buildInfo.getManagedProject().setValid(false); |
| return false; |
| } |
| } else { |
| // If there are no converters for toolChain, walk through |
| // it's children |
| ITool[] tools = toolChain.getTools(); |
| for (ITool tool : tools) { |
| if (forCurrentMbsVersion) { |
| element = ((Tool) tool).getCurrentMbsVersionConversionElement(); |
| } else { |
| element = ((Tool) tool).getPreviousMbsVersionConversionElement(); |
| } |
| if (element != null) { |
| if (invokeConverter(buildInfo, tool, element) == null) { |
| buildInfo.getManagedProject().setValid(false); |
| return false; |
| } |
| } |
| } |
| IBuilder builder = toolChain.getBuilder(); |
| if (builder != null) { |
| if (forCurrentMbsVersion) { |
| element = ((Builder) builder).getCurrentMbsVersionConversionElement(); |
| } else { |
| element = ((Builder) builder).getPreviousMbsVersionConversionElement(); |
| } |
| |
| if (element != null) { |
| if (invokeConverter(buildInfo, builder, element) == null) { |
| buildInfo.getManagedProject().setValid(false); |
| return false; |
| } |
| } |
| } |
| } |
| |
| // walk through each resource configuration and look if there |
| // are any converters |
| // available. If so, invoke them. |
| IResourceConfiguration[] resourceConfigs = configuration.getResourceConfigurations(); |
| if ((resourceConfigs != null) && (resourceConfigs.length > 0)) { |
| for (IResourceConfiguration resConfig : resourceConfigs) { |
| ITool[] resTools = resConfig.getTools(); |
| for (ITool resTool : resTools) { |
| if (forCurrentMbsVersion) { |
| element = ((Tool) resTool).getCurrentMbsVersionConversionElement(); |
| } else { |
| element = ((Tool) resTool).getPreviousMbsVersionConversionElement(); |
| } |
| if (element != null) { |
| if (invokeConverter(buildInfo, resTool, element) == null) { |
| buildInfo.getManagedProject().setValid(false); |
| return false; |
| } |
| } |
| } |
| } |
| } // end of if |
| } |
| } |
| // If control comes here, it means either there is no converter element |
| // or converters are invoked successfully |
| |
| return true; |
| } |
| |
| private static IBuildObject invokeConverter(ManagedBuildInfo bi, IBuildObject buildObject, |
| IConfigurationElement element) { |
| |
| if (element != null) { |
| IConvertManagedBuildObject convertBuildObject = null; |
| String toId = element.getAttribute("toId"); //$NON-NLS-1$ |
| String fromId = element.getAttribute("fromId"); //$NON-NLS-1$ |
| |
| try { |
| convertBuildObject = (IConvertManagedBuildObject) element.createExecutableExtension("class"); //$NON-NLS-1$ |
| } catch (CoreException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| |
| if (convertBuildObject != null) { |
| // invoke the converter |
| IProject prj = null; |
| IBuildObject result = null; |
| try { |
| if (bi != null) { |
| prj = (IProject) bi.getManagedProject().getOwner(); |
| UpdateManagedProjectManager.addInfo(prj, bi); |
| } |
| result = convertBuildObject.convert(buildObject, fromId, toId, false); |
| } finally { |
| if (bi != null) |
| UpdateManagedProjectManager.delInfo(prj); |
| } |
| return result; |
| } |
| } |
| // if control comes here, it means that either 'convertBuildObject' is null or |
| // converter did not convert the object successfully |
| return null; |
| } |
| |
| /* |
| * Generic Converter function. |
| * If the converter is available for the given Build Object, it calls the corresponding converter. |
| * It returns null if there are no converters or if the conversion is not successful |
| * It returns 'IBuildObject' if the conversion is successful. |
| */ |
| |
| public static IBuildObject convert(IBuildObject buildObj, String toId, boolean userhasConfirmed) { |
| |
| String tmpToId = null; |
| |
| // Get the Converter Extension Point |
| IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint( |
| "org.eclipse.cdt.managedbuilder.core", //$NON-NLS-1$ |
| "projectConverter"); //$NON-NLS-1$ |
| if (extensionPoint != null) { |
| // Get the extensions |
| IExtension[] extensions = extensionPoint.getExtensions(); |
| for (IExtension extension : extensions) { |
| // Get the configuration elements of each extension |
| IConfigurationElement[] configElements = extension.getConfigurationElements(); |
| for (IConfigurationElement element : configElements) { |
| |
| if (element.getName().equals("converter") //$NON-NLS-1$ |
| && (isBuildObjectApplicableForConversion(buildObj, element) == true)) { |
| tmpToId = element.getAttribute("toId"); //$NON-NLS-1$ |
| if (tmpToId.equals(toId)) { |
| return invokeConverter(null, buildObj, element); |
| } |
| } |
| } |
| } |
| } |
| return null; |
| } |
| |
| /** |
| * Generic routine for checking the availability of converters for the given |
| * Build Object. |
| * |
| * @return true if there are converters for the given Build Object. |
| * Returns false if there are no converters. |
| */ |
| public static boolean hasTargetConversionElements(IBuildObject buildObj) { |
| |
| // Get the Converter Extension Point |
| IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint( |
| "org.eclipse.cdt.managedbuilder.core", //$NON-NLS-1$ |
| "projectConverter"); //$NON-NLS-1$ |
| if (extensionPoint != null) { |
| // Get the extensions |
| IExtension[] extensions = extensionPoint.getExtensions(); |
| for (IExtension extension : extensions) { |
| // Get the configuration elements of each extension |
| IConfigurationElement[] configElements = extension.getConfigurationElements(); |
| for (IConfigurationElement element : configElements) { |
| if (element.getName().equals("converter") //$NON-NLS-1$ |
| && (isBuildObjectApplicableForConversion(buildObj, element) == true)) |
| return true; |
| } |
| } |
| } |
| return false; |
| } |
| |
| /* |
| * Generic function for getting the list of converters for the given Build Object |
| */ |
| |
| public static Map<String, IConfigurationElement> getConversionElements(IBuildObject buildObj) { |
| |
| Map<String, IConfigurationElement> conversionTargets = new HashMap<>(); |
| |
| // Get the Converter Extension Point |
| IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint( |
| "org.eclipse.cdt.managedbuilder.core", //$NON-NLS-1$ |
| "projectConverter"); //$NON-NLS-1$ |
| if (extensionPoint != null) { |
| // Get the extensions |
| IExtension[] extensions = extensionPoint.getExtensions(); |
| for (IExtension extension : extensions) { |
| // Get the configuration elements of each extension |
| IConfigurationElement[] configElements = extension.getConfigurationElements(); |
| for (IConfigurationElement element : configElements) { |
| if (element.getName().equals("converter") //$NON-NLS-1$ |
| && (isBuildObjectApplicableForConversion(buildObj, element) == true)) { |
| conversionTargets.put(element.getAttribute("name"), element); //$NON-NLS-1$ |
| } |
| } |
| } |
| } |
| return conversionTargets; |
| } |
| |
| /* |
| * Generic function that checks whether the given conversion element can be used to convert the given |
| * build object. It returns true if the given build object is convertable, otherwise it returns false. |
| */ |
| |
| private static boolean isBuildObjectApplicableForConversion(IBuildObject buildObj, IConfigurationElement element) { |
| |
| String id = null; |
| String fromId = element.getAttribute("fromId"); //$NON-NLS-1$ |
| |
| // Check whether the current converter can be used for conversion |
| |
| if (buildObj instanceof IProjectType) { |
| IProjectType projType = (IProjectType) buildObj; |
| |
| // Check whether the converter's 'fromId' and the |
| // given projType 'id' are equal |
| while (projType != null) { |
| id = projType.getId(); |
| |
| if (fromId.equals(id)) { |
| return true; |
| } |
| projType = projType.getSuperClass(); |
| } |
| } else if (buildObj instanceof IToolChain) { |
| IToolChain toolChain = (IToolChain) buildObj; |
| |
| // Check whether the converter's 'fromId' and the |
| // given toolChain 'id' are equal |
| while (toolChain != null) { |
| id = toolChain.getId(); |
| |
| if (fromId.equals(id)) { |
| return true; |
| } |
| toolChain = toolChain.getSuperClass(); |
| } |
| } else if (buildObj instanceof ITool) { |
| ITool tool = (ITool) buildObj; |
| |
| // Check whether the converter's 'fromId' and the |
| // given tool 'id' are equal |
| while (tool != null) { |
| id = tool.getId(); |
| |
| if (fromId.equals(id)) { |
| return true; |
| } |
| tool = tool.getSuperClass(); |
| } |
| } else if (buildObj instanceof IBuilder) { |
| IBuilder builder = (IBuilder) buildObj; |
| |
| // Check whether the converter's 'fromId' and the |
| // given builder 'id' are equal |
| while (builder != null) { |
| id = builder.getId(); |
| |
| if (fromId.equals(id)) { |
| return true; |
| } |
| builder = builder.getSuperClass(); |
| } |
| } |
| return false; |
| } |
| |
| /* |
| * if the suffix is null, then the random number will be appended to the superId |
| */ |
| static public String calculateChildId(String superId, String suffix) { |
| if (suffix == null) |
| suffix = Integer.toString(getRandomNumber()); |
| |
| String version = getVersionFromIdAndVersion(superId); |
| if (version != null) |
| return ManagedBuildManager.getIdFromIdAndVersion(superId) + "." + suffix + "_" + version; //$NON-NLS-1$ //$NON-NLS-2$ |
| return superId + "." + suffix; //$NON-NLS-1$ |
| } |
| |
| private static int isInt(String s) { |
| try { |
| return Integer.parseInt(s); |
| } catch (NumberFormatException e) { |
| return 0; |
| } |
| } |
| |
| /** |
| * @return base id when the given id was generated by {@link #calculateChildId(String, String)}. |
| * @since 8.0 |
| */ |
| public static String calculateBaseId(String id) { |
| int index = id.lastIndexOf('.'); |
| if (index < 0) |
| return id; |
| |
| String lastSeg = id.substring(index + 1, id.length()); |
| if (isInt(lastSeg) > 0) { |
| String baseId = id.substring(0, index); |
| return baseId; |
| } |
| return getIdFromIdAndVersion(id); |
| } |
| |
| /** |
| * @return calculated relative path given the full path to a folder and a file |
| */ |
| public static IPath calculateRelativePath(IPath container, IPath contents) { |
| IPath path = contents; |
| if (container.isPrefixOf(contents)) { |
| path = contents.setDevice(null).removeFirstSegments(container.segmentCount()); |
| } else { |
| String file = null; |
| container = container.addTrailingSeparator(); |
| if (!contents.hasTrailingSeparator()) { |
| file = contents.lastSegment(); |
| contents = contents.removeLastSegments(1); |
| contents = contents.addTrailingSeparator(); |
| } |
| |
| IPath prefix = contents; |
| for (; prefix.segmentCount() > 0 && !prefix.isPrefixOf(container); prefix = prefix.removeLastSegments(1)) { |
| } |
| if (prefix.segmentCount() > 0) { |
| int diff = container.segmentCount() - prefix.segmentCount(); |
| StringBuilder buff = new StringBuilder(); |
| while (diff-- > 0) |
| buff.append("../"); //$NON-NLS-1$ |
| path = new Path(buff.toString()).append(contents.removeFirstSegments(prefix.segmentCount())); |
| if (file != null) |
| path = path.append(file); |
| } |
| } |
| return path; |
| } |
| |
| /* private static IBuildObject getBuildObjectFromDataObject(CDataObject data){ |
| if(data instanceof BuildConfigurationData) |
| return ((BuildConfigurationData)data).getConfiguration(); |
| else if(data instanceof BuildFolderData) |
| return ((BuildFolderData)data).getFolderInfo(); |
| else if(data instanceof BuildFileData) |
| return ((BuildFileData)data).getFileInfo(); |
| return null; |
| } |
| */ |
| private static final boolean TEST_CONSISTENCE = false; |
| |
| public static IConfiguration getConfigurationForDescription(ICConfigurationDescription cfgDes) { |
| return getConfigurationForDescription(cfgDes, TEST_CONSISTENCE); |
| } |
| |
| private static IConfiguration getConfigurationForDescription(ICConfigurationDescription cfgDes, |
| boolean checkConsistance) { |
| if (cfgDes == null) |
| return null; |
| |
| if (cfgDes instanceof ICMultiConfigDescription) { |
| ICMultiConfigDescription mcd = (ICMultiConfigDescription) cfgDes; |
| ICConfigurationDescription[] cfds = (ICConfigurationDescription[]) mcd.getItems(); |
| return new MultiConfiguration(cfds); |
| } |
| |
| CConfigurationData cfgData = cfgDes.getConfigurationData(); |
| if (cfgData instanceof BuildConfigurationData) { |
| IConfiguration cfg = ((BuildConfigurationData) cfgData).getConfiguration(); |
| if (checkConsistance) { |
| if (cfgDes != getDescriptionForConfiguration(cfg, false)) { |
| throw new IllegalStateException(); |
| } |
| } |
| return cfg; |
| } |
| return null; |
| } |
| |
| /** |
| * Convert the IOption integer type ID to the {@link ICSettingEntry#getKind()} type ID |
| * @param type {@link IOption#getValueType()} |
| * @return ICSettingEntry type |
| */ |
| public static int optionTypeToEntryKind(int type) { |
| switch (type) { |
| case IOption.INCLUDE_PATH: |
| return ICSettingEntry.INCLUDE_PATH; |
| case IOption.PREPROCESSOR_SYMBOLS: |
| return ICSettingEntry.MACRO; |
| case IOption.INCLUDE_FILES: |
| return ICSettingEntry.INCLUDE_FILE; |
| case IOption.LIBRARY_PATHS: |
| return ICSettingEntry.LIBRARY_PATH; |
| case IOption.LIBRARIES: |
| case IOption.LIBRARY_FILES: |
| return ICSettingEntry.LIBRARY_FILE; |
| case IOption.MACRO_FILES: |
| return ICSettingEntry.MACRO_FILE; |
| } |
| return 0; |
| } |
| |
| /** |
| * Convert the IOption integer type ID to the {@link ICSettingEntry#getKind()} type ID |
| * @param type {@link IOption#getValueType()} |
| * @return ICSettingEntry type |
| */ |
| public static int optionUndefTypeToEntryKind(int type) { |
| switch (type) { |
| case IOption.UNDEF_INCLUDE_PATH: |
| return ICSettingEntry.INCLUDE_PATH; |
| case IOption.UNDEF_PREPROCESSOR_SYMBOLS: |
| return ICSettingEntry.MACRO; |
| case IOption.UNDEF_INCLUDE_FILES: |
| return ICSettingEntry.INCLUDE_FILE; |
| case IOption.UNDEF_LIBRARY_PATHS: |
| return ICSettingEntry.LIBRARY_PATH; |
| case IOption.UNDEF_LIBRARY_FILES: |
| return ICSettingEntry.LIBRARY_FILE; |
| case IOption.UNDEF_MACRO_FILES: |
| return ICSettingEntry.MACRO_FILE; |
| } |
| return 0; |
| } |
| |
| public static int entryKindToOptionType(int kind) { |
| switch (kind) { |
| case ICSettingEntry.INCLUDE_PATH: |
| return IOption.INCLUDE_PATH; |
| case ICSettingEntry.INCLUDE_FILE: |
| return IOption.INCLUDE_FILES; |
| case ICSettingEntry.MACRO: |
| return IOption.PREPROCESSOR_SYMBOLS; |
| case ICSettingEntry.MACRO_FILE: |
| return IOption.MACRO_FILES; |
| case ICSettingEntry.LIBRARY_PATH: |
| return IOption.LIBRARY_PATHS;//TODO IOption.LIBRARIES; |
| case ICSettingEntry.LIBRARY_FILE: |
| return IOption.LIBRARY_FILES; |
| } |
| return 0; |
| } |
| |
| public static int entryKindToUndefOptionType(int kind) { |
| switch (kind) { |
| case ICSettingEntry.INCLUDE_PATH: |
| return IOption.UNDEF_INCLUDE_PATH; |
| case ICSettingEntry.INCLUDE_FILE: |
| return IOption.UNDEF_INCLUDE_FILES; |
| case ICSettingEntry.MACRO: |
| return IOption.UNDEF_PREPROCESSOR_SYMBOLS; |
| case ICSettingEntry.MACRO_FILE: |
| return IOption.UNDEF_MACRO_FILES; |
| case ICSettingEntry.LIBRARY_PATH: |
| return IOption.UNDEF_LIBRARY_PATHS;//TODO IOption.LIBRARIES; |
| case ICSettingEntry.LIBRARY_FILE: |
| return IOption.UNDEF_LIBRARY_FILES; |
| } |
| return 0; |
| } |
| |
| public static ICConfigurationDescription getDescriptionForConfiguration(IConfiguration cfg) { |
| return getDescriptionForConfiguration(cfg, TEST_CONSISTENCE); |
| } |
| |
| private static ICConfigurationDescription getDescriptionForConfiguration(IConfiguration cfg, |
| boolean checkConsistance) { |
| if (cfg.isExtensionElement()) |
| return null; |
| ICConfigurationDescription des = ((Configuration) cfg).getConfigurationDescription(); |
| if (des == null) { |
| if (checkConsistance) |
| throw new IllegalStateException(); |
| if (((Configuration) cfg).isPreference()) { |
| try { |
| des = CCorePlugin.getDefault().getPreferenceConfiguration(CFG_DATA_PROVIDER_ID); |
| } catch (CoreException e) { |
| ManagedBuilderCorePlugin.log(e); |
| } |
| } else { |
| IProject project = cfg.getOwner().getProject(); |
| ICProjectDescription projDes = CoreModel.getDefault().getProjectDescription(project, false); |
| if (projDes != null) { |
| des = projDes.getConfigurationById(cfg.getId()); |
| } |
| } |
| } |
| if (checkConsistance) { |
| if (cfg != getConfigurationForDescription(des, false)) { |
| throw new IllegalStateException(); |
| } |
| } |
| return des; |
| } |
| |
| public static IPath getBuildFullPath(IConfiguration cfg, IBuilder builder) { |
| IProject project = cfg.getOwner().getProject(); |
| // String path = builder.getBuildPath(); |
| |
| IPath buildDirectory = builder.getBuildLocation(); |
| IPath fullPath = null; |
| if (buildDirectory != null && !buildDirectory.isEmpty()) { |
| IResource res = project.getParent().findMember(buildDirectory); |
| if (res instanceof IContainer && res.exists()) { |
| fullPath = res.getFullPath(); |
| } else { |
| IContainer crs[] = ((IWorkspaceRoot) project.getParent()).findContainersForLocation(buildDirectory); |
| if (crs.length != 0) { |
| String projName = project.getName(); |
| for (IContainer cr : crs) { |
| IPath path = cr.getFullPath(); |
| if (path.segmentCount() != 0 && path.segment(0).equals(projName)) { |
| fullPath = path; |
| break; |
| } |
| } |
| |
| if (fullPath == null) { |
| fullPath = crs[0].getFullPath(); |
| } |
| } |
| } |
| } else { |
| fullPath = cfg.getOwner().getProject().getFullPath(); |
| if (builder.isManagedBuildOn()) |
| fullPath = fullPath.append(cfg.getName()); |
| } |
| |
| return fullPath; |
| } |
| |
| /** |
| * Returns a string representing the workspace relative path with ${workspace_loc: stripped |
| * or null if the String path doesn't contain workspace_loc |
| * @param path String path to have workspace_loc removed |
| * @return workspace path or null |
| * |
| * @deprecated as of CDT 8.3. This method is useless as API as it does something very specfic to {@link BuildEntryStorage}. |
| * It was moved there as private method {@link BuildEntryStorage#locationToFullPath}. |
| */ |
| @Deprecated |
| public static String locationToFullPath(String path) { |
| Assert.isLegal(false, "Do not use this method"); //$NON-NLS-1$ |
| return null; |
| } |
| |
| public static String fullPathToLocation(String path) { |
| StringBuilder buf = new StringBuilder(); |
| return buf.append("${").append("workspace_loc:").append(path).append("}").toString(); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| } |
| |
| public static IPath getBuildLocation(IConfiguration cfg, IBuilder builder) { |
| if (cfg.getOwner() == null) |
| return Path.EMPTY; |
| |
| IProject project = cfg.getOwner().getProject(); |
| IPath buildDirectory = builder.getBuildLocation(); |
| if (buildDirectory != null && !buildDirectory.isEmpty()) { |
| IResource res = project.getParent().findMember(buildDirectory); |
| if (res instanceof IContainer && res.exists()) { |
| buildDirectory = res.getLocation(); |
| } |
| } else { |
| buildDirectory = getPathForResource(project); |
| |
| if (buildDirectory != null) { |
| if (builder.isManagedBuildOn()) |
| buildDirectory = buildDirectory.append(cfg.getName()); |
| } |
| } |
| return buildDirectory; |
| } |
| |
| /** |
| * @return build location URI or null if one couldn't be found |
| * @since 6.0 |
| */ |
| public static URI getBuildLocationURI(IConfiguration cfg, IBuilder builder) { |
| if (cfg.getOwner() == null) |
| return null; |
| |
| IProject project = cfg.getOwner().getProject(); |
| IPath buildDirectory = builder.getBuildLocation(); |
| if (buildDirectory != null && !buildDirectory.isEmpty()) { |
| IResource res = project.getParent().findMember(buildDirectory); |
| if (res instanceof IContainer && res.exists()) { |
| return res.getLocationURI(); |
| } |
| } else { |
| URI uri = project.getLocationURI(); |
| if (buildDirectory != null && builder.isManagedBuildOn()) |
| return URIUtil.append(uri, cfg.getName()); |
| return uri; |
| } |
| return org.eclipse.core.filesystem.URIUtil.toURI(buildDirectory); |
| } |
| |
| private static IPath getPathForResource(IResource resource) { |
| URI uri = resource.getLocationURI(); |
| return new Path(uri.getPath()); |
| } |
| |
| public static IBuilder[] createBuilders(IProject project, Map<String, String> args) { |
| return ManagedBuilderCorePlugin.createBuilders(project, args); |
| } |
| |
| public static IBuilder createCustomBuilder(IConfiguration cfg, String builderId) throws CoreException { |
| return ManagedBuilderCorePlugin.createCustomBuilder(cfg, builderId); |
| } |
| |
| public static IBuilder createCustomBuilder(IConfiguration cfg, IBuilder base) { |
| return ManagedBuilderCorePlugin.createCustomBuilder(cfg, base); |
| } |
| |
| public static IBuilder createBuilderForEclipseBuilder(IConfiguration cfg, String eclipseBuilderID) |
| throws CoreException { |
| return ManagedBuilderCorePlugin.createBuilderForEclipseBuilder(cfg, eclipseBuilderID); |
| } |
| |
| /* public static IToolChain[] getExtensionsToolChains(String propertyType, String propertyValue){ |
| List all = getSortedToolChains(); |
| List result = new ArrayList(); |
| for(int i = 0; i < all.size(); i++){ |
| List list = (List)all.get(i); |
| IToolChain tc = findToolChain(list, propertyType, propertyValue); |
| if(tc != null) |
| result.add(tc); |
| } |
| return (IToolChain[])result.toArray(new ToolChain[result.size()]); |
| } |
| */ |
| /* public static void resortToolChains(){ |
| sortedToolChains = null; |
| getSortedToolChains(); |
| } |
| */ |
| /* private static List getSortedToolChains(){ |
| if(sortedToolChains == null){ |
| sortedToolChains = new ArrayList(); |
| SortedMap map = getExtensionToolChainMapInternal(); |
| for(Iterator iter = map.values().iterator(); iter.hasNext();){ |
| ToolChain tc = (ToolChain)iter.next(); |
| if(tc.isAbstract()) |
| continue; |
| List list = searchIdentical(sortedToolChains, tc); |
| if(list == null){ |
| list = new ArrayList(); |
| sortedToolChains.add(list); |
| } |
| list.add(tc); |
| tc.setIdenticalList(list); |
| } |
| } |
| return sortedToolChains; |
| } |
| */ |
| // private static List findIdenticalToolChains(IToolChain tc){ |
| // ToolChain tCh = (ToolChain)tc; |
| // List list = tCh.getIdenticalList(); |
| // if(list == null){ |
| // resortToolChains(); |
| // list = tCh.getIdenticalList(); |
| // if(list == null){ |
| // list = new ArrayList(0); |
| // tCh.setIdenticalList(list); |
| // } |
| // } |
| // |
| // return ((ToolChain)tc).getIdenticalList(); |
| // } |
| |
| public static IToolChain[] getExtensionToolChains(IProjectType type) { |
| List<IToolChain> result = new ArrayList<>(); |
| IConfiguration cfgs[] = type.getConfigurations(); |
| |
| for (IConfiguration cfg : cfgs) { |
| IToolChain tc = cfg.getToolChain(); |
| if (tc == null) |
| continue; |
| |
| List<ToolChain> list = findIdenticalElements((ToolChain) tc, fToolChainSorter); |
| int k = 0; |
| for (; k < result.size(); k++) { |
| if (findIdenticalElements((ToolChain) result.get(k), fToolChainSorter) == list) |
| break; |
| } |
| |
| if (k == result.size()) { |
| result.add(tc); |
| } |
| } |
| return result.toArray(new IToolChain[result.size()]); |
| } |
| |
| public static IConfiguration[] getExtensionConfigurations(IToolChain tChain, IProjectType type) { |
| List<IConfiguration> list = new ArrayList<>(); |
| IConfiguration cfgs[] = type.getConfigurations(); |
| for (IConfiguration cfg : cfgs) { |
| IToolChain cur = cfg.getToolChain(); |
| if (cur != null && findIdenticalElements((ToolChain) cur, |
| fToolChainSorter) == findIdenticalElements((ToolChain) tChain, fToolChainSorter)) { |
| list.add(cfg); |
| } |
| } |
| return list.toArray(new Configuration[list.size()]); |
| } |
| |
| public static IConfiguration getFirstExtensionConfiguration(IToolChain tChain) { |
| if (tChain.getParent() != null) |
| return tChain.getParent(); |
| |
| List<ToolChain> list = findIdenticalElements((ToolChain) tChain, fToolChainSorter); |
| if (list != null) { |
| for (int i = 0; i < list.size(); i++) { |
| ToolChain cur = list.get(i); |
| if (cur.getParent() != null) |
| return cur.getParent(); |
| } |
| } |
| |
| return null; |
| } |
| |
| public static IConfiguration[] getExtensionConfigurations(IToolChain tChain, String propertyType, |
| String propertyValue) { |
| // List all = getSortedToolChains(); |
| List<ToolChain> list = findIdenticalElements((ToolChain) tChain, fToolChainSorter); |
| LinkedHashSet<IConfiguration> result = new LinkedHashSet<>(); |
| boolean tcFound = false; |
| if (list != null) { |
| for (int i = 0; i < list.size(); i++) { |
| ToolChain cur = list.get(i); |
| if (cur == tChain) { |
| tcFound = true; |
| } |
| |
| IConfiguration cfg = cur.getParent(); |
| if (cfg != null) { |
| IBuildObjectProperties props = cfg.getBuildProperties(); |
| if (props.containsValue(propertyType, propertyValue)) { |
| result.add(cfg); |
| } |
| } |
| } |
| |
| } |
| |
| if (!tcFound) { |
| IConfiguration cfg = tChain.getParent(); |
| if (cfg != null) { |
| IBuildObjectProperties props = cfg.getBuildProperties(); |
| if (props.containsValue(propertyType, propertyValue)) { |
| result.add(cfg); |
| } |
| } |
| } |
| |
| // if(result.size() == 0){ |
| // if(((ToolChain)tChain).supportsValue(propertyType, propertyValue)){ |
| // IConfiguration cfg = getFirstExtensionConfiguration(tChain); |
| // if(cfg != null){ |
| // result.add(cfg); |
| // } |
| // } |
| // } |
| return result.toArray(new IConfiguration[result.size()]); |
| } |
| |
| /* public static IToolChain[] getRealToolChains(){ |
| List all = getSortedToolChains(); |
| IToolChain tcs[] = new ToolChain[all.size()]; |
| for(int i = 0; i < tcs.length; i++){ |
| List list = (List)all.get(i); |
| tcs[i] = (ToolChain)list.get(0); |
| } |
| return tcs; |
| } |
| */ |
| |
| private static HashMap<MatchKey<ToolChain>, List<ToolChain>> getSortedToolChains() { |
| if (fSortedToolChains == null) { |
| Collection<ToolChain> toolChains = getExtensionToolChainMapInternal().values(); |
| fSortedToolChains = getSortedElements(toolChains); |
| } |
| return fSortedToolChains; |
| } |
| |
| private static HashMap<MatchKey<Tool>, List<Tool>> getSortedTools() { |
| if (fSortedTools == null) { |
| Collection<Tool> tools = getExtensionToolMapInternal().values(); |
| fSortedTools = getSortedElements(tools); |
| } |
| return fSortedTools; |
| } |
| |
| private static HashMap<MatchKey<Builder>, List<Builder>> getSortedBuilders() { |
| if (fSortedBuilders == null) { |
| Collection<Builder> builders = getExtensionBuilderMapInternal().values(); |
| fSortedBuilders = getSortedElements(builders); |
| } |
| return fSortedBuilders; |
| } |
| |
| private static <T extends BuildObject & IMatchKeyProvider<T>> HashMap<MatchKey<T>, List<T>> getSortedElements( |
| Collection<T> elements) { |
| HashMap<MatchKey<T>, List<T>> map = new HashMap<>(); |
| for (T p : elements) { |
| MatchKey<T> key = p.getMatchKey(); |
| if (key == null) |
| continue; |
| |
| List<T> list = map.get(key); |
| if (list == null) { |
| list = new ArrayList<>(); |
| map.put(key, list); |
| } |
| list.add(p); |
| p.setIdenticalList(list); |
| } |
| |
| Collection<List<T>> values = map.values(); |
| for (List<T> list : values) { |
| Collections.sort(list); |
| } |
| return map; |
| } |
| |
| public static IToolChain[] getRealToolChains() { |
| HashMap<MatchKey<ToolChain>, List<ToolChain>> map = getSortedToolChains(); |
| IToolChain tcs[] = new ToolChain[map.size()]; |
| int i = 0; |
| for (List<ToolChain> list : map.values()) { |
| tcs[i++] = list.get(0); |
| } |
| return tcs; |
| } |
| |
| public static ITool[] getRealTools() { |
| HashMap<MatchKey<Tool>, List<Tool>> map = getSortedTools(); |
| Tool ts[] = new Tool[map.size()]; |
| int i = 0; |
| for (List<Tool> list : map.values()) { |
| ts[i++] = list.get(0); |
| } |
| return ts; |
| } |
| |
| public static IBuilder[] getRealBuilders() { |
| HashMap<MatchKey<Builder>, List<Builder>> map = getSortedBuilders(); |
| IBuilder bs[] = new Builder[map.size()]; |
| int i = 0; |
| for (List<Builder> list : map.values()) { |
| bs[i++] = list.get(0); |
| } |
| return bs; |
| } |
| |
| public static IBuilder getRealBuilder(IBuilder builder) { |
| IBuilder extBuilder = builder; |
| IBuilder realBuilder = null; |
| for (; extBuilder != null && !extBuilder.isExtensionElement(); extBuilder = extBuilder.getSuperClass()) { |
| // empty body |
| } |
| |
| if (extBuilder != null) { |
| List<Builder> list = findIdenticalElements((Builder) extBuilder, fBuilderSorter); |
| if (list.size() == 0) { |
| realBuilder = extBuilder; |
| } else { |
| for (IBuilder realBldr : getRealBuilders()) { |
| List<Builder> rList = findIdenticalElements((Builder) realBldr, fBuilderSorter); |
| if (rList == list) { |
| realBuilder = realBldr; |
| break; |
| } |
| } |
| } |
| } else { |
| //TODO: |
| } |
| return realBuilder; |
| } |
| |
| public static ITool getRealTool(ITool tool) { |
| if (tool == null) |
| return null; |
| ITool extTool = tool; |
| ITool realTool = null; |
| for (; extTool != null && !extTool.isExtensionElement(); extTool = extTool.getSuperClass()) { |
| // empty body |
| } |
| |
| if (extTool != null) { |
| List<Tool> list = findIdenticalElements((Tool) extTool, fToolSorter); |
| if (list.size() == 0) { |
| realTool = extTool; |
| } else { |
| for (ITool realT : getRealTools()) { |
| List<Tool> rList = findIdenticalElements((Tool) realT, fToolSorter); |
| if (rList == list) { |
| realTool = realT; |
| break; |
| } |
| } |
| } |
| } else { |
| realTool = getExtensionTool(Tool.DEFAULT_TOOL_ID); |
| } |
| return realTool; |
| } |
| |
| public static IToolChain getExtensionToolChain(IToolChain tc) { |
| IToolChain extTc = tc; |
| for (; extTc != null && !extTc.isExtensionElement(); extTc = extTc.getSuperClass()) { |
| // empty body |
| } |
| return extTc; |
| } |
| |
| public static IToolChain getRealToolChain(IToolChain tc) { |
| IToolChain extTc = tc; |
| IToolChain realToolChain = null; |
| for (; extTc != null && !extTc.isExtensionElement(); extTc = extTc.getSuperClass()) { |
| // empty body |
| } |
| |
| if (extTc != null) { |
| List<ToolChain> list = findIdenticalElements((ToolChain) extTc, fToolChainSorter); |
| if (list.size() == 0) { |
| realToolChain = extTc; |
| } else { |
| for (IToolChain realTc : getRealToolChains()) { |
| List<ToolChain> rList = findIdenticalElements((ToolChain) realTc, fToolChainSorter); |
| if (rList == list) { |
| realToolChain = realTc; |
| break; |
| } |
| } |
| } |
| } else { |
| //TODO: |
| } |
| return realToolChain; |
| } |
| |
| public static IToolChain[] findIdenticalToolChains(IToolChain tc) { |
| List<ToolChain> list = findIdenticalElements((ToolChain) tc, fToolChainSorter); |
| return list.toArray(new ToolChain[list.size()]); |
| } |
| |
| public static ITool[] findIdenticalTools(ITool tool) { |
| List<Tool> list = findIdenticalElements((Tool) tool, fToolSorter); |
| return list.toArray(new Tool[list.size()]); |
| } |
| |
| public static IBuilder[] findIdenticalBuilders(IBuilder b) { |
| List<Builder> list = findIdenticalElements((Builder) b, fBuilderSorter); |
| return list.toArray(new Builder[list.size()]); |
| } |
| |
| public static IToolChain[] getExtensionsToolChains(String propertyType, String propertyValue) { |
| return getExtensionsToolChains(propertyType, propertyValue, true); |
| } |
| |
| public static IToolChain[] getExtensionsToolChains(String propertyType, String propertyValue, |
| boolean supportedPropsOnly) { |
| HashMap<MatchKey<ToolChain>, List<ToolChain>> all = getSortedToolChains(); |
| List<IToolChain> result = new ArrayList<>(); |
| for (List<ToolChain> list : all.values()) { |
| IToolChain tc = findToolChain(list, propertyType, propertyValue, supportedPropsOnly); |
| if (tc != null) |
| result.add(tc); |
| } |
| return result.toArray(new ToolChain[result.size()]); |
| } |
| |
| public static void resortToolChains() { |
| fSortedToolChains = null; |
| getSortedToolChains(); |
| } |
| |
| public static void resortTools() { |
| fSortedTools = null; |
| getSortedTools(); |
| } |
| |
| public static void resortBuilders() { |
| fSortedBuilders = null; |
| getSortedBuilders(); |
| } |
| |
| private static IToolChain findToolChain(List<ToolChain> list, String propertyType, String propertyValue, |
| boolean supportedOnly) { |
| ToolChain bestMatch = null; |
| IConfiguration cfg = null; |
| IProjectType type = null; |
| boolean valueSupported = false; |
| |
| for (int i = 0; i < list.size(); i++) { |
| ToolChain tc = list.get(i); |
| if (tc.supportsValue(propertyType, propertyValue)) { |
| valueSupported = true; |
| } else if (valueSupported) { |
| continue; |
| } |
| |
| if (!tc.supportsBuild(true)) |
| return null; |
| |
| if (bestMatch == null && valueSupported) |
| bestMatch = tc; |
| |
| IConfiguration tcCfg = tc.getParent(); |
| if (tcCfg != null) { |
| if (cfg == null && valueSupported) { |
| bestMatch = tc; |
| cfg = tcCfg; |
| } |
| |
| IBuildObjectProperties props = tcCfg.getBuildProperties(); |
| IBuildProperty prop = props.getProperty(propertyType); |
| if (valueSupported && prop != null && propertyValue.equals(prop.getValue().getId())) { |
| bestMatch = tc; |
| cfg = tcCfg; |
| } |
| |
| IProjectType tcType = tcCfg.getProjectType(); |
| if (tcType != null) { |
| if (type == null && valueSupported) { |
| type = tcType; |
| bestMatch = tc; |
| } |
| props = tcType.getBuildProperties(); |
| prop = props.getProperty(propertyType); |
| if (prop != null && propertyValue.equals(prop.getValue().getId())) { |
| bestMatch = tc; |
| if (valueSupported) { |
| type = tcType; |
| break; |
| } |
| } |
| } |
| } |
| } |
| |
| if (valueSupported || !supportedOnly) |
| return bestMatch; |
| return null; |
| } |
| |
| private static <T extends BuildObject & IMatchKeyProvider<T>> List<T> findIdenticalElements(T p, ISorter sorter) { |
| List<T> list = p.getIdenticalList(); |
| if (list == null) { |
| sorter.sort(); |
| list = p.getIdenticalList(); |
| if (list == null) { |
| list = new ArrayList<>(0); |
| p.setIdenticalList(list); |
| } |
| } |
| |
| return list; |
| } |
| |
| public static IBuildPropertyManager getBuildPropertyManager() { |
| return BuildPropertyManager.getInstance(); |
| } |
| |
| /** |
| * Returns the configurations referenced by this configuration. |
| * Returns an empty array if there are no referenced configurations. |
| * |
| * @see CoreModelUtil#getReferencedConfigurationDescriptions(ICConfigurationDescription, boolean) |
| * @return an array of IConfiguration objects referenced by this IConfiguration |
| */ |
| public static IConfiguration[] getReferencedConfigurations(IConfiguration config) { |
| ICConfigurationDescription cfgDes = getDescriptionForConfiguration(config); |
| if (cfgDes != null) { |
| ICConfigurationDescription[] descs = CoreModelUtil.getReferencedConfigurationDescriptions(cfgDes, false); |
| List<IConfiguration> result = new ArrayList<>(); |
| for (ICConfigurationDescription desc : descs) { |
| IConfiguration cfg = getConfigurationForDescription(desc); |
| if (cfg != null) { |
| result.add(cfg); |
| } |
| } |
| return result.toArray(new IConfiguration[result.size()]); |
| } |
| |
| return new Configuration[0]; |
| } |
| |
| /** |
| * Build the specified build configurations |
| * @param configs - configurations to build |
| * @param monitor - progress monitor |
| */ |
| public static void buildConfigurations(IConfiguration[] configs, IProgressMonitor monitor) throws CoreException { |
| buildConfigurations(configs, null, monitor); |
| } |
| |
| /** |
| * Build the specified build configurations |
| * @param configs - configurations to build |
| * @param builder - builder to retrieve build arguments |
| * @param monitor - progress monitor |
| */ |
| public static void buildConfigurations(IConfiguration[] configs, IBuilder builder, IProgressMonitor monitor) |
| throws CoreException { |
| buildConfigurations(configs, builder, monitor, true); |
| } |
| |
| /** |
| * Build the specified build configurations. |
| * |
| * @param configs - configurations to build |
| * @param builder - builder to retrieve build arguments |
| * @param monitor - progress monitor |
| * @param allBuilders - {@code true} if all builders need to be building |
| * or {@code false} to build with {@link CommonBuilder} |
| */ |
| public static void buildConfigurations(IConfiguration[] configs, IBuilder builder, IProgressMonitor monitor, |
| boolean allBuilders) throws CoreException { |
| buildConfigurations(configs, builder, monitor, allBuilders, IncrementalProjectBuilder.FULL_BUILD); |
| } |
| |
| /** |
| * Build the specified build configurations. |
| * |
| * @param configs - configurations to build |
| * @param builder - builder to retrieve build arguments |
| * @param monitor - progress monitor |
| * @param allBuilders - {@code true} if all builders need to be building |
| * or {@code false} to build with {@link CommonBuilder} |
| * @param buildKind - one of |
| * <li>{@link IncrementalProjectBuilder#CLEAN_BUILD}</li> |
| * <li>{@link IncrementalProjectBuilder#INCREMENTAL_BUILD}</li> |
| * <li>{@link IncrementalProjectBuilder#FULL_BUILD}</li> |
| * |
| * @since 7.0 |
| */ |
| public static void buildConfigurations(IConfiguration[] configs, IBuilder builder, IProgressMonitor monitor, |
| boolean allBuilders, int buildKind) throws CoreException { |
| |
| Map<IProject, IConfiguration[]> map = sortConfigs(configs); |
| for (Entry<IProject, IConfiguration[]> entry : map.entrySet()) { |
| IProject proj = entry.getKey(); |
| IConfiguration[] cfgs = entry.getValue(); |
| buildConfigurations(proj, cfgs, builder, monitor, allBuilders, buildKind); |
| } |
| } |
| |
| private static Map<IProject, IConfiguration[]> sortConfigs(IConfiguration cfgs[]) { |
| Map<IProject, Set<IConfiguration>> cfgSetMap = new HashMap<>(); |
| for (IConfiguration cfg : cfgs) { |
| IProject proj = cfg.getOwner().getProject(); |
| Set<IConfiguration> set = cfgSetMap.get(proj); |
| if (set == null) { |
| set = new HashSet<>(); |
| cfgSetMap.put(proj, set); |
| } |
| set.add(cfg); |
| } |
| |
| Map<IProject, IConfiguration[]> cfgArrayMap = new HashMap<>(); |
| if (cfgSetMap.size() != 0) { |
| Set<Entry<IProject, Set<IConfiguration>>> entrySet = cfgSetMap.entrySet(); |
| for (Entry<IProject, Set<IConfiguration>> entry : entrySet) { |
| IProject key = entry.getKey(); |
| Set<IConfiguration> set = entry.getValue(); |
| cfgArrayMap.put(key, set.toArray(new Configuration[set.size()])); |
| } |
| } |
| |
| return cfgArrayMap; |
| } |
| |
| /** |
| * Build the specified build configurations for a given project. |
| * |
| * @param project - project the configurations belong to |
| * @param configs - configurations to build |
| * @param builder - builder to retrieve build arguments |
| * @param monitor - progress monitor |
| * @param allBuilders - {@code true} if all builders need to be building |
| * or {@code false} to build with {@link CommonBuilder} |
| * @param buildKind - one of |
| * <li>{@link IncrementalProjectBuilder#CLEAN_BUILD}</li> |
| * <li>{@link IncrementalProjectBuilder#INCREMENTAL_BUILD}</li> |
| * <li>{@link IncrementalProjectBuilder#FULL_BUILD}</li> |
| * |
| * @throws CoreException |
| */ |
| private static void buildConfigurations(final IProject project, final IConfiguration[] configs, |
| final IBuilder builder, final IProgressMonitor monitor, final boolean allBuilders, final int buildKind) |
| throws CoreException { |
| |
| IWorkspaceRunnable op = new IWorkspaceRunnable() { |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.core.resources.IWorkspaceRunnable#run(org.eclipse.core.runtime.IProgressMonitor) |
| */ |
| @Override |
| public void run(IProgressMonitor monitor) throws CoreException { |
| int ticks = 1; |
| if (buildKind == IncrementalProjectBuilder.CLEAN_BUILD) { |
| if (allBuilders) { |
| ICommand[] commands = project.getDescription().getBuildSpec(); |
| ticks = commands.length; |
| } |
| ticks = ticks * configs.length; |
| } |
| monitor.beginTask(project.getName(), ticks); |
| |
| if (buildKind == IncrementalProjectBuilder.CLEAN_BUILD) { |
| // It is not possible to pass arguments to clean() method of a builder |
| // So we iterate setting active configuration |
| IManagedBuildInfo buildInfo = ManagedBuildManager.getBuildInfo(project); |
| IConfiguration savedCfg = buildInfo.getDefaultConfiguration(); |
| |
| try { |
| for (IConfiguration config : configs) { |
| if (monitor.isCanceled()) |
| break; |
| |
| buildInfo.setDefaultConfiguration(config); |
| buildProject(project, null, allBuilders, buildKind, monitor); |
| } |
| } finally { |
| buildInfo.setDefaultConfiguration(savedCfg); |
| } |
| } else { |
| // configuration IDs are passed in args to CDT builder |
| Map<String, String> args = builder != null ? BuilderFactory.createBuildArgs(configs, builder) |
| : BuilderFactory.createBuildArgs(configs); |
| buildProject(project, args, allBuilders, buildKind, monitor); |
| } |
| |
| monitor.done(); |
| } |
| |
| private void buildProject(IProject project, Map<String, String> args, boolean allBuilders, int buildKind, |
| IProgressMonitor monitor) throws CoreException { |
| |
| if (allBuilders) { |
| ICommand[] commands = project.getDescription().getBuildSpec(); |
| for (ICommand command : commands) { |
| if (monitor.isCanceled()) |
| break; |
| |
| String builderName = command.getBuilderName(); |
| Map<String, String> newArgs = null; |
| if (buildKind != IncrementalProjectBuilder.CLEAN_BUILD) { |
| newArgs = new HashMap<>(args); |
| if (!builderName.equals(CommonBuilder.BUILDER_ID)) { |
| newArgs.putAll(command.getArguments()); |
| } |
| } |
| project.build(buildKind, builderName, newArgs, new SubProgressMonitor(monitor, 1)); |
| } |
| } else { |
| project.build(buildKind, CommonBuilder.BUILDER_ID, args, new SubProgressMonitor(monitor, 1)); |
| } |
| } |
| }; |
| |
| try { |
| ResourcesPlugin.getWorkspace().run(op, monitor); |
| } finally { |
| monitor.done(); |
| } |
| } |
| |
| public static IBuilder getInternalBuilder() { |
| return getExtensionBuilder(INTERNAL_BUILDER_ID); |
| } |
| |
| public static ITool getExtensionTool(ITool tool) { |
| ITool extTool = tool; |
| for (; extTool != null && !extTool.isExtensionElement(); extTool = extTool.getSuperClass()) { |
| } |
| return extTool; |
| } |
| |
| public static IInputType getExtensionInputType(IInputType inType) { |
| IInputType extIT = inType; |
| for (; extIT != null && !extIT.isExtensionElement(); extIT = extIT.getSuperClass()) { |
| } |
| return extIT; |
| } |
| |
| public static IConfiguration getPreferenceConfiguration(boolean write) { |
| try { |
| ICConfigurationDescription des = CCorePlugin.getDefault().getPreferenceConfiguration(CFG_DATA_PROVIDER_ID, |
| write); |
| if (des != null) |
| return getConfigurationForDescription(des); |
| } catch (CoreException e) { |
| ManagedBuilderCorePlugin.log(e); |
| } |
| return null; |
| } |
| |
| public static void setPreferenceConfiguration(IConfiguration cfg) throws CoreException { |
| ICConfigurationDescription des = getDescriptionForConfiguration(cfg); |
| if (des != null) |
| CCorePlugin.getDefault().setPreferenceConfiguration(CFG_DATA_PROVIDER_ID, des); |
| } |
| |
| static synchronized void updateLoaddedInfo(IProject fromProject, IProject toProject, IManagedBuildInfo info) { |
| try { |
| setLoaddedBuildInfo(fromProject, null); |
| setLoaddedBuildInfo(toProject, info); |
| } catch (CoreException e) { |
| } |
| } |
| |
| /** |
| * entry-point for the tool-chain modification validation functionality |
| */ |
| public static IToolChainModificationManager getToolChainModificationManager() { |
| return ToolChainModificationManager.getInstance(); |
| } |
| |
| // Check toolchain for platform compatibility |
| public static boolean isPlatformOk(IToolChain tc) { |
| ITargetPlatform tp = tc.getTargetPlatform(); |
| if (tp != null) { |
| List<String> osList = Arrays.asList(tc.getOSList()); |
| if (osList.contains(ALL) || osList.contains(os)) { |
| List<String> archList = Arrays.asList(tc.getArchList()); |
| if (archList.contains(ALL) || archList.contains(arch)) |
| return true; // OS and ARCH fits |
| } |
| return false; // OS or ARCH does not fit |
| } |
| return true; // no target platform - nothing to check. |
| } |
| |
| /*package*/ static void collectLanguageSettingsConsoleParsers(ICConfigurationDescription cfgDescription, |
| IWorkingDirectoryTracker cwdTracker, List<IConsoleParser> parsers) { |
| if (cfgDescription instanceof ILanguageSettingsProvidersKeeper) { |
| List<ILanguageSettingsProvider> lsProviders = ((ILanguageSettingsProvidersKeeper) cfgDescription) |
| .getLanguageSettingProviders(); |
| for (ILanguageSettingsProvider lsProvider : lsProviders) { |
| ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(lsProvider); |
| if (rawProvider instanceof ICBuildOutputParser) { |
| ICBuildOutputParser consoleParser = (ICBuildOutputParser) rawProvider; |
| try { |
| consoleParser.startup(cfgDescription, cwdTracker); |
| parsers.add(consoleParser); |
| } catch (CoreException e) { |
| ManagedBuilderCorePlugin.log(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, |
| "Language Settings Provider failed to start up", e)); //$NON-NLS-1$ |
| } |
| } |
| } |
| } |
| } |
| |
| /** |
| * Generic routine for checking the availability of converters for the given list of Build Objects. |
| * |
| * @return true if there are converters for at least one object in the given list of Build Objects. |
| * Returns false if there are no converters. |
| * @since 8.1 |
| */ |
| public static boolean hasAnyTargetConversionElements(List<IBuildObject> buildObjs) { |
| if (buildObjs != null && !buildObjs.isEmpty()) { |
| for (IBuildObject obj : buildObjs) { |
| if (hasTargetConversionElements(obj)) { |
| return true; |
| } |
| } |
| } |
| return false; |
| } |
| } |