/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Eclipse Public License, Version 1.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.eclipse.org/org/documents/epl-v10.php * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.ide.eclipse.ndk.internal.build; import com.android.ide.eclipse.adt.AdtPlugin; import com.android.ide.eclipse.ndk.internal.NdkManager; import org.eclipse.cdt.core.CommandLauncher; import org.eclipse.cdt.utils.CygPath; 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 java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.List; @SuppressWarnings("restriction") // for AdtPlugin internal classes public class NdkCommandLauncher extends CommandLauncher { private static CygPath sCygPath = null; private static final List<String> WINDOWS_NATIVE_EXECUTABLES = Arrays.asList( "exe", //$NON-NLS-1$ "cmd", //$NON-NLS-1$ "bat" //$NON-NLS-1$ ); static { if (Platform.OS_WIN32.equals(Platform.getOS())) { try { sCygPath = new CygPath(); } catch (IOException e) { AdtPlugin.printErrorToConsole("Unable to launch cygpath. Is Cygwin on the path?", e); } } } @Override public Process execute(IPath commandPath, String[] args, String[] env, IPath changeToDirectory, IProgressMonitor monitor) throws CoreException { if (!commandPath.isAbsolute()) commandPath = new Path(NdkManager.getNdkLocation()).append(commandPath); if (Platform.getOS().equals(Platform.OS_WIN32)) { // convert cygwin paths to standard paths if (sCygPath != null && commandPath.toString().startsWith("/cygdrive")) { //$NON-NLS-1$ try { String path = sCygPath.getFileName(commandPath.toString()); commandPath = new Path(path); } catch (IOException e) { AdtPlugin.printErrorToConsole( "Unexpected error while transforming cygwin path.", e); } } if (isWindowsExecutable(commandPath)) { // append necessary extension commandPath = appendExecutableExtension(commandPath); } else { // Invoke using Cygwin shell if this is not a native windows executable String[] newargs = new String[args.length + 1]; newargs[0] = commandPath.toOSString(); System.arraycopy(args, 0, newargs, 1, args.length); commandPath = new Path("sh"); //$NON-NLS-1$ args = newargs; } } return super.execute(commandPath, args, env, changeToDirectory, monitor); } private boolean isWindowsExecutable(IPath commandPath) { String ext = commandPath.getFileExtension(); if (isWindowsExecutableExtension(ext)) { return true; } ext = findWindowsExecutableExtension(commandPath); if (ext != null) { return true; } return false; } private IPath appendExecutableExtension(IPath commandPath) { if (isWindowsExecutableExtension(commandPath.getFileExtension())) { return commandPath; } String ext = findWindowsExecutableExtension(commandPath); if (ext != null) { return commandPath.addFileExtension(ext); } return commandPath; } private String findWindowsExecutableExtension(IPath command) { for (String e: WINDOWS_NATIVE_EXECUTABLES) { File exeFile = command.addFileExtension(e).toFile(); if (exeFile.exists()) { return e; } } return null; } private boolean isWindowsExecutableExtension(String extension) { return extension != null && WINDOWS_NATIVE_EXECUTABLES.contains(extension); } }