/* * Copyright 2012 Phil Pratt-Szeliga and other contributors * http://chirrup.org/ * * See the file LICENSE for copying permission. */ package org.trifort.rootbeer.util; import java.io.File; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.trifort.rootbeer.configuration.RootbeerPaths; import org.trifort.rootbeer.generate.opencl.tweaks.CompileResult; import org.trifort.rootbeer.util.CudaPath; public class WindowsCompile { private List<String> m_visualStudioPaths; private List<String> m_jdkPaths; public WindowsCompile(){ m_visualStudioPaths = new ArrayList<String>(); m_visualStudioPaths.add("C:\\Program Files\\Microsoft Visual Studio 9.0\\VC\\vcvarsall.bat"); m_visualStudioPaths.add("C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\vcvarsall.bat"); m_visualStudioPaths.add("C:\\Program Files\\Microsoft Visual Studio 10.0\\VC\\vcvarsall.bat"); m_visualStudioPaths.add("C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\vcvarsall.bat"); m_visualStudioPaths.add("D:\\Program Files\\Microsoft Visual Studio 10.0\\VC\\vcvarsall.bat"); m_visualStudioPaths.add("D:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\vcvarsall.bat"); m_visualStudioPaths.add("C:\\Program Files\\Microsoft Visual Studio 11.0\\VC\\vcvarsall.bat"); m_visualStudioPaths.add("C:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\VC\\vcvarsall.bat"); m_jdkPaths = new ArrayList<String>(); m_jdkPaths.add("C:\\Program Files\\Java\\"); m_jdkPaths.add("C:\\Program Files (x86)\\Java\\"); } public List<String> compile(String cmd, boolean arch64){ File cl_script = generateScript(cmd, arch64); String command = "cmd /c \""+cl_script.getAbsolutePath()+"\""; CompilerRunner runner = new CompilerRunner(); List<String> errors = runner.run(command); return errors; } public String endl(){ return System.getProperty("line.separator"); } public String jdkPath(){ for(String root : m_jdkPaths){ List<String> possible_paths = findPossibleJdkPaths(root); if(possible_paths.isEmpty()){ continue; } String[] path_array = new String[possible_paths.size()]; path_array = possible_paths.toArray(path_array); Arrays.sort(path_array); return path_array[path_array.length-1]; } System.out.println("JDK not installed. Please install."); System.exit(-1); return ""; } private List<String> findPossibleJdkPaths(String root){ List<String> ret = new ArrayList<String>(); File file = new File(root); File[] children = file.listFiles(); for(File child : children){ String name = child.getName(); if(name.startsWith("jdk")){ ret.add(child.getAbsolutePath()); } } return ret; } private File generateScript(String cmd, boolean arch64){ String vs_path = ""; if(System.getenv().containsKey("VS_VCVARSALL_PATH")){ vs_path = System.getenv("VS_VCVARSALL_PATH"); if(vs_path.trim().equals("")){ vs_path = findPath(m_visualStudioPaths, "Visual Studio"); } else { if(vs_path.endsWith("\\\\") == false){ vs_path += "\\"; } vs_path += "vcvarsall.bat"; } } else { vs_path = findPath(m_visualStudioPaths, "Visual Studio"); } String file_text = ""; String amd64 = "amd64"; String arch = System.getProperty("os.arch"); if(arch == null){ arch = ""; } //http://lopica.sourceforge.net/os.html if(arch.equals("x86")){ amd64 = ""; } file_text += "@call \""+vs_path+"\" "+amd64+endl(); file_text += cmd; String version_str; if(arch64){ version_str = "_64"; } else { version_str = "_32"; } File cl_script = new File(RootbeerPaths.v().getRootbeerHome()+"cl_script"+version_str+".bat"); try { PrintWriter writer = new PrintWriter(cl_script); writer.println(file_text); writer.flush(); writer.close(); return cl_script; } catch(Exception ex){ throw new RuntimeException(ex); } } private String findPath(List<String> paths, String desc) { for(String path : paths){ File file = new File(path); if(file.exists()) return path; } throw new RuntimeException("cannot find path for: "+desc); } }