<div dir="rtl"><div dir="ltr">I agree it's not very nice. The trouble is there is no registry or environment entry set by the MingW installation to indicate where it is, so you just search for it. It may be on the PATH or may not, depending if the user set it.</div>

<div dir="ltr"><br></div><div dir="ltr"><div>While it is not complete efficient, my thinking was to make the directory search future-proof in handling directory structure and version changes. I did check the directory structure of mingw-builds installation and i686-w64-mingw32 should be found quite fast, in the 9th iteration or so.  It's not deep.</div>

<div>I can get rid of the iteration by assuming more about the directory structure, hopefully it will not break in the future.</div><div><br></div><div>While at it, the existing code (below) includes many possible hardcoded version paths (which actually does not work with all current and future versions) and later prunes the non-existing ones:</div>

<div><br></div></div><div dir="ltr"><span style="font-family:'courier new',monospace">  case llvm::Triple::MinGW32:</span><br></div><div dir="ltr"><div dir="ltr"><div dir="ltr"><font face="courier new, monospace">    // mingw-w64 C++ include paths (i686-w64-mingw32 and x86_64-w64-mingw32)</font></div>

<div dir="ltr"><font face="courier new, monospace">    AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.5.0");</font></div><div dir="ltr"><font face="courier new, monospace">    AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.5.1");</font></div>

<div dir="ltr"><font face="courier new, monospace">    AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.5.2");</font></div><div dir="ltr"><font face="courier new, monospace">    AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.5.3");</font></div>

<div dir="ltr"><font face="courier new, monospace">    AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.5.4");</font></div><div dir="ltr"><font face="courier new, monospace">    AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.6.0");</font></div>

<div dir="ltr"><font face="courier new, monospace">    AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.6.1");</font></div><div dir="ltr"><font face="courier new, monospace">    AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.6.2");</font></div>

<div dir="ltr"><font face="courier new, monospace">    AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.6.3");</font></div><div dir="ltr"><font face="courier new, monospace">    AddMinGW64CXXPaths(HSOpts.ResourceDir, "4.7.0");</font></div>

<div dir="ltr"><font face="courier new, monospace">    // <a href="http://mingw.org">mingw.org</a> C++ include paths</font></div><div dir="ltr"><font face="courier new, monospace">    AddMinGWCPlusPlusIncludePaths("/mingw/lib/gcc", "mingw32", "4.5.2"); //MSYS</font></div>

<div dir="ltr"><font face="courier new, monospace">#if defined(_WIN32)</font></div><div dir="ltr"><font face="courier new, monospace">    AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.6.2");</font></div>

<div dir="ltr"><font face="courier new, monospace">    AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.6.1");</font></div><div dir="ltr"><font face="courier new, monospace">    AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.5.2");</font></div>

<div dir="ltr"><font face="courier new, monospace">    AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.5.0");</font></div><div dir="ltr"><font face="courier new, monospace">    AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.4.0");</font></div>

<div dir="ltr"><font face="courier new, monospace">    AddMinGWCPlusPlusIncludePaths("c:/MinGW/lib/gcc", "mingw32", "4.3.0");</font></div><div dir="ltr"><font face="courier new, monospace">#endif</font></div>

<div><br></div></div><div>...</div><div><div><font face="courier new, monospace">      // mingw-w64 crt include paths</font></div><div><font face="courier new, monospace">      // <sysroot>/i686-w64-mingw32/include</font></div>

<div><font face="courier new, monospace">      SmallString<128> P = StringRef(HSOpts.ResourceDir);</font></div><div><font face="courier new, monospace">      llvm::sys::path::append(P, "../../../i686-w64-mingw32/include");</font></div>

<div><font face="courier new, monospace">      AddPath(P.str(), System, false);</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">      // <sysroot>/x86_64-w64-mingw32/include</font></div>

<div><font face="courier new, monospace">      P.resize(HSOpts.ResourceDir.size());</font></div><div><font face="courier new, monospace">      llvm::sys::path::append(P, "../../../x86_64-w64-mingw32/include");</font></div>

<div><font face="courier new, monospace">      AddPath(P.str(), System, false);</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">      // <a href="http://mingw.org">mingw.org</a> crt include paths</font></div>

<div><font face="courier new, monospace">      // <sysroot>/include</font></div><div><font face="courier new, monospace">      P.resize(HSOpts.ResourceDir.size());</font></div><div><font face="courier new, monospace">      llvm::sys::path::append(P, "../../../include");</font></div>

<div><font face="courier new, monospace">      AddPath(P.str(), System, false);</font></div><div><font face="courier new, monospace">      AddPath("/mingw/include", System, false);</font></div><div><font face="courier new, monospace">#if defined(_WIN32)</font></div>

<div><font face="courier new, monospace">      AddPath("c:/mingw/include", System, false); </font></div><div><font face="courier new, monospace">#endif</font></div></div><div><br></div><div>Why MingW include path should depend on<font face="arial, helvetica, sans-serif"> HSOpts.ResourceDir at all? clang may be a devleopment version running not in C:\program files\ at all and we still want clang to locate MingW correctly.</font></div>

<div><span style="font-family:'courier new',monospace"><br></span></div><div>The #if defined(_WIN32) especiialy odd since MingW is a Windows-only target so why is it needed?</div><div dir="ltr"><br></div><div dir="ltr">

If it makes sense, I can rewrite the whole MingW include logic (including the mingw-builds patch) replacing all the code with something more generic and version-proof. It will still need some hardcoded paths to support the different MingW distributions but not hard-coded version numbers or clang-relative directories as above. </div>

<div dir="ltr"><br></div><div dir="ltr">What do you think?<br></div><div dir="ltr"><br></div><div>Yaron</div><div><br></div><div dir="ltr"><br></div><div><br></div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">

<div dir="ltr">2013/10/6 Anton Korobeynikov <span dir="ltr"><<a href="mailto:anton@korobeynikov.info" target="_blank">anton@korobeynikov.info</a>></span></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

What if it's installed in some other directory? Is there a way to find<br>
the installation directory precisely?<br>
<br>
Iterating over all the subdirs of some dir during each run of clang<br>
looks pretty gross.<br>
<div><div class="h5"><br>
On Sun, Oct 6, 2013 at 7:20 PM, Yaron Keren <<a href="mailto:yaron.keren@gmail.com">yaron.keren@gmail.com</a>> wrote:<br>
> mingw-builds is installed by default in c:\Program Files<br>
> (x86)\mingw-builds\...<br>
><br>
> This patch locates its include directory.<br>
><br>
> Yaron<br>
><br>
><br>
</div></div>> _______________________________________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
><br>
<span class="HOEnZb"><font color="#888888"><br>
<br>
<br>
--<br>
With best regards, Anton Korobeynikov<br>
Faculty of Mathematics and Mechanics, Saint Petersburg State University<br>
</font></span></blockquote></div><br></div>