C++ Logo


Advanced search

Re: [Tooling] Clang Modules and build system requirements

From: Tom Honermann <tom_at_[hidden]>
Date: Fri, 8 Feb 2019 14:01:43 -0500
On 2/8/19 12:59 PM, Corentin wrote:
> I think the information _should_ be in the source file.
> The goal should be to simplify the use of tools as much as we want to
> simplify (or make possible) their implementation.
> Asking people to manually maintain a module mapping for every project
> doesn't seem to be a reasonable stance given:
> * The information would have to be encoded in the build system too
> anyway because build systems will have different requirements than
> these files
> * Each dependency would have to have a similar file which both
> compilers and tools would have to search for
Clang modules has demonstrated that 1) programmers are willing to author
module map files, 2) build systems don't have to be aware of them, and
3) dependencies can still be inferred.
> Module make compiling individual source files harder, however, it is
> not a new problem
> Each source file already depends on a set of include paths and defines
> that may vary on a source-per-source and configuration-per
> configuration basis.
> Any project beyond a simple Hello World has some of its state in a
> build system, and the only accurate way to build or parse a TU is to
> ask the build system for the relevant info.
I don't agree with that. It is common to configure tools with include
paths and macro definitions gleaned from compilers without involving
build systems.
> It would be nice that the source code was the single source of truth.
> The preprocessor has been prohibiting that since forever (and it is
> not something we can fix any time soon).
> It would, therefore, be preferable not to introduce a third source of
> truth beyond the build system and the files.
Module maps are (non-C++) source files. They don't need to be redundant
with respect to what is in other source files. Clang module map files
don't specify redundant information.
> This is not to say such manifest should not exist, in fact, I would
> love if it did.
> But I think it should be generated and maintained by a build system
> rather than be manually maintained.
> Neither of these precludes that
> * The file could be manually maintained if you really want to do so
> * The file could be committed - although I would strongly discourage
> that
> In such a scenario, the file would be updated by invoking the build
> system (which would *NOT* need to compile anything) to update the
> file, but a scan of modified files as well as potentially a
> configuration step
> That would ensure the manifest you want describes a known build
> configuration ( which is relatively easy ) rather than describes how
> to set up a build ( which is akin as specifying a build system
> description format)
If manifest files have to reflect a build configuration, then I think
the problems we face have been made worse.
> That generated manifest file could further be used by a compiler to
> build all the dependency of a TU, but doing so would start to turn
> compiler in a build system ( minus the configuration part), which I
> don't think many people would be comfortable with.

This is what I like about Clang modules. The compiler-as-a-build-system
is optional. It is QOI performance improvement.


> On Fri, 8 Feb 2019 at 18:26 Mathias Stearn <redbeard0531_at_[hidden]
> <mailto:redbeard0531_at_[hidden]>> wrote:
> On Fri, Feb 8, 2019 at 12:33 AM Tom Honermann <tom_at_[hidden]
> <mailto:tom_at_[hidden]>> wrote:
> I've been recently claiming two properties of Clang Modules
> that I believe have been central to their success.
> 1. Clang modules are built on #include directives in such a
> way that existing tools that have no knowledge of Clang
> modules continue to work as they always have.
> 2. Modules are built implicitly on demand (by default) such
> that build system updates are not required (other than to
> pass '-fmodules' to enable the feature).
> Unfortunately that design of "compiler handles everything, build
> systems are oblivious" means that clang modules break several
> important build-system-adjacent tools, such as ccache[1] and
> icecream[2]. distcc is likely also affected since it originally
> worked the same as icecream. It is possible that the new "pump"
> mode makes it work in distcc, but I don't have a cluster to test
> that on.
> I think the clang modules design makes it somewhere between hard
> and impossible for these kinds of tools to work well with them.
> Support for distributed builds is one of my major concerns with
> modules. Almost any form of modules that isn't just "better
> scoping in headers with no caching" will make distributed builds
> more complicated than today. I want to hope that this problem is
> solvable though. Having the machinery hidden in the compiler
> rather than explicitly managed makes it substantially harder
> (while admittedly making simple builds simpler).
> [1]
> https://github.com/ccache/ccache/blob/2753dafa38e14bfc5d4bb5c2b692edad964aaef6/src/compopt.c#L66
> [2] This is how I tested. It also fails with remote cpp enabled.
> If there is a better way, I'd be happy to try it.
> /usr/lib/icecream/bin/icecc clang++ -fmodules -c test.cpp
> test.cpp:1:29: fatal error: module 'Header' not found
> #pragma clang module import Header /* clang -E: implicit import
> for #include "header.h" */
> _______________________________________________
> Tooling mailing list
> Tooling_at_[hidden] <mailto:Tooling_at_[hidden]>
> http://www.open-std.org/mailman/listinfo/tooling
> _______________________________________________
> Tooling mailing list
> Tooling_at_[hidden]
> http://www.open-std.org/mailman/listinfo/tooling

Received on 2019-02-08 20:01:48