<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<div class="moz-cite-prefix"><br>
I think this discussion is more suited to the cmake-developers
mailing list. Moving there. Hopefully Brad or someone else can
provide other input from research already done.<br>
<br>
On 05/07/2018 12:49 AM, David Blaikie wrote:<br>
</div>
<blockquote type="cite"
cite="mid:CAENS6Et0JNc0Mm3_AB6Zg5O07FVXNJRznSQhVEZXaOjKOQAiAA@mail.gmail.com">
<div dir="ltr"><br>
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF">
<blockquote type="cite">
<div dir="ltr">The basic commands required are:<br>
<br>
clang++ -fmodules -xc++ -Xclang -emit-module
-Xclang -fmodules-codegen -fmodule-name=foo
foo.modulemap -o foo.pcm<br>
clang++ -fmodules -c -fmodule-file=foo.pcm
use.cpp<br>
clang++ -c foo.pcm<br>
clang++ foo.o use.o -o a.out<br>
</div>
</blockquote>
<br>
</div>
<div text="#000000" bgcolor="#FFFFFF"> Ok.
Fundamentally, I am suspicious of having to have a
-fmodule-file=foo.pcm for every 'import foo' in each
cpp file. I shouldn't have to manually add that each
time I add a new import to my cpp file. Even if it
can be automated (eg by CMake), I shouldn't have to
have my buildsystem be regenerated each time I add
an import to my cpp file either.<br>
<br>
That's something I mentioned in the google groups
post I made which you linked to. How will that work
when using Qt or any other library?<br>
</div>
</blockquote>
</div>
</div>
</div>
</div>
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<div><br>
- My understanding/feeling is that this would be
similar to how a user has to change their link command
when they pick up a new dependency.<br>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
Perhaps it would be interesting to get an idea of how often users
need to change their buildsystems because of a new link dependency,
and how often users add includes to existing c++ files.<br>
<br>
I expect you'll find the latter to be a far bigger number. <br>
<br>
I also expect that expecting users to edit their buildsystem, or
allow it to be regenerated every time they add/remove includes would
lead to less adoption of modules. I can see people trying them and
then giving up in frustration. <br>
<br>
I think I read somewhere that the buildsystem in google already
requires included '.h' files to be listed explicitly in the
buildsystem, so it's no change in workflow there. For other teams,
that would be a change which could be a change in workflow and
something rebelled against.<br>
<br>
By the way, do you have any idea how much modules adoption would be
needed to constitute "success"? Is there a goal there?<br>
<br>
<blockquote type="cite"
cite="mid:CAENS6Et0JNc0Mm3_AB6Zg5O07FVXNJRznSQhVEZXaOjKOQAiAA@mail.gmail.com">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<div>Nope, scratch that ^ I had thought that was the
case, but talking more with Richard Smith it seems
there's an expectation that modules will be somewhere
between header and library granularity (obviously some
small libraries today have one or only a few headers,
some (like Qt) have many - maybe those on the Qt end
might have slightly fewer modules than the have
headers - but still several modules to one library
most likely, by the sounds of it)<br>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
Why? Richard maybe you can answer that? These are the kinds of
things I was trying to get answers to in the previous post to iso
sg2 in the google group. I didn't get an answer as definitive as
this, so maybe you can share the reason behind such a definitive
answer?<br>
<br>
<blockquote type="cite"
cite="mid:CAENS6Et0JNc0Mm3_AB6Zg5O07FVXNJRznSQhVEZXaOjKOQAiAA@mail.gmail.com">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<div>Now, admittedly, external dependencies are a little
more complicated than internal (within a single
project consisting of multiple libraries) - which is
why I'd like to focus a bit on the simpler internal
case first.<br>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
Fair enough.<br>
<br>
<blockquote type="cite"
cite="mid:CAENS6Et0JNc0Mm3_AB6Zg5O07FVXNJRznSQhVEZXaOjKOQAiAA@mail.gmail.com">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<div> </div>
</div>
</div>
</div>
</div>
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF">Today, a
beginner can find a random C++ book, type in a code
example from chapter one and put `g++
-I/opt/book_examples prog1.cpp` into a terminal and
get something compiling and running. With modules,
they'll potentially have to pass a whole list of
module files too.<br>
</div>
</blockquote>
</div>
</div>
</div>
</div>
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<div><br>
Yeah, there's some talk of supporting a mode that
doesn't explicitly build/use modules in the
filesystem, but only in memory for the purpose of
preserving the isolation semantics of modules. This
would be used in simple direct-compilation cases like
this. Such a library might need a configuration file
or similar the compiler can parse to discover the
parameters (warning flags, define flags, whatever
else) needed to build the BMI.<br>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
Perhaps. I'd be interested in how far into the book such a system
would take a beginner. Maybe that's fine, I don't know. Such a
system might not help with code in stack overflow questions/answers
though, which would probably be simpler sticking with includes (eg
for Qt/boost). <br>
<br>
Library authors will presumably have some say, or try to introduce
some 'best practice' for users to follow. And such best practice
will be different for each library.<br>
<div class="gmail_quote">
<div> </div>
</div>
<blockquote type="cite"
cite="mid:CAENS6Et0JNc0Mm3_AB6Zg5O07FVXNJRznSQhVEZXaOjKOQAiAA@mail.gmail.com">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF">I raised some of
these issues a few years ago regarding the clang
implementation with files named exactly
module.modulemap:<br>
<br>
<a
class="m_4089600057544350869m_2648820049216965386m_1970699153108696964m_-801848360278511963moz-txt-link-freetext"
href="http://clang-developers.42468.n3.nabble.com/How-do-I-try-out-C-modules-with-clang-td4041946.html"
target="_blank" moz-do-not-send="true">http://clang-developers.42468.n3.nabble.com/How-do-I-try-out-C-modules-with-clang-td4041946.html</a><br>
<br>
<a
class="m_4089600057544350869m_2648820049216965386m_1970699153108696964m_-801848360278511963moz-txt-link-freetext"
href="http://clang-developers.42468.n3.nabble.com/How-do-I-try-out-C-modules-with-clang-td4041946i20.html"
target="_blank" moz-do-not-send="true">http://clang-developers.42468.n3.nabble.com/How-do-I-try-out-C-modules-with-clang-td4041946i20.html</a><br>
<br>
Interestingly, GCC is taking a directory-centric
approach in the driver (-fmodule-path=<dir>)
as opposed to the 'add a file to your compile line
for each import' that Clang and MSVC are taking:<br>
<br>
<a
class="m_4089600057544350869m_2648820049216965386m_1970699153108696964m_-801848360278511963moz-txt-link-freetext"
href="http://gcc.gnu.org/wiki/cxx-modules"
target="_blank" moz-do-not-send="true">http://gcc.gnu.org/wiki/cxx-modules</a><br>
<br>
Why is Clang not doing a directory-centric
driver-interface? It seems to obviously solve
problems. I wonder if modules can be a success
without coordination between major compiler and
buildsystem developers. That's why I made the git
repo - to help work on something more concrete to
see how things scale.<br>
</div>
</blockquote>
</div>
</div>
</div>
</div>
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<div><br>
'We' (myself & other Clang developers) are/will be
talking to GCC folks to try to get consistency here,
in one direction or another (maybe some 3rd direction
different from Clang or LLVM's). As you noted in a
follow-up, there is a directory-based flag in Clang
now, added by Boris as he's been working through
adding modules support to Build2.<br>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
I just looked through the commits from Boris, and it seems he made
some changes relating to -fmodule-file=. That still presupposes that
all (transitively) used module files are specified on the command
line. <br>
<br>
I was talking about the -fprebuilt-module-path option added by
Manman Ren in <a class="moz-txt-link-freetext" href="https://reviews.llvm.org/D23125">https://reviews.llvm.org/D23125</a> because that actually
relieves the user/buildsystem of maintaining a list of all used
modules (I hope).<br>
<br>
<blockquote type="cite"
cite="mid:CAENS6Et0JNc0Mm3_AB6Zg5O07FVXNJRznSQhVEZXaOjKOQAiAA@mail.gmail.com">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF">Having just read
all of my old posts again, I still worry things like
this will hinder modules 'too much' to be
successful. The more (small) barriers exist, the
less chance of success. If modules aren't
successful, then they'll become a poisoned chalice
and no one will be able to work on fixing them.
That's actually exactly what I expect to happen, but
I also still hope I'm just missing something :). I
really want to see a committee document from the
people working on modules which actually explores
the problems and barriers to adoption and concludes
with 'none of those things matter'. I think it's
fixable, but I haven't seen anyone interested enough
to fix the problems (or even to find out what they
are).<br>
</div>
</blockquote>
</div>
</div>
</div>
</div>
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<div><br>
Indeed - hence my desire to talk through these things,
get some practical experience, document them to the
committee in perhaps a less-ranty, more concrete form
along with pros/cons/unknowns/etc to hopefully find
some consistency, maybe write up a document of "this
is how we expect build systems to integrate with this
C++ feature", etc.<br>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
Great. Nathan Sidwell already wrote a paper which is clearer than I
am on some of the problems:<br>
<br>
<a class="moz-txt-link-freetext" href="http://open-std.org/JTC1/SC22/WG21/docs/papers/2017/p0778r0.pdf">http://open-std.org/JTC1/SC22/WG21/docs/papers/2017/p0778r0.pdf</a><br>
<br>
However he told me it 'wasn't popular'. I don't know if he means the
problems were dismissed, or his proposed solution was dismissed as
not popular.<br>
<br>
Nevertheless, I recommend reading the problems stated there.<br>
<br>
<blockquote type="cite"
cite="mid:CAENS6Et0JNc0Mm3_AB6Zg5O07FVXNJRznSQhVEZXaOjKOQAiAA@mail.gmail.com">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF"> <br>
<blockquote type="cite">
<div dir="ltr">My current very simplistic
prototype, to build a module file, its
respective module object file, and include those
in the library/link for anything that depends on
this library:<br>
<br>
<div><font face="monospace">
add_custom_command(</font></div>
<div><font face="monospace"> COMMAND
${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS}
-xc++ -c -Xclang -emit-module -fmodules
-fmodule-name=Hello
${CMAKE_CURRENT_SOURCE_DIR}/module.modulemap
-o
${CMAKE_CURRENT_BINARY_DIR}/hello_module.pcm
-Xclang -fmodules-codegen</font></div>
<div><font face="monospace"> DEPENDS
module.modulemap hello.h</font></div>
</div>
</blockquote>
<br>
</div>
<div text="#000000" bgcolor="#FFFFFF"> Why does this
command depend on hello.h?</div>
</blockquote>
<div><br>
</div>
</div>
</div>
</div>
</div>
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<div>Because it builds the binary module interface
(hello_module.pcm) that is a serialized form of the
compiler's internal representation of the contents of
module.modulemap which refers to hello.h (the
modulemap lists the header files that are part of the
module). This is all using Clang's current backwards
semi-compatible "header modules" stuff. In a "real"
modules system, ideally there wouldn't be any
modulemap. Just a .cppm file, and any files it depends
on (discovered through the build system scanning the
module imports, or a compiler-driven .d file style
thing).<br>
<br>
Perhaps it'd be better for me to demonstrate something
closer to the actual modules reality, rather than this
retro header modules stuff that clang supports.<br>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
That would be better for me. I'm interested in modules-ts, but I'm
not interested in clang-modules.<br>
<br>
<blockquote type="cite"
cite="mid:CAENS6Et0JNc0Mm3_AB6Zg5O07FVXNJRznSQhVEZXaOjKOQAiAA@mail.gmail.com">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<div> </div>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF"> If that is
changed and module.modulemap is not, what will
happen?</div>
</blockquote>
</div>
</div>
</div>
</div>
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<div><br>
If hello.h is changed and module.modulemap is not
changed? The hello_module.pcm does need to be rebuilt.<br>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
Hmm, this assumes that the pcm/BMI only contains declarations and
not definitions, right? I think clang outputs the definitions in a
separate object file, but GCC currently doesn't. Perhaps that's a
difference that cmake has to account for or pass on to the user.<br>
<br>
<blockquote type="cite"
cite="mid:CAENS6Et0JNc0Mm3_AB6Zg5O07FVXNJRznSQhVEZXaOjKOQAiAA@mail.gmail.com">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<div><br>
Ideally all of this would be implicit (maybe with some
flag/configuration, or detected based on new file
extensions for C++ interface definitions) in the
add_library - taking, let's imagine, the .ccm (let's
say, for argument's sake*) file listed in the
add_library's inputs and using it to build a .pcm
(BMI), building that .pcm as an object file along with
all the normal .cc files, <br>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
Ok, I think this is the separation I described above.<br>
<br>
<blockquote type="cite"
cite="mid:CAENS6Et0JNc0Mm3_AB6Zg5O07FVXNJRznSQhVEZXaOjKOQAiAA@mail.gmail.com">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<div>* alternatively, maybe they'll all just be .cc
files & a build system would be scanning the .cc
files to figure out dependencies & could notice
that one of them is the blessed module interface
definition based on the first line in the file.<br>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
Today, users have to contend with errors resulting from their own
code being incorrect, using some 3rd party template incorrectly,
linking not working due to incorrect link dependencies, and
incorrect compiles due to missing include directories (or incorrect
defines specified). I can see incorrect inputs to module generation
being a new category of errors to confuse users.<br>
<br>
For example, if in your list of files there are two files which look
like the blessed module interface based on the first line in the
file, there will be something to debug.<br>
<br>
<blockquote type="cite"
cite="mid:CAENS6Et0JNc0Mm3_AB6Zg5O07FVXNJRznSQhVEZXaOjKOQAiAA@mail.gmail.com">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<div>So I suppose the more advanced question: Is there a
way I can extend handling of existing CXX files
(and/or define a new kind of file, say, CXXM?)
specified in a cc_library. If I want to potentially
check if a .cc file is a module, discover its module
dependencies, add new rules about how to build those,
etc. Is that do-able within my cmake project, or would
that require changes to cmake itself? (I'm happy to
poke around at what those changes might look like)<br>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
One of the things users can do in order to ensure that CMake works
best is to explicitly list the cpp files they want compiled, instead
of relying on globbing as users are prone to want to do: <br>
<br>
<a class="moz-txt-link-freetext" href="https://stackoverflow.com/questions/1027247/is-it-better-to-specify-source-files-with-glob-or-each-file-individually-in-cmak">https://stackoverflow.com/questions/1027247/is-it-better-to-specify-source-files-with-glob-or-each-file-individually-in-cmak</a><br>
<br>
if using globbing, adding a new file does not cause the buildsystem
to be regenerated, and you won't have a working build until you
explicitly cause cmake to be run again.<br>
<br>
I expect you could get into similar problems with modules - needing
a module to be regenerated because its dependencies change (because
it exports what it imports from a dependency for example). I'm not
sure anything can be done to cause cmake to reliably regenerate the
module in that case. It seems similar to the globbing case to me.<br>
<br>
But aside from that you could probably experimentally come up with a
way to do the check for whether a file is a module and discover its
direct dependencies using file(READ). You might want to delegate to
a script in another language to determine transitive dependencies
and what add_custom{_command,_target} code to generate.<br>
<br>
<blockquote type="cite"
cite="mid:CAENS6Et0JNc0Mm3_AB6Zg5O07FVXNJRznSQhVEZXaOjKOQAiAA@mail.gmail.com">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF"><br>
<blockquote type="cite">
<div dir="ltr">
<div>But this isn't ideal - I don't /think/ I've
got the dependencies quite right & things
might not be rebuilding at the right times.<br>
Also it involves hardcoding a bunch of things
like the pcm file names, header files, etc.<br>
</div>
</div>
</blockquote>
<br>
</div>
<div text="#000000" bgcolor="#FFFFFF"> Indeed. I think
part of that comes from the way modules have been
designed. The TS has similar issues.</div>
</blockquote>
</div>
</div>
</div>
</div>
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote"><br>
Sure - but I'd still be curious to understand how I
might go about modifying the build system to handle
this. If there are obvious things I have gotten wrong
about the dependencies, etc, that would cause this not
to rebuild on modifications to any of the source/header
files - I'd love any tips you've got.<br>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
Sure. I didn't notice anything from reading, but I also didn't try
it out. You might need to provide a repo with the
module.modulemap/c++ files etc that are part of your experiment. Or
better, provide something based on modules-ts that I can try out.<br>
<br>
<blockquote type="cite"
cite="mid:CAENS6Et0JNc0Mm3_AB6Zg5O07FVXNJRznSQhVEZXaOjKOQAiAA@mail.gmail.com">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">& if there are good paths
forward for ways to prototype changes to the build
system to handle, say, specifying a switch/setting a
property/turning on a feature that I could implement
that would collect all the .ccm files in an add_library
rule and use them to make a .pcm file - I'd be happy to
try prototyping that.<br>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
cmGeneratorTarget has a set of methods like GetResxSources which
return a subset of the files provided to add_library/target_sources
by splitting them by 'kind'. You would probably extend
ComputeKindedSources to handle the ccm extension, add a
GetCCMFiles() to cmGeneratorTarget, then use that new GetCCMFiles()
in the makefiles/ninja generator to generate rules.<br>
<br>
When extending ComputeKindedSources could use <br>
<br>
if(Target->getPropertyAsBool("MAKE_CCM_RULES"))<br>
<br>
as a condition to populating the 'kind'. Then rules will only be
created for targets which use something like <br>
<br>
set_property(TARGET myTarget PROPERTY MAKE_CCM_RULES ON)<br>
<br>
in cmake code.<br>
<br>
I'm guessing that's enough for you to implement what you want as an
experiment?<br>
<br>
<blockquote type="cite"
cite="mid:CAENS6Et0JNc0Mm3_AB6Zg5O07FVXNJRznSQhVEZXaOjKOQAiAA@mail.gmail.com">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF">
<blockquote type="cite">
<div dir="ltr">
<div>Ideally, at least for a simplistic build, I
wouldn't mind generating a modulemap from all
the .h files (& have those headers listed
in the add_library command - perhaps splitting
public and private headers in some way, only
including the public headers in the module
file, likely). Eventually for the
standards-proposal version, it's expected that
there won't be any modulemap file, but maybe
all headers are included in the module
compilation (just pass the headers directly to
the compiler).<br>
</div>
</div>
</blockquote>
<br>
</div>
<div text="#000000" bgcolor="#FFFFFF"> In a design
based on passing directories instead of files, would
those directories be redundant with the include
directories?<br>
</div>
</blockquote>
<div><br>
</div>
</div>
</div>
</div>
</div>
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<div>I'm not sure I understand the question, but if I
do, I think the answer would be: no, they wouldn't be
redundant. The system will not have precompiled
modules available to use - because binary module
definitions are compiler (& compiler version, and
to some degree, compiler flags (eg: are you building
this for x86 32 bit or 64 bit?)) dependent.</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
Right. I discussed modules with Nathan Sidwell meanwhile and
realised this too.<br>
<br>
<blockquote type="cite"
cite="mid:CAENS6Et0JNc0Mm3_AB6Zg5O07FVXNJRznSQhVEZXaOjKOQAiAA@mail.gmail.com">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<div> </div>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF">One of the
problems modules adoption will hit is that all the
compilers are designing fundamentally different
command line interfaces for them. </div>
</blockquote>
</div>
</div>
</div>
</div>
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<div><br>
*nod* We'll be working amongst GCC and Clang at least
to try to converge on something common.<br>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
Different flags would not be a problem for cmake at least, but if
Clang didn't have something like -fprebuilt-module-path and GCC did,
that would be the kind of 'fundamental' difference I mean.<br>
<br>
<blockquote type="cite"
cite="mid:CAENS6Et0JNc0Mm3_AB6Zg5O07FVXNJRznSQhVEZXaOjKOQAiAA@mail.gmail.com">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF">
<blockquote type="cite">
<div dir="ltr">
<div>This also doesn't start to approach the
issue of how to build modules for external
libraries - which I'm happy to
discuss/prototype too, though interested in
working to streamline the inter-library but
intra-project (not inter-project) case first.<br>
</div>
</div>
</blockquote>
<br>
</div>
<div text="#000000" bgcolor="#FFFFFF"> Yes, there are
many aspects to consider.<br>
<br>
Are you interested in design of a CMake abstraction
for this stuff? I have thoughts on that, but I don't
know if your level of interest stretches that far.</div>
</blockquote>
</div>
</div>
</div>
</div>
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<div><br>
Not sure how much work it'd be - at the moment my
immediate interest is to show as much
real-world/can-actually-run prototype with cmake as
possible, either with or without changes to cmake
itself (or a combination of minimal cmake changes plus
project-specific recipes of how to write a user's
cmake files to work with this stuff) or also showing
non-working/hypothetical prototypes of what ideal user
cmake files would look like with reasonable/viable
(but not yet implemented) cmake support.<br>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
Yes, it's specifying the ideal user cmake files that I mean. Given
that granularity of modules can be anywhere on the spectrum between
one-module-file-per-library and one-module-file-per-class, I think
cmake will need to consider one-module-file-per-library and
*not*-one-module-file-per-library separately. <br>
<br>
In the *not*-one-module-file-per-library case, cmake might have to
delegate more to the user, so it would be more inconvenient for
them.<br>
<br>
In the one-module-file-per-library case, I think the ideal is
something like:<br>
<br>
add_library(foo foo.cpp)<br>
# assuming foo.h is a module interface file, this creates<br>
# a c++-module called foo and makes it an interface usage <br>
# requirement of the foo target defined above<br>
add_cxx_module(foo foo.h)<br>
<br>
# bar.cpp imports foo.<br>
add_library(bar bar.cpp)<br>
# bar links to foo, and a suitable compile line argument is added
if<br>
# needed for the foo module.<br>
target_link_libraries(bar foo)<br>
<br>
This would work best if foo.h did not contain <br>
<br>
module;<br>
export module foo;<br>
<br>
(after
<a class="moz-txt-link-freetext" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0713r1.html">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0713r1.html</a>)<br>
<br>
but instead contained only <br>
<br>
module;<br>
<br>
and the module name came from the buildsystem (or from the compiler
using the basename).<br>
<br>
As it is, the above cmake code would have to determine the module
name from foo.h and throw an error if it was different from foo.
Having the module name inside the source just adds scope for things
to be wrong. It would be better to specify the module name on the
outside.<br>
<br>
I wonder what you think about that, and whether it can be changed in
the modules ts? My thoughts on this and what the ideal in cmake
would be are changing as the discussion continues.<br>
<br>
<blockquote type="cite"
cite="mid:CAENS6Et0JNc0Mm3_AB6Zg5O07FVXNJRznSQhVEZXaOjKOQAiAA@mail.gmail.com">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF">Can you help? It
would really help my understanding of where things
currently stand with modules.</div>
</blockquote>
<div><br>
I can certainly have a go, for sure.<br>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
Great, thanks.<br>
<br>
<blockquote type="cite"
cite="mid:CAENS6Et0JNc0Mm3_AB6Zg5O07FVXNJRznSQhVEZXaOjKOQAiAA@mail.gmail.com">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<div> </div>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF"> For example, is
there only one way to port the contents of the cpp
files?<br>
</div>
</blockquote>
<div><br>
Much like header grouping - how granular headers are
(how many headers you have for a given library) is up
to the developer to some degree (certain things can't
be split up), similarly with modules - given a set of
C++ definitions, it's not 100% constrained how those
definitions are exposed as modules - the developer has
some freedom over how the declarations of those
entities are grouped into modules.<br>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
Yes, exactly. This repo is small, but has a few libraries, so if we
start with one approach we should be easily able to also try a
different approach and examine what the difference is and what it
means.<br>
<br>
<blockquote type="cite"
cite="mid:CAENS6Et0JNc0Mm3_AB6Zg5O07FVXNJRznSQhVEZXaOjKOQAiAA@mail.gmail.com">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<div> </div>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF">After that, is
there one importable module per class or one per
shared library (which I think would make more sense
for Qt)?</div>
</blockquote>
</div>
</div>
</div>
</div>
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<div><br>
Apparently (this was a surprise to me - since I'd been
thinking about this based on the Clang header modules
(backwards compatibility stuff, not the
standardized/new language feature modules)) the
thinking is probably somewhere between one-per-class
and one-per-shared-library. But for me, in terms of
how a build file would interact with this, more than
one-per-shared-library is probably the critical
tipping point.</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
Yes. I think you're talking about the one-module-file-per-library
and *not*-one-module-file-per-library distinction I mentioned above.<br>
<br>
<blockquote type="cite"
cite="mid:CAENS6Et0JNc0Mm3_AB6Zg5O07FVXNJRznSQhVEZXaOjKOQAiAA@mail.gmail.com">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<div> If it was just one per shared library, then I'd
feel like the dependency/flag management would be
relatively simple. You have to add a flag to the
linker commandline to link in a library, so you have
to add a flag to the compile step to reference a
module, great. But, no, bit more complicated than that
given the finer granularity that's expected here.<br>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
"finer granularity that's *allowed* here" really. If there is a
simple thing for the user to do (ie one-module-file-per-library),
then cmake can make that simple to achieve (because the dependencies
between modules are the same as dependencies between targets, which
the user already specifies with target_link_libraries). <br>
<br>
If the user wants to do the more complicated thing
(*not*-one-module-file-per-library), then cmake can provide APIs for
the user to do that (perhaps by requiring the user to explicitly
specify the dependencies between modules).<br>
<br>
My point is that cmake can design optimize for the easy way and I
think users will choose the easy way most of the time.<br>
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<div> </div>
</div>
</div>
</div>
<blockquote type="cite"
cite="mid:CAENS6Et0JNc0Mm3_AB6Zg5O07FVXNJRznSQhVEZXaOjKOQAiAA@mail.gmail.com">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF">The git repo is
an attempt to make the discussion concrete because
it would show how multiple classes and multiple
libraries with dependencies could interact in a
modules world. I'm interested in what it would look
like ported to modules-ts, because as far as I know,
clang-modules and module maps would not need porting
of the cpp files at all.</div>
</blockquote>
<div><br>
Right, clang header-modules is a backwards
compatibility feature. It does require a constrained
subset of C++ to be used to be effective (ie:
basically your headers need to be what we think of as
ideal/canonical headers - reincludable, independent,
complete, etc). So if you've got good/isolated
headers, you can port them to Clang's header modules
by adding the module maps & potentially not doing
anything else - though, if you rely on not changing
your build system, then that presents some problems if
you want to scale (more cores) or distribute your
build. Because the build system doesn't know about
these dependencies - so if you have, say, two .cc
files that both include foo.h then bar.h - well, the
build system runs two compiles, both compiles try to
implicitly build the foo.h module - one blocks waiting
for the other to complete, then they continue and
block again waiting for bar.h module to be built. If
the build system knew about these dependencies (what
Google uses - what we call "explicit (header)modules")
then it could build the foo.h module and the bar.h
module in parallel, then build the two .cc files in
parallel.<br>
</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
I think that the 'build a module' step should be a precondition to
the compile step. I think the compiler should issue an error if it
encounters an import for a module it doesn't find a file for. No one
expects a linker to compile foo.cpp into foo.o and link it just
because it encounters a fooFunc without a definition which was
declared in foo.h. <br>
<br>
That would reduce the magic and expect something like <br>
<br>
add_cxx_module(somename somefile.h otherfiles.h)<br>
<br>
to specify a module file and its constituent partitions, which I
think is fine.<br>
<br>
<blockquote type="cite"
cite="mid:CAENS6Et0JNc0Mm3_AB6Zg5O07FVXNJRznSQhVEZXaOjKOQAiAA@mail.gmail.com">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div dir="ltr">
<div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF">
<blockquote type="cite">
<div dir="ltr">
<div>Basically: What do folks think about
supporting these sort of features in CMake C++
Builds? Any pointers on how I might best
implement this with or without changes to
CMake?</div>
</div>
</blockquote>
<br>
</div>
<div text="#000000" bgcolor="#FFFFFF"> I think some
design is needed up front. I expect CMake would want
to have a first-class (on equal footing with include
directories or compile definitions and with
particular handling) concept for modules, extending
the install(TARGET) command to install module binary
files etc. <br>
</div>
</blockquote>
<div><br>
</div>
<div>Module binary files wouldn't be installed in the
sense of being part of the shipped package of a
library - because module binary files are
compiler/flag/etc specific.</div>
</div>
</div>
</div>
</div>
</div>
</blockquote>
<br>
Ok.<br>
<br>
Thanks,<br>
<br>
Stephen.<br>
<br>
</body>
</html>