[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[cdt-patch] Build system fixes
|
Title: Build system fixes
The attached patch files contain fixes for cdt-build bugzilla entries #93230 and #76821
and a related regression test.
<<patch_mbc.txt>> <<patch_mbct.txt>> <<patch_sbui.txt>>
Bob Monteleone
Intel Corporation
Index: src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java,v
retrieving revision 1.40
diff -u -r1.40 GeneratedMakefileBuilder.java
--- src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java 19 May 2005 16:19:09 -0000 1.40
+++ src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java 20 May 2005 19:16:54 -0000
@@ -68,7 +68,8 @@
public class ResourceDeltaVisitor implements IResourceDeltaVisitor {
private String buildGoalName;
private IManagedBuildInfo buildInfo;
- private boolean buildNeeded = true;
+ private boolean incrBuildNeeded = false;
+ private boolean fullBuildNeeded = false;
private List reservedNames;
/**
@@ -135,10 +136,14 @@
return reservedNames.contains(resource.getName());
}
- public boolean shouldBuild() {
- return buildNeeded;
+ public boolean shouldBuildIncr() {
+ return incrBuildNeeded;
}
+ public boolean shouldBuildFull() {
+ return fullBuildNeeded;
+ }
+
public boolean visit(IResourceDelta delta) throws CoreException {
IResource resource = delta.getResource();
// If the project has changed, then a build is needed and we can stop
@@ -151,28 +156,34 @@
} else {
String name = changedResource.getName();
String ext = changedResource.getFileExtension();
- // There are some things we don't care about and some we do
- if (name.equals(buildGoalName)) {
- buildNeeded = true;
- break;
- } else if (resource.isDerived()) {
- buildNeeded |= false;
- } else if (isGeneratedResource(changedResource)) {
- buildNeeded |= false;
- } else if (buildInfo.buildsFileType(ext) || buildInfo.isHeaderFile(ext)) {
- // We do care and there is no point checking anythings else
- buildNeeded = true;
- break;
- } else if (isProjectFile(changedResource)) {
- buildNeeded |= false;
- } else {
- buildNeeded = true;
- }
+
+ if (changedResource.isDerived() || (isProjectFile(changedResource)) ||
+ (isGeneratedResource(changedResource))) {
+ // The resource that changed has attributes which make it uninteresting,
+ // so don't do anything
+ ;
+ }
+ else if (name.equals(buildGoalName) ||
+ (buildInfo.buildsFileType(ext) || buildInfo.isHeaderFile(ext))) {
+ // We need to do an incremental build, at least
+ incrBuildNeeded = true;
+ if (kids[index].getKind() == IResourceDelta.REMOVED) {
+ // If a meaningful resource was removed, then force a full build
+ // This is required because an incremental build will trigger make to
+ // do nothing for a missing source, since the state after the file
+ // removal is uptodate, as far as make is concerned
+ // A full build will clean, and ultimately trigger a relink without
+ // the object generated from the deleted source, which is what we want
+ fullBuildNeeded = true;
+ // There is no point in checking anything else since we have
+ // decided to do a full build anyway
+ break;
+ }
+ }
}
}
return false;
}
-
return true;
}
}
@@ -275,7 +286,10 @@
}
else {
delta.accept(visitor);
- if (visitor.shouldBuild()) {
+ if (visitor.shouldBuildFull()) {
+ outputTrace(getProject().getName(), "Incremental build requested, full build needed"); //$NON-NLS-1$
+ fullBuild(info, generator, monitor);
+ } else if (visitor.shouldBuildIncr()) {
outputTrace(getProject().getName(), "Incremental build requested"); //$NON-NLS-1$
incrementalBuild(delta, info, generator, monitor);
}
Index: tests/org/eclipse/cdt/managedbuild/core/tests/ManagedProject30MakefileTests.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuild/core/tests/ManagedProject30MakefileTests.java,v
retrieving revision 1.3
diff -u -r1.3 ManagedProject30MakefileTests.java
--- tests/org/eclipse/cdt/managedbuild/core/tests/ManagedProject30MakefileTests.java 20 May 2005 18:31:37 -0000 1.3
+++ tests/org/eclipse/cdt/managedbuild/core/tests/ManagedProject30MakefileTests.java 20 May 2005 19:19:22 -0000
@@ -56,6 +56,7 @@
// rather than an MBS functionality issue
//suite.addTest(new ManagedProject30MakefileTests("test30LinkedFolder"));
suite.addTest(new ManagedProject30MakefileTests("test30CopyandDeploy"));
+ suite.addTest(new ManagedProject30MakefileTests("test30DeleteFile"));
suite.addTest(new ManagedProject30MakefileTests("test30_1"));
return suite;
@@ -145,7 +146,7 @@
assertTrue(isCompatible);
if(isCompatible){
- // Build the project in order to generate the maekfiles
+ // Build the project in order to generate the makefiles
try{
curProject.build(IncrementalProjectBuilder.INCREMENTAL_BUILD,null);
}
@@ -325,6 +326,32 @@
IProject[] projects = createProjects("copyandDeploy", null, null, true);
buildProjects(projects, makefiles);
}
+
+ /* (non-Javadoc)
+ * tests 3.0 style tool integration in the context of deleting a file, to see if the proper behavior
+ * occurs in the managedbuild system
+ */
+ public void test30DeleteFile(){
+ IPath[] makefiles = {
+ Path.fromOSString("makefile"),
+ Path.fromOSString("objects.mk"),
+ Path.fromOSString("subdir.mk"),
+ Path.fromOSString("sources.mk")};
+
+ IProject[] projects = createProjects("deleteFile", null, null, true);
+ IWorkspace workspace = ResourcesPlugin.getWorkspace();
+ ArrayList resourceList = new ArrayList(1);
+ IProject project = projects[0];
+ IFile projfile = project.getFile("filetobedeleted.cxx");
+ resourceList.add(projfile);
+ IResource[] fileResource = (IResource[])resourceList.toArray(new IResource[resourceList.size()]);
+ try {
+ workspace.delete(fileResource, false, null);
+ } catch (Exception e) {fail("could not delete file in project " + project.getName());}
+ try {
+ buildProjects(projects, makefiles);
+ } finally {};
+ }
/* (non-Javadoc)
* tests 3.0 style tool integration with pre and post process steps added to typical compile & link
Index: resources/test30Projects/deleteFile/deleteFile.zip
===================================================================
RCS file: resources/test30Projects/deleteFile/deleteFile.zip
diff -N resources/test30Projects/deleteFile/deleteFile.zip
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ resources/test30Projects/deleteFile/deleteFile.zip 1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,47 @@
+PK R2p©~[ s main.cxxUT º·BóBUx ü\X]A
+ Ïí+½(úèf°YèïÙ¡K·Ñ}:á¸Àè/©@
+Í($6* ÎWǹ}ÁÉâ{ôÑ SåìðF¨ñ¿×aPK r2aÄÞð: Ü
+ .cdtbuildUT ÒïBóBUx ü\Xí]o0ïû+ïëø/kÉ¢¬Ó¤¥ªÖl÷8ldÈÔýûBÉ2¨r·»`^?çÕñ¦ó,µ~ ]$JÎ XB*Jd<ßV÷·>¿¿Î7I*¾ïd
"³z3]rÉc=jõSåÝ6I£Ïr£Ì|·d%Ñ,D*Jqo*À0*a¶Û´®Ô°ä:%å"(^$>ñ]â{6°$ÏÄ,ï(ZÕ²³PI+!°öG¬~çFu±00P¡$Þj^Vmp]&ÖUÛÀ
+SÁe 2SÐàë̺ÕãÖJ?r]f@é0Mòb×U¨´Kþ,>eïzEà²æËâ²æÃSKj«_Ù°k¢(Gb½!Á6r(f¶sbuPï¨^¬cc3×BJW^J¥ÁÈ~®êuX½îEÃ>Áºu¦ ©y¤+¶¹ÐAÊbè!
+äy¾Ö®Ðtåf8tÛ@Dê;Ø=<*«I
+ÿñÂ9`24ÏûX±GlêºNç^u`ó| nïaaÈç¬ç¼ÓÁlt£lí1ÜÔWÄf.!¹ç)ÇøÙK:9\§êá$ÇþçÚá^kÓ+7¥0C&Ú|³sÉöU¤Cm_ü
+ÙvÀó!ÏîÇiºÕ£Ò:&ßRǦħ¶¯p
+ìÛ2®á5ÿØõ\£«¦Ü8èöÍ>N*eÄcÑ«DÝhwûP=ù¾a½Zܵiÿxý·_õóì7èPK r2ò=ä .cdtprojectUT ÒïBóBUx ü\XMO@ïü
+²÷zò %´RC"Øh=7ëîkaKCÿ½¥6ÑXzÝ÷yfö#ºªt÷@Ò²[ï¹BK
EÈÞ6«Ù=æN(UÝÀLHsN¿³éÖu«Ö¤¿@WÉi*¼±À³WqäÈ÷VÈà¤e|Ì6Î öÔ«ÙQ[ôÚqM̵Bó·~(x(Ž&½WÄüÉÖCiò´ºÌ^(ätXsj®b[
+%tS/Ó1«Kn¸
+Ê@õ?ºææÐС¿Ú»³íBÖ°ý¬²øÛ×¹è'â²8íò9ßÄi¼<¿½ãQüóï;ßPK r2[ÌÍRÛ û .projectUT ÒïBóBUx ü\XQMO!<Û_Ñì]кM´éÑKõàcBP>6À6þ|a¡µÆx7¼<ÄöÓÙõ1à7Ã=»Öðñz3¼¾ìoí¸Sï ¼C¢h¦\ÌãêFxé0î`±7/BPp>PûT1ÿNÞfcÕaÒÙSy&½ªB Q35S#YK
+µ¸
¦áü@×ÎuÊ
+õ\{¤FùüGfz¥çfmøªÍOmXsÓþßÚwí±jÏÿÞÔ¯£O°Ô>_ûâû¾ PK ¬R2ÀQ y deletefileheader.hUT ä·BóBUx ü\XSÎLËKIMSwqõq
+quóôqõputq
+÷çRÊdæ¥bäÊÌ+QHIÍI-*ÊIÍHMLI-Ù*Xsq)§æ¥d¦)èkaÓ¬¥Ï PK
+ s2 Benchmarks/UT ÷ðB5
BUx ü\XPK ;2¯£
J Benchmarks/subdir.mkUT Á
B4
BUx ü\XR]k1|~ÅÕ8ºòfêà:IKÆÁ.$
"Kº;Ñ;éÐGbSúß»gc_J¤ÙÕ¬:]¬¯)ºZD#EUmy¡ö"j
ÜT:ÃuZø}°xµòJÁØ&Å a\»sî]Xê «òâ$uél @`L¥ð"¼ëJ°Åìa
Ñ?Y÷Pªñ:7dç©
±£Ã_ÆnïÿÏS{ÞÍóó¯ÕòæÀý¼\,~/v¹Ùµíß Y"¤µ2^Ëèüu
+"MSmáSÛXîü¾Yc¼¤ ÎFoÖ)êÀzã Ñkë³³©¥Ã`vHm'B¤/#tO®ü&hùluuIW7DòYaS&æÈ,F#ðÅ%xqþDàyC
æ¶E,'»î(íè÷É£³·ôé4éejHrÝé×§À>g§4Óþþþú&ÝVóú´ÞÑoÆPÒ>¸~ê4ºPK ;2L@t É Benchmarks/makefileUT Á
B4
BUx ü\XRÝkÛ0þIILgw°7C¡qí²¦.qëÓ³£E<Y.ì¿ßÙK3J P¿ÈÒ}ü>î¦ÓýØ35w²àJýñ+Ôh¹C¥T@l@(¤ûÄ>|ÊØ&M·^C0æK]¨N Ìý³wUó,¤r×}¦Á·%ë+¦·GhMgl¡áÈäè
+¤y' nµÓ$mOpÇâ >)d»(^m²ðâúâªír!-%x§ÿÂÂ
+U²Ôø³Eë¬l¨6N3Ïûìû
+oµå9©D±Ä AüεÀµ ӹῴ¦îEµÎE)Ϧ µF·ô0ûÌä¹"O^¬Úr[¡c4åbTèð ûèö¿Nìa}Ï<:wY²ù9\Øä½yÔcõV»¡9eßÌ_+êx `ë(ûú%PRÐî¢i^óªËK ß0ߤËý* ß]ðÎmQ»§éççHüw$%#íѱ
+¹Ùħi½´ãHgäGr»Û.£ûPGÎNüQÏàñ[úðÙC?Zƶ5Yr>ÄËÍSxn7ÜÏ_PK ;2@gÇ(L å Benchmarks/objects.mkUT Á
B4
BUx ü\XSV¦.àRVp,-ÉÏM,ÉLNÌÉ©ÔMOÍK-J,IMQHËÌIÕSpÉWÈË/QHMÉ,Q䢲åÊ\\>NÁ
+V¶\\¡Á®AñþN^ PK ;24:® Benchmarks/sources.mkUT Á
B4
BUx ü\XM
+0
÷9Ŭë
+]øEKÁ \Di
+¨ü´xû]èxßá
+¥Ç¡{§ÇÖ)ÑÃ|þà¦u(á Ó0i(;SBÒ¦âMY¤%\®Mr¾A¾óëz»<¹¯"c|¬fiõ[9Äe_43XßIeP8à§\V{#pImaôÖA Ñ
+£ºð
+²J²[±¬z(4ùPK
+ æR2}Ø) ) filetobedeleted.cxxUT O¸B4
BUx ü\X/* This is a comment in an empty file */
+PK R2p©~[ s
+ í main.cxxUT º·BUx PK r2aÄÞð: Ü
+
+ í .cdtbuildUT ÒïBUx PK r2ò=ä
+ í .cdtprojectUT ÒïBUx PK r2[ÌÍRÛ û
+ íU .projectUT ÒïBUx PK ¬R2ÀQ y
+ ík deletefileheader.hUT ä·BUx PK
+ s2
+ íA Benchmarks/UT ÷ðBUx PK ;2¯£
J
+ í? Benchmarks/subdir.mkUT Á
BUx PK ;2L@t É
+ í Benchmarks/makefileUT Á
BUx PK ;2@gÇ(L å
+ í
+ Benchmarks/objects.mkUT Á
BUx PK ;24:®
+ í®
+ Benchmarks/sources.mkUT Á
BUx PK
+ æR2}Ø) )
+ í¤ filetobedeleted.cxxUT O¸BUx PK .
Index: src/org/eclipse/cdt/make/ui/dialogs/SettingsBlock.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/SettingsBlock.java,v
retrieving revision 1.17
diff -u -r1.17 SettingsBlock.java
--- src/org/eclipse/cdt/make/ui/dialogs/SettingsBlock.java 16 May 2005 14:44:01 -0000 1.17
+++ src/org/eclipse/cdt/make/ui/dialogs/SettingsBlock.java 20 May 2005 19:18:05 -0000
@@ -517,15 +517,41 @@
argumentVariablesButton.setEnabled(true);
stopOnErrorButton.setEnabled(false);
}
+
defButton.setSelection(info.isDefaultBuildCmd());
+
autoButton.setSelection(info.isAutoBuildEnable());
targetAuto.setText(info.getAutoBuildTarget());
+
incrButton.setSelection(info.isIncrementalBuildEnabled());
targetIncr.setText(info.getIncrementalBuildTarget());
+
fullButton.setSelection(info.isFullBuildEnabled());
targetFull.setText(info.getFullBuildTarget());
+
cleanButton.setSelection(info.isCleanBuildEnabled());
targetClean.setText(info.getCleanBuildTarget());
+
+ if (info.isAutoBuildEnable())
+ targetAuto.setEnabled(true);
+ else
+ targetAuto.setEnabled(false);
+
+ if (info.isIncrementalBuildEnabled())
+ targetIncr.setEnabled(true);
+ else
+ targetIncr.setEnabled(false);
+
+ if (info.isFullBuildEnabled())
+ targetFull.setEnabled(true);
+ else
+ targetFull.setEnabled(false);
+
+ if (info.isCleanBuildEnabled())
+ targetClean.setEnabled(true);
+ else
+ targetClean.setEnabled(false);
+
}
boolean isStopOnError() {