Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWarren Paul2008-04-08 21:50:33 +0000
committerWarren Paul2008-04-08 21:50:33 +0000
commit1ca857981f6093615295f66ad67264c18b0559e5 (patch)
treeed4540ed230a845c9d6e74e726751679e89e3f52
parent24cc1a78220a6d66481ce510d8e6830a5d251736 (diff)
downloadorg.eclipse.cdt-1ca857981f6093615295f66ad67264c18b0559e5.tar.gz
org.eclipse.cdt-1ca857981f6093615295f66ad67264c18b0559e5.tar.xz
org.eclipse.cdt-1ca857981f6093615295f66ad67264c18b0559e5.zip
applied patch from bug #225777.
-rw-r--r--build/org.eclipse.cdt.make.core.tests/META-INF/MANIFEST.MF1
-rw-r--r--build/org.eclipse.cdt.make.core.tests/src/org/eclipse/cdt/make/core/tests/AutomatedIntegrationSuite.java1
-rw-r--r--build/org.eclipse.cdt.make.core.tests/src/org/eclipse/cdt/make/core/tests/MakefileReaderProviderTests.java169
-rw-r--r--build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeCorePlugin.java35
-rw-r--r--build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/makefile/IMakefile.java17
-rw-r--r--build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/makefile/IMakefileReaderProvider.java31
-rw-r--r--build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/makefile/NullMakefile.java21
-rw-r--r--build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/makefile/gnu/GNUMakefile.java65
-rw-r--r--build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/makefile/gnu/Include.java35
-rw-r--r--build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/makefile/posix/PosixMakefile.java33
10 files changed, 376 insertions, 32 deletions
diff --git a/build/org.eclipse.cdt.make.core.tests/META-INF/MANIFEST.MF b/build/org.eclipse.cdt.make.core.tests/META-INF/MANIFEST.MF
index c3898837e93..c117862e9e4 100644
--- a/build/org.eclipse.cdt.make.core.tests/META-INF/MANIFEST.MF
+++ b/build/org.eclipse.cdt.make.core.tests/META-INF/MANIFEST.MF
@@ -16,3 +16,4 @@ Require-Bundle: org.eclipse.core.runtime,
Bundle-ActivationPolicy: lazy
Bundle-Vendor: Eclipse.org
Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Import-Package: org.eclipse.core.filesystem
diff --git a/build/org.eclipse.cdt.make.core.tests/src/org/eclipse/cdt/make/core/tests/AutomatedIntegrationSuite.java b/build/org.eclipse.cdt.make.core.tests/src/org/eclipse/cdt/make/core/tests/AutomatedIntegrationSuite.java
index 56eab3a818a..784a5cdd9e8 100644
--- a/build/org.eclipse.cdt.make.core.tests/src/org/eclipse/cdt/make/core/tests/AutomatedIntegrationSuite.java
+++ b/build/org.eclipse.cdt.make.core.tests/src/org/eclipse/cdt/make/core/tests/AutomatedIntegrationSuite.java
@@ -39,6 +39,7 @@ public class AutomatedIntegrationSuite extends TestSuite {
suite.addTest(StandardBuildTests.suite());
suite.addTest(ScannerDiscoveryTests.suite());
+ suite.addTest(MakefileReaderProviderTests.suite());
return suite;
}
diff --git a/build/org.eclipse.cdt.make.core.tests/src/org/eclipse/cdt/make/core/tests/MakefileReaderProviderTests.java b/build/org.eclipse.cdt.make.core.tests/src/org/eclipse/cdt/make/core/tests/MakefileReaderProviderTests.java
new file mode 100644
index 00000000000..725cd647d80
--- /dev/null
+++ b/build/org.eclipse.cdt.make.core.tests/src/org/eclipse/cdt/make/core/tests/MakefileReaderProviderTests.java
@@ -0,0 +1,169 @@
+/**
+ * (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.tests;
+
+import org.eclipse.cdt.make.core.MakeCorePlugin;
+import org.eclipse.cdt.make.core.makefile.*;
+import org.eclipse.core.filesystem.URIUtil;
+import org.eclipse.core.runtime.*;
+
+import java.io.*;
+import java.net.*;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+
+public class MakefileReaderProviderTests extends TestCase {
+ private String[] inclDirs;
+
+ /* (non-Javadoc)
+ * @see junit.framework.TestCase#setUp()
+ */
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ String basePath = "";
+ File baseDir = getPluginRelativeFile(new Path("data"));
+ if (baseDir != null)
+ basePath = baseDir.getAbsolutePath() + File.separator;
+ inclDirs = new String[] {
+ basePath + "bogus",
+ basePath + "incl"
+ };
+ }
+
+ public void testNoReaderProvider() throws Exception {
+ IPath path = new Path("data/Makefile.main");
+ File file = getPluginRelativeFile(path);
+ // doesn't work in packaged plugin, which is fine
+ if (file != null) {
+ IMakefile makefile = MakeCorePlugin.createMakefile(
+ URIUtil.toURI(file.getAbsolutePath()),
+ true, inclDirs);
+ assertMakefileContents(makefile);
+ }
+ }
+
+ public void testNullReaderProvider() throws Exception {
+ IPath path = new Path("data/Makefile.main");
+ File file = getPluginRelativeFile(path);
+ // doesn't work in packaged plugin, which is fine
+ if (file != null) {
+ IMakefile makefile = MakeCorePlugin.createMakefile(
+ URIUtil.toURI(file.getAbsolutePath()), true, inclDirs, null);
+ assertMakefileContents(makefile);
+ }
+ }
+
+ public void testInputStreamReaderProvider() throws Exception {
+ IPath path = new Path("Makefile.main");
+
+ // get base directory for searches
+ final URL url = getPluginRelativeURL(new Path("data").addTrailingSeparator());
+ IMakefile makefile = MakeCorePlugin.createMakefile(
+ URIUtil.toURI(path), true, inclDirs,
+ new IMakefileReaderProvider() {
+
+ public Reader getReader(URI fileURI) throws IOException {
+ URL fileUrl;
+ try {
+ fileUrl = new URL(url, fileURI.getPath());
+ } catch (MalformedURLException e) {
+ fileUrl = new URL("file", null, fileURI.getPath());
+ }
+ InputStream is = fileUrl.openStream();
+ return new InputStreamReader(is);
+ }
+
+ });
+
+ assertMakefileContents(makefile);
+ }
+
+ public void testInMemoryReaderProvider() throws Exception {
+ IMakefile makefile = MakeCorePlugin.createMakefile(
+ URIUtil.toURI("Makefile.main"), true, inclDirs,
+ new IMakefileReaderProvider() {
+
+ public Reader getReader(URI fileURI) throws IOException {
+ String name = new File(fileURI).getName();
+ if (name.equals("Makefile.main"))
+ return new StringReader(
+ "VAR = foo\r\n" +
+ "\r\n" +
+ "include Makefile.incl\r\n" +
+ "\r\n" +
+ "main: $(VAR)\r\n" +
+ " nothing\r\n");
+ if (name.equals("Makefile.incl"))
+ return new StringReader(
+ "INCLVAR = bar\r\n" +
+ "\r\n" +
+ "foo.o: .PHONY\r\n"
+ );
+
+ throw new FileNotFoundException(fileURI.getPath());
+ }
+
+ });
+
+ assertMakefileContents(makefile);
+ }
+
+ /**
+ * @param makefile
+ */
+ private void assertMakefileContents(IMakefile makefile) {
+ assertNotNull(makefile);
+ IMacroDefinition[] macroDefinitions = makefile.getMacroDefinitions();
+ assertNotNull(macroDefinitions);
+ assertEquals(2, macroDefinitions.length);
+ assertEquals("VAR", macroDefinitions[0].getName());
+ assertEquals("INCLVAR", macroDefinitions[1].getName());
+
+ IRule[] rules = makefile.getRules();
+ assertEquals(2, rules.length);
+ assertEquals("main", rules[0].getTarget().toString());
+ assertEquals("foo.o", rules[1].getTarget().toString());
+ }
+
+ /**
+ * Try to get a file in the development version of a plugin --
+ * will return <code>null</code> for a jar-packaged plugin.
+ * @param path
+ * @return
+ * @throws Exception
+ */
+ private File getPluginRelativeFile(IPath path) throws Exception {
+ URL url = getPluginRelativeURL(path);
+ assertNotNull(url);
+ if (url.getProtocol().equals("file"))
+ return new File(url.getPath());
+ return null;
+ }
+
+ private URL getPluginRelativeURL(IPath path) throws Exception {
+ if (MakeTestsPlugin.getDefault() != null)
+ return FileLocator.find(
+ MakeTestsPlugin.getDefault().getBundle(),
+ path, null);
+ else {
+ return new URL("file", null, path.toFile().getAbsolutePath());
+ }
+ }
+
+ /**
+ * @return
+ */
+ public static Test suite() {
+ return new MakefileReaderProviderTests();
+ }
+}
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;
}
+
}

Back to the top