mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-24 09:25:31 +02:00
bug 364733: Internal Builder does not work with Cygwin toolchain
This commit is contained in:
parent
863ac9d61b
commit
dc01366f97
9 changed files with 244 additions and 230 deletions
|
@ -10,7 +10,6 @@
|
|||
*******************************************************************************/
|
||||
package org.eclipse.cdt.managedbuilder.internal.buildmodel;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
|
@ -21,12 +20,14 @@ import java.util.Set;
|
|||
|
||||
import org.eclipse.cdt.core.CommandLauncher;
|
||||
import org.eclipse.cdt.core.ICommandLauncher;
|
||||
import org.eclipse.cdt.internal.core.Cygwin;
|
||||
import org.eclipse.cdt.managedbuilder.buildmodel.IBuildCommand;
|
||||
import org.eclipse.cdt.managedbuilder.internal.core.ManagedMakeMessages;
|
||||
import org.eclipse.cdt.utils.PathUtil;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
import org.eclipse.core.runtime.IProgressMonitor;
|
||||
import org.eclipse.core.runtime.Path;
|
||||
import org.eclipse.core.runtime.Platform;
|
||||
import org.eclipse.core.runtime.SubProgressMonitor;
|
||||
|
||||
/**
|
||||
|
@ -41,56 +42,28 @@ import org.eclipse.core.runtime.SubProgressMonitor;
|
|||
*/
|
||||
public class CommandBuilder implements IBuildModelBuilder {
|
||||
private static final String PATH_ENV = "PATH"; //$NON-NLS-1$
|
||||
private static final String PROPERTY_DELIMITER = "path.separator"; //$NON-NLS-1$
|
||||
private static final String PROPERTY_OS_NAME = "os.name"; //$NON-NLS-1$
|
||||
private static final String PROPERTY_OS_VALUE = "windows";//$NON-NLS-1$
|
||||
static final String DELIMITER_UNIX = ":"; //$NON-NLS-1$
|
||||
static final String DELIMITER_WINDOWS = ";"; //$NON-NLS-1$
|
||||
private static final String NEWLINE = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
|
||||
private IBuildCommand fCmd;
|
||||
private Process fProcess;
|
||||
private String fErrMsg;
|
||||
|
||||
private static final String BUILDER_MSG_HEADER = "InternalBuilder.msg.header"; //$NON-NLS-1$
|
||||
private static final String NEWLINE = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
|
||||
/*
|
||||
* no need in this for now, Spawner is always used
|
||||
*
|
||||
protected class SpawnerfreeLauncher extends CommandLauncher{
|
||||
|
||||
public Process execute(IPath commandPath, String[] args, String[] env, IPath changeToDirectory) {
|
||||
try {
|
||||
// add platform specific arguments (shell invocation)
|
||||
fCommandArgs = constructCommandArray(commandPath.toOSString(), args);
|
||||
fProcess = Runtime.getRuntime().exec(fCommandArgs, env, changeToDirectory.toFile());
|
||||
// ProcessFactory.getFactory().exec(fCommandArgs, env, changeToDirectory.toFile());
|
||||
fErrorMessage = ""; //$NON-NLS-1$
|
||||
} catch (IOException e) {
|
||||
setErrorMessage(e.getMessage());
|
||||
fProcess = null;
|
||||
}
|
||||
return fProcess;
|
||||
}
|
||||
}
|
||||
*/
|
||||
/*
|
||||
* a temporary work-around to resolve the bug#145099
|
||||
* (https://bugs.eclipse.org/bugs/show_bug.cgi?id=145099)
|
||||
*
|
||||
* this will be removed after fixing the bug#145737
|
||||
* (https://bugs.eclipse.org/bugs/show_bug.cgi?id=145737)
|
||||
*/
|
||||
private class CommandSearchLauncher extends CommandLauncher{
|
||||
|
||||
private class CommandSearchLauncher extends CommandLauncher {
|
||||
@Override
|
||||
protected String[] constructCommandArray(String command, String[] commandArgs) {
|
||||
String[] args = new String[1 + commandArgs.length];
|
||||
if(!isWindows()){
|
||||
//find a full path to an executable
|
||||
String cmd = getExecutable(command, fCmd.getEnvironment());
|
||||
if(cmd != null)
|
||||
command = cmd;
|
||||
if (Platform.getOS().equals(Platform.OS_WIN32)) {
|
||||
// find a location of the executable
|
||||
String envPathValue = fCmd.getEnvironment().get(PATH_ENV);
|
||||
IPath location = PathUtil.findProgramLocation(command, envPathValue);
|
||||
if(location != null) {
|
||||
try {
|
||||
// Handle cygwin link
|
||||
command = Cygwin.cygwinToWindowsPath(location.toString(), envPathValue);
|
||||
} catch (Exception e) {
|
||||
command = location.toString();
|
||||
}
|
||||
}
|
||||
//if not found, continue with the command passed as an argument
|
||||
}
|
||||
|
||||
|
@ -99,7 +72,6 @@ public class CommandBuilder implements IBuildModelBuilder {
|
|||
return args;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void printCommandLine(OutputStream os) {
|
||||
if (os != null) {
|
||||
|
@ -274,7 +246,7 @@ public class CommandBuilder implements IBuildModelBuilder {
|
|||
|
||||
protected void printMessage(String msg, OutputStream os){
|
||||
if (os != null) {
|
||||
msg = ManagedMakeMessages.getFormattedString(BUILDER_MSG_HEADER, msg);
|
||||
msg = ManagedMakeMessages.getFormattedString("InternalBuilder.msg.header", msg); //$NON-NLS-1$
|
||||
printMessage(null, msg, os);
|
||||
}
|
||||
|
||||
|
@ -305,53 +277,4 @@ public class CommandBuilder implements IBuildModelBuilder {
|
|||
}
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
private String getExecutable(String command, Map<String, String> environment){
|
||||
if(new Path(command).isAbsolute())
|
||||
return command;
|
||||
return searchExecutable(command, getPaths(environment));
|
||||
}
|
||||
|
||||
private String[] getPaths(Map<String, String> env){
|
||||
String pathsStr = env.get(PATH_ENV);
|
||||
if(pathsStr == null){
|
||||
Set<Entry<String, String>> entrySet = env.entrySet();
|
||||
for (Entry<String, String> entry : entrySet) {
|
||||
if(PATH_ENV.equalsIgnoreCase(entry.getKey())){
|
||||
pathsStr = entry.getValue();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(pathsStr != null){
|
||||
String delimiter = getDelimiter();
|
||||
|
||||
return pathsStr.split(delimiter);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private String getDelimiter(){
|
||||
String delimiter = System.getProperty(PROPERTY_DELIMITER);
|
||||
if(delimiter == null)
|
||||
delimiter = isWindows() ? DELIMITER_WINDOWS : DELIMITER_UNIX;
|
||||
return delimiter;
|
||||
}
|
||||
|
||||
private String searchExecutable(String command, String paths[]){
|
||||
if(paths == null)
|
||||
return null;
|
||||
|
||||
for(int i = 0; i < paths.length; i++){
|
||||
File file = new File(paths[i], command.toString());
|
||||
if(file.isFile())
|
||||
return file.toString();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private boolean isWindows() {
|
||||
String prop = System.getProperty(PROPERTY_OS_NAME);
|
||||
return prop != null ? prop.toLowerCase().startsWith(PROPERTY_OS_VALUE) : false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,6 +27,7 @@ import org.eclipse.cdt.core.errorparsers.AbstractErrorParser;
|
|||
import org.eclipse.cdt.core.errorparsers.ErrorPattern;
|
||||
import org.eclipse.cdt.core.testplugin.CTestPlugin;
|
||||
import org.eclipse.cdt.core.testplugin.ResourceHelper;
|
||||
import org.eclipse.cdt.internal.core.Cygwin;
|
||||
import org.eclipse.core.internal.registry.ExtensionRegistry;
|
||||
import org.eclipse.core.resources.IFile;
|
||||
import org.eclipse.core.resources.IFolder;
|
||||
|
@ -903,7 +904,7 @@ public class ErrorParserFileMatchingTest extends TestCase {
|
|||
String windowsFileName = fProject.getLocation().append(fileName).toOSString();
|
||||
String cygwinFileName;
|
||||
try {
|
||||
cygwinFileName = ResourceHelper.windowsToCygwinPath(windowsFileName);
|
||||
cygwinFileName = Cygwin.windowsToCygwinPath(windowsFileName);
|
||||
} catch (UnsupportedOperationException e) {
|
||||
// Skip the test if Cygwin is not available.
|
||||
return;
|
||||
|
@ -931,7 +932,7 @@ public class ErrorParserFileMatchingTest extends TestCase {
|
|||
|
||||
String usrIncludeWindowsPath;
|
||||
try {
|
||||
usrIncludeWindowsPath = ResourceHelper.cygwinToWindowsPath(cygwinFolder);
|
||||
usrIncludeWindowsPath = Cygwin.cygwinToWindowsPath(cygwinFolder);
|
||||
} catch (UnsupportedOperationException e) {
|
||||
// Skip the test if Cygwin is not available.
|
||||
return;
|
||||
|
@ -961,7 +962,7 @@ public class ErrorParserFileMatchingTest extends TestCase {
|
|||
String windowsFileName = anotherProject.getLocation().append(fileName).toOSString();
|
||||
String cygwinFileName;
|
||||
try {
|
||||
cygwinFileName = ResourceHelper.windowsToCygwinPath(windowsFileName);
|
||||
cygwinFileName = Cygwin.windowsToCygwinPath(windowsFileName);
|
||||
} catch (UnsupportedOperationException e) {
|
||||
// Skip the test if Cygwin is not available.
|
||||
return;
|
||||
|
@ -1010,7 +1011,7 @@ public class ErrorParserFileMatchingTest extends TestCase {
|
|||
String windowsFileName = fProject.getLocation().append(fileName).toOSString();
|
||||
String cygwinFileName;
|
||||
try {
|
||||
cygwinFileName = ResourceHelper.windowsToCygwinPath(windowsFileName);
|
||||
cygwinFileName = Cygwin.windowsToCygwinPath(windowsFileName);
|
||||
} catch (UnsupportedOperationException e) {
|
||||
// Skip the test if Cygwin is not available.
|
||||
return;
|
||||
|
@ -1021,7 +1022,7 @@ public class ErrorParserFileMatchingTest extends TestCase {
|
|||
|
||||
String lines = "make[0]: Entering directory `dir'\n"
|
||||
+ cygwinFileName+":1:error\n";
|
||||
|
||||
|
||||
String[] errorParsers = {CWD_LOCATOR_ID, mockErrorParserId };
|
||||
parseOutput(fProject, fProject.getLocation(), errorParsers, lines);
|
||||
assertEquals(1, errorList.size());
|
||||
|
@ -1273,21 +1274,21 @@ public class ErrorParserFileMatchingTest extends TestCase {
|
|||
ResourceHelper.createFolder(fProject, "Folder");
|
||||
ResourceHelper.createFile(fProject, fileName);
|
||||
ResourceHelper.createFile(fProject, "Folder/"+fileName);
|
||||
|
||||
|
||||
String lines = "make -j2\n"
|
||||
+ "make[0]: Entering directory `Folder'\n"
|
||||
+ fileName+":1:error\n";
|
||||
|
||||
|
||||
String[] errorParsers = {CWD_LOCATOR_ID, mockErrorParserId };
|
||||
parseOutput(fProject, fProject.getLocation(), errorParsers, lines);
|
||||
assertEquals(1, errorList.size());
|
||||
|
||||
|
||||
ProblemMarkerInfo problemMarkerInfo = errorList.get(0);
|
||||
assertEquals("L/FindMatchingFilesTest/"+fileName,problemMarkerInfo.file.toString());
|
||||
assertEquals(1,problemMarkerInfo.lineNumber);
|
||||
assertEquals("error",problemMarkerInfo.description);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Checks if a file from error output can be found.
|
||||
*
|
||||
|
@ -1298,21 +1299,21 @@ public class ErrorParserFileMatchingTest extends TestCase {
|
|||
ResourceHelper.createFolder(fProject, "Folder");
|
||||
ResourceHelper.createFile(fProject, fileName);
|
||||
ResourceHelper.createFile(fProject, "Folder/"+fileName);
|
||||
|
||||
|
||||
String lines = "make -j 2\n"
|
||||
+ "make[0]: Entering directory `Folder'\n"
|
||||
+ fileName+":1:error\n";
|
||||
|
||||
|
||||
String[] errorParsers = {CWD_LOCATOR_ID, mockErrorParserId };
|
||||
parseOutput(fProject, fProject.getLocation(), errorParsers, lines);
|
||||
assertEquals(1, errorList.size());
|
||||
|
||||
|
||||
ProblemMarkerInfo problemMarkerInfo = errorList.get(0);
|
||||
assertEquals("L/FindMatchingFilesTest/"+fileName,problemMarkerInfo.file.toString());
|
||||
assertEquals(1,problemMarkerInfo.lineNumber);
|
||||
assertEquals("error",problemMarkerInfo.description);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Checks if a file from error output can be found.
|
||||
*
|
||||
|
@ -1323,21 +1324,21 @@ public class ErrorParserFileMatchingTest extends TestCase {
|
|||
ResourceHelper.createFolder(fProject, "Folder");
|
||||
ResourceHelper.createFile(fProject, fileName);
|
||||
ResourceHelper.createFile(fProject, "Folder/"+fileName);
|
||||
|
||||
|
||||
String lines = "make -j1\n"
|
||||
+ "make[0]: Entering directory `Folder'\n"
|
||||
+ fileName+":1:error\n";
|
||||
|
||||
|
||||
String[] errorParsers = {CWD_LOCATOR_ID, mockErrorParserId };
|
||||
parseOutput(fProject, fProject.getLocation(), errorParsers, lines);
|
||||
assertEquals(1, errorList.size());
|
||||
|
||||
|
||||
ProblemMarkerInfo problemMarkerInfo = errorList.get(0);
|
||||
assertEquals("L/FindMatchingFilesTest/Folder/"+fileName,problemMarkerInfo.file.toString());
|
||||
assertEquals(1,problemMarkerInfo.lineNumber);
|
||||
assertEquals("error",problemMarkerInfo.description);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Checks if a file from error output can be found.
|
||||
*
|
||||
|
@ -1348,21 +1349,21 @@ public class ErrorParserFileMatchingTest extends TestCase {
|
|||
ResourceHelper.createFolder(fProject, "Folder");
|
||||
ResourceHelper.createFile(fProject, fileName);
|
||||
ResourceHelper.createFile(fProject, "Folder/"+fileName);
|
||||
|
||||
|
||||
String lines = "make -j 1\n"
|
||||
+ "make[0]: Entering directory `Folder'\n"
|
||||
+ fileName+":1:error\n";
|
||||
|
||||
|
||||
String[] errorParsers = {CWD_LOCATOR_ID, mockErrorParserId };
|
||||
parseOutput(fProject, fProject.getLocation(), errorParsers, lines);
|
||||
assertEquals(1, errorList.size());
|
||||
|
||||
|
||||
ProblemMarkerInfo problemMarkerInfo = errorList.get(0);
|
||||
assertEquals("L/FindMatchingFilesTest/Folder/"+fileName,problemMarkerInfo.file.toString());
|
||||
assertEquals(1,problemMarkerInfo.lineNumber);
|
||||
assertEquals("error",problemMarkerInfo.description);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Checks if a file from error output can be found.
|
||||
*
|
||||
|
@ -1373,21 +1374,21 @@ public class ErrorParserFileMatchingTest extends TestCase {
|
|||
ResourceHelper.createFolder(fProject, "Folder");
|
||||
ResourceHelper.createFile(fProject, fileName);
|
||||
ResourceHelper.createFile(fProject, "Folder/"+fileName);
|
||||
|
||||
|
||||
String lines = "make --jobs=2\n"
|
||||
+ "make[0]: Entering directory `Folder'\n"
|
||||
+ fileName+":1:error\n";
|
||||
|
||||
|
||||
String[] errorParsers = {CWD_LOCATOR_ID, mockErrorParserId };
|
||||
parseOutput(fProject, fProject.getLocation(), errorParsers, lines);
|
||||
assertEquals(1, errorList.size());
|
||||
|
||||
|
||||
ProblemMarkerInfo problemMarkerInfo = errorList.get(0);
|
||||
assertEquals("L/FindMatchingFilesTest/"+fileName,problemMarkerInfo.file.toString());
|
||||
assertEquals(1,problemMarkerInfo.lineNumber);
|
||||
assertEquals("error",problemMarkerInfo.description);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Checks if a file from error output can be found.
|
||||
*
|
||||
|
@ -1398,21 +1399,21 @@ public class ErrorParserFileMatchingTest extends TestCase {
|
|||
ResourceHelper.createFolder(fProject, "Folder");
|
||||
ResourceHelper.createFile(fProject, fileName);
|
||||
ResourceHelper.createFile(fProject, "Folder/"+fileName);
|
||||
|
||||
|
||||
String lines = "make --jobs=1\n"
|
||||
+ "make[0]: Entering directory `Folder'\n"
|
||||
+ fileName+":1:error\n";
|
||||
|
||||
|
||||
String[] errorParsers = {CWD_LOCATOR_ID, mockErrorParserId };
|
||||
parseOutput(fProject, fProject.getLocation(), errorParsers, lines);
|
||||
assertEquals(1, errorList.size());
|
||||
|
||||
|
||||
ProblemMarkerInfo problemMarkerInfo = errorList.get(0);
|
||||
assertEquals("L/FindMatchingFilesTest/Folder/"+fileName,problemMarkerInfo.file.toString());
|
||||
assertEquals(1,problemMarkerInfo.lineNumber);
|
||||
assertEquals("error",problemMarkerInfo.description);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Checks if a file from error output can be found.
|
||||
*
|
||||
|
@ -1423,21 +1424,21 @@ public class ErrorParserFileMatchingTest extends TestCase {
|
|||
ResourceHelper.createFolder(fProject, "Folder");
|
||||
ResourceHelper.createFile(fProject, fileName);
|
||||
ResourceHelper.createFile(fProject, "Folder/"+fileName);
|
||||
|
||||
|
||||
String lines = "gmake384 -k -j all\n"
|
||||
+ "make[0]: Entering directory `Folder'\n"
|
||||
+ fileName+":1:error\n";
|
||||
|
||||
|
||||
String[] errorParsers = {CWD_LOCATOR_ID, mockErrorParserId };
|
||||
parseOutput(fProject, fProject.getLocation(), errorParsers, lines);
|
||||
assertEquals(1, errorList.size());
|
||||
|
||||
|
||||
ProblemMarkerInfo problemMarkerInfo = errorList.get(0);
|
||||
assertEquals("L/FindMatchingFilesTest/"+fileName,problemMarkerInfo.file.toString());
|
||||
assertEquals(1,problemMarkerInfo.lineNumber);
|
||||
assertEquals("error",problemMarkerInfo.description);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Checks if a file from error output can be found.
|
||||
*
|
||||
|
@ -1447,10 +1448,10 @@ public class ErrorParserFileMatchingTest extends TestCase {
|
|||
ResourceHelper.createFolder(fProject, "Folder");
|
||||
ResourceHelper.createFolder(fProject, "Folder/AbsoluteRemoteFolder");
|
||||
IFile file = ResourceHelper.createFile(fProject, "Folder/AbsoluteRemoteFolder/testMappedRemoteAbsolutePath.h");
|
||||
|
||||
|
||||
parseOutput("/AbsoluteRemoteFolder/testMappedRemoteAbsolutePath.h:1:error");
|
||||
assertEquals(1, errorList.size());
|
||||
|
||||
|
||||
ProblemMarkerInfo problemMarkerInfo = errorList.get(0);
|
||||
assertEquals("L/FindMatchingFilesTest/Folder/AbsoluteRemoteFolder/testMappedRemoteAbsolutePath.h",problemMarkerInfo.file.toString());
|
||||
assertEquals(1,problemMarkerInfo.lineNumber);
|
||||
|
@ -1469,16 +1470,16 @@ public class ErrorParserFileMatchingTest extends TestCase {
|
|||
ResourceHelper.createFolder(anotherProject, "Folder");
|
||||
ResourceHelper.createFolder(anotherProject, "Folder/AbsoluteRemoteFolder");
|
||||
IFile file = ResourceHelper.createFile(anotherProject, "Folder/AbsoluteRemoteFolder/testMappedRemoteAbsolutePathAnotherProject.h");
|
||||
|
||||
|
||||
parseOutput("/AbsoluteRemoteFolder/testMappedRemoteAbsolutePathAnotherProject.h:1:error");
|
||||
assertEquals(1, errorList.size());
|
||||
|
||||
|
||||
ProblemMarkerInfo problemMarkerInfo = errorList.get(0);
|
||||
assertEquals("L/ProjectMappedRemoteAbsolutePathAnotherProject/Folder/AbsoluteRemoteFolder/testMappedRemoteAbsolutePathAnotherProject.h",problemMarkerInfo.file.toString());
|
||||
assertEquals(1,problemMarkerInfo.lineNumber);
|
||||
assertEquals("error",problemMarkerInfo.description);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Checks if a file from error output can be found.
|
||||
*
|
||||
|
|
|
@ -35,6 +35,7 @@ import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
|
|||
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
|
||||
import org.eclipse.cdt.core.settings.model.ICProjectDescriptionManager;
|
||||
import org.eclipse.cdt.core.settings.model.TestCfgDataProvider;
|
||||
import org.eclipse.cdt.internal.core.Cygwin;
|
||||
import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences;
|
||||
import org.eclipse.core.resources.IContainer;
|
||||
import org.eclipse.core.resources.IFile;
|
||||
|
@ -629,24 +630,7 @@ public class ResourceHelper {
|
|||
* @throws IOException on IO problem.
|
||||
*/
|
||||
public static String windowsToCygwinPath(String windowsPath) throws IOException, UnsupportedOperationException {
|
||||
if (!Platform.getOS().equals(Platform.OS_WIN32)) {
|
||||
// Don't run this on non-windows platforms
|
||||
throw new UnsupportedOperationException("Not a Windows system, Cygwin is unavailable.");
|
||||
}
|
||||
String[] args = {"cygpath", "-u", windowsPath};
|
||||
Process cygpath;
|
||||
try {
|
||||
cygpath = Runtime.getRuntime().exec(args);
|
||||
} catch (IOException ioe) {
|
||||
throw new UnsupportedOperationException("Cygwin utility cygpath is not in the system search path.");
|
||||
}
|
||||
BufferedReader stdout = new BufferedReader(new InputStreamReader(cygpath.getInputStream()));
|
||||
|
||||
String cygwinPath = stdout.readLine();
|
||||
if (cygwinPath == null) {
|
||||
throw new UnsupportedOperationException("Cygwin utility cygpath is not available.");
|
||||
}
|
||||
return cygwinPath.trim();
|
||||
return Cygwin.windowsToCygwinPath(windowsPath);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -658,24 +642,7 @@ public class ResourceHelper {
|
|||
* @throws IOException on IO problem.
|
||||
*/
|
||||
public static String cygwinToWindowsPath(String cygwinPath) throws IOException, UnsupportedOperationException {
|
||||
if (!Platform.getOS().equals(Platform.OS_WIN32)) {
|
||||
// Don't run this on non-windows platforms
|
||||
throw new UnsupportedOperationException("Not a Windows system, Cygwin is unavailable.");
|
||||
}
|
||||
String[] args = {"cygpath", "-w", cygwinPath};
|
||||
Process cygpath;
|
||||
try {
|
||||
cygpath = Runtime.getRuntime().exec(args);
|
||||
} catch (IOException ioe) {
|
||||
throw new UnsupportedOperationException("Cygwin utility cygpath is not in the system search path.");
|
||||
}
|
||||
BufferedReader stdout = new BufferedReader(new InputStreamReader(cygpath.getInputStream()));
|
||||
|
||||
String windowsPath = stdout.readLine();
|
||||
if (windowsPath == null) {
|
||||
throw new UnsupportedOperationException("Cygwin utility cygpath is not available.");
|
||||
}
|
||||
return windowsPath.trim();
|
||||
return Cygwin.cygwinToWindowsPath(cygwinPath);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -25,10 +25,10 @@ import java.util.Vector;
|
|||
|
||||
import org.eclipse.cdt.core.errorparsers.ErrorParserNamedWrapper;
|
||||
import org.eclipse.cdt.core.resources.ACBuilder;
|
||||
import org.eclipse.cdt.internal.core.Cygwin;
|
||||
import org.eclipse.cdt.internal.core.IErrorMarkeredOutputStream;
|
||||
import org.eclipse.cdt.internal.core.resources.ResourceLookup;
|
||||
import org.eclipse.cdt.internal.errorparsers.ErrorParserExtensionManager;
|
||||
import org.eclipse.cdt.utils.CygPath;
|
||||
import org.eclipse.cdt.utils.EFSExtensionManager;
|
||||
import org.eclipse.core.resources.IFile;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
|
@ -524,20 +524,13 @@ outer:
|
|||
|
||||
private IFile findCygwinFile(String filePath) {
|
||||
IFile file=null;
|
||||
IPath path;
|
||||
CygPath cygpath = null;
|
||||
try {
|
||||
cygpath = new CygPath();
|
||||
path = new Path(cygpath.getFileName(filePath));
|
||||
IPath path = new Path(Cygwin.cygwinToWindowsPath(filePath));
|
||||
file = findFileInWorkspace(path);
|
||||
} catch (UnsupportedOperationException e) {
|
||||
isCygwin = false;
|
||||
} catch (Exception e) {
|
||||
}
|
||||
finally {
|
||||
if (cygpath != null)
|
||||
cygpath.dispose();
|
||||
}
|
||||
return file;
|
||||
}
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ import java.util.regex.Pattern;
|
|||
|
||||
import org.eclipse.cdt.core.ErrorParserManager;
|
||||
import org.eclipse.cdt.core.IMarkerGenerator;
|
||||
import org.eclipse.cdt.utils.CygPath;
|
||||
import org.eclipse.cdt.internal.core.Cygwin;
|
||||
import org.eclipse.core.resources.IResource;
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
import org.eclipse.core.runtime.Path;
|
||||
|
@ -26,7 +26,7 @@ import org.eclipse.core.runtime.Path;
|
|||
/**
|
||||
* Error Pattern - used by Error Parser to convert build output to problem markers
|
||||
* @since 5.1
|
||||
*
|
||||
*
|
||||
* Clients may extend this class.
|
||||
*/
|
||||
public class ErrorPattern {
|
||||
|
@ -67,7 +67,7 @@ public class ErrorPattern {
|
|||
this.groupVarName = groupVarName;
|
||||
this.severity = severity;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Pattern for errors not associated file a file
|
||||
* (e.g. make and linker errors).
|
||||
|
@ -86,7 +86,7 @@ public class ErrorPattern {
|
|||
|
||||
/**
|
||||
* Pattern for errors that should be skipped.
|
||||
*
|
||||
*
|
||||
* @param pattern - error pattern.
|
||||
*/
|
||||
public ErrorPattern(String pattern) {
|
||||
|
@ -100,7 +100,7 @@ public class ErrorPattern {
|
|||
public Matcher getMatcher(CharSequence input) {
|
||||
return pattern.matcher(input);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param matcher - matcher to parse the input line.
|
||||
* @return parsed file name or {@code null}.
|
||||
|
@ -108,7 +108,7 @@ public class ErrorPattern {
|
|||
public String getFileName(Matcher matcher) {
|
||||
return groupFileName != 0 ? matcher.group(groupFileName) : null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param matcher - matcher to parse the input line.
|
||||
* @return parsed line number or {@code 0}.
|
||||
|
@ -122,7 +122,7 @@ public class ErrorPattern {
|
|||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param matcher - matcher to parse the input line.
|
||||
* @return parsed description or {@code null}.
|
||||
|
@ -130,7 +130,7 @@ public class ErrorPattern {
|
|||
public String getDesc(Matcher matcher) {
|
||||
return groupDesc != 0 ? matcher.group(groupDesc) : null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param matcher - matcher to parse the input line.
|
||||
* @return parsed variable name or {@code null}.
|
||||
|
@ -138,7 +138,7 @@ public class ErrorPattern {
|
|||
public String getVarName(Matcher matcher) {
|
||||
return groupVarName != 0 ? matcher.group(groupVarName) : null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param matcher - matcher to parse the input line.
|
||||
* @return severity of the problem.
|
||||
|
@ -146,11 +146,11 @@ public class ErrorPattern {
|
|||
public int getSeverity(Matcher matcher) {
|
||||
return severity;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Parse a line of build output and register error/warning for
|
||||
* Problems view.
|
||||
*
|
||||
*
|
||||
* @param line - one line of output.
|
||||
* @param eoParser - {@link ErrorParserManager}.
|
||||
* @return {@code true} if error/warning/info problem was found.
|
||||
|
@ -162,10 +162,10 @@ public class ErrorPattern {
|
|||
|
||||
return recordError(matcher, eoParser);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Register the error in {@link ErrorParserManager}.
|
||||
*
|
||||
*
|
||||
* @param matcher - matcher to parse the input line.
|
||||
* @param eoParser - {@link ErrorParserManager}.
|
||||
* @return {@code true} indicating that error was found.
|
||||
|
@ -181,7 +181,7 @@ public class ErrorPattern {
|
|||
String desc = getDesc(matcher);
|
||||
String varName = getVarName(matcher);
|
||||
IPath externalPath = null ;
|
||||
|
||||
|
||||
IResource file = null;
|
||||
if (fileName != null) {
|
||||
file = eoParser.findFileName(fileName);
|
||||
|
@ -193,15 +193,15 @@ public class ErrorPattern {
|
|||
externalPath = getLocation(fileName);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
eoParser.generateExternalMarker(file, lineNum, desc, severity, varName, externalPath);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* If the file designated by filename exists, return the IPath representation of the filename
|
||||
* If it does not exist, try cygpath translation
|
||||
*
|
||||
*
|
||||
* @param filename - file name
|
||||
* @return location (outside of the workspace).
|
||||
*/
|
||||
|
@ -209,10 +209,8 @@ public class ErrorPattern {
|
|||
IPath path = new Path(filename);
|
||||
File file = path.toFile() ;
|
||||
if (!file.exists() && isCygwin && path.isAbsolute()) {
|
||||
CygPath cygpath = null ;
|
||||
try {
|
||||
cygpath = new CygPath("cygpath"); //$NON-NLS-1$
|
||||
String cygfilename = cygpath.getFileName(filename);
|
||||
String cygfilename = Cygwin.cygwinToWindowsPath(filename);
|
||||
IPath convertedPath = new Path(cygfilename);
|
||||
file = convertedPath.toFile() ;
|
||||
if (file.exists()) {
|
||||
|
@ -222,11 +220,6 @@ public class ErrorPattern {
|
|||
isCygwin = false;
|
||||
} catch (IOException e) {
|
||||
}
|
||||
finally {
|
||||
if (null!=cygpath) {
|
||||
cygpath.dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
return path ;
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@ import java.util.regex.Pattern;
|
|||
|
||||
import org.eclipse.cdt.core.ErrorParserManager;
|
||||
import org.eclipse.cdt.core.IMarkerGenerator;
|
||||
import org.eclipse.cdt.utils.CygPath;
|
||||
import org.eclipse.cdt.internal.core.Cygwin;
|
||||
import org.eclipse.core.resources.IResource;
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
import org.eclipse.core.runtime.Path;
|
||||
|
@ -330,10 +330,8 @@ public class RegexErrorPattern implements Cloneable {
|
|||
IPath path = new Path(filename);
|
||||
File file = path.toFile() ;
|
||||
if (!file.exists() && isCygwin && path.isAbsolute()) {
|
||||
CygPath cygpath = null ;
|
||||
try {
|
||||
cygpath = new CygPath("cygpath"); //$NON-NLS-1$
|
||||
String cygfilename = cygpath.getFileName(filename);
|
||||
String cygfilename = Cygwin.cygwinToWindowsPath(filename);
|
||||
IPath convertedPath = new Path(cygfilename);
|
||||
file = convertedPath.toFile() ;
|
||||
if (file.exists()) {
|
||||
|
@ -342,10 +340,6 @@ public class RegexErrorPattern implements Cloneable {
|
|||
} catch (UnsupportedOperationException e) {
|
||||
isCygwin = false;
|
||||
} catch (IOException e) {
|
||||
} finally {
|
||||
if (null!=cygpath) {
|
||||
cygpath.dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
return path ;
|
||||
|
|
|
@ -0,0 +1,136 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012, 2012 Andrew Gvozdev and others.
|
||||
* 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:
|
||||
* Andrew Gvozdev - Initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
|
||||
import org.eclipse.cdt.utils.PathUtil;
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
import org.eclipse.core.runtime.Platform;
|
||||
|
||||
/**
|
||||
* A collection of cygwin-related utilities.
|
||||
*/
|
||||
public class Cygwin {
|
||||
|
||||
private static IPath findCygpathLocation(String envPath) {
|
||||
return PathUtil.findProgramLocation("cygpath", envPath); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if cygwin path conversion utilities are available in the path.
|
||||
*
|
||||
* @param envPath - list of directories to search for cygwin utilities separated
|
||||
* by path separator (format of environment variable $PATH).
|
||||
* @return {@code true} if cygwin is available, {@code false} otherwise.
|
||||
*/
|
||||
public static boolean isAvailable(String envPath) {
|
||||
return Platform.getOS().equals(Platform.OS_WIN32) && findCygpathLocation(envPath) != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Conversion from Cygwin path to Windows path.
|
||||
*
|
||||
* @param cygwinPath - Cygwin path.
|
||||
* @param envPath - list of directories to search for cygwin utilities separated
|
||||
* by path separator (format of environment variable $PATH).
|
||||
* @return Windows style converted path. Note that that also converts cygwin links to their targets.
|
||||
*
|
||||
* @throws UnsupportedOperationException if Cygwin is unavailable.
|
||||
* @throws IOException on IO problem.
|
||||
*/
|
||||
public static String cygwinToWindowsPath(String cygwinPath, String envPath) throws IOException, UnsupportedOperationException {
|
||||
if (cygwinPath == null || cygwinPath.trim().length() == 0)
|
||||
return cygwinPath;
|
||||
|
||||
if (!Platform.getOS().equals(Platform.OS_WIN32)) {
|
||||
// Don't run this on non-windows platforms
|
||||
throw new UnsupportedOperationException("Not a Windows system, Cygwin is unavailable."); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
IPath cygpathLocation = findCygpathLocation(envPath);
|
||||
if (cygpathLocation == null) {
|
||||
throw new UnsupportedOperationException("Cygwin utility cygpath is not in the system search path."); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
String[] args = {cygpathLocation.toOSString(), "-w", cygwinPath}; //$NON-NLS-1$
|
||||
Process cygpathProcess = Runtime.getRuntime().exec(args);
|
||||
BufferedReader stdout = new BufferedReader(new InputStreamReader(cygpathProcess.getInputStream()));
|
||||
|
||||
String windowsPath = stdout.readLine();
|
||||
if (windowsPath == null) {
|
||||
throw new IOException("Unexpected output from Cygwin utility cygpath."); //$NON-NLS-1$
|
||||
}
|
||||
return windowsPath.trim();
|
||||
}
|
||||
|
||||
/**
|
||||
* Conversion from Cygwin path to Windows path.
|
||||
*
|
||||
* @param cygwinPath - Cygwin path.
|
||||
* @return Windows style converted path. Note that that also converts cygwin links to their targets.
|
||||
*
|
||||
* @throws UnsupportedOperationException if Cygwin is unavailable.
|
||||
* @throws IOException on IO problem.
|
||||
*/
|
||||
public static String cygwinToWindowsPath(String cygwinPath) throws IOException, UnsupportedOperationException {
|
||||
return cygwinToWindowsPath(cygwinPath, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Conversion from Windows path to Cygwin path.
|
||||
*
|
||||
* @param windowsPath - Windows path.
|
||||
* @param envPath - list of directories to search for cygwin utilities (value of environment variable $PATH).
|
||||
* @return Cygwin style converted path.
|
||||
*
|
||||
* @throws UnsupportedOperationException if Cygwin is unavailable.
|
||||
* @throws IOException on IO problem.
|
||||
*/
|
||||
public static String windowsToCygwinPath(String windowsPath, String envPath) throws IOException, UnsupportedOperationException {
|
||||
if (windowsPath == null || windowsPath.trim().length() == 0)
|
||||
return windowsPath;
|
||||
|
||||
if (!Platform.getOS().equals(Platform.OS_WIN32)) {
|
||||
// Don't run this on non-windows platforms
|
||||
throw new UnsupportedOperationException("Not a Windows system, Cygwin is unavailable."); //$NON-NLS-1$
|
||||
}
|
||||
IPath cygpathLocation = findCygpathLocation(envPath);
|
||||
if (cygpathLocation == null) {
|
||||
throw new UnsupportedOperationException("Cygwin utility cygpath is not in the system search path."); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
String[] args = {cygpathLocation.toOSString(), "-u", windowsPath}; //$NON-NLS-1$
|
||||
Process cygpath = Runtime.getRuntime().exec(args);
|
||||
BufferedReader stdout = new BufferedReader(new InputStreamReader(cygpath.getInputStream()));
|
||||
|
||||
String cygwinPath = stdout.readLine();
|
||||
if (cygwinPath == null) {
|
||||
throw new IOException("Unexpected output from Cygwin utility cygpath."); //$NON-NLS-1$
|
||||
}
|
||||
return cygwinPath.trim();
|
||||
}
|
||||
|
||||
/**
|
||||
* Conversion from Windows path to Cygwin path.
|
||||
*
|
||||
* @param windowsPath - Windows path.
|
||||
* @return Cygwin style converted path.
|
||||
*
|
||||
* @throws UnsupportedOperationException if Cygwin is unavailable.
|
||||
* @throws IOException on IO problem.
|
||||
*/
|
||||
public static String windowsToCygwinPath(String windowsPath) throws IOException, UnsupportedOperationException {
|
||||
return windowsToCygwinPath(windowsPath, null);
|
||||
}
|
||||
}
|
|
@ -17,6 +17,7 @@ import java.io.IOException;
|
|||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStreamWriter;
|
||||
|
||||
import org.eclipse.cdt.internal.core.Cygwin;
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
import org.eclipse.core.runtime.Path;
|
||||
import org.eclipse.core.runtime.Platform;
|
||||
|
@ -41,7 +42,7 @@ public class CygPath {
|
|||
stdin = new BufferedWriter(new OutputStreamWriter(cygpath.getOutputStream()));
|
||||
stdout = new BufferedReader(new InputStreamReader(cygpath.getInputStream()));
|
||||
try {
|
||||
String test= getFileName("a b"); //$NON-NLS-1$
|
||||
String test= getFileName("a b"); //$NON-NLS-1$
|
||||
if ("a".equals(test)) { //$NON-NLS-1$
|
||||
// Bug 298615: This version seems to treat space as a separator
|
||||
fSpaceIsSeparator= true;
|
||||
|
@ -59,11 +60,15 @@ public class CygPath {
|
|||
this("cygpath"); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
/**
|
||||
* Use this method for series of translations of paths.
|
||||
* If a single path needs to be translated consider {@link Cygwin#cygwinToWindowsPath(String)}.
|
||||
*/
|
||||
public String getFileName(String name) throws IOException {
|
||||
// bug 214603, empty names don't create a response
|
||||
if (name == null || name.length() == 0)
|
||||
if (name == null || name.length() == 0)
|
||||
return name;
|
||||
|
||||
|
||||
if (useOldCygPath) {
|
||||
return internalgetFileName(name);
|
||||
}
|
||||
|
|
|
@ -58,7 +58,7 @@ public class PathUtil {
|
|||
public static IPath getCanonicalPath(IPath fullPath) {
|
||||
if (!fullPath.isAbsolute())
|
||||
return fullPath;
|
||||
|
||||
|
||||
File file = fullPath.toFile();
|
||||
try {
|
||||
String canonPath = file.getCanonicalPath();
|
||||
|
@ -97,7 +97,7 @@ public class PathUtil {
|
|||
}
|
||||
return fullPath;
|
||||
}
|
||||
|
||||
|
||||
public static IPath getProjectRelativePath(IPath fullPath, IProject project) {
|
||||
IPath projectPath = project.getFullPath();
|
||||
if (isPrefix(projectPath, fullPath)) {
|
||||
|
@ -149,7 +149,7 @@ public class PathUtil {
|
|||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public static IPath makeRelativePathToIncludes(IPath fullPath, String[] includePaths) {
|
||||
IPath relativePath = null;
|
||||
int mostSegments = 0;
|
||||
|
@ -180,7 +180,7 @@ public class PathUtil {
|
|||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public static IPath getValidEnclosingFolder(IPath fullPath) {
|
||||
IWorkspaceRoot root = getWorkspaceRoot();
|
||||
if (root != null) {
|
||||
|
@ -199,7 +199,7 @@ public class PathUtil {
|
|||
/**
|
||||
* Checks whether path1 is the same as path2.
|
||||
* @return <code>true</code> if path1 is the same as path2, and <code>false</code> otherwise
|
||||
*
|
||||
*
|
||||
* Similar to IPath.equals(Object obj), but takes case sensitivity of the file system
|
||||
* into account.
|
||||
* @since 5.1
|
||||
|
@ -231,7 +231,7 @@ public class PathUtil {
|
|||
/**
|
||||
* Checks whether path1 is the same as path2.
|
||||
* @return <code>true</code> if path1 is the same as path2, and <code>false</code> otherwise
|
||||
*
|
||||
*
|
||||
* Similar to IPath.equals(Object obj), but takes case sensitivity of the file system
|
||||
* into account.
|
||||
* @since 5.3
|
||||
|
@ -266,13 +266,13 @@ public class PathUtil {
|
|||
* Checks whether path1 is a prefix of path2. To be a prefix, path1's segments
|
||||
* must appear in path1 in the same order, and their device ids must match.
|
||||
* <p>
|
||||
* An empty path is a prefix of all paths with the same device; a root path is a prefix of
|
||||
* An empty path is a prefix of all paths with the same device; a root path is a prefix of
|
||||
* all absolute paths with the same device.
|
||||
* </p>
|
||||
* @return <code>true</code> if path1 is a prefix of path2, and <code>false</code> otherwise
|
||||
*
|
||||
*
|
||||
* Similar to IPath.isPrefixOf(IPath anotherPath), but takes case sensitivity of the file system
|
||||
* into account.
|
||||
* into account.
|
||||
* @since 5.1
|
||||
*/
|
||||
public static boolean isPrefix(IPath path1, IPath path2) {
|
||||
|
@ -334,22 +334,23 @@ public class PathUtil {
|
|||
|
||||
/**
|
||||
* Find location of the program inspecting each path in the path list.
|
||||
*
|
||||
*
|
||||
* @param prog - program to find. For Windows, extensions "com" and "exe"
|
||||
* can be omitted.
|
||||
* @param pathsStr - the list of paths to inspect separated by path separator
|
||||
* defined in the platform (i.e. ":" in Unix and ";" in Windows).
|
||||
* In case pathStr is {@code null} environment variable ${PATH} is inspected.
|
||||
* @return - absolute location of the file on the file system.
|
||||
* @return - absolute location of the file on the file system
|
||||
* or {@code null} if not found.
|
||||
* @since 5.3
|
||||
*/
|
||||
public static IPath findProgramLocation(String prog, String pathsStr) {
|
||||
if (prog==null || prog.trim().length()==0)
|
||||
return null;
|
||||
|
||||
|
||||
if (pathsStr==null)
|
||||
pathsStr = System.getenv("PATH"); //$NON-NLS-1$
|
||||
|
||||
|
||||
if (pathsStr.trim().length()==0)
|
||||
return null;
|
||||
|
||||
|
@ -381,7 +382,7 @@ public class PathUtil {
|
|||
for (String dir : dirs) {
|
||||
IPath dirLocation = new Path(dir);
|
||||
File file = null;
|
||||
|
||||
|
||||
file = dirLocation.append(prog).toFile();
|
||||
if (file.isFile() && file.canRead()) {
|
||||
locationStr = file.getAbsolutePath();
|
||||
|
@ -399,10 +400,11 @@ public class PathUtil {
|
|||
/**
|
||||
* Find location of the program inspecting each path in the path list
|
||||
* defined by environment variable ${PATH}.
|
||||
*
|
||||
*
|
||||
* @param prog - program to find. For Windows, extensions "com" and "exe"
|
||||
* can be omitted.
|
||||
* @return - absolute location of the file on the file system.
|
||||
* @return - absolute location of the file on the file system
|
||||
* or {@code null} if not found.
|
||||
* @since 5.3
|
||||
*/
|
||||
public static IPath findProgramLocation(String prog) {
|
||||
|
|
Loading…
Add table
Reference in a new issue