[libcxx-dev] [llvm-dev] RFC: A top level monorepo CMake file
Steven Wu via libcxx-dev
libcxx-dev at lists.llvm.org
Thu Jun 18 12:07:24 PDT 2020
> On Jun 18, 2020, at 11:40 AM, Josh Stone <jistone at redhat.com> wrote:
>
> On 6/18/20 11:27 AM, Steven Wu via llvm-dev wrote:
>> I like the proposal but I would like to go even further. If we are going
>> to create a top level CMake file, we should just go ahead and eliminate
>> all the standalone build configuration. The standalone build should just
>> be `cmake <monorepo-root> -DLLVM_ENABLE_PROJECTS=standalone-project
>> ...`. That means less build configuration to maintain which is always good.
>
> This would break the release of standalone source tarballs, no?
That is a problem we can fix. We just need to ship those tarballs with some processing by including the top-level cmake and cmake modules, and removing all other subdirectories.
I don't think we have split standalone repo so it is just about release management. Yes, all the clients will have to build standalone projects differently so it is a workflow break but it should be acceptable.
Steven
>
>> That also means that we can refactor some of the cmake modules to put
>> into the top level directories so sub-projects can just reuse them
>> without duping the code worrying they are not available in the
>> standalone build today.
>>
>> Steven
>>
>>> On Jun 18, 2020, at 10:57 AM, Louis Dionne via llvm-dev
>>> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>>>
>>> Hi folks,
>>>
>>> Building any LLVM project currently requires invoking CMake inside
>>> <monorepo-root>/llvm, while setting the projects to enable in the
>>> LLVM_ENABLE_PROJECTS variable. This has the downside that CMake
>>> processing for the LLVM subproject happens even when one doesn't
>>> really need or want it. It's also not great from a build hygiene
>>> perspective, as LLVM globally sets some flags and subprojects pick
>>> them up, when they don't really mean to. For example, see this
>>> workaround:
>>> https://github.com/llvm/llvm-project/blob/master/libcxx/CMakeLists.txt#L503-L507,
>>> where we need to account for some flags that might have been set
>>> globally by LLVM.
>>>
>>> I'm not sure about other projects, however this is quite problematic
>>> for projects part of the C++ runtime (libc++/libc++abi/libunwind).
>>> Indeed, we often try to build those projects targetting not widely
>>> supported platforms, where the overall LLVM build doesn't work. For
>>> example, trying to use the LLVM_ENABLE_PROJECTS approach for building
>>> libc++ for Apple's DriverKit environment doesn't work, since it has a
>>> few unusual things that the LLVM build chokes on. However, building
>>> libc++ standalone works just fine because it has far fewer
>>> requirements. It's also not just an issue of working vs not working:
>>> because of global flag pollution, building libc++ standalone and as
>>> part of the rest of LLVM can result in slightly different flags being
>>> used, which could cause important and hard-to-diagnose issues.
>>>
>>> Hence, I think we should introduce a way to build LLVM projects (or at
>>> least the runtimes) without going through
>>> <monorepo-root>/llvm/CMakeLists.txt. What I suggest is to have a
>>> top-level <monorepo-root>/CMakeLists.txt whose sole job is to include
>>> subprojects. We could also place basic LLVM-wide things like the check
>>> for the minimum CMake version there. More specifically, I would like
>>> to be able to do:
>>>
>>> Â Â $ cd <monorepo-root>
>>> Â Â $ mkdir build
>>> Â Â $ (cd build && cmake <monorepo-root>
>>> -DLLVM_ENABLE_PROJECTS="<projects-to-enable>")
>>>
>>> Pretty much the only difference with today is that you'd use `cmake
>>> <monorepo-root>` instead of `cmake <monorepo-root>/llvm`.
>>>
>>> Like I said, this is a problem for the runtime projects, but I'm not
>>> sure about other projects. For the runtime projects, another option
>>> would be to only allow standalone builds. However, the runtime
>>> projects are often built in lockstep, and so running three CMake
>>> commands when one would suffice is both annoying and also an easy way
>>> to screw things up. Furthermore, the current standalone builds add
>>> complexity to the projects, because they require the ability to point
>>> to arbitrary headers/libraries from the other projects, when we really
>>> always want to point to the just-built ones.
>>>
>>> Relationship with Petr Hosek's "Runtimes" build
>>> ---------------------------------------------------------------
>>> What I'm proposing isn't a replacement for itl. The "Runtimes" build
>>> can be seen as a driver that sets up the individual
>>> libc++/libc++abi/libunwind builds with the just-built toolchain, and
>>> for the provided targets. That's really great, however it is built *on
>>> top of* the basic libc++/libc++abi/libunwind builds. So basically,
>>> after my proposal, the "Runtimes" build could simply build all
>>> elements from the runtime with a single CMake invocation, as opposed
>>> to multiple invocations.
>>>
>>> Thoughts?
>>> Louis
>>>
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
>>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>
>
More information about the libcxx-dev
mailing list