Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright (C) 2012 Trillian Mobile AB
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License
   * as published by the Free Software Foundation; either version 2
   * of the License, or (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/gpl-2.0.html>.
  */
 package org.robovm.compiler.util;
 
 import java.io.File;
 import java.util.List;
 

Author(s):
niklas
 
 public class ToolchainUtil {
     private static String IOS_DEV_CLANG
     private static String IOS_SIM_CLANG
     private static String PNGCRUSH;
     private static String PLUTIL;
     private static String PACKAGE_APPLICATION;
 
     private static String getIOSDevClang() throws IOException {
         if ( == null) {
              = findXcodeCommand("clang++""iphoneos");
         }
         return ;
     }
     
     private static String getIOSSimClang() throws IOException {
         if ( == null) {
              = findXcodeCommand("clang++""iphonesimulator");
         }
         return ;
     }
     
     private static String getPngCrush() throws IOException {
         if ( == null) {
              = findXcodeCommand("pngcrush""iphoneos");
         }
         return ;
     }
 
     private static String getPlutil() throws IOException {
         if ( == null) {
              = findXcodeCommand("plutil""iphoneos");
         }
         return ;
     }
 
     private static String getPackageApplication() throws IOException {
         if ( == null) {
              = findXcodeCommand("PackageApplication""iphoneos");
         }
         return ;
     }
 
     private static void handleExecuteException(ExecuteException e) {
         if (e.getExitValue() == 2) {
             throw new IllegalArgumentException("No Xcode is selected. Is Xcode installed? " 
                     + "If yes, use 'sudo xcode-select -switch <path-to-xcode>' from a Terminal " 
                     + "to switch to the correct Xcode path.");
         }
         if (e.getExitValue() == 69) {
             throw new IllegalArgumentException("You must agree to the Xcode/iOS license. " 
                     + "Please open Xcode once or run 'sudo xcrun clang' from a Terminal to agree to the terms.");
         }
         throw new IllegalArgumentException(e.getMessage());
     }
     
     public static String findXcodePath() throws IOException {
         try {
             String path = new Executor(."xcode-select").args("--print-path").execCapture();
             File f = new File(path);
             if (f.exists() && f.isDirectory()) {
                 if (new File(f"Platforms").exists() && new File(f"Toolchains").exists()) {
                     return path;
                }
            }
            throw new IllegalArgumentException(String.format(
                    "The path '%s' does not appear to be a valid Xcode path. Use " 
                    + "'sudo xcode-select -switch <path-to-xcode>' from a Terminal " 
                    + "to switch to the correct Xcode path."path));
        } catch (ExecuteException e) {
            handleExecuteException(e);
            return null;
        }
    }
    
    public static String findXcodeCommand(String cmdString sdkthrows IOException {
        try {
            return new Executor(."xcrun").args("-sdk"sdk"-f"cmd).execCapture();
        } catch (ExecuteException e) {
            handleExecuteException(e);
            return null;
        }
    }
    
    public static void pngcrush(Config configFile inFileFile outFilethrows IOException {
        new Executor(config.getLogger(), getPngCrush())
            .args("-q""-iphone""-f""0"inFileoutFile)
            .exec();
    }
    public static void compileStrings(Config configFile inFileFile outFilethrows IOException {
        new Executor(config.getLogger(), getPlutil())
            .args("-convert""binary1"inFile"-o"outFile)
            .exec();
    }
    public static void packageApplication(Config configFile appDirFile outFilethrows IOException {
        new Executor(config.getLogger(), getPackageApplication())
            .args(appDir"-o"outFile)
            .exec();
    }
    public static void link(Config configList<StringargsList<FileobjectFilesList<StringlibsFile outFilethrows IOException {
        File objectsFile = new File(config.getTmpDir(), "objects");
        if (config.getOs().getFamily() == ..) {
            // The Xcode linker doesn't need paths with spaces to be quoted and 
            // will fail if we do quote
            FileUtils.writeLines(objectsFileobjectFiles"\n");
        } else {
            // The linker on Linux will fail if we don't quote paths with spaces
            BufferedOutputStream objectsOut = null;
            try {
                objectsOut = new BufferedOutputStream(new FileOutputStream(objectsFile));
                for (File f : objectFiles) {
                    objectsOut.write('"');
                    objectsOut.write(f.getAbsolutePath().getBytes());
                    objectsOut.write('"');
                    objectsOut.write('\n');
                }
            } finally {
                IOUtils.closeQuietly(objectsOut);
            }
        }
        
        List<Stringopts = new ArrayList<String>();
        if (config.isDebug()) {
            opts.add("-g");
        }
        if (config.getOs().getFamily() == ..) {
            opts.add("-arch");            
            opts.add(config.getArch().getClangName());            
            opts.add("-Wl,-filelist," + objectsFile.getAbsolutePath());
        } else {
            opts.add("-m32");
            opts.add("@" + objectsFile.getAbsolutePath());
        }
        opts.addAll(args);
        new Executor(config.getLogger(), getCcPath(config))
            .args("-o"outFileoptslibs)
            .exec();
    }
    private static String getCcPath(Config configthrows IOException {
        String ccPath = config.getOs().getFamily() == .. ? "clang++" : "g++";
        if (config.getCcBinPath() != null) {
            ccPath = config.getCcBinPath().getAbsolutePath();
        } else if (config.getOs() == .) {
            if (config.getArch() == .) {
                ccPath = getIOSSimClang();
            } else {
                ccPath = getIOSDevClang();
            }
        }
        return ccPath;
    }
New to GrepCode? Check out our FAQ X