[PATCH] D11877: [Support] On Windows, generate PDF files for graphs and open with associated viewer

Aaron Ballman via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 17 09:16:26 PDT 2015


On Mon, Aug 17, 2015 at 12:06 PM, Michael Kruse via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Meinersbur added a comment.
>
> ping
>
>
> Repository:
>   rL LLVM
>
> http://reviews.llvm.org/D11877

> Index: lib/Support/GraphWriter.cpp
> ===================================================================
> --- lib/Support/GraphWriter.cpp
> +++ lib/Support/GraphWriter.cpp
> @@ -189,32 +189,47 @@
>      return ExecGraphViewer(ViewerPath, args, Filename, wait, ErrMsg);
>    }
>
> -  enum PSViewerKind { PSV_None, PSV_OSXOpen, PSV_XDGOpen, PSV_Ghostview };
> -  PSViewerKind PSViewer = PSV_None;
> +  enum ViewerKind {
> +    PSV_None,
> +    PSV_OSXOpen,
> +    PSV_XDGOpen,
> +    PSV_Ghostview,
> +    PDFV_CmdStart

Why is this prefixed with PDFV_ instead of PSV_ like the rest of the
enumerators? Should have the same prefix since it's part of the same
enumeration.

> +  };
> +  ViewerKind Viewer = PSV_None;
>  #ifdef __APPLE__
> -  if (!PSViewer && S.TryFindProgram("open", ViewerPath))
> -    PSViewer = PSV_OSXOpen;
> +  if (!Viewer && S.TryFindProgram("open", ViewerPath))
> +    Viewer = PSV_OSXOpen;
> +#endif
> +  if (!Viewer && S.TryFindProgram("gv", ViewerPath))
> +    Viewer = PSV_Ghostview;
> +  if (!Viewer && S.TryFindProgram("xdg-open", ViewerPath))
> +    Viewer = PSV_XDGOpen;
> +#ifdef LLVM_ON_WIN32
> +  if (!Viewer && S.TryFindProgram("cmd", ViewerPath)) {
> +    Viewer = PDFV_CmdStart;
> +  }

Is there an advantage to using cmd instead of manually opening the
file with the related PDF viewer via ShellExecuteEx (or one of the
other Shell APIs)?

>  #endif
> -  if (!PSViewer && S.TryFindProgram("gv", ViewerPath))
> -    PSViewer = PSV_Ghostview;
> -  if (!PSViewer && S.TryFindProgram("xdg-open", ViewerPath))
> -    PSViewer = PSV_XDGOpen;
>
> -  // PostScript graph generator + PostScript viewer
> +  // PostScript or PDF graph generator + PostScript/PDF viewer
>    std::string GeneratorPath;
> -  if (PSViewer &&
> +  if (Viewer &&
>        (S.TryFindProgram(getProgramName(program), GeneratorPath) ||
>         S.TryFindProgram("dot|fdp|neato|twopi|circo", GeneratorPath))) {
> -    std::string PSFilename = Filename + ".ps";
> +    std::string OutputFilename =
> +        Filename + (Viewer == PDFV_CmdStart ? ".pdf" : ".ps");
>
>      std::vector<const char *> args;
>      args.push_back(GeneratorPath.c_str());
> -    args.push_back("-Tps");
> +    if (Viewer == PDFV_CmdStart)
> +      args.push_back("-Tpdf");
> +    else
> +      args.push_back("-Tps");
>      args.push_back("-Nfontname=Courier");
>      args.push_back("-Gsize=7.5,10");
>      args.push_back(Filename.c_str());
>      args.push_back("-o");
> -    args.push_back(PSFilename.c_str());
> +    args.push_back(OutputFilename.c_str());
>      args.push_back(nullptr);
>
>      errs() << "Running '" << GeneratorPath << "' program... ";
> @@ -222,20 +237,30 @@
>      if (ExecGraphViewer(GeneratorPath, args, Filename, wait, ErrMsg))
>        return true;
>
> +    std::string StartArg;
> +    if (Viewer == PDFV_CmdStart)
> +      StartArg =
> +          (StringRef("start ") + (wait ? "/WAIT " : "") + OutputFilename).str();
> +
>      args.clear();
>      args.push_back(ViewerPath.c_str());
> -    switch (PSViewer) {
> +    switch (Viewer) {
>      case PSV_OSXOpen:
>        args.push_back("-W");
> -      args.push_back(PSFilename.c_str());
> +      args.push_back(OutputFilename.c_str());
>        break;
>      case PSV_XDGOpen:
>        wait = false;
> -      args.push_back(PSFilename.c_str());
> +      args.push_back(OutputFilename.c_str());
>        break;
>      case PSV_Ghostview:
>        args.push_back("--spartan");
> -      args.push_back(PSFilename.c_str());
> +      args.push_back(OutputFilename.c_str());
> +      break;
> +    case PDFV_CmdStart:
> +      args.push_back("/S");
> +      args.push_back("/C");
> +      args.push_back(StartArg.c_str());
>        break;
>      case PSV_None:
>        llvm_unreachable("Invalid viewer");
> @@ -243,7 +268,7 @@
>      args.push_back(nullptr);
>
>      ErrMsg.clear();
> -    return ExecGraphViewer(ViewerPath, args, PSFilename, wait, ErrMsg);
> +    return ExecGraphViewer(ViewerPath, args, OutputFilename, wait, ErrMsg);
>    }
>
>    // dotty
>

~Aaron


More information about the llvm-commits mailing list