[llvm-dev] wasteful cmake defaults

Robinson, Paul via llvm-dev llvm-dev at lists.llvm.org
Wed Nov 18 07:37:49 PST 2020



> -----Original Message-----
> From: llvm-dev <llvm-dev-bounces at lists.llvm.org> On Behalf Of David
> Chisnall via llvm-dev
> Sent: Wednesday, November 18, 2020 6:32 AM
> To: llvm-dev at lists.llvm.org
> Subject: Re: [llvm-dev] wasteful cmake defaults
> 
> On 17/11/2020 18:25, Luke Drummond via llvm-dev wrote:
> >> -- No build type selected, default to Debug
> > It appears that llvm's configuration forces Debug builds if the user
> > does not specify the build type.
> >
> >      https://urldefense.com/v3/__https://github.com/llvm/llvm-
> project/blob/9218ff50f93085d0a16a974db28ca8f14bc66f64/llvm/CMakeLists.txt*
> L57-
> L60__;Iw!!JmoZiZGBv3RvKRSx!pbrEqQxC9HKXzCXnbVPOezybndBSk6GZShkECVJPUB7Pjax
> HX2noFrIRX8qXPuJ15Q$
> >
> > I've just done a build of llvm and clang 10 in debug mode for X86 and
> > ARM targets and it weighs in at a whopping 75GiB. I feel that forcing
> > Debug builds in the absence of an option to be a wasteful default. It is
> > a valid and useful thing to call cmake without specifying a build type;
> > absence of a command line switch does not always imply absence of a
> > choice.
> 
> I think you are conflating two things somewhat here:
> 
>   - Is it useful to do an -O0 build without assertions or debug info?
>   - What is the most useful default build configuration?
> 
> These are somewhat separable.  As others have said, the first can be
> achieved by specifying a release build with -O0 in the CXXFLAGS.  This
> is honestly not something I've ever considered doing, because the extra
> time to run a handful of tests at -O0 is likely to offset any build-time
> improvements.  It's useful if you want to get an LLVM binary quickly,
> but not so useful if you want to actually run it.  If you run it and it
> doesn't work, then you'll still need to do a debug build to get useful
> debug information.  As such, I'm not sure that I understand the use case.
> 
> In terms of the most useful build configuration to be the default, I
> think there are a bunch of users that we need to consider:
> 
>   - Developers of LLVM
>   - Developers of downstream projects that use LLVM
>   - Package builders
>   - CI admins.
> 
> Some of these are easy.  CI admins are likely to want to configure their
> builds explicitly and so won't want to use the defaults.  Package
> builders are going to want a Release build, but generally put that in
> their configuration for the package file and so don't care too much what
> the default is.
> 
> Developers of LLVM and downstream projects are similar.  Downstream
> projects come in two flavours:
> 
>   - Ones that depend on an LLVM release version existing
>   - Ones that ship their own LLVM as a submodule.
> 
> The second is less of a problem because it will be driving the LLVM
> build from its own build infrastructure and so has a one-time cost for
> configuration and anyone building that project inherits the benefits.
> 
> The first is more of a problem because build configurations of LLVM
> change its ABI, so you need to match the LLVM build to the downstream
> project's build configuration.  This is generally fairly easy to do by
> just pointing at the llvm-config built by the specific LLVM output, so
> you can easily have Debug / Release / Whatever builds of your project
> using different llvm-config versions.  Supporting this means that you
> are already propagating config from LLVM and people building your
> project in anything other than a relase configuration need to do a
> non-default build of LLVM.
> 
> This leaves LLVM developers.  I'd assume that these are the people
> building LLVM manually the most often and so it makes sense to provide
> them with a default that makes sense.  Unfortunately, there isn't a
> single one that makes sense for developers.
> 
> For the last few years, I've been following Chandler's suggestion and
> building a Release + Asserts build and a Debug + ASan + expensive checks
> build whenever I work on LLVM.  Release with asserts is reasonably fast
> running the tests and fast to build, so a compile-test cycle is not too
> bad.  When that fails, I can switch to the other build and get something
> that's easy to debug.  I also generally try to run the entire test suite
> in this configuration once before merging to master because it picks up
> memory management bugs that may not actually break anything in the
> (simple) test cases.

My own personal default is Release + Asserts + -g1 (line tables only).
This gives tracebacks with source locations on a crash/assert, and is
noticeably faster to build than RelWithDebInfo (the main benefit to the
latter is symbolized tracebacks).  As a rule I find logging/printf to
work more effectively than a debugger so I don't usually miss having
debug info; I can always run a debug build if I have to.
--paulr

> 
> The default isn't for either of those.  I'd be quite happy for the
> default to be either Debug + ASan + expensive tests or Release +
> Asserts, but given that I have to manually configure one of them,
> there's limited value in needing less manual configuration for the other.
> 
> Perhaps the right solution is for the build to fail and tell people to
> pick one if they don't specify CMAKE_BUILD_TYPE.
> 
> David
> 
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://urldefense.com/v3/__https://lists.llvm.org/cgi-
> bin/mailman/listinfo/llvm-
> dev__;!!JmoZiZGBv3RvKRSx!pbrEqQxC9HKXzCXnbVPOezybndBSk6GZShkECVJPUB7PjaxHX
> 2noFrIRX8qo20n0jA$


More information about the llvm-dev mailing list