===============
LLVMBuild Guide
===============

.. contents::
   :local:

Introduction
============

This document describes the ``LLVMBuild`` organization and files which
we use to describe parts of the LLVM ecosystem. For description of
specific LLVMBuild related tools, please see the command guide.

LLVM is designed to be a modular set of libraries which can be flexibly
mixed together in order to build a variety of tools, like compilers,
JITs, custom code generators, optimization passes, interpreters, and so
on. Related projects in the LLVM system like Clang and LLDB also tend to
follow this philosophy.

In order to support this usage style, LLVM has a fairly strict structure
as to how the source code and various components are organized. The
``LLVMBuild.txt`` files are the explicit specification of that
structure, and are used by the build systems and other tools in order to
develop the LLVM project.

Project Organization
====================

The source code for LLVM projects using the LLVMBuild system (LLVM,
Clang, and LLDB) is organized into *components*, which define the
separate pieces of functionality that make up the project. These
projects may consist of many libraries, associated tools, build tools,
or other utility tools (for example, testing tools).

For the most part, the project contents are organized around defining
one main component per each subdirectory. Each such directory contains
an ``LLVMBuild.txt`` which contains the component definitions.

The component descriptions for the project as a whole are automatically
gathered by the LLVMBuild tools. The tools automatically traverse the
source directory structure to find all of the component description
files. NOTE: For performance/sanity reasons, we only traverse into
subdirectories when the parent itself contains an ``LLVMBuild.txt``
description file.

Build Integration
=================

The LLVMBuild files themselves are just a declarative way to describe
the project structure. The actual building of the LLVM project is
handled by another build system (currently we support both
:doc:`Makefiles <MakefileGuide>` and :doc:`CMake <CMake>`).

The build system implementation will load the relevant contents of the
LLVMBuild files and use that to drive the actual project build.
Typically, the build system will only need to load this information at
"configure" time, and use it to generative native information. Build
systems will also handle automatically reconfiguring their information
when the contents of the ``LLVMBuild.txt`` files change.

Developers generally are not expected to need to be aware of the details
of how the LLVMBuild system is integrated into their build. Ideally,
LLVM developers who are not working on the build system would only ever
need to modify the contents of the ``LLVMBuild.txt`` description files
(although we have not reached this goal yet).

For more information on the utility tool we provide to help interfacing
with the build system, please see the :doc:`llvm-build
<CommandGuide/llvm-build>` documentation.

Component Overview
==================

As mentioned earlier, LLVM projects are organized into logical
*components*. Every component is typically grouped into its own
subdirectory. Generally, a component is organized around a coherent
group of sources which have some kind of clear API separation from other
parts of the code.

LLVM primarily uses the following types of components:

- *Libraries* - Library components define a distinct API which can be
  independently linked into LLVM client applications. Libraries typically
  have private and public header files, and may specify a link of required
  libraries that they build on top of.
- *Build Tools* - Build tools are applications which are designed to be run
  as part of the build process (typically to generate other source files).
  Currently, LLVM uses one main build tool called :doc:`TableGen
  <TableGenFundamentals>` to generate a variety of source files.
- *Tools* - Command line applications which are built using the LLVM
  component libraries. Most LLVM tools are small and are primarily
  frontends to the library interfaces.

Components are described using ``LLVMBuild.txt`` files in the directories
that define the component. See the `LLVMBuild Format Reference`_ section
for information on the exact format of these files.

LLVMBuild Format Reference
==========================

LLVMBuild files are written in a simple variant of the INI or configuration
file format (`Wikipedia entry`_). The format defines a list of sections
each of which may contain some number of properties. A simple example of
the file format is below:

.. _Wikipedia entry: http://en.wikipedia.org/wiki/INI_file

.. code-block:: ini

   ; Comments start with a semi-colon.

   ; Sections are declared using square brackets.
   [component_0]

   ; Properties are declared using '=' and are contained in the previous section.
   ;
   ; We support simple string and boolean scalar values and list values, where
   ; items are separated by spaces. There is no support for quoting, and so
   ; property values may not contain spaces.
   property_name = property_value
   list_property_name = value_1 value_2 ... value_n
   boolean_property_name = 1 (or 0)

LLVMBuild files are expected to define a strict set of sections and
properties. A typical component description file for a library
component would look like the following example:

.. code-block:: ini

   [component_0]
   type = Library
   name = Linker
   parent = Libraries
   required_libraries = Archive BitReader Core Support TransformUtils

A full description of the exact sections and properties which are
allowed follows.

Each file may define exactly one common component, named ``common``. The
common component may define the following properties:

-  ``subdirectories`` **[optional]**

   If given, a list of the names of the subdirectories from the current
   subpath to search for additional LLVMBuild files.

Each file may define multiple components. Each component is described by a
section who name starts with ``component``. The remainder of the section
name is ignored, but each section name must be unique. Typically components
are just number in order for files with multiple components
(``component_0``, ``component_1``, and so on).

.. warning::

   Section names not matching this format (or the ``common`` section) are
   currently unused and are disallowed.

Every component is defined by the properties in the section. The exact
list of properties that are allowed depends on the component type.
Components **may not** define any properties other than those expected
by the component type.

Every component must define the following properties:

-  ``type`` **[required]**

   The type of the component. Supported component types are detailed
   below. Most components will define additional properties which may be
   required or optional.

-  ``name`` **[required]**

   The name of the component. Names are required to be unique across the
   entire project.

-  ``parent`` **[required]**

   The name of the logical parent of the component. Components are
   organized into a logical tree to make it easier to navigate and
   organize groups of components. The parents have no semantics as far
   as the project build is concerned, however. Typically, the parent
   will be the main component of the parent directory.

   Components may reference the root pseudo component using ``$ROOT`` to
   indicate they should logically be grouped at the top-level.

Components may define the following properties:

-  ``dependencies`` **[optional]**

   If specified, a list of names of components which *must* be built
   prior to this one. This should only be exactly those components which
   produce some tool or source code required for building the component.

   .. note::

      ``Group`` and ``LibraryGroup`` components have no semantics for the
      actual build, and are not allowed to specify dependencies.

The following section lists the available component types, as well as
the properties which are associated with that component.

-  ``type = Group``

   Group components exist purely to allow additional arbitrary structuring
   of the logical components tree. For example, one might define a
   ``Libraries`` group to hold all of the root library components.

   ``Group`` components have no additionally properties.

-  ``type = Library``

   Library components define an individual library which should be built
   from the source code in the component directory.

   Components with this type use the following properties:

   -  ``library_name`` **[optional]**

      If given, the name to use for the actual library file on disk. If
      not given, the name is derived from the component name itself.

   -  ``required_libraries`` **[optional]**

      If given, a list of the names of ``Library`` or ``LibraryGroup``
      components which must also be linked in whenever this library is
      used. That is, the link time dependencies for this component. When
      tools are built, the build system will include the transitive closure
      of all ``required_libraries`` for the components the tool needs.

   -  ``add_to_library_groups`` **[optional]**

      If given, a list of the names of ``LibraryGroup`` components which
      this component is also part of. This allows nesting groups of
      components.  For example, the ``X86`` target might define a library
      group for all of the ``X86`` components. That library group might
      then be included in the ``all-targets`` library group.

   -  ``installed`` **[optional]** **[boolean]**

      Whether this library is installed. Libraries that are not installed
      are only reported by ``llvm-config`` when it is run as part of a
      development directory.

-  ``type = LibraryGroup``

   ``LibraryGroup`` components are a mechanism to allow easy definition of
   useful sets of related components. In particular, we use them to easily
   specify things like "all targets", or "all assembly printers".

   Components with this type use the following properties:

   -  ``required_libraries`` **[optional]**

      See the ``Library`` type for a description of this property.

   -  ``add_to_library_groups`` **[optional]**

      See the ``Library`` type for a description of this property.

-  ``type = TargetGroup``

   ``TargetGroup`` components are an extension of ``LibraryGroup``\s,
   specifically for defining LLVM targets (which are handled specially in a
   few places).

   The name of the component should always be the name of the target.

   Components with this type use the ``LibraryGroup`` properties in
   addition to:

   -  ``has_asmparser`` **[optional]** **[boolean]**

      Whether this target defines an assembly parser.

   -  ``has_asmprinter`` **[optional]** **[boolean]**

      Whether this target defines an assembly printer.

   -  ``has_disassembler`` **[optional]** **[boolean]**

      Whether this target defines a disassembler.

   -  ``has_jit`` **[optional]** **[boolean]**

      Whether this target supports JIT compilation.

-  ``type = Tool``

   ``Tool`` components define standalone command line tools which should be
   built from the source code in the component directory and linked.

   Components with this type use the following properties:

   -  ``required_libraries`` **[optional]**

      If given, a list of the names of ``Library`` or ``LibraryGroup``
      components which this tool is required to be linked with.

      .. note::

         The values should be the component names, which may not always
         match up with the actual library names on disk.

      Build systems are expected to properly include all of the libraries
      required by the linked components (i.e., the transitive closure of
      ``required_libraries``).

      Build systems are also expected to understand that those library
      components must be built prior to linking -- they do not also need
      to be listed under ``dependencies``.

-  ``type = BuildTool``

   ``BuildTool`` components are like ``Tool`` components, except that the
   tool is supposed to be built for the platform where the build is running
   (instead of that platform being targetted). Build systems are expected
   to handle the fact that required libraries may need to be built for
   multiple platforms in order to be able to link this tool.

   ``BuildTool`` components currently use the exact same properties as
   ``Tool`` components, the type distinction is only used to differentiate
   what the tool is built for.

