diff options
author | Warren Paul | 2008-04-08 21:50:33 +0000 |
---|---|---|
committer | Warren Paul | 2008-04-08 21:50:33 +0000 |
commit | 1ca857981f6093615295f66ad67264c18b0559e5 (patch) | |
tree | ed4540ed230a845c9d6e74e726751679e89e3f52 /build/org.eclipse.cdt.make.core | |
parent | 24cc1a78220a6d66481ce510d8e6830a5d251736 (diff) | |
download | org.eclipse.cdt-1ca857981f6093615295f66ad67264c18b0559e5.tar.gz org.eclipse.cdt-1ca857981f6093615295f66ad67264c18b0559e5.tar.xz org.eclipse.cdt-1ca857981f6093615295f66ad67264c18b0559e5.zip |
applied patch from bug #225777.
Diffstat (limited to 'build/org.eclipse.cdt.make.core')
7 files changed, 205 insertions, 32 deletions
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeCorePlugin.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeCorePlugin.java index 1db677ed2f2..138cca059af 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeCorePlugin.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeCorePlugin.java @@ -14,7 +14,6 @@ package org.eclipse.cdt.make.core; import java.io.File; import java.io.FileReader; import java.io.IOException; -import java.io.InputStreamReader; import java.lang.reflect.InvocationTargetException; import java.net.URI; import java.util.ArrayList; @@ -24,6 +23,7 @@ import java.util.Map; import java.util.StringTokenizer; import org.eclipse.cdt.make.core.makefile.IMakefile; +import org.eclipse.cdt.make.core.makefile.IMakefileReaderProvider; import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager; import org.eclipse.cdt.make.core.scannerconfig.IExternalScannerInfoProvider; import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo; @@ -187,8 +187,22 @@ public class MakeCorePlugin extends Plugin { } static public IMakefile createMakefile(IFileStore file, boolean isGnuStyle, String[] makefileDirs) throws CoreException { + return createMakefile(file.toURI(), isGnuStyle, makefileDirs, null); + } + + /** + * Create an IMakefile using the given IMakefileReaderProvider to fetch + * contents by name. + * @param name URI of main file + * @param isGnuStyle + * @param makefileDirs + * @param makefileReaderProvider may be <code>null</code> for EFS IFileStore reading + * @return IMakefile + * @throws CoreException + */ + public static IMakefile createMakefile(URI fileURI, + boolean isGnuStyle, String[] makefileDirs, IMakefileReaderProvider makefileReaderProvider) { IMakefile makefile; - URI fileURI = file.toURI(); if (isGnuStyle) { GNUMakefile gnu = new GNUMakefile(); ArrayList includeList = new ArrayList(); @@ -198,14 +212,14 @@ public class MakeCorePlugin extends Plugin { String[] includes = (String[]) includeList.toArray(new String[includeList.size()]); gnu.setIncludeDirectories(includes); try { - gnu.parse(fileURI, new InputStreamReader(file.openInputStream(EFS.NONE, null))); + gnu.parse(fileURI, makefileReaderProvider); } catch (IOException e) { } makefile = gnu; } else { PosixMakefile posix = new PosixMakefile(); try { - posix.parse(fileURI, new InputStreamReader(file.openInputStream(EFS.NONE, null))); + posix.parse(fileURI, makefileReaderProvider); } catch (IOException e) { } makefile = posix; @@ -213,6 +227,19 @@ public class MakeCorePlugin extends Plugin { return makefile; } + /** + * Create an IMakefile using EFS to fetch contents. + * @param name URI of main file + * @param isGnuStyle + * @param makefileDirs + * @return IMakefile + * @throws CoreException + */ + public static IMakefile createMakefile(URI fileURI, + boolean isGnuStyle, String[] makefileDirs) { + return createMakefile(fileURI, isGnuStyle, makefileDirs, null); + } + public IMakefile createMakefile(IFile file) throws CoreException { return createMakefile(EFS.getStore(file.getLocationURI()), isMakefileGNUStyle(), getMakefileDirs()); } diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/makefile/IMakefile.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/makefile/IMakefile.java index aa467ed506f..1c3b49a0c61 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/makefile/IMakefile.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/makefile/IMakefile.java @@ -125,6 +125,12 @@ public interface IMakefile extends IParent { String expandString(String line, boolean recursive); /** + * Get the makefile Reader provider used to create this makefile. + * @return IMakefileReaderProvider or <code>null</code> + */ + IMakefileReaderProvider getMakefileReaderProvider(); + + /** * Clear all statements and (re)parse the Makefile * * @param filePath @@ -143,6 +149,17 @@ public interface IMakefile extends IParent { void parse(URI fileURI, Reader makefile) throws IOException; /** + * Clear the all statements and (re)parse the Makefile + * using the given makefile Reader provider + * + * @param fileURI + * @param makefileReaderProvider provider, or <code>null</code> to use a FileReader + * @throws IOException + */ + void parse(URI fileURI, IMakefileReaderProvider makefileReaderProvider) throws IOException; + + + /** * @return the <code>URI</code> of this makefile */ URI getFileURI(); diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/makefile/IMakefileReaderProvider.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/makefile/IMakefileReaderProvider.java new file mode 100644 index 00000000000..a8d0f26be5a --- /dev/null +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/makefile/IMakefileReaderProvider.java @@ -0,0 +1,31 @@ +/** + * (c) 2008 Nokia + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Ed Swartz (NOKIA) - Initial API and implementation + */ +package org.eclipse.cdt.make.core.makefile; + +import java.io.IOException; +import java.io.Reader; +import java.net.URI; + +/** + * Provide an abstraction to loading the contents of a makefile + * @author eswartz + * + */ +public interface IMakefileReaderProvider { + /** + * Get a reader for the contents of the file at filename. + * @param fileURI the file to read. It's up to the implementation how to read + * it, but usually EFS.getFileStore(fileURI).getInputStream(...) is the best bet. + * @return Reader a reader for the contents of the existing file + * @throws IOException if the file cannot be found according to the implementation + */ + Reader getReader(URI fileURI) throws IOException; +} diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/makefile/NullMakefile.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/makefile/NullMakefile.java index 0b23a014861..813f4fb5345 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/makefile/NullMakefile.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/makefile/NullMakefile.java @@ -15,6 +15,7 @@ import java.io.Reader; import java.net.URI; import org.eclipse.cdt.make.core.makefile.IDirective; +import org.eclipse.cdt.make.core.makefile.IMakefileReaderProvider; /** * Makefile : ( statement ) * @@ -61,6 +62,26 @@ public class NullMakefile extends AbstractMakefile { public void parse(String name, Reader makefile) throws IOException { } + /* (non-Javadoc) + * @see org.eclipse.cdt.make.core.makefile.IMakefile#getMakefileReaderProvider() + */ + public IMakefileReaderProvider getMakefileReaderProvider() { + return null; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.make.core.makefile.IMakefile#parse(java.lang.String, org.eclipse.cdt.make.core.makefile.IMakefileReaderProvider) + */ + public void parse(String name, + IMakefileReaderProvider makefileReaderProvider) throws IOException { + } public void parse(URI fileURI, Reader makefile) throws IOException { } + + /* (non-Javadoc) + * @see org.eclipse.cdt.make.core.makefile.IMakefile#parse(java.net.URI, org.eclipse.cdt.make.core.makefile.IMakefileReaderProvider) + */ + public void parse(URI fileURI, + IMakefileReaderProvider makefileReaderProvider) throws IOException { + } } diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/makefile/gnu/GNUMakefile.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/makefile/gnu/GNUMakefile.java index 3d42e3c9f6f..c9176c2bcd5 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/makefile/gnu/GNUMakefile.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/makefile/gnu/GNUMakefile.java @@ -27,6 +27,7 @@ import java.util.StringTokenizer; import org.eclipse.cdt.make.core.MakeCorePlugin; import org.eclipse.cdt.make.core.makefile.IDirective; import org.eclipse.cdt.make.core.makefile.IMakefile; +import org.eclipse.cdt.make.core.makefile.IMakefileReaderProvider; import org.eclipse.cdt.make.core.makefile.gnu.IGNUMakefile; import org.eclipse.cdt.make.internal.core.makefile.AbstractMakefile; import org.eclipse.cdt.make.internal.core.makefile.BadDirective; @@ -51,7 +52,9 @@ import org.eclipse.cdt.make.internal.core.makefile.Target; import org.eclipse.cdt.make.internal.core.makefile.TargetRule; import org.eclipse.cdt.make.internal.core.makefile.Util; import org.eclipse.cdt.make.internal.core.makefile.posix.PosixMakefileUtil; +import org.eclipse.core.filesystem.EFS; import org.eclipse.core.filesystem.URIUtil; +import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.Path; @@ -78,19 +81,49 @@ public class GNUMakefile extends AbstractMakefile implements IGNUMakefile { String[] includeDirectories = new String[0]; IDirective[] builtins = null; + private IMakefileReaderProvider makefileReaderProvider; public GNUMakefile() { super(null); } + /* (non-Javadoc) + * @see org.eclipse.cdt.make.core.makefile.IMakefile#getMakefileReaderProvider() + */ + public IMakefileReaderProvider getMakefileReaderProvider() { + return makefileReaderProvider; + } + public void parse(String filePath, Reader reader) throws IOException { parse(URIUtil.toURI(filePath), new MakefileReader(reader)); } + /* (non-Javadoc) + * @see org.eclipse.cdt.make.core.makefile.IMakefile#parse(java.net.URI, org.eclipse.cdt.make.core.makefile.IMakefileReaderProvider) + */ + public void parse(URI fileURI, + IMakefileReaderProvider makefileReaderProvider) throws IOException { + this.makefileReaderProvider = makefileReaderProvider; + MakefileReader reader; + if (makefileReaderProvider == null) { + try { + reader = new MakefileReader(new InputStreamReader( + EFS.getStore(fileURI).openInputStream(EFS.NONE, null))); + } catch (CoreException e) { + MakeCorePlugin.log(e); + throw new IOException(e.getMessage()); + } + } else { + reader = new MakefileReader(makefileReaderProvider.getReader(fileURI)); + } + parse(fileURI, reader); + } + public void parse(URI filePath, Reader reader) throws IOException { parse(filePath, new MakefileReader(reader)); } + protected void parse(URI fileURI, MakefileReader reader) throws IOException { String line; Rule[] rules = null; @@ -787,22 +820,24 @@ public class GNUMakefile extends AbstractMakefile implements IGNUMakefile { public IDirective[] getBuiltins() { if (builtins == null) { String location = "builtin" + File.separator + "gnu.mk"; //$NON-NLS-1$ //$NON-NLS-2$ - try { - InputStream stream = FileLocator.openStream(MakeCorePlugin.getDefault().getBundle(), new Path(location), false); - GNUMakefile gnu = new GNUMakefile(); - URL url = FileLocator.find(MakeCorePlugin.getDefault().getBundle(), new Path(location), null); - gnu.parse(url.toURI(), new InputStreamReader(stream)); - builtins = gnu.getDirectives(); - for (int i = 0; i < builtins.length; i++) { - if (builtins[i] instanceof MacroDefinition) { - ((MacroDefinition) builtins[i]).setFromDefault(true); + if (MakeCorePlugin.getDefault() != null) { + try { + InputStream stream = FileLocator.openStream(MakeCorePlugin.getDefault().getBundle(), new Path(location), false); + GNUMakefile gnu = new GNUMakefile(); + URL url = FileLocator.find(MakeCorePlugin.getDefault().getBundle(), new Path(location), null); + gnu.parse(url.toURI(), new InputStreamReader(stream)); + builtins = gnu.getDirectives(); + for (int i = 0; i < builtins.length; i++) { + if (builtins[i] instanceof MacroDefinition) { + ((MacroDefinition) builtins[i]).setFromDefault(true); + } } - } - } catch (IOException e) { - MakeCorePlugin.log(e); - } catch (URISyntaxException e) { - MakeCorePlugin.log(e); - } + } catch (IOException e) { + MakeCorePlugin.log(e); + } catch (URISyntaxException e) { + MakeCorePlugin.log(e); + } + } if (builtins == null) { builtins = new IDirective[0]; } diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/makefile/gnu/Include.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/makefile/gnu/Include.java index 4ca800e55a1..af1c5de2599 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/makefile/gnu/Include.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/makefile/gnu/Include.java @@ -10,20 +10,17 @@ *******************************************************************************/ package org.eclipse.cdt.make.internal.core.makefile.gnu; -import java.io.FileInputStream; import java.io.IOException; -import java.io.InputStreamReader; import java.net.URI; import java.net.URISyntaxException; import org.eclipse.cdt.make.core.makefile.IDirective; +import org.eclipse.cdt.make.core.makefile.IMakefile; +import org.eclipse.cdt.make.core.makefile.IMakefileReaderProvider; import org.eclipse.cdt.make.core.makefile.gnu.IInclude; import org.eclipse.cdt.make.internal.core.makefile.Directive; import org.eclipse.cdt.make.internal.core.makefile.Parent; -import org.eclipse.core.filesystem.EFS; -import org.eclipse.core.filesystem.IFileStore; import org.eclipse.core.filesystem.URIUtil; -import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; @@ -50,9 +47,24 @@ public class Include extends Parent implements IInclude { return filenames; } + private IMakefileReaderProvider getCurrentMakefileReaderProvider() { + IDirective directive = this; + while (directive != null) { + if (directive instanceof IMakefile) { + IMakefileReaderProvider makefileReaderProvider = ((IMakefile) directive).getMakefileReaderProvider(); + if (makefileReaderProvider != null) + return makefileReaderProvider; + } + directive = directive.getParent(); + } + return null; + } + + public IDirective[] getDirectives() { clearDirectives(); URI uri = getMakefile().getFileURI(); + IMakefileReaderProvider makefileReaderProvider = getCurrentMakefileReaderProvider(); for (int i = 0; i < filenames.length; i++) { IPath includeFilePath = new Path(filenames[i]); if (includeFilePath.isAbsolute()) { @@ -65,8 +77,7 @@ public class Include extends Parent implements IInclude { } try { GNUMakefile gnu = new GNUMakefile(); - final InputStreamReader reader = new InputStreamReader(new FileInputStream(includeFilePath.toFile())); - gnu.parse(includeFilePath.toOSString(), reader); + gnu.parse(URIUtil.toURI(includeFilePath), makefileReaderProvider); addDirective(gnu); continue; } catch (IOException e) { @@ -75,21 +86,19 @@ public class Include extends Parent implements IInclude { } else if (dirs != null) { for (int j = 0; j < dirs.length; j++) { try { - includeFilePath= new Path(dirs[j]).append(includeFilePath); - String uriPath = includeFilePath.toString(); - if (includeFilePath.getDevice() != null) { + IPath testIncludeFilePath= new Path(dirs[j]).append(includeFilePath); + String uriPath = testIncludeFilePath.toString(); + if (testIncludeFilePath.getDevice() != null) { // special case: device prefix is seen as relative path by URI uriPath = '/' + uriPath; } GNUMakefile gnu = new GNUMakefile(); URI includeURI = new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(), uriPath, null, null); - IFileStore store = EFS.getStore(includeURI); - gnu.parse(includeURI, new InputStreamReader(store.openInputStream(0, null))); + gnu.parse(includeURI, makefileReaderProvider); addDirective(gnu); break; } catch (IOException e) { } catch (URISyntaxException exc) { - } catch (CoreException exc) { } } } diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/makefile/posix/PosixMakefile.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/makefile/posix/PosixMakefile.java index c5f4f2459b1..c3b406bbb5d 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/makefile/posix/PosixMakefile.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/makefile/posix/PosixMakefile.java @@ -21,6 +21,7 @@ import java.net.URL; import org.eclipse.cdt.make.core.MakeCorePlugin; import org.eclipse.cdt.make.core.makefile.IDirective; +import org.eclipse.cdt.make.core.makefile.IMakefileReaderProvider; import org.eclipse.cdt.make.internal.core.makefile.AbstractMakefile; import org.eclipse.cdt.make.internal.core.makefile.BadDirective; import org.eclipse.cdt.make.internal.core.makefile.Command; @@ -43,7 +44,9 @@ import org.eclipse.cdt.make.internal.core.makefile.SuffixesRule; import org.eclipse.cdt.make.internal.core.makefile.Target; import org.eclipse.cdt.make.internal.core.makefile.TargetRule; import org.eclipse.cdt.make.internal.core.makefile.Util; +import org.eclipse.core.filesystem.EFS; import org.eclipse.core.filesystem.URIUtil; +import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.Path; @@ -67,15 +70,44 @@ import org.eclipse.core.runtime.Path; public class PosixMakefile extends AbstractMakefile { IDirective[] builtins = null; + private IMakefileReaderProvider makefileReaderProvider; public PosixMakefile() { super(null); } + /* (non-Javadoc) + * @see org.eclipse.cdt.make.core.makefile.IMakefile#getMakefileReaderProvider() + */ + public IMakefileReaderProvider getMakefileReaderProvider() { + return makefileReaderProvider; + } + public void parse(String name, Reader reader) throws IOException { parse(URIUtil.toURI(name), new MakefileReader(reader)); } + /* (non-Javadoc) + * @see org.eclipse.cdt.make.core.makefile.IMakefile#parse(java.net.URI, org.eclipse.cdt.make.core.makefile.IMakefileReaderProvider) + */ + public void parse(URI fileURI, + IMakefileReaderProvider makefileReaderProvider) throws IOException { + this.makefileReaderProvider = makefileReaderProvider; + MakefileReader reader; + if (makefileReaderProvider == null) { + try { + reader = new MakefileReader(new InputStreamReader( + EFS.getStore(fileURI).openInputStream(EFS.NONE, null))); + } catch (CoreException e) { + MakeCorePlugin.log(e); + throw new IOException(e.getMessage()); + } + } else { + reader = new MakefileReader(makefileReaderProvider.getReader(fileURI)); + } + parse(fileURI, reader); + } + public void parse(URI fileURI, Reader reader) throws IOException { parse(fileURI, new MakefileReader(reader)); } @@ -332,4 +364,5 @@ public class PosixMakefile extends AbstractMakefile { } return targetRules; } + } |