123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320 |
- ===============
- 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.
- 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).
- 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.
|