From f3c8eaaf302399dc0212c86a3b6f799889d422c0 Mon Sep 17 00:00:00 2001 From: "Christian W. Damus" Date: Mon, 21 Nov 2011 21:16:33 -0500 Subject: [PATCH] Bug 210248 - [Internal Builder]does not rebuild a dependent project in case of a reference library project change --- .../resources/depLibsProjects/tapp.zip | Bin 0 -> 4514 bytes .../resources/depLibsProjects/tlib.zip | Bin 0 -> 3091 bytes .../resources/depLibsProjects/tobjs.zip | Bin 0 -> 3603 bytes .../tests/suite/AllManagedBuildTests.java | 2 + .../ManagedBuildDependencyLibsTests.java | 285 +++++++++++++++ .../internal/core/AdditionalInput.java | 332 +++++++++++++++++- .../plugin.xml | 10 +- 7 files changed, 622 insertions(+), 7 deletions(-) create mode 100644 build/org.eclipse.cdt.managedbuilder.core.tests/resources/depLibsProjects/tapp.zip create mode 100644 build/org.eclipse.cdt.managedbuilder.core.tests/resources/depLibsProjects/tlib.zip create mode 100644 build/org.eclipse.cdt.managedbuilder.core.tests/resources/depLibsProjects/tobjs.zip create mode 100644 build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/core/tests/ManagedBuildDependencyLibsTests.java diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/depLibsProjects/tapp.zip b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/depLibsProjects/tapp.zip new file mode 100644 index 0000000000000000000000000000000000000000..56f88881c1a0ecf9c98be04dc41553c85a92fad1 GIT binary patch literal 4514 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 literal 0 HcmV?d00001 diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/depLibsProjects/tlib.zip b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/depLibsProjects/tlib.zip new file mode 100644 index 0000000000000000000000000000000000000000..2167f3f90247d6535bedd90d2a67ed32e8e6b7ce GIT binary patch literal 3091 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 literal 0 HcmV?d00001 diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/depLibsProjects/tobjs.zip b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/depLibsProjects/tobjs.zip new file mode 100644 index 0000000000000000000000000000000000000000..3fe31c0ee4c0144f5a8336a9c0bcad1eddee8396 GIT binary patch literal 3603 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 H`?LQ8{|yeR literal 0 HcmV?d00001 diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/suite/org/eclipse/cdt/managedbuilder/tests/suite/AllManagedBuildTests.java b/build/org.eclipse.cdt.managedbuilder.core.tests/suite/org/eclipse/cdt/managedbuilder/tests/suite/AllManagedBuildTests.java index 65fdaadca1d..d90c1e4adde 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/suite/org/eclipse/cdt/managedbuilder/tests/suite/AllManagedBuildTests.java +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/suite/org/eclipse/cdt/managedbuilder/tests/suite/AllManagedBuildTests.java @@ -26,6 +26,7 @@ import org.eclipse.cdt.managedbuilder.core.tests.ManagedBuildCoreTests; import org.eclipse.cdt.managedbuilder.core.tests.ManagedBuildCoreTests20; import org.eclipse.cdt.managedbuilder.core.tests.ManagedBuildCoreTests_SharedToolOptions; import org.eclipse.cdt.managedbuilder.core.tests.ManagedBuildDependencyCalculatorTests; +import org.eclipse.cdt.managedbuilder.core.tests.ManagedBuildDependencyLibsTests; import org.eclipse.cdt.managedbuilder.core.tests.ManagedBuildEnvironmentTests; import org.eclipse.cdt.managedbuilder.core.tests.ManagedBuildMacrosTests; import org.eclipse.cdt.managedbuilder.core.tests.ManagedBuildTCSupportedTest; @@ -61,6 +62,7 @@ public class AllManagedBuildTests { suite.addTestSuite(GCCSpecsConsoleParserTest.class); // managedbuilder.core.tests + suite.addTest(ManagedBuildDependencyLibsTests.suite()); suite.addTest(ManagedBuildCoreTests20.suite()); suite.addTest(ManagedBuildCoreTests.suite()); suite.addTest(ManagedProjectUpdateTests.suite()); diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/core/tests/ManagedBuildDependencyLibsTests.java b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/core/tests/ManagedBuildDependencyLibsTests.java new file mode 100644 index 00000000000..05b0320ddec --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/core/tests/ManagedBuildDependencyLibsTests.java @@ -0,0 +1,285 @@ +package org.eclipse.cdt.managedbuilder.core.tests; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +import org.eclipse.cdt.core.model.CoreModel; +import org.eclipse.cdt.core.settings.model.ICProjectDescription; +import org.eclipse.cdt.managedbuilder.core.IBuilder; +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; +import org.eclipse.cdt.managedbuilder.core.IToolChain; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; +import org.eclipse.cdt.managedbuilder.internal.core.FolderInfo; +import org.eclipse.cdt.managedbuilder.tcmodification.IConfigurationModification; +import org.eclipse.cdt.managedbuilder.tcmodification.IToolChainModificationManager; +import org.eclipse.cdt.managedbuilder.testplugin.ManagedBuildTestHelper; +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IFolder; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IProjectDescription; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IWorkspaceDescription; +import org.eclipse.core.resources.IncrementalProjectBuilder; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.OperationCanceledException; + +public class ManagedBuildDependencyLibsTests extends TestCase { + private static final String PROJ_PATH = "depLibsProjects"; + private static final String MESSAGE_TAIL = " (see .log file for more details)."; + + private IProject fTapp, fTlib, fTobjs; + + private IToolChain[] allToolChains; + + public ManagedBuildDependencyLibsTests(String name) { + super(name); + // TODO Auto-generated constructor stub + } + + public static Test suite() { + TestSuite suite = new TestSuite(ManagedBuildDependencyLibsTests.class.getName()); + + suite.addTest(new ManagedBuildDependencyLibsTests("testDepLibs")); + suite.addTest(new ManagedBuildDependencyLibsTests("testDepUObjs")); + return suite; + } + + private void buildProject(IProject curProject) { + + IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(curProject); + try { + IProject[] referencedProjects = curProject.getReferencedProjects(); + for(int i = 0; i < referencedProjects.length; ++i) + buildProject(referencedProjects[i]); + + // Build the project in order to generate the makefiles + curProject.build(IncrementalProjectBuilder.INCREMENTAL_BUILD,new NullProgressMonitor()); + } + catch(CoreException e){ + fail(e.getStatus().getMessage()); + } + catch(OperationCanceledException e){ + fail("the project \"" + curProject.getName() + "\" build was cancelled, exception message: " + e.getMessage()); + } + + + } + + + + @Override + protected void setUp() throws Exception { + super.setUp(); + allToolChains = ManagedBuildManager. + getRealToolChains(); + IWorkspaceDescription wsDescription = ResourcesPlugin.getWorkspace().getDescription(); + wsDescription.setAutoBuilding(false); + ResourcesPlugin.getWorkspace().setDescription(wsDescription); + assertNotNull("Cannot create tapp project", + fTapp = ManagedBuildTestHelper.loadProject("tapp", PROJ_PATH)); + assertNotNull("Cannot create tlib project", + fTlib = ManagedBuildTestHelper.loadProject("tlib", PROJ_PATH)); + assertNotNull("Cannot create tobjs project", + fTobjs = ManagedBuildTestHelper.loadProject("tobjs", PROJ_PATH)); + IProjectDescription projDescription = fTapp.getDescription(); + projDescription.setReferencedProjects(new IProject[] + {fTlib, fTobjs}); + fTapp.setDescription(projDescription, new NullProgressMonitor()); + IToolChain toolChain = setToolChain(fTapp, null); + assertNotNull("No compatible tool chain.", toolChain); + setToolChain(fTlib, toolChain); + setToolChain(fTobjs, toolChain); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + ManagedBuildTestHelper.removeProject(fTapp.getName()); + ManagedBuildTestHelper.removeProject(fTlib.getName()); + ManagedBuildTestHelper.removeProject(fTobjs.getName()); + } + + private void deleteFiles(IFolder dir, String pattern, IProgressMonitor monitor) { + List files = new ArrayList(); + findFiles(dir, pattern, files); + for(Iterator i = files.iterator(); i.hasNext(); ) { + IFile file = i.next(); + try { + file.delete(true, monitor); + } catch (CoreException e) { + e.printStackTrace(); + fail("Error deleting file " + file.getFullPath().toString() + '.' + MESSAGE_TAIL); + } + } + } + + private void findFiles(IResource dir, String pattern, List files) { + IResource resource = null; + try { + IResource[] members; + if(dir instanceof IContainer) + members = ((IContainer)dir).members(IFolder.INCLUDE_PHANTOMS); + else + if(dir instanceof IFolder) + members = ((IFolder)dir).members(IFolder.INCLUDE_PHANTOMS); + else // Not possible + return; + for(int i = 0; i < members.length; ++i) { + resource = members[i]; + if(resource.getType() == IResource.FOLDER) + findFiles((IFolder)resource, pattern, files); + else { + if(resource.getName().matches(pattern)) + files.add((IFile)resource); + } + } + } catch (CoreException e) { + e.printStackTrace(); + fail("Error while collecting files." + MESSAGE_TAIL); + } + } + + private IToolChain setToolChain(IProject project, IToolChain setTo) { + try { + IConfiguration cfg = getProjectConfiguration(project); + IToolChain currentToolChain = cfg.getToolChain(); + + IToolChainModificationManager mngr = + ManagedBuildManager.getToolChainModificationManager(); + IConfigurationModification cfgM = + (IConfigurationModification)mngr. + createModification(cfg.getRootFolderInfo()); + FolderInfo folderInfo = (FolderInfo)cfg.getRootFolderInfo(); + + if(setTo == null) { + for(int i = 0; i < allToolChains.length; ++i) { + // If predefined tool chain supported, leave it alone + if(allToolChains[i].equals(currentToolChain)) + return currentToolChain; + // In the same loop try to find compatible tool chain + if(setTo == null) { + IBuilder builder = allToolChains[i].getBuilder(); + if(cfg.isBuilderCompatible(builder) && + folderInfo.isToolChainCompatible(allToolChains[i])) + setTo = allToolChains[i]; + } + } + } + if(null != setTo) { + cfgM.setToolChain(setTo); + assertEquals(setTo, cfgM.getToolChain()); + assertEquals(setTo.getBuilder(), cfgM.getBuilder()); + } + } catch (CoreException e) { + e.printStackTrace(); + fail("Error. " + MESSAGE_TAIL); + } + return setTo; + } + + private IConfiguration getProjectConfiguration(IProject project) throws CoreException { + ICProjectDescription cProjDescription = CoreModel.getDefault(). + createProjectDescription(project, true); + return ManagedBuildManager. + getConfigurationForDescription( + cProjDescription.getConfigurations()[0]); + + } + + private void rebuildArtefact(IProject project) { +// deleteFiles(getProjectFolder(project), +// getArtefactFullName(project), +// new NullProgressMonitor()); + try { + project.build(IncrementalProjectBuilder.CLEAN_BUILD, new NullProgressMonitor()); + } catch (CoreException e) { + e.printStackTrace(); + fail("Cannot clean project " + fTapp.getName() + '.' + MESSAGE_TAIL); + } + buildProject(project); + } + + private long getArtifactTimeStamp(IProject project) { + List files = new ArrayList(); + findFiles(project, getArtefactFullName(project), files); + if(files.size() == 0) // File not exists + return 0; + IFile artefact = files.iterator().next(); + return artefact.getModificationStamp(); + } + + private String getArtefactFullName(IProject project) { + IConfiguration cfg = null; + try { + cfg = getProjectConfiguration(project); + } catch (CoreException e) { + e.printStackTrace(); + fail("Error. " + MESSAGE_TAIL); + } + String name = cfg.getArtifactName(); + String ext = cfg.getArtifactExtension(); + if((null != ext) && (ext.length() > 0)) { + name += '.'; + name += ext; + } + return name; + } + + + public void testDepLibs() { + buildProject(fTapp); + long timeStamp = getArtifactTimeStamp(fTapp); + if(timeStamp == 0) { + fail("Cannot build project " + fTapp.getName()); + } + try { // To be sure that in case of build the time should be changed + Thread.sleep(1000); + } catch (InterruptedException e) { + // Do nothing + } + // Check if no build any more + buildProject(fTapp); + if(timeStamp != getArtifactTimeStamp(fTapp)) { + fail("Error. This time it should be nothing to build"); + } + rebuildArtefact(fTlib); + buildProject(fTapp); + if(timeStamp == getArtifactTimeStamp(fTapp)) { + fail("Error. This time it should build application."); + } + } + + public void testDepUObjs() { + buildProject(fTapp); + long timeStamp = getArtifactTimeStamp(fTapp); + if(timeStamp == 0) { + fail("Cannot build project " + fTapp.getName()); + } + try { // To be sure that in case of build the time should be changed + Thread.sleep(1000); + } catch (InterruptedException e) { + // Do nothing + } + // Check if no build any more + buildProject(fTapp); + if(timeStamp != getArtifactTimeStamp(fTapp)) { + fail("Error. This time it should be nothing to build"); + } +// deleteFiles(getProjectFolder(fTobjs), "*.o", new NullProgressMonitor()); + rebuildArtefact(fTobjs); + buildProject(fTapp); + if(timeStamp == getArtifactTimeStamp(fTapp)) { + fail("Error. This time it should build application."); + } + } +} \ No newline at end of file diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/AdditionalInput.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/AdditionalInput.java index 15fe5197395..89d8fed340c 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/AdditionalInput.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/AdditionalInput.java @@ -11,17 +11,51 @@ *******************************************************************************/ package org.eclipse.cdt.managedbuilder.internal.core; +import java.net.URI; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; + +import org.eclipse.cdt.core.cdtvariables.CdtVariableException; import org.eclipse.cdt.core.settings.model.ICStorageElement; import org.eclipse.cdt.core.settings.model.util.CDataUtil; import org.eclipse.cdt.internal.core.SafeStringInterner; +import org.eclipse.cdt.managedbuilder.core.BuildException; import org.eclipse.cdt.managedbuilder.core.IAdditionalInput; +import org.eclipse.cdt.managedbuilder.core.IBuildObject; +import org.eclipse.cdt.managedbuilder.core.IBuilder; +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.cdt.managedbuilder.core.IFileInfo; import org.eclipse.cdt.managedbuilder.core.IInputType; import org.eclipse.cdt.managedbuilder.core.IManagedConfigElement; +import org.eclipse.cdt.managedbuilder.core.IOption; +import org.eclipse.cdt.managedbuilder.core.IOutputType; +import org.eclipse.cdt.managedbuilder.core.ITool; +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.macros.BuildMacroProvider; +import org.eclipse.cdt.managedbuilder.internal.macros.IMacroContextInfo; +import org.eclipse.cdt.managedbuilder.internal.macros.OptionContextData; +import org.eclipse.cdt.managedbuilder.macros.BuildMacroException; +import org.eclipse.cdt.managedbuilder.macros.IBuildMacroProvider; +import org.eclipse.cdt.utils.cdtvariables.CdtVariableResolver; +import org.eclipse.cdt.utils.cdtvariables.SupplierBasedCdtVariableSubstitutor; +import org.eclipse.core.filesystem.EFS; +import org.eclipse.core.filesystem.IFileStore; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.Path; public class AdditionalInput implements IAdditionalInput { private static final String EMPTY_STRING = new String(); + private static final String BUILD_VARIABLE_STATIC_LIB = "ARCHIVES"; //$NON-NLS-1$ + private static final String BUILD_VARIABLE_SHARED_LIB = "LIBRARIES"; //$NON-NLS-1$ + + private String[] expandedNames; + // Superclass // Parent and children private IInputType fParent; @@ -289,8 +323,302 @@ public class AdditionalInput implements IAdditionalInput { } } - public boolean needsRebuild(){ - return fRebuildState; + public boolean needsRebuild() { + // This shouldn't be called for an extension AdditionalInput + if (fIsExtensionAdditionalInput) + return false; + if (fRebuildState) + return fRebuildState; + if (fKind.intValue() == IAdditionalInput.KIND_ADDITIONAL_DEPENDENCY + || fKind.intValue() == IAdditionalInput.KIND_ADDITIONAL_INPUT_DEPENDENCY) { + IToolChain toolChain = getToolChain(); + if (!toolChain.isExtensionElement()) { + long artifactTimeStamp = getArtifactTimeStamp(toolChain); + if (0 != artifactTimeStamp) { + String[] paths = getPaths(); + for (int i = 0; i < paths.length; ++i) { + if (paths[i].length() == 0) + continue; + if (dependencyChanged(paths[i], artifactTimeStamp)) + return true; + } + } + } + } + return false; + } + + private long getArtifactTimeStamp(IToolChain toolChain) { + IBuilder builder = toolChain.getBuilder(); + IConfiguration configuration = toolChain.getParent(); + URI buildLocationURI = ManagedBuildManager.getBuildLocationURI(configuration, builder); + if (buildLocationURI != null) { + if (!buildLocationURI.toString().endsWith("/")) { //$NON-NLS-1$ + // ensure that it's a directory URI + buildLocationURI = URI.create(buildLocationURI.toString() + "/"); //$NON-NLS-1$ + } + + String artifactName = configuration.getArtifactName(); + String artifactExt = configuration.getArtifactExtension(); + String artifactPref = configuration.getOutputPrefix(artifactExt); + if (artifactName.length() > 0) { + if (artifactExt.length() > 0) + artifactName += "." + artifactExt; //$NON-NLS-1$ + if (artifactPref.length() > 0) + artifactName = artifactPref + artifactName; + try { + artifactName = ManagedBuildManager.getBuildMacroProvider().resolveValue(artifactName, "", //$NON-NLS-1$ + " ", IBuildMacroProvider.CONTEXT_CONFIGURATION, configuration); //$NON-NLS-1$ + } catch (BuildMacroException e) { + } + + URI buildArtifactURI = buildLocationURI.resolve(artifactName); + + try { + IFileStore artifact = EFS.getStore(buildArtifactURI); + org.eclipse.core.filesystem.IFileInfo info = (artifact == null) ? null : artifact.fetchInfo(); + if ((info != null) && info.exists()) { + return info.getLastModified(); + } + } catch (CoreException e) { + // if we can't even inquire about it, then assume it doesn't exist + } + } + } + return 0; + } + + private boolean dependencyChanged(String sPath, long artefactTimeStamp) { + try { + IToolChain toolChain = getToolChain(); + IConfiguration configuration = toolChain.getParent(); + if (fIsDirty || (null == expandedNames)) { + if ("$(LIBS)".equals(sPath)) //$NON-NLS-1$ + expandedNames = getDepLibs(); + else if ("$(USER_OBJS)".equals(sPath)) //$NON-NLS-1$ + expandedNames = getDepObjs(configuration); + else { + expandedNames = getDepFiles(sPath); + } + } + for (int j = 0; j < expandedNames.length; ++j) { + if (expandedNames[j] != null) { + IFileStore file = getEFSFile(expandedNames[j]); + org.eclipse.core.filesystem.IFileInfo info = (file == null) ? null : file.fetchInfo(); + if ((info != null) && info.exists() && (info.getLastModified() > artefactTimeStamp)) { + return true; + } + } + } + } catch (Exception e) { + // we'll have to assume that the dependency didn't change if we couldn't get its timestamp + ManagedBuilderCorePlugin.log(e); + } + return false; + } + + private IToolChain getToolChain() { + IBuildObject bo = fParent.getParent().getParent(); + IToolChain tCh = null; + if (bo instanceof IToolChain) { + tCh = ((IToolChain) bo); + } else if (bo instanceof IFileInfo) { + tCh = ((ResourceConfiguration) bo).getBaseToolChain(); + } + return tCh; + } + + private String[] getDepLibs() throws CoreException, BuildException, CdtVariableException { + IOption[] options = fParent.getParent().getOptions(); + String[] libNames = null; + List libPaths = null; + for (int i = 0; i < options.length; ++i) { + int type = options[i].getValueType(); + if (type == IOption.LIBRARIES) { + libNames = options[i].getLibraries(); + } else if (type == IOption.LIBRARY_PATHS) { + if (null == libPaths) + libPaths = new ArrayList(); + libPaths.addAll(Arrays.asList(restoreLibraryPaths(options[i]))); + } + } + + if ((libNames != null) && (libPaths != null)) { + IToolChain toolChain = getToolChain(); + for (int i = 0; i < libNames.length; ++i) { + URI uri = findLibrary(toolChain, libNames[i], libPaths); + libNames[i] = (uri == null) ? null : uri.toString(); + } + return libNames; + } + return new String[0]; + } + + private String[] restoreLibraryPaths(IOption option) throws BuildException, CdtVariableException { + @SuppressWarnings("unchecked") + List libPaths = (List) option.getValue(); + String[] dirs = libPaths.toArray(new String[libPaths.size()]); + dirs = substituteEnvVars(option, dirs); + return dirs; + } + + private URI findLibrary(IToolChain toolChain, final String libName, List dirs) throws CoreException { + final String libSO = getDynamicLibPrefix(toolChain) + libName + '.' + + getDynamicLibExtension(toolChain); + final String libA = getStaticLibPrefix(toolChain) + libName + '.' + getStaticLibExtension(toolChain); + + class LibFilter { + public boolean accept(String name) { + if (equals(libA, name)) + return true; + if (!startsWith(name, libSO)) + return false; + if (libSO.length() == name.length()) + return true; // we don't necessarily have a version extension + if (name.charAt(libSO.length()) != '.') + return false; + String ext = libName.substring(libSO.length() + 1); + try { + Integer.parseInt(ext); + return true; + } catch (NumberFormatException e) { + return false; + } + } + + boolean equals(String a, String b) { + return a.equals(b); + } + + boolean startsWith(String string, String prefix) { + return string.startsWith(prefix); + } + + } + class CaseInsensitiveLibFilter extends LibFilter { + @Override + boolean equals(String a, String b) { + return a.equalsIgnoreCase(b); + } + + @Override + boolean startsWith(String string, String prefix) { + return string.toLowerCase().startsWith(prefix.toLowerCase()); + } + } + + for (Iterator i = dirs.iterator(); i.hasNext();) { + IFileStore dir = getEFSFile(i.next()); + LibFilter filter = dir.getFileSystem().isCaseSensitive() ? new LibFilter() : new CaseInsensitiveLibFilter(); + for (IFileStore child : dir.childStores(EFS.NONE, null)) { + if (filter.accept(child.getName())) { + return child.toURI(); + } + } + } + return null; + } + + /** + * Gets an EFS file-store for the specified path or URI, which may be a local filesystem path or may be a more abstract URI. + * + * @param pathOrURI a local filesystem path or URI + * + * @return the file store, if one could be determined + */ + private static IFileStore getEFSFile(String pathOrURI) { + IFileStore result; + + try { + // try it as a URI + result = EFS.getStore(URI.create(pathOrURI)); + } catch (Exception e) { + // most likely, the path is not a URI, so assume a local file and try again + result = EFS.getLocalFileSystem().getStore(new Path(pathOrURI)); + } + + return result; + } + + private String[] substituteEnvVars(IOption option, String[] paths) throws CdtVariableException { + BuildMacroProvider provider = (BuildMacroProvider) ManagedBuildManager.getBuildMacroProvider(); + IMacroContextInfo info = provider.getMacroContextInfo(IBuildMacroProvider.CONTEXT_OPTION, + new OptionContextData(option, fParent)); + String delimiter = ManagedBuildManager.getEnvironmentVariableProvider().getDefaultDelimiter(); + String inexVal = " "; //$NON-NLS-1$ + SupplierBasedCdtVariableSubstitutor subst = provider.getMacroSubstitutor(info, inexVal, delimiter); + + String[] newPaths = CdtVariableResolver.resolveStringListValues(paths, subst, false); + for (int i = 0; i < newPaths.length; ++i) { + String newPath = newPaths[i]; + int len = newPath.length(); + if ((len > 1) && (newPath.charAt(0) == '\"') && (newPath.charAt(len - 1) == '\"')) + newPaths[i] = newPaths[i].substring(1, len - 1); + } + return newPaths; + } + + private static String getStaticLibPrefix(IToolChain toolChain) { + IOutputType type = findOutputType(toolChain, BUILD_VARIABLE_STATIC_LIB); + if (null == type) + return "lib"; //$NON-NLS-1$ + return type.getOutputPrefix(); + } + + private static String getStaticLibExtension(IToolChain toolChain) { + IOutputType type = findOutputType(toolChain, BUILD_VARIABLE_STATIC_LIB); + if (null == type || type.getOutputExtensionsAttribute().length == 0) { + return "a"; //$NON-NLS-1$ + } + return type.getOutputExtensionsAttribute()[0]; + } + + private static String getDynamicLibPrefix(IToolChain toolChain) { + IOutputType type = findOutputType(toolChain, BUILD_VARIABLE_SHARED_LIB); + if (null == type) + return "lib"; //$NON-NLS-1$ + return type.getOutputPrefix(); + } + + private static String getDynamicLibExtension(IToolChain toolChain) { + IOutputType type = findOutputType(toolChain, BUILD_VARIABLE_SHARED_LIB); + if (null == type || type.getOutputExtensionsAttribute().length == 0) { + return "so"; //$NON-NLS-1$ + } + return type.getOutputExtensionsAttribute()[0]; + } + + public static IOutputType findOutputType(IToolChain toolChain, String buildVariable) { + // if we're determining whether to re-build an executable, then it won't have an output + // type for shared libraries from which we can get a filename extension or prefix. + // We have to scan the extension toolchain + toolChain = ManagedBuildManager.getExtensionToolChain(toolChain); + ITool[] tools = toolChain.getTools(); + for (int i = 0; i < tools.length; ++i) { + IOutputType[] oTypes = tools[i].getOutputTypes(); + for (int j = 0; j < oTypes.length; ++j) { + if (buildVariable.equals(oTypes[j].getBuildVariable())) + return oTypes[j]; + } + } + return null; + } + + private String[] getDepObjs(IConfiguration configuration) throws BuildException, CdtVariableException { + IOption[] options = fParent.getParent().getOptions(); + String[] userObjs = null; + for (int i = 0; i < options.length; ++i) { + int type = options[i].getValueType(); + if (type == IOption.OBJECTS) { + userObjs = options[i].getUserObjects(); + return substituteEnvVars(options[i], userObjs); + } + } + return new String[0]; + } + + private String[] getDepFiles(String sPath) { + return new String[0]; } public void setRebuildState(boolean rebuild){ diff --git a/build/org.eclipse.cdt.managedbuilder.gnu.ui/plugin.xml b/build/org.eclipse.cdt.managedbuilder.gnu.ui/plugin.xml index ddc4c317689..3fce76a186d 100644 --- a/build/org.eclipse.cdt.managedbuilder.gnu.ui/plugin.xml +++ b/build/org.eclipse.cdt.managedbuilder.gnu.ui/plugin.xml @@ -176,7 +176,7 @@ + kind="additionalinputdependency"> + kind="additionalinputdependency"> + kind="additionalinputdependency"> + kind="additionalinputdependency"> + kind="additionalinputdependency">