[LLVMdev] Repository Layout

Chris Lattner sabre at nondot.org
Mon Jul 2 00:38:20 PDT 2007


On Sat, 30 Jun 2007, Reid Spencer wrote:
> I'm finding the current layout a bit frustrating, not to mention that it
> breaks all the documentation. We currently have modules laid out like
> this:
>   llvm/trunk/...
>   llvm/branches/...
>   llvm/tags/...
>   stacker/trunk/...
>   stacker/branches/...
>   stacker/tags/...
>
> and similarly for all the other modules (test-suite, java, poolalloc,
> etc.). Unfortunately, this "standard" layout interjects a directory
> (trunk/branches/tags) below each module name. I would rather see it laid
> out like this:
>
>   trunk/llvm/...
>   trunk/stacker/...
>   trunk/java/...
> Fortunately, with SVN, making such a change isn't hard and its tracked
> in the commits. Anyone object or have other ideas in this realm?

I strongly dislike this approach.  This is particularly bad because we 
have many subprojects.  Lots of these subprojects are only loosly coupled 
to LLVM: things like llvm-tv, llvm-java, llvm-poolalloc, etc.

I think that it is natural for subprojects to go through various 
development phases and to sink or swim based on their own merits and the 
contributor base around them.  Our goal should be to make it as easy as
possible to check out the desired subset of LLVM and get going quickly.

Instead of trying to make a mega project, I suggest something else.  What 
I'd really like to see is this:

1. I check out the "llvm-project" into a directory.  This provides some
    very very basic makefiles and configure script stuff.  This does not
    try to solve all the worlds problems, it is just some simple glue.
2. Based on my interests, I check out a subset of the subprojects into
    directories under llvm-project.
3. Each subproject knows the projects it depends on - either as a hard
    dependency (requirement) or a soft dependency (optional component).
4. Once the stuff is checked out, you type "configure".  Based on the glue
    in #1, this checks to ensure that the various dependencies required are
    checked out.  If not, it errors out, telling you what else to check out
    (or offering to do it for you?)
5. make, make test, make install, etc are provided by the glue.  These
    simply recurse into the subdirectories in the appropriate order and
    invoke the respective targets.

With this design, I'd suggest refactoring the LLVM project a little bit. 
I'd like to see:

1. a subproject for libsupport and libsystem.
2. a subproject for the rest of the "llvm" project.  sometime later we can
    separate out vmcore perhaps.
3. a subproject for llvm-gcc, which depends on #1 and #2.
4. a subproject for the new c front-end, which has a hard requirement on
    #1 and a optional requirement for #2.
5. HLVM, llvm-tv, etc (the ones other people care about :)

One of the big in-between things is llvm-config.  I've grown to *love* 
this tool, but it only works for the main llvm project.  I'd like to see 
it move up and works as part of the glue, so that it is easy to 
link/include anything that is part of the "llvm-project".

The overall goal is to make the system more modular (NOT more monolithic) 
and to make it easier to get stuff started: it should be enough to check 
out the llvm-project glue (very very quick checkout) and run "make 
get-me-llvm-gcc-and-build-it" :)

As an aside, I've been working on a revamp of the website, to make *it* 
more modular, which is also required for the docs.  I think it's 
amazing(ly bad) that we don't have a documentation subsection for llvm-gcc 
anywhere!

Thoughts?

-Chris

-- 
http://nondot.org/sabre/
http://llvm.org/



More information about the llvm-dev mailing list