[cfe-dev] RFC: Upcoming Build System Changes
Nico Weber
thakis at chromium.org
Fri Oct 28 08:24:57 PDT 2011
Hi,
my 2 cents:
1) If you're targeting python 2.6 or less, I prefer a python
dependency over cmake 'cause it's already installed on all machines I
build clang on. If you're targeting 2.7+, I don't care either way.
2) On the chromium project, we're using a custom meta build system
written in python, and it's been a lot more useful than we initially
expected. Based on this experience, your proposal sounds good to me.
Nico
On Thu, Oct 27, 2011 at 6:11 PM, Daniel Dunbar <daniel at zuster.org> wrote:
> Hi all,
>
> As you might have inferred, I'm in the process of working on some changes to the
> way LLVM builds. I have outlined a rough proposal below, unless there are any
> major objections I will probably start committing stuff next week.
>
> This message may be verbose, if you want the executive summary, skip
> to 'What This
> Means For Jane "LLVM Developer" Doe' at the bottom.
>
> Motivation
> ----------
>
> We currently maintain two build systems (make, CMake). This has a couple of
> problems:
>
> * Duplication: the two build systems duplicate a significant amount of implicit
> logic (higher level dependencies), some config files, and other miscellaneous
> features.
>
> * Maintenance: Some parts of the build systems requires regular maintenance
> (the CMake file lists, CMake dependency lists, module structure). Having one
> more thing to maintain is annoying.
>
> * Inconsistency: The two build systems behave inconsistently in some ways. If
> we want both to officially supported systems, it would be nice for them to
> behave as identically as possible.
>
> For example, CMake now uses explicit dependencies which are hard coded into
> the CMake files, but the Makefiles work completely differently.
>
> There are also other general issues with the way LLVM is built now:
>
> * LLVM has a higher level structure for its organization, but this is not
> explicit. LLVM is roughly organized into components (libraries, tools, etc.)
> by directory. It would be nice to have this be more explicit.
>
> * Much of the project build structure is implicit in the Makefiles or
> CMakeFiles. It is not particularly explicit anywhere that, say, parts of
> VMCore depend on building the Intrinsics, which depend on building tblgen.
>
> * The Make system is not very efficient. We use recursive Makefiles which make
> the current system (relatively) simple in some ways, but mean the Make build
> is not nearly as scalable as it could be. In particular, the current
> organization means the built is often serialized on something that is not a
> strict dependency. It also makes it much more likely to do things like a
> stampeding link of all the tools, even though many tools could have been
> built earlier.
>
>
> Specific Goals
> --------------
>
> * Move both build systems to use explicit library dependencies, in a clean
> fashion. The CMake files do this now, but I don't think it has been made
> clear to developers when they are supposed to edit these files, or how (other
> than when something breaks, I guess).
>
> * Explicitly describe as much of the project structure as necessary to support
> builds. This means explicitly specifying how the project is organized, and
> the dependencies among the components required to build (e.g., Intrinsics
> before VMCore).
>
> I believe a number of other projects/users (FreeBSD, fbuild) have
> built there own
> build system for LLVM. Encoding the project structure clearly should make it
> easier for such projects, or for other future users that want to do the same.
>
> This should make it easier to experiment with the build system, for example
> we could just directly generate good Makefiles for our project, or could
> experiment with systems like Ninja which expect to be targetted by a
> generator of some kind.
>
>
> Proposal
> --------
>
> My initial proposal is focused at moving us to use explicit library
> dependencies, but paves the way for centralizing more "build systemy" stuff in
> the future.
>
> * Every LLVM "component" (roughly corresponds to each place we have a Makefile
> or CMakeLists.txt currently) will get a 'LLVMBuild.txt' file.
>
> This file will be an LLVM specific description of that component. Initially,
> it will look something like this::
>
> [component]
> # The kind of component this is (currently library, tool, build tool). More
> # types will be defined over time.
> type = Library
>
> # The name of the component.
> name = VMCore
>
> # The name of the component to logically group this in. This is just for
> # organization purposes.
> parent = Libraries
>
> # The names of the library components that are also required when linking
> # with this library. More on this later.
> required_libraries = Support
>
> The exact structure of the format is TBD (and easy to change), currently the
> format is INI style but I may decide to change to JSON once all the pieces
> are in place.
>
> The LLVM web pages will have clear documentation on what these files should
> look like, what is required, what is supported, and so on.
>
>
> * I will add a new tool in utils/llvm-build which is designed to load and work
> with these files. This tool will be written in Python, and the expectation is
> that it can be run at configure time.
>
> TO BE CLEAR: I intend to introduce a hard dependency on requiring Python in
> order to build LLVM.
>
> For the Makefiles, this is no worse than requiring Perl, so I don't think
> there is much to argue with.
>
> For CMake, this is a new dependency. However, I feel this is unavoidable:
>
> * I see no way to support multiple build systems including CMake without
> either introducing a dependency on some extra tool (which can be shared),
> or duplicating a significant amount of logic in CMake.
>
> I believe that duplicating logic is worse than adding the Python
> dependency, and I think we already have more CMake code (a relatively
> horrible language) than can be expected for most LLVM developers to deal
> with.
>
> Additionally, we already require Python for running our tests, so anyone
> doing serious LLVM development should have it.
>
> The one use case I believe this particularly hurts is users who just want to
> download and play with LLVM, but I believe the Right Answer (tm) for that
> case would be for us to provide nice installer packages anyway.
>
>
> * utils/llvm-build will be run during configure time (both for Make and CMake),
> and will:
>
> * Generate the library dependency information required to link tools, in
> whatever format makes the most system for the build system in use.
>
> * Generate a C++ .inc file containing the dependency table for use by
> llvm-config (which I am going to rewrite in C++).
>
> * Add dependencies on the LLVMBuild.txt files to the build system, so that
> the build will reconfigure appropriately when the library
> requirements change.
>
>
> * Remove GenLibDeps.pl, find-cycles.pl, etc.
>
> We will no longer be using these after llvm-config has moved over.
>
>
> * Add explicit source file lists to the LLVMBuild.txt files. Unfortunately,
> this is inevitable if we want to support CMake users projects automatically
> reconfiguring themselves when new files get added. I can make it easier to
> manage (for example, provide build targets that will automatically add any
> new files).
>
>
> * Move both Make and CMake over to using the explicit file lists in the
> LLVMBuild files. This ensures that both systems get the same behavior
> (instead of Make users being able to add files and forget to update
> CMakeLists.txt).
>
>
> * Add new 'lit' tests to check that the library dependency
> information is correct.
>
> This seems a nicer place to do the checking which is currently partially
> handled by find-cycles, and we should also be able to do a better job of the
> checking (for example, verifying that the dependency list is "exact" -- only
> specifies the minimum set of libraries required, and isn't allowed to specify
> libraries which are only indirectly required).
>
> It would be particularly cool if we could just write these tests using our
> Object libraries.
>
> This is one piece I haven't prototyped yet. I can obviously do something as
> good as the current find-cycles.pl, but I hope to do better (eventually).
>
>
> * These are just the first steps, after this I will continue to incrementally
> try and move as much common information out of the Make and CMake systems so
> there is "one source of truth" with regard to the project definition.
>
>
> * I assume it is obvious, but when I say "LLVM" here I am referring to both
> LLVM and Clang. I have not looked at lldb yet, but if it uses the LLVM build
> system (and llvm-config) functionality I will try to make sure it
> continues to work.
>
>
> What This Means For Jane "LLVM Developer" Doe
> ---------------------------------------------
>
> In practice, this means:
>
> * LLVM requires Python to build.
>
> * When you add a file to LLVM, you will need to edit LLVMBuild.txt instead of
> CMakeLists.txt, which will be in a slightly different, but otherwise totally
> obvious format.
>
> If you forget to do this, your file will not be built (which will most likely
> cause a link error eventually). This is better than it being built by Make,
> but causing CMake build failures when you check in.
>
> * When you add a new library requirement to an existing component, you will be
> required to edit LLVMBuild.txt instead of CMakeLists.txt, which will be in a
> slightly different, but otherwise totally obvious (hopefully) format.
>
> If you forget to do this, you will either get a link error or a test
> failure. This is better than library you need transparently getting linked in
> (with make) because it forces you to think about whether you actually should
> be adding that dependency.
>
> The goal is that this also ensures that if LLVM links and passes tests on
> your system, then it should for everyone else as well.
>
> * Developers not actively touching the build system should never need to touch
> a Makefile or a CMake file.
>
> Overall, I believe this should be a quality of life improvement for the
> developer community. The only downside is having to deal with a new non-standard
> LLVM specific format, but I plan to solve this through documentation.
>
> Comments?
>
> - Daniel
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
More information about the cfe-dev
mailing list