mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-12 10:45:37 +02:00
Work-around fix for 145099
This commit is contained in:
parent
6d81ef8ab2
commit
27eee377fe
1 changed files with 101 additions and 5 deletions
|
@ -10,6 +10,7 @@
|
|||
*******************************************************************************/
|
||||
package org.eclipse.cdt.managedbuilder.internal.buildmodel;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
|
@ -20,8 +21,8 @@ import java.util.Map;
|
|||
import org.eclipse.cdt.core.CommandLauncher;
|
||||
import org.eclipse.cdt.managedbuilder.buildmodel.IBuildCommand;
|
||||
import org.eclipse.cdt.managedbuilder.internal.core.ManagedMakeMessages;
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
import org.eclipse.core.runtime.IProgressMonitor;
|
||||
import org.eclipse.core.runtime.Path;
|
||||
import org.eclipse.core.runtime.SubProgressMonitor;
|
||||
|
||||
/**
|
||||
|
@ -35,14 +36,23 @@ 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 IBuildCommand fCmd;
|
||||
private Process fProcess;
|
||||
private String fErrMsg;
|
||||
private boolean fUseSpawner;
|
||||
|
||||
private static final String BUILDER_MSG_HEADER = "InternalBuilder.msg.header"; //$NON-NLS-1$
|
||||
private static final String LINE_SEPARATOR = 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) {
|
||||
|
@ -59,7 +69,45 @@ public class CommandBuilder implements IBuildModelBuilder {
|
|||
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{
|
||||
|
||||
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 not found, continue with the command passed as an argument
|
||||
}
|
||||
|
||||
args[0] = command;
|
||||
System.arraycopy(commandArgs, 0, args, 1, commandArgs.length);
|
||||
return args;
|
||||
}
|
||||
|
||||
|
||||
protected void printCommandLine(OutputStream os) {
|
||||
if (os != null) {
|
||||
String cmd = CommandBuilder.this.getCommandLine();
|
||||
try {
|
||||
os.write(cmd.getBytes());
|
||||
os.flush();
|
||||
} catch (IOException e) {
|
||||
// ignore;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected class OutputStreamWrapper extends OutputStream {
|
||||
private OutputStream fOut;
|
||||
|
||||
|
@ -153,9 +201,9 @@ public class CommandBuilder implements IBuildModelBuilder {
|
|||
}
|
||||
|
||||
protected CommandLauncher createLauncher() {
|
||||
if(fUseSpawner)
|
||||
return new CommandLauncher();
|
||||
return new SpawnerfreeLauncher();
|
||||
// if(isWindows())
|
||||
// return new CommandLauncher();
|
||||
return new CommandSearchLauncher();
|
||||
}
|
||||
|
||||
public String getErrMsg(){
|
||||
|
@ -207,4 +255,52 @@ public class CommandBuilder implements IBuildModelBuilder {
|
|||
return buf.toString();
|
||||
}
|
||||
|
||||
private String getExecutable(String command, Map environment){
|
||||
if(new Path(command).isAbsolute())
|
||||
return command;
|
||||
return searchExecutable(command, getPaths(environment));
|
||||
}
|
||||
|
||||
private String[] getPaths(Map env){
|
||||
String pathsStr = (String)env.get(PATH_ENV);
|
||||
if(pathsStr == null){
|
||||
for(Iterator iter = env.entrySet().iterator(); iter.hasNext();){
|
||||
Map.Entry entry = (Map.Entry)iter.next();
|
||||
if(PATH_ENV.equalsIgnoreCase((String)entry.getKey())){
|
||||
pathsStr = (String)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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue