LLVMBuild.html   [plain text]


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <title>LLVMBuild Documentation</title>
  <link rel="stylesheet" href="_static/llvm.css" type="text/css">
</head>
<body>

<h1>LLVMBuild Guide</h1>

<ol>
  <li><a href="#introduction">Introduction</a></li>
  <li><a href="#projectorg">Project Organization</a></li>
  <li><a href="#buildintegration">Build Integration</a></li>
  <li><a href="#componentoverview">Component Overview</a></li>
  <li><a href="#formatreference">Format Reference</a></li>
</ol>

<!-- *********************************************************************** -->
<h2><a name="introduction">Introduction</a></h2>
<!-- *********************************************************************** -->

<div>
  <p>This document describes the <tt>LLVMBuild</tt> 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.</p>

  <p>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.</p>

  <p>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
  <tt>LLVMBuild.txt</tt> 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.</p>
</div>

<!-- *********************************************************************** -->
<h2><a name="projectorg">Project Organization</a></h2>
<!-- *********************************************************************** -->

<!-- FIXME: We should probably have an explicit top level project object. Good
place to hang project level data, name, etc. Also useful for serving as the
$ROOT of project trees for things which can be checked out separately. -->

<div>
  <p>The source code for LLVM projects using the LLVMBuild system (LLVM, Clang,
  and LLDB) is organized into <em>components</em>, 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).</p>

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

  <p>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 <tt>LLVMBuild.txt</tt> description file.</p>
</div>

<!-- *********************************************************************** -->
<h2><a name="buildintegration">Build Integration</a></h2>
<!-- *********************************************************************** -->

<div>
  <p>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 <a href="MakefileGuide.html">Makefiles</a>
  and <a href="CMake.html">CMake</a>.</p>

  <p>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 <i>LLVMBuild.txt</i> files change.</p>

  <p>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 <i>LLVMBuild.txt</i> description files (although we
  have not reached this goal yet).</p>

  <p>For more information on the utility tool we provide to help interfacing
  with the build system, please see
  the <a href="CommandGuide/html/llvm-build.html">llvm-build</a>
  documentation.</p>
</div>

<!-- *********************************************************************** -->
<h2><a name="componentoverview">Component Overview</a></h2>
<!-- *********************************************************************** -->

<div>
  <p>As mentioned earlier, LLVM projects are organized into
  logical <em>components</em>. 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.</p>

  <p>LLVM primarily uses the following types of components:</p>
  <ul>
    <li><em>Libraries</em> - 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.</li>

    <li><em>Build Tools</em> - 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 <a href="TableGenFundamentals.html">TableGen</a> to generate a
    variety of source files.</li>

    <li><em>Tools</em> - Command line applications which are built using the
    LLVM component libraries. Most LLVM tools are small and are primarily
    frontends to the library interfaces.</li>

<!-- FIXME: We also need shared libraries as a first class component, but this
     is not yet implemented. -->
  </ul>

  <p>Components are described using <em>LLVMBuild.txt</em> files in the
  directories that define the component. See
  the <a href="#formatreference">Format Reference</a> section for information on
  the exact format of these files.</p>
</div>

<!-- *********************************************************************** -->
<h2><a name="formatreference">LLVMBuild Format Reference</a></h2>
<!-- *********************************************************************** -->

<div>
  <p>LLVMBuild files are written in a simple variant of the INI or configuration
  file format (<a href="http://en.wikipedia.org/wiki/INI_file">Wikipedia
  entry</a>). 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:</p>
  <div class="doc_code">
  <pre>
<i>; Comments start with a semi-colon.</i>

<i>; Sections are declared using square brackets.</i>
[component_0]

<i>; 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.</i>
property_name = property_value
list_property_name = value_1 value_2 <em>...</em> value_n
boolean_property_name = 1 <em>(or 0)</em>
</pre>
  </div>

  <p>LLVMBuild files are expected to define a strict set of sections and
  properties. An typical component description file for a library
  component would look typically look like the following example:</p>
  <div class="doc_code">
  <pre>
[component_0]
type = Library
name = Linker
parent = Libraries
required_libraries = Archive BitReader Core Support TransformUtils
</pre>
  </div>

  <p>A full description of the exact sections and properties which are allowed
 follows.</p>

  <p>Each file may define exactly one common component, named "common". The
  common component may define the following properties:</p>
  <ul>
    <li><i>subdirectories</i> <b>[optional]</b>
      <p>If given, a list of the names of the subdirectories from the current
        subpath to search for additional LLVMBuild files.</p></li>
  </ul>

  <p>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).<p>

  <p><b>Section names not matching this format (or the "common" section) are
  currently unused and are disallowed.</b></p>

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

  <p>Every component must define the following properties:</p>
  <ul>
    <li><i>type</i> <b>[required]</b>
      <p>The type of the component. Supported component types are
      detailed below. Most components will define additional properties which
      may be required or optional.</p></li>

    <li><i>name</i> <b>[required]</b>
      <p>The name of the component. Names are required to be unique
      across the entire project.</p></li>

    <li><i>parent</i> <b>[required]</b>
      <p>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.</p>

      <!-- FIXME: Should we make the parent optional, and default to parent
      directories component? -->

      <p>Components may reference the root pseudo component using '$ROOT' to
      indicate they should logically be grouped at the top-level.</p>
    </li>
  </ul>

  <p>Components may define the following properties:</p>
  <ul>
    <li><i>dependencies</i> <b>[optional]</b>
      <p>If specified, a list of names of components which <i>must</i> 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.</p>

      <p><em>NOTE:</em> Group and LibraryGroup components have no semantics for
      the actual build, and are not allowed to specify dependencies.</p></li>
  </ul>

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

  <ul>
    <li><i>type = Group</i>
      <p>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.</p>

      <p>Group components have no additionally properties.</p>
    </li>

    <li><i>type = Library</i>
      <p>Library components define an individual library which should be built
      from the source code in the component directory.</p>

      <p>Components with this type use the following properties:</p>
      <ul>
        <li><i>library_name</i> <b>[optional]</b>
          <p>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.</p></li>

        <li><i>required_libraries</i> <b>[optional]</b>
          <p>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 <i>required_libraries</i> for the components the tool needs.</p></li>

        <li><i>add_to_library_groups</i> <b>[optional]</b>
          <p>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 <i>X86</i> target might define a library
          group for all of the <i>X86</i> components. That library group might
          then be included in the <i>all-targets</i> library group.</p></li>

        <li><i>installed</i> <b>[optional]</b> <b>[boolean]</b>
          <p>Whether this library is installed. Libraries that are not installed
          are only reported by <tt>llvm-config</tt> when it is run as part of a
          development directory.</p></li>
      </ul>
    </li>

    <li><i>type = LibraryGroup</i>
      <p>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".</p>

      <p>Components with this type use the following properties:</p>
      <ul>
        <li><i>required_libraries</i> <b>[optional]</b>
          <p>See the Library type for a description of this property.</p></li>

        <li><i>add_to_library_groups</i> <b>[optional]</b>
          <p>See the Library type for a description of this property.</p></li>
      </ul>
    </li>

    <li><i>type = TargetGroup</i>
      <p>TargetGroup components are an extension of LibraryGroups, specifically
      for defining LLVM targets (which are handled specially in a few
      places).</p>

      <p>The name of the component should always be the name of the target.</p>

      <p>Components with this type use the LibraryGroup properties in addition
      to:</p>
      <ul>
        <li><i>has_asmparser</i> <b>[optional]</b> <b>[boolean]</b>
          <p>Whether this target defines an assembly parser.</p></li>
        <li><i>has_asmprinter</i> <b>[optional]</b> <b>[boolean]</b>
          <p>Whether this target defines an assembly printer.</p></li>
        <li><i>has_disassembler</i> <b>[optional]</b> <b>[boolean]</b>
          <p>Whether this target defines a disassembler.</p></li>
        <li><i>has_jit</i> <b>[optional]</b> <b>[boolean]</b>
          <p>Whether this target supports JIT compilation.</p></li>
      </ul>
    </li>

    <li><i>type = Tool</i>
      <p>Tool components define standalone command line tools which should be
      built from the source code in the component directory and linked.</p>

      <p>Components with this type use the following properties:</p>
      <ul>
        <li><i>required_libraries</i> <b>[optional]</b>

          <p>If given, a list of the names of Library or LibraryGroup components
          which this tool is required to be linked with. <b>NOTE:</b> The values
          should be the component names, which may not always match up with the
          actual library names on disk.</p>

          <p>Build systems are expected to properly include all of the libraries
          required by the linked components (i.e., the transitive closer
          of <em>required_libraries</em>).</p>

          <p>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 <i>dependencies</i>.</p></li>
      </ul>
    </li>

    <li><i>type = BuildTool</i>
      <p>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.</p>

      <p>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.</p>
    </li>
  </ul>
</div>

<!-- *********************************************************************** -->
<hr>
<address>
  <a href="http://jigsaw.w3.org/css-validator/check/referer"><img
  src="http://jigsaw.w3.org/css-validator/images/vcss-blue" alt="Valid CSS"></a>
  <a href="http://validator.w3.org/check/referer"><img
  src="http://www.w3.org/Icons/valid-html401-blue" alt="Valid HTML 4.01"></a>

  <a href="http://llvm.org/">The LLVM Compiler Infrastructure</a><br>
  Last modified: $Date$
</address>
</body>
</html>