private <T extends BinaryToolSpec> CommandLineTool<T> commandLineTool(
        String toolName, File exe) {
      CommandLineTool<T> tool = new CommandLineTool<T>(toolName, exe, execActionFactory);

      // The visual C++ tools use the path to find other executables
      tool.withPath(
          install.getVisualCppBin(targetPlatform),
          sdk.getBinDir(targetPlatform),
          install.getCommonIdeBin());

      return tool;
    }
 public <T extends BinaryToolSpec> Compiler<T> createCCompiler() {
   CommandLineTool<CCompileSpec> commandLineTool =
       commandLineTool("C compiler", install.getCompiler(targetPlatform));
   Transformer<CCompileSpec, CCompileSpec> specTransformer = addIncludePath();
   commandLineTool.withSpecTransformer(specTransformer);
   CCompiler cCompiler = new CCompiler(commandLineTool);
   return (Compiler<T>) new OutputCleaningCompiler<CCompileSpec>(cCompiler, ".obj");
 }
 public <T extends StaticLibraryArchiverSpec> Compiler<T> createStaticLibraryArchiver() {
   CommandLineTool<StaticLibraryArchiverSpec> commandLineTool =
       commandLineTool("Static library archiver", install.getStaticLibArchiver(targetPlatform));
   return (Compiler<T>) new LibExeStaticLibraryArchiver(commandLineTool);
 }
 public <T extends LinkerSpec> Compiler<T> createLinker() {
   CommandLineTool<LinkerSpec> commandLineTool =
       commandLineTool("Linker", install.getLinker(targetPlatform));
   commandLineTool.withSpecTransformer(addLibraryPath());
   return (Compiler<T>) new LinkExeLinker(commandLineTool);
 }
 public <T extends BinaryToolSpec> Compiler<T> createAssembler() {
   CommandLineTool<AssembleSpec> commandLineTool =
       commandLineTool("Assembler", install.getAssembler(targetPlatform));
   return (Compiler<T>) new Assembler(commandLineTool);
 }