<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 27 June 2017 at 02:53, Boris Kolpackov via cfe-dev <span dir="ltr"><<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I am trying to understand how Clang's Modules TS will work so that we<br>
have a general-enough model in the build system.<br>
<br>
Consider these two modules and a consumer:<br>
<br>
// module core<br>
export module core;<br>
export void f (int);<br>
<br>
// module extra<br>
export module extra;<br>
import core;<br>
export inline void g (int x) {f (x);}<br>
<br>
// consumer<br>
import extra;<br>
int main () {g ();}<br>
<br>
Currently, when compiling the consumer (with -fmodules-ts), Clang only<br>
requires the binary module interface (BMI) for extra. In contrast, VC<br>
and GCC require both extra and core (note: even though core is not<br>
re-exported from extra).<br></blockquote><div><br></div><div>Assuming by BMI you mean the .pcm file, this is not true. Clang requires both the core and extra .pcm files in this case. However, we found it extremely impractical to explicitly pass all such .pcm files to a compilation (and indeed on large projects doing so caused us to hit command line length limits and generally produce *highly* unwieldy command lines), so we do not require .pcm's that are reachable through the dependencies of another .pcm file to be explicitly passed to the compiler -- each .pcm stores names and relative paths to its dependencies, and we load those dependencies as part of loading the .pcm itself.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
The Clang's model is definitely more desirable from the build system's<br>
perspective, especially for distributed compilation. So I wonder if this<br>
is accidental and will change in the future or if this is something that<br>
Clang is committed to, so to speak?<br>
<br>
Here is a more interesting variant of the extra module that highlights<br>
some of the issues to consider:<br>
<br>
// module extra<br>
export module extra;<br>
import core;<br>
export template <typename T> void g (T x) {f (x);}<br>
<br>
Now f() can only be resolved (via ADL) when g() is instantiated.<br>
<br>
Thanks,<br>
Boris<br>
______________________________<wbr>_________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-dev</a><br>
</blockquote></div><br></div></div>