Skip to main content

[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•R­2™p©~[smain.cxxUT	º·„Bó„BUxü\X]‹A
+€ Ïí+½”„(ú‹è–f°Y—èïÙ¡K·™Ñœ}:ḗÀ›è/©@‰
+͜(’$6*ÎWǹ}ÁÉâ{ôÑ	Såìð‚F¨’ñ¿×a€PKr­2aÄÞð:Ü
+	.cdtbuildUT	Òï„Bó„BUxü\Xí–]o›0†ïû+ïëøƒ/kÉ¢•¬Ó¤¥ªÖl÷8ŒldÈÔýû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×B–ƒJW^—J¥ÁžÈ~®êuX½îEÃ>Á”ºŒu¦ ©y¤+¶¹ÐAʋbè!
+äy¾Ö®Ðt›åf8tÛ@Dê;Ø=<*«I
+ÿñÂ9`2ˆ4ÏûX±GlêºNç^u`ó| nïaašÈç¬çмÓÁlt£líž1ÜÔW”Äf.!”¹ç)ÇøÙK:9\§êá$ÇþçÚá^kÓ+7¥0C&Ú|³sÉöU¤C“m_ü
+ÙvÀó!ÏîÇiºÕ„£Ò­:&ßRǦħ¶¯–p
+ìÛ2®á5ÿØõ\£«¦Ü8èöÍ>N*eÄcŒÑ«DÝhwûP=ù¾a½Zܵiÿx“ý·_õóì7èPKr­2ò=ä‘.cdtprojectUT	Òï„Bó„BUxü\X’MOƒ@†ïü
+²÷‚zò%´RC"Øh=7ëîˆka–KCÿ½¥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r­2[ÌÍRÛû.projectUT	Òï„Bó„BUxü\XQMO!<Û_Ñì]ЛºM´éÑKõàcBP>6À6þ|a¡µÆx›™7¼™<ÄöÓÙõ1™à7Ã=»Öð”ñz3¼¾ìo†í¸Sï ¼C¢h¦\ÌãêFxé0î`‘±7‚/BPp>‚ŸPûŽT1ÿNÞfcÕaÒÙSy&½ªB	Q35S#•YK
+µ¸…¦áü@×ÎuÊ
+õ\{¤FùüGfz¥’ŸçˆfmøªÍOmXsÓþßÚwí±jÏÿÞԒ¯£O°Ô>_ûâû¾PK¬R­2ÀQydeletefileheader.hUT	䷄Bó„BUxü\XSÎLËKIMSˆwqõq
+quóôqõputq
+Š÷ˆçRÊdæ¥b—äÊÌ+QHIÍI-*ÊIÍHMLI-‰Ù*˜Xsq)§æ¥d¦)èkaÓ¬¥ÏPK
+s­2Benchmarks/UT	÷ð„B5…BUxü\XPK;ˆ­2¯£…JBenchmarks/subdir.mkUT	Á…B4…BUxü\X­R]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Œùluu™IW7DòYaS&›æÈ,F#ðÅ%xqþD“—ày­C…æ•¶E,'„»î”(íè÷É£³·ô’阞4éejHrÝé×§À>g§4ŸÓþþþú&ÝVóú´ÞіoƚPÒ>¸~ê4ºPK;ˆ­2L@t	ÉBenchmarks/makefileUT	Á…B4…BUxü\X­RÝ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µÓ$mOpÇâ >Œ)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;ˆ­2Œ4:Š®Benchmarks/sources.mkUT	Á…B4…BUxü\X­M
+ƒ0…÷9Ŕ¬ë
+]ø“EKÁ \D“i
+¨ü´xû]èx߃™á
+¥Ç¡{§ÇÖ)ÑÃ|þà„¦u(á­Œ Ó0i(•;‘ƒSBÒ¦âœMY¤%\®ŒMr¾A¾óëz»<¹¯"c|¬fiõŒ“[9Äe_43XßIeP8à§\V{#pImaôÖA‡ Ñ
+£ºð
+’²J²[±¬z‘(4ùPK
+æR­2}Ø))filetobedeleted.cxxUT	O¸„B4…BUxü\X/* This is a comment in an empty file */
+PK•R­2™p©~[s
+ímain.cxxUTº·„BUxPKr­2aÄÞð:Ü
+	
+큖.cdtbuildUTÒï„BUxPKr­2ò=ä‘
+í.cdtprojectUTÒï„BUxPKr­2[ÌÍRÛû
+íU.projectUTÒï„BUxPK¬R­2ÀQy
+íkdeletefileheader.hUT䷄BUxPK
+s­2
+íABenchmarks/UT÷ð„BUxPK;ˆ­2¯£…J
+í?Benchmarks/subdir.mkUTÁ…BUxPK;ˆ­2L@t	É
+íBenchmarks/makefileUTÁ…BUxPK;ˆ­2@gÇ(Lå
+í
+Benchmarks/objects.mkUTÁ…BUxPK;ˆ­2Œ4:Š®
+큮
+Benchmarks/sources.mkUTÁ…BUxPK
+æR­2}Ø))
+큤filetobedeleted.cxxUTO¸„BUxPK.
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() {

Back to the top