mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-23 17:05:26 +02:00
bug 340219: Project metadata files are saved unnecessarily, patch to
address .project file modifications
This commit is contained in:
parent
088185204c
commit
6b66aef60b
5 changed files with 103 additions and 112 deletions
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2000, 2010 QNX Software Systems and others.
|
||||
* Copyright (c) 2000, 2012 QNX Software Systems and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
|
@ -7,6 +7,7 @@
|
|||
*
|
||||
* Contributors:
|
||||
* QNX Software Systems - Initial API and implementation
|
||||
* Baltasar Belyavsky (Texas Instruments) - bug 340219: Project metadata files are saved unnecessarily
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.make.internal.core;
|
||||
|
||||
|
@ -18,6 +19,10 @@ import java.util.Map.Entry;
|
|||
import java.util.StringTokenizer;
|
||||
|
||||
import org.eclipse.cdt.core.ErrorParserManager;
|
||||
import org.eclipse.cdt.core.model.CoreModel;
|
||||
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
|
||||
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
|
||||
import org.eclipse.cdt.core.settings.model.extension.CBuildData;
|
||||
import org.eclipse.cdt.make.core.IMakeBuilderInfo;
|
||||
import org.eclipse.cdt.make.core.IMakeCommonBuildInfo;
|
||||
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||
|
@ -493,12 +498,27 @@ public class BuildInfoFactory {
|
|||
BuildInfoProject(IProject project, String builderID) throws CoreException {
|
||||
this.project = project;
|
||||
this.builderID = builderID;
|
||||
ICommand builder;
|
||||
builder = MakeProjectNature.getBuildSpec(project.getDescription(), builderID);
|
||||
if (builder == null) {
|
||||
throw new CoreException(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1,
|
||||
MakeMessages.getString("BuildInfoFactory.Missing_Builder") + builderID, null)); //$NON-NLS-1$
|
||||
|
||||
ICommand builder = null;
|
||||
|
||||
// first, give the build-system a chance to return the build-command overlayed with data managed by it
|
||||
ICProjectDescription cProjectDescription = CoreModel.getDefault().getProjectDescription(project, false);
|
||||
if(cProjectDescription != null) {
|
||||
ICConfigurationDescription cConfigDescription = cProjectDescription.getActiveConfiguration();
|
||||
CBuildData buildData = cConfigDescription.getConfigurationData().getBuildData();
|
||||
if(buildData != null) {
|
||||
builder = buildData.getBuildSpecCommand();
|
||||
}
|
||||
}
|
||||
|
||||
if(builder == null) {
|
||||
builder = MakeProjectNature.getBuildSpec(project.getDescription(), builderID);
|
||||
if (builder == null) {
|
||||
throw new CoreException(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1,
|
||||
MakeMessages.getString("BuildInfoFactory.Missing_Builder") + builderID, null)); //$NON-NLS-1$
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, String> builderArgs = builder.getArguments();
|
||||
args = builderArgs;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007, 2010 Intel Corporation and others.
|
||||
* Copyright (c) 2007, 2012 Intel Corporation and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
|
@ -7,6 +7,7 @@
|
|||
*
|
||||
* Contributors:
|
||||
* Intel Corporation - Initial API and implementation
|
||||
* Baltasar Belyavsky (Texas Instruments) - bug 340219: Project metadata files are saved unnecessarily
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.managedbuilder.internal.core;
|
||||
|
||||
|
@ -25,7 +26,6 @@ import org.eclipse.cdt.managedbuilder.core.IManagedProject;
|
|||
import org.eclipse.cdt.managedbuilder.core.IToolChain;
|
||||
import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
|
||||
import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin;
|
||||
import org.eclipse.cdt.managedbuilder.core.ManagedCProjectNature;
|
||||
import org.eclipse.core.resources.ICommand;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.core.resources.IProjectDescription;
|
||||
|
@ -59,7 +59,6 @@ public class BuilderFactory {
|
|||
static final String CONTENTS_BUILDER = PREFIX + ".builder"; //$NON-NLS-1$
|
||||
static final String CONTENTS_BUILDER_CUSTOMIZATION = PREFIX + ".builderCustomization"; //$NON-NLS-1$
|
||||
static final String CONTENTS_CONFIGURATION_IDS = PREFIX + ".configurationIds"; //$NON-NLS-1$
|
||||
static final String CONTENTS_ACTIVE_CFG_SETTINGS = PREFIX + ".activeConfigSettings"; //$NON-NLS-1$
|
||||
|
||||
// static final String IDS = PREFIX + ".ids"; //$NON-NLS-1$
|
||||
static final String CONFIGURATION_IDS = PREFIX + ".configurationIds"; //$NON-NLS-1$
|
||||
|
@ -225,19 +224,6 @@ public class BuilderFactory {
|
|||
return el.toStringMap();
|
||||
}
|
||||
|
||||
private static Map<String, String> builderBuildArgsMap(IBuilder builder){
|
||||
MapStorageElement el = new BuildArgsStorageElement("", null); //$NON-NLS-1$
|
||||
((Builder)builder).serializeRawData(el);
|
||||
|
||||
Boolean d = Boolean.valueOf(builder.isDefaultBuildCmd());
|
||||
el.setAttribute(BuilderFactory.USE_DEFAULT_BUILD_CMD, d.toString());
|
||||
|
||||
Map<String, String> map = el.toStringMap();
|
||||
map.put(CONTENTS, CONTENTS_ACTIVE_CFG_SETTINGS);
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
public static IBuilder createCustomBuilder(IConfiguration cfg, String builderId) throws CoreException{
|
||||
IBuilder builder = cfg.getBuilder();
|
||||
if(!builderId.equals(builder.getId())){
|
||||
|
@ -293,6 +279,31 @@ public class BuilderFactory {
|
|||
// return createBuilder(cfg, args);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new build-command containing data dynamically obtained from the Builder.
|
||||
*/
|
||||
public static ICommand createCommandFromBuilder(IBuilder builder) throws CoreException {
|
||||
IProject project = builder.getParent().getParent().getOwner().getProject();
|
||||
ICommand command = getBuildSpec(project.getDescription(), CommonBuilder.BUILDER_ID);
|
||||
if(command == null)
|
||||
return null;
|
||||
|
||||
MapStorageElement el = new BuildArgsStorageElement("", null); //$NON-NLS-1$
|
||||
((Builder)builder).serializeRawData(el);
|
||||
|
||||
// always set to false - the raw data will always explicitly contain the build-command
|
||||
el.setAttribute(BuilderFactory.USE_DEFAULT_BUILD_CMD, Boolean.FALSE.toString());
|
||||
|
||||
command.setArguments(el.toStringMap());
|
||||
|
||||
command.setBuilding(IncrementalProjectBuilder.AUTO_BUILD, builder.isAutoBuildEnable());
|
||||
command.setBuilding(IncrementalProjectBuilder.FULL_BUILD, builder.isFullBuildEnabled());
|
||||
command.setBuilding(IncrementalProjectBuilder.INCREMENTAL_BUILD, builder.isIncrementalBuildEnabled());
|
||||
command.setBuilding(IncrementalProjectBuilder.CLEAN_BUILD, builder.isCleanBuildEnabled());
|
||||
|
||||
return command;
|
||||
}
|
||||
|
||||
public static ICommand getBuildSpec(IProjectDescription description, String builderID) {
|
||||
ICommand[] commands = description.getBuildSpec();
|
||||
for (int i = 0; i < commands.length; ++i) {
|
||||
|
@ -350,6 +361,7 @@ public class BuilderFactory {
|
|||
IConfiguration cfg = info.getDefaultConfiguration();
|
||||
IBuilder builder = cfg.getEditableBuilder();
|
||||
builders = new IBuilder[]{builder};
|
||||
|
||||
} else {
|
||||
String type = args.get(CONTENTS);
|
||||
if(type == null || CONTENTS_BUILDER_CUSTOMIZATION.equals(type)){
|
||||
|
@ -361,12 +373,6 @@ public class BuilderFactory {
|
|||
builder = createBuilder(cfg, args, true);
|
||||
}
|
||||
builders = new IBuilder[]{builder};
|
||||
} else if (CONTENTS_ACTIVE_CFG_SETTINGS.equals(type)) {
|
||||
IConfiguration cfg = info.getDefaultConfiguration();
|
||||
|
||||
IBuilder builder = cfg.getEditableBuilder();
|
||||
|
||||
builders = new IBuilder[]{builder};
|
||||
|
||||
} else if (CONTENTS_BUILDER.equals(type)){
|
||||
IConfiguration cfgs[] = configsFromMap(args, info);
|
||||
|
@ -379,6 +385,7 @@ public class BuilderFactory {
|
|||
}
|
||||
builders = list.toArray(new IBuilder[list.size()]);
|
||||
}
|
||||
|
||||
} else if (CONTENTS_CONFIGURATION_IDS.equals(type)){
|
||||
IConfiguration cfgs[] = configsFromMap(args, info);
|
||||
if(cfgs.length != 0){
|
||||
|
@ -388,6 +395,17 @@ public class BuilderFactory {
|
|||
}
|
||||
builders = list.toArray(new IBuilder[list.size()]);
|
||||
}
|
||||
|
||||
} else if ("org.eclipse.cdt.make.core.activeConfigSettings".equals(type)) { //$NON-NLS-1$
|
||||
/* NOTE: Here, only for backwards-compatibility support, since bug 340219 was fixed.
|
||||
* Existing projects will still be going through this execution path, but new
|
||||
* projects will no longer store the active-configuration's builder-arguments in the
|
||||
* build-command, and will be going through the "args == null" condition above.
|
||||
*/
|
||||
IConfiguration cfg = info.getDefaultConfiguration();
|
||||
IBuilder builder = cfg.getEditableBuilder();
|
||||
builders = new IBuilder[]{builder};
|
||||
|
||||
} /*else if (CONTENTS_BUILDER_CUSTOMIZATION.equals(type)){
|
||||
String idsString = (String)args.get(CONFIGURATION_IDS);
|
||||
if(idsString != null){
|
||||
|
@ -415,39 +433,4 @@ public class BuilderFactory {
|
|||
return EMPTY_BUILDERS_ARRAY;
|
||||
}
|
||||
|
||||
public static int applyBuilder(IProjectDescription eDes, IBuilder builder){
|
||||
return applyBuilder(eDes, CommonBuilder.BUILDER_ID, builder);
|
||||
}
|
||||
|
||||
public static final int CMD_UNDEFINED = -1;
|
||||
public static final int NO_CHANGES = 0;
|
||||
public static final int CMD_CHANGED = 1;
|
||||
|
||||
public static int applyBuilder(IProjectDescription eDes, String eBuilderId, IBuilder builder){
|
||||
ICommand cmd = ManagedCProjectNature.getBuildSpec(eDes, eBuilderId);
|
||||
if(cmd == null)
|
||||
return CMD_UNDEFINED;
|
||||
|
||||
if(applyBuilder(cmd, builder)){
|
||||
ManagedCProjectNature.setBuildSpec(eDes, cmd);
|
||||
return CMD_CHANGED;
|
||||
}
|
||||
return NO_CHANGES;
|
||||
}
|
||||
|
||||
public static boolean applyBuilder(ICommand cmd, IBuilder builder) {
|
||||
Map<String, String> oldMap = cmd.getArguments();
|
||||
Map<String, String> map = builderBuildArgsMap(builder);
|
||||
|
||||
if(oldMap.equals(map))
|
||||
return false;
|
||||
|
||||
cmd.setArguments(map);
|
||||
|
||||
cmd.setBuilding(IncrementalProjectBuilder.AUTO_BUILD, builder.isAutoBuildEnable());
|
||||
cmd.setBuilding(IncrementalProjectBuilder.FULL_BUILD, builder.isFullBuildEnabled());
|
||||
cmd.setBuilding(IncrementalProjectBuilder.INCREMENTAL_BUILD, builder.isIncrementalBuildEnabled());
|
||||
cmd.setBuilding(IncrementalProjectBuilder.CLEAN_BUILD, builder.isCleanBuildEnabled());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007 Intel Corporation and others.
|
||||
* Copyright (c) 2007, 2012 Intel Corporation and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
|
@ -7,6 +7,7 @@
|
|||
*
|
||||
* Contributors:
|
||||
* Intel Corporation - Initial API and implementation
|
||||
* Baltasar Belyavsky (Texas Instruments) - bug 340219: Project metadata files are saved unnecessarily
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.managedbuilder.internal.dataprovider;
|
||||
|
||||
|
@ -14,8 +15,12 @@ import org.eclipse.cdt.core.envvar.IEnvironmentContributor;
|
|||
import org.eclipse.cdt.core.settings.model.ICOutputEntry;
|
||||
import org.eclipse.cdt.core.settings.model.extension.CBuildData;
|
||||
import org.eclipse.cdt.managedbuilder.core.IBuilder;
|
||||
import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin;
|
||||
import org.eclipse.cdt.managedbuilder.internal.core.Builder;
|
||||
import org.eclipse.cdt.managedbuilder.internal.core.BuilderFactory;
|
||||
import org.eclipse.cdt.managedbuilder.internal.core.Configuration;
|
||||
import org.eclipse.core.resources.ICommand;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
import org.eclipse.core.runtime.Path;
|
||||
|
||||
|
@ -91,6 +96,17 @@ public class BuildBuildData extends CBuildData {
|
|||
return new BuildEnvironmentContributor(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ICommand getBuildSpecCommand() {
|
||||
try {
|
||||
return BuilderFactory.createCommandFromBuilder(this.fBuilder);
|
||||
}
|
||||
catch(CoreException cx) {
|
||||
ManagedBuilderCorePlugin.log(cx);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public IBuilder getBuilder(){
|
||||
return fBuilder;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007, 2010 Intel Corporation and others.
|
||||
* Copyright (c) 2007, 2012 Intel Corporation and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
|
@ -7,6 +7,7 @@
|
|||
*
|
||||
* Contributors:
|
||||
* Intel Corporation - Initial API and implementation
|
||||
* Baltasar Belyavsky (Texas Instruments) - bug 340219: Project metadata files are saved unnecessarily
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.managedbuilder.internal.dataprovider;
|
||||
|
||||
|
@ -29,7 +30,6 @@ import org.eclipse.cdt.core.settings.model.IModificationContext;
|
|||
import org.eclipse.cdt.core.settings.model.extension.CConfigurationData;
|
||||
import org.eclipse.cdt.core.settings.model.extension.CConfigurationDataProvider;
|
||||
import org.eclipse.cdt.managedbuilder.core.BuildException;
|
||||
import org.eclipse.cdt.managedbuilder.core.IBuilder;
|
||||
import org.eclipse.cdt.managedbuilder.core.IConfiguration;
|
||||
import org.eclipse.cdt.managedbuilder.core.IFolderInfo;
|
||||
import org.eclipse.cdt.managedbuilder.core.IInputType;
|
||||
|
@ -43,7 +43,6 @@ import org.eclipse.cdt.managedbuilder.core.IToolChain;
|
|||
import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
|
||||
import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin;
|
||||
import org.eclipse.cdt.managedbuilder.internal.core.Builder;
|
||||
import org.eclipse.cdt.managedbuilder.internal.core.BuilderFactory;
|
||||
import org.eclipse.cdt.managedbuilder.internal.core.Configuration;
|
||||
import org.eclipse.cdt.managedbuilder.internal.core.ISettingsChangeListener;
|
||||
import org.eclipse.cdt.managedbuilder.internal.core.InputType;
|
||||
|
@ -54,7 +53,6 @@ import org.eclipse.cdt.managedbuilder.internal.core.SettingsChangeEvent;
|
|||
import org.eclipse.cdt.managedbuilder.internal.core.Tool;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.core.resources.IProjectDescription;
|
||||
import org.eclipse.core.resources.IWorkspaceRunnable;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.IProgressMonitor;
|
||||
import org.eclipse.core.runtime.QualifiedName;
|
||||
|
@ -83,28 +81,6 @@ public class ConfigurationDataProvider extends CConfigurationDataProvider implem
|
|||
}
|
||||
}
|
||||
|
||||
private static class DesApplyRunnable implements IWorkspaceRunnable {
|
||||
IBuilder fBuilder;
|
||||
IProject fProject;
|
||||
|
||||
DesApplyRunnable(IProject project, IBuilder builder){
|
||||
fProject = project;
|
||||
fBuilder = builder;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(IProgressMonitor monitor) throws CoreException {
|
||||
try {
|
||||
IProjectDescription eDes = fProject.getDescription();
|
||||
if(BuilderFactory.applyBuilder(eDes, fBuilder) == BuilderFactory.CMD_CHANGED) {
|
||||
fProject.setDescription(eDes, monitor);
|
||||
}
|
||||
} catch (Exception e){
|
||||
ManagedBuilderCorePlugin.log(e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
static BuildConfigurationData writeConfiguration(ICConfigurationDescription cfgDescription,
|
||||
BuildConfigurationData base) throws CoreException {
|
||||
BuildConfigurationData appliedCfg = base;
|
||||
|
@ -178,22 +154,6 @@ public class ConfigurationDataProvider extends CConfigurationDataProvider implem
|
|||
|
||||
setPersistedFlag(cfgDescription);
|
||||
cacheNaturesIdsUsedOnCache(cfgDescription);
|
||||
|
||||
if(cfgDescription.isActive()){
|
||||
IConfiguration cfg = appliedCfg.getConfiguration();
|
||||
IBuilder builder = cfg.getEditableBuilder();
|
||||
IProject project = context.getProject();
|
||||
IProjectDescription eDes = context.getEclipseProjectDescription();
|
||||
switch(BuilderFactory.applyBuilder(eDes, builder)){
|
||||
case BuilderFactory.CMD_UNDEFINED:
|
||||
IWorkspaceRunnable applyR = new DesApplyRunnable(project, builder);
|
||||
context.addWorkspaceRunnable(applyR);
|
||||
break;
|
||||
case BuilderFactory.CMD_CHANGED:
|
||||
context.setEclipseProjectDescription(eDes);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return appliedCfg;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007, 2008 Intel Corporation and others.
|
||||
* Copyright (c) 2007, 2012 Intel Corporation and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
|
@ -7,12 +7,14 @@
|
|||
*
|
||||
* Contributors:
|
||||
* Intel Corporation - Initial API and implementation
|
||||
* Baltasar Belyavsky (Texas Instruments) - bug 340219: Project metadata files are saved unnecessarily
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.core.settings.model.extension;
|
||||
|
||||
import org.eclipse.cdt.core.envvar.IEnvironmentContributor;
|
||||
import org.eclipse.cdt.core.settings.model.ICOutputEntry;
|
||||
import org.eclipse.cdt.core.settings.model.ICSettingBase;
|
||||
import org.eclipse.core.resources.ICommand;
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
|
||||
public abstract class CBuildData extends CDataObject {
|
||||
|
@ -34,4 +36,14 @@ public abstract class CBuildData extends CDataObject {
|
|||
public abstract void setErrorParserIDs(String[] ids);
|
||||
|
||||
public abstract IEnvironmentContributor getBuildEnvironmentContributor();
|
||||
|
||||
/**
|
||||
* Override to return the build-command overlayed with data (eg. builder-arguments) managed by the build-system.
|
||||
*
|
||||
* @since 5.4
|
||||
*/
|
||||
public ICommand getBuildSpecCommand() {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue