===============
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 (See: :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/index`
  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 targeted). 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.
