===================
LLVM Makefile Guide
===================

.. contents::
   :local:

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

This document provides *usage* information about the LLVM makefile system. While
loosely patterned after the BSD makefile system, LLVM has taken a departure from
BSD in order to implement additional features needed by LLVM.  Although makefile
systems, such as ``automake``, were attempted at one point, it has become clear
that the features needed by LLVM and the ``Makefile`` norm are too great to use
a more limited tool. Consequently, LLVM requires simply GNU Make 3.79, a widely
portable makefile processor. LLVM unabashedly makes heavy use of the features of
GNU Make so the dependency on GNU Make is firm. If you're not familiar with
``make``, it is recommended that you read the `GNU Makefile Manual
<http://www.gnu.org/software/make/manual/make.html>`_.

While this document is rightly part of the `LLVM Programmer's
Manual <ProgrammersManual.html>`_, it is treated separately here because of the
volume of content and because it is often an early source of bewilderment for
new developers.

General Concepts
================

The LLVM Makefile System is the component of LLVM that is responsible for
building the software, testing it, generating distributions, checking those
distributions, installing and uninstalling, etc. It consists of a several files
throughout the source tree. These files and other general concepts are described
in this section.

Projects
--------

The LLVM Makefile System is quite generous. It not only builds its own software,
but it can build yours too. Built into the system is knowledge of the
``llvm/projects`` directory. Any directory under ``projects`` that has both a
``configure`` script and a ``Makefile`` is assumed to be a project that uses the
LLVM Makefile system.  Building software that uses LLVM does not require the
LLVM Makefile System nor even placement in the ``llvm/projects``
directory. However, doing so will allow your project to get up and running
quickly by utilizing the built-in features that are used to compile LLVM. LLVM
compiles itself using the same features of the makefile system as used for
projects.

For further details, consult the `Projects <Projects.html>`_ page.

Variable Values
---------------

To use the makefile system, you simply create a file named ``Makefile`` in your
directory and declare values for certain variables.  The variables and values
that you select determine what the makefile system will do. These variables
enable rules and processing in the makefile system that automatically Do The
Right Thing (C).

Including Makefiles
-------------------

Setting variables alone is not enough. You must include into your Makefile
additional files that provide the rules of the LLVM Makefile system. The various
files involved are described in the sections that follow.

``Makefile``
^^^^^^^^^^^^

Each directory to participate in the build needs to have a file named
``Makefile``. This is the file first read by ``make``. It has three
sections:

#. Settable Variables --- Required that must be set first.
#. ``include $(LEVEL)/Makefile.common`` --- include the LLVM Makefile system.
#. Override Variables --- Override variables set by the LLVM Makefile system.

.. _$(LEVEL)/Makefile.common:

``Makefile.common``
^^^^^^^^^^^^^^^^^^^

Every project must have a ``Makefile.common`` file at its top source
directory. This file serves three purposes:

#. It includes the project's configuration makefile to obtain values determined
   by the ``configure`` script. This is done by including the
   `$(LEVEL)/Makefile.config`_ file.

#. It specifies any other (static) values that are needed throughout the
   project. Only values that are used in all or a large proportion of the
   project's directories should be placed here.

#. It includes the standard rules for the LLVM Makefile system,
   `$(LLVM_SRC_ROOT)/Makefile.rules`_.  This file is the *guts* of the LLVM
   ``Makefile`` system.

.. _$(LEVEL)/Makefile.config:

``Makefile.config``
^^^^^^^^^^^^^^^^^^^

Every project must have a ``Makefile.config`` at the top of its *build*
directory. This file is **generated** by the ``configure`` script from the
pattern provided by the ``Makefile.config.in`` file located at the top of the
project's *source* directory. The contents of this file depend largely on what
configuration items the project uses, however most projects can get what they
need by just relying on LLVM's configuration found in
``$(LLVM_OBJ_ROOT)/Makefile.config``.

.. _$(LLVM_SRC_ROOT)/Makefile.rules:

``Makefile.rules``
^^^^^^^^^^^^^^^^^^

This file, located at ``$(LLVM_SRC_ROOT)/Makefile.rules`` is the heart of the
LLVM Makefile System. It provides all the logic, dependencies, and rules for
building the targets supported by the system. What it does largely depends on
the values of ``make`` `variables`_ that have been set *before*
``Makefile.rules`` is included.

Comments
^^^^^^^^

User ``Makefile``\s need not have comments in them unless the construction is
unusual or it does not strictly follow the rules and patterns of the LLVM
makefile system. Makefile comments are invoked with the pound (``#``) character.
The ``#`` character and any text following it, to the end of the line, are
ignored by ``make``.

Tutorial
========

This section provides some examples of the different kinds of modules you can
build with the LLVM makefile system. In general, each directory you provide will
build a single object although that object may be composed of additionally
compiled components.

Libraries
---------

Only a few variable definitions are needed to build a regular library.
Normally, the makefile system will build all the software into a single
``libname.o`` (pre-linked) object. This means the library is not searchable and
that the distinction between compilation units has been dissolved. Optionally,
you can ask for a shared library (.so) or archive library (.a) built.  Archive
libraries are the default. For example:

.. code-block:: makefile

  LIBRARYNAME = mylib
  SHARED_LIBRARY = 1
  BUILD_ARCHIVE = 1

says to build a library named ``mylib`` with both a shared library
(``mylib.so``) and an archive library (``mylib.a``) version. The contents of all
the libraries produced will be the same, they are just constructed differently.
Note that you normally do not need to specify the sources involved. The LLVM
Makefile system will infer the source files from the contents of the source
directory.

The ``LOADABLE_MODULE=1`` directive can be used in conjunction with
``SHARED_LIBRARY=1`` to indicate that the resulting shared library should be
openable with the ``dlopen`` function and searchable with the ``dlsym`` function
(or your operating system's equivalents). While this isn't strictly necessary on
Linux and a few other platforms, it is required on systems like HP-UX and
Darwin. You should use ``LOADABLE_MODULE`` for any shared library that you
intend to be loaded into an tool via the ``-load`` option.  :ref:`Pass
documentation <writing-an-llvm-pass-makefile>` has an example of why you might
want to do this.

Loadable Modules
^^^^^^^^^^^^^^^^

In some situations, you need to create a loadable module. Loadable modules can
be loaded into programs like ``opt`` or ``llc`` to specify additional passes to
run or targets to support.  Loadable modules are also useful for debugging a
pass or providing a pass with another package if that pass can't be included in
LLVM.

LLVM provides complete support for building such a module. All you need to do is
use the ``LOADABLE_MODULE`` variable in your ``Makefile``. For example, to build
a loadable module named ``MyMod`` that uses the LLVM libraries ``LLVMSupport.a``
and ``LLVMSystem.a``, you would specify:

.. code-block:: makefile

  LIBRARYNAME := MyMod
  LOADABLE_MODULE := 1
  LINK_COMPONENTS := support system

Use of the ``LOADABLE_MODULE`` facility implies several things:

#. There will be no "``lib``" prefix on the module. This differentiates it from
    a standard shared library of the same name.

#. The `SHARED_LIBRARY`_ variable is turned on.

#. The `LINK_LIBS_IN_SHARED`_ variable is turned on.

A loadable module is loaded by LLVM via the facilities of libtool's libltdl
library which is part of ``lib/System`` implementation.

Tools
-----

For building executable programs (tools), you must provide the name of the tool
and the names of the libraries you wish to link with the tool. For example:

.. code-block:: makefile

  TOOLNAME = mytool
  USEDLIBS = mylib
  LINK_COMPONENTS = support system

says that we are to build a tool name ``mytool`` and that it requires three
libraries: ``mylib``, ``LLVMSupport.a`` and ``LLVMSystem.a``.

Note that two different variables are used to indicate which libraries are
linked: ``USEDLIBS`` and ``LLVMLIBS``. This distinction is necessary to support
projects. ``LLVMLIBS`` refers to the LLVM libraries found in the LLVM object
directory. ``USEDLIBS`` refers to the libraries built by your project. In the
case of building LLVM tools, ``USEDLIBS`` and ``LLVMLIBS`` can be used
interchangeably since the "project" is LLVM itself and ``USEDLIBS`` refers to
the same place as ``LLVMLIBS``.

Also note that there are two different ways of specifying a library: with a
``.a`` suffix and without. Without the suffix, the entry refers to the re-linked
(.o) file which will include *all* symbols of the library.  This is
useful, for example, to include all passes from a library of passes.  If the
``.a`` suffix is used then the library is linked as a searchable library (with
the ``-l`` option). In this case, only the symbols that are unresolved *at
that point* will be resolved from the library, if they exist. Other
(unreferenced) symbols will not be included when the ``.a`` syntax is used. Note
that in order to use the ``.a`` suffix, the library in question must have been
built with the ``BUILD_ARCHIVE`` option set.

JIT Tools
^^^^^^^^^

Many tools will want to use the JIT features of LLVM.  To do this, you simply
specify that you want an execution 'engine', and the makefiles will
automatically link in the appropriate JIT for the host or an interpreter if none
is available:

.. code-block:: makefile

  TOOLNAME = my_jit_tool
  USEDLIBS = mylib
  LINK_COMPONENTS = engine

Of course, any additional libraries may be listed as other components.  To get a
full understanding of how this changes the linker command, it is recommended
that you:

.. code-block:: bash

  % cd examples/Fibonacci
  % make VERBOSE=1

Targets Supported
=================

This section describes each of the targets that can be built using the LLVM
Makefile system. Any target can be invoked from any directory but not all are
applicable to a given directory (e.g. "check", "dist" and "install" will always
operate as if invoked from the top level directory).

================= ===============      ==================
Target Name       Implied Targets      Target Description
================= ===============      ==================
``all``           \                    Compile the software recursively. Default target.
``all-local``     \                    Compile the software in the local directory only.
``check``         \                    Change to the ``test`` directory in a project and run the test suite there.
``check-local``   \                    Run a local test suite. Generally this is only defined in the  ``Makefile`` of the project's ``test`` directory.
``clean``         \                    Remove built objects recursively.
``clean-local``   \                    Remove built objects from the local directory only.
``dist``          ``all``              Prepare a source distribution tarball.
``dist-check``    ``all``              Prepare a source distribution tarball and check that it builds.
``dist-clean``    ``clean``            Clean source distribution tarball temporary files.
``install``       ``all``              Copy built objects to installation directory.
``preconditions`` ``all``              Check to make sure configuration and makefiles are up to date.
``printvars``     ``all``              Prints variables defined by the makefile system (for debugging).
``tags``          \                    Make C and C++ tags files for emacs and vi.
``uninstall``     \                    Remove built objects from installation directory.
================= ===============      ==================

.. _all:

``all`` (default)
-----------------

When you invoke ``make`` with no arguments, you are implicitly instructing it to
seek the ``all`` target (goal). This target is used for building the software
recursively and will do different things in different directories.  For example,
in a ``lib`` directory, the ``all`` target will compile source files and
generate libraries. But, in a ``tools`` directory, it will link libraries and
generate executables.

``all-local``
-------------

This target is the same as `all`_ but it operates only on the current directory
instead of recursively.

``check``
---------

This target can be invoked from anywhere within a project's directories but
always invokes the `check-local`_ target in the project's ``test`` directory, if
it exists and has a ``Makefile``. A warning is produced otherwise.  If
`TESTSUITE`_ is defined on the ``make`` command line, it will be passed down to
the invocation of ``make check-local`` in the ``test`` directory. The intended
usage for this is to assist in running specific suites of tests. If
``TESTSUITE`` is not set, the implementation of ``check-local`` should run all
normal tests.  It is up to the project to define what different values for
``TESTSUTE`` will do. See the :doc:`Testing Guide <TestingGuide>` for further
details.

``check-local``
---------------

This target should be implemented by the ``Makefile`` in the project's ``test``
directory. It is invoked by the ``check`` target elsewhere.  Each project is
free to define the actions of ``check-local`` as appropriate for that
project. The LLVM project itself uses the :doc:`Lit <CommandGuide/lit>` testing
tool to run a suite of feature and regression tests. Other projects may choose
to use :program:`lit` or any other testing mechanism.

``clean``
---------

This target cleans the build directory, recursively removing all things that the
Makefile builds. The cleaning rules have been made guarded so they shouldn't go
awry (via ``rm -f $(UNSET_VARIABLE)/*`` which will attempt to erase the entire
directory structure).

``clean-local``
---------------

This target does the same thing as ``clean`` but only for the current (local)
directory.

``dist``
--------

This target builds a distribution tarball. It first builds the entire project
using the ``all`` target and then tars up the necessary files and compresses
it. The generated tarball is sufficient for a casual source distribution, but
probably not for a release (see ``dist-check``).

``dist-check``
--------------

This target does the same thing as the ``dist`` target but also checks the
distribution tarball. The check is made by unpacking the tarball to a new
directory, configuring it, building it, installing it, and then verifying that
the installation results are correct (by comparing to the original build).  This
target can take a long time to run but should be done before a release goes out
to make sure that the distributed tarball can actually be built into a working
release.

``dist-clean``
--------------

This is a special form of the ``clean`` clean target. It performs a normal
``clean`` but also removes things pertaining to building the distribution.

``install``
-----------

This target finalizes shared objects and executables and copies all libraries,
headers, executables and documentation to the directory given with the
``--prefix`` option to ``configure``.  When completed, the prefix directory will
have everything needed to **use** LLVM.

The LLVM makefiles can generate complete **internal** documentation for all the
classes by using ``doxygen``. By default, this feature is **not** enabled
because it takes a long time and generates a massive amount of data (>100MB). If
you want this feature, you must configure LLVM with the --enable-doxygen switch
and ensure that a modern version of doxygen (1.3.7 or later) is available in
your ``PATH``. You can download doxygen from `here
<http://www.stack.nl/~dimitri/doxygen/download.html#latestsrc>`_.

``preconditions``
-----------------

This utility target checks to see if the ``Makefile`` in the object directory is
older than the ``Makefile`` in the source directory and copies it if so. It also
reruns the ``configure`` script if that needs to be done and rebuilds the
``Makefile.config`` file similarly. Users may overload this target to ensure
that sanity checks are run *before* any building of targets as all the targets
depend on ``preconditions``.

``printvars``
-------------

This utility target just causes the LLVM makefiles to print out some of the
makefile variables so that you can double check how things are set.

``reconfigure``
---------------

This utility target will force a reconfigure of LLVM or your project. It simply
runs ``$(PROJ_OBJ_ROOT)/config.status --recheck`` to rerun the configuration
tests and rebuild the configured files. This isn't generally useful as the
makefiles will reconfigure themselves whenever its necessary.

``spotless``
------------

.. warning::

  Use with caution!

This utility target, only available when ``$(PROJ_OBJ_ROOT)`` is not the same as
``$(PROJ_SRC_ROOT)``, will completely clean the ``$(PROJ_OBJ_ROOT)`` directory
by removing its content entirely and reconfiguring the directory. This returns
the ``$(PROJ_OBJ_ROOT)`` directory to a completely fresh state. All content in
the directory except configured files and top-level makefiles will be lost.

``tags``
--------

This target will generate a ``TAGS`` file in the top-level source directory. It
is meant for use with emacs, XEmacs, or ViM. The TAGS file provides an index of
symbol definitions so that the editor can jump you to the definition
quickly.

``uninstall``
-------------

This target is the opposite of the ``install`` target. It removes the header,
library and executable files from the installation directories. Note that the
directories themselves are not removed because it is not guaranteed that LLVM is
the only thing installing there (e.g. ``--prefix=/usr``).

.. _variables:

Variables
=========

Variables are used to tell the LLVM Makefile System what to do and to obtain
information from it. Variables are also used internally by the LLVM Makefile
System. Variable names that contain only the upper case alphabetic letters and
underscore are intended for use by the end user. All other variables are
internal to the LLVM Makefile System and should not be relied upon nor
modified. The sections below describe how to use the LLVM Makefile
variables.

Control Variables
-----------------

Variables listed in the table below should be set *before* the inclusion of
`$(LEVEL)/Makefile.common`_.  These variables provide input to the LLVM make
system that tell it what to do for the current directory.

``BUILD_ARCHIVE``
    If set to any value, causes an archive (.a) library to be built.

``BUILT_SOURCES``
    Specifies a set of source files that are generated from other source
    files. These sources will be built before any other target processing to
    ensure they are present.

``CONFIG_FILES``
    Specifies a set of configuration files to be installed.

``DEBUG_SYMBOLS``
    If set to any value, causes the build to include debugging symbols even in
    optimized objects, libraries and executables. This alters the flags
    specified to the compilers and linkers. Debugging isn't fun in an optimized
    build, but it is possible.

``DIRS``
    Specifies a set of directories, usually children of the current directory,
    that should also be made using the same goal. These directories will be
    built serially.

``DISABLE_AUTO_DEPENDENCIES``
    If set to any value, causes the makefiles to **not** automatically generate
    dependencies when running the compiler. Use of this feature is discouraged
    and it may be removed at a later date.

``ENABLE_OPTIMIZED``
    If set to 1, causes the build to generate optimized objects, libraries and
    executables. This alters the flags specified to the compilers and
    linkers. Generally debugging won't be a fun experience with an optimized
    build.

``ENABLE_PROFILING``
    If set to 1, causes the build to generate both optimized and profiled
    objects, libraries and executables. This alters the flags specified to the
    compilers and linkers to ensure that profile data can be collected from the
    tools built. Use the ``gprof`` tool to analyze the output from the profiled
    tools (``gmon.out``).

``DISABLE_ASSERTIONS``
    If set to 1, causes the build to disable assertions, even if building a
    debug or profile build.  This will exclude all assertion check code from the
    build. LLVM will execute faster, but with little help when things go
    wrong.

``EXPERIMENTAL_DIRS``
    Specify a set of directories that should be built, but if they fail, it
    should not cause the build to fail. Note that this should only be used
    temporarily while code is being written.

``EXPORTED_SYMBOL_FILE``
    Specifies the name of a single file that contains a list of the symbols to
    be exported by the linker. One symbol per line.

``EXPORTED_SYMBOL_LIST``
    Specifies a set of symbols to be exported by the linker.

``EXTRA_DIST``
    Specifies additional files that should be distributed with LLVM. All source
    files, all built sources, all Makefiles, and most documentation files will
    be automatically distributed. Use this variable to distribute any files that
    are not automatically distributed.

``KEEP_SYMBOLS``
    If set to any value, specifies that when linking executables the makefiles
    should retain debug symbols in the executable. Normally, symbols are
    stripped from the executable.

``LEVEL`` (required)
    Specify the level of nesting from the top level. This variable must be set
    in each makefile as it is used to find the top level and thus the other
    makefiles.

``LIBRARYNAME``
    Specify the name of the library to be built. (Required For Libraries)

``LINK_COMPONENTS``
    When specified for building a tool, the value of this variable will be
    passed to the ``llvm-config`` tool to generate a link line for the
    tool. Unlike ``USEDLIBS`` and ``LLVMLIBS``, not all libraries need to be
    specified. The ``llvm-config`` tool will figure out the library dependencies
    and add any libraries that are needed. The ``USEDLIBS`` variable can still
    be used in conjunction with ``LINK_COMPONENTS`` so that additional
    project-specific libraries can be linked with the LLVM libraries specified
    by ``LINK_COMPONENTS``.

.. _LINK_LIBS_IN_SHARED:

``LINK_LIBS_IN_SHARED``
    By default, shared library linking will ignore any libraries specified with
    the `LLVMLIBS`_ or `USEDLIBS`_. This prevents shared libs from including
    things that will be in the LLVM tool the shared library will be loaded
    into. However, sometimes it is useful to link certain libraries into your
    shared library and this option enables that feature.

.. _LLVMLIBS:

``LLVMLIBS``
    Specifies the set of libraries from the LLVM ``$(ObjDir)`` that will be
    linked into the tool or library.

``LOADABLE_MODULE``
    If set to any value, causes the shared library being built to also be a
    loadable module. Loadable modules can be opened with the dlopen() function
    and searched with dlsym (or the operating system's equivalent). Note that
    setting this variable without also setting ``SHARED_LIBRARY`` will have no
    effect.

``NO_INSTALL``
    Specifies that the build products of the directory should not be installed
    but should be built even if the ``install`` target is given.  This is handy
    for directories that build libraries or tools that are only used as part of
    the build process, such as code generators (e.g.  ``tblgen``).

``OPTIONAL_DIRS``
    Specify a set of directories that may be built, if they exist, but it is
    not an error for them not to exist.

``PARALLEL_DIRS``
    Specify a set of directories to build recursively and in parallel if the
    ``-j`` option was used with ``make``.

.. _SHARED_LIBRARY:

``SHARED_LIBRARY``
    If set to any value, causes a shared library (``.so``) to be built in
    addition to any other kinds of libraries. Note that this option will cause
    all source files to be built twice: once with options for position
    independent code and once without. Use it only where you really need a
    shared library.

``SOURCES`` (optional)
    Specifies the list of source files in the current directory to be
    built. Source files of any type may be specified (programs, documentation,
    config files, etc.). If not specified, the makefile system will infer the
    set of source files from the files present in the current directory.

``SUFFIXES``
    Specifies a set of filename suffixes that occur in suffix match rules.  Only
    set this if your local ``Makefile`` specifies additional suffix match
    rules.

``TARGET``
    Specifies the name of the LLVM code generation target that the current
    directory builds. Setting this variable enables additional rules to build
    ``.inc`` files from ``.td`` files. 

.. _TESTSUITE:

``TESTSUITE``
    Specifies the directory of tests to run in ``llvm/test``.

``TOOLNAME``
    Specifies the name of the tool that the current directory should build.

``TOOL_VERBOSE``
    Implies ``VERBOSE`` and also tells each tool invoked to be verbose. This is
    handy when you're trying to see the sub-tools invoked by each tool invoked
    by the makefile. For example, this will pass ``-v`` to the GCC compilers
    which causes it to print out the command lines it uses to invoke sub-tools
    (compiler, assembler, linker).

.. _USEDLIBS:

``USEDLIBS``
    Specifies the list of project libraries that will be linked into the tool or
    library.

``VERBOSE``
    Tells the Makefile system to produce detailed output of what it is doing
    instead of just summary comments. This will generate a LOT of output.

Override Variables
------------------

Override variables can be used to override the default values provided by the
LLVM makefile system. These variables can be set in several ways:

* In the environment (e.g. setenv, export) --- not recommended.
* On the ``make`` command line --- recommended.
* On the ``configure`` command line.
* In the Makefile (only *after* the inclusion of `$(LEVEL)/Makefile.common`_).

The override variables are given below:

``AR`` (defaulted)
    Specifies the path to the ``ar`` tool.

``PROJ_OBJ_DIR``
    The directory into which the products of build rules will be placed.  This
    might be the same as `PROJ_SRC_DIR`_ but typically is not.

.. _PROJ_SRC_DIR:

``PROJ_SRC_DIR``
    The directory which contains the source files to be built.

``BUILD_EXAMPLES``
    If set to 1, build examples in ``examples`` and (if building Clang)
    ``tools/clang/examples`` directories.

``BZIP2`` (configured)
    The path to the ``bzip2`` tool.

``CC`` (configured)
    The path to the 'C' compiler.

``CFLAGS``
    Additional flags to be passed to the 'C' compiler.

``CPPFLAGS``
    Additional flags passed to the C/C++ preprocessor.

``CXX``
    Specifies the path to the C++ compiler.

``CXXFLAGS``
    Additional flags to be passed to the C++ compiler.

``DATE`` (configured)
    Specifies the path to the ``date`` program or any program that can generate
    the current date and time on its standard output.

``DOT`` (configured)
    Specifies the path to the ``dot`` tool or ``false`` if there isn't one.

``ECHO`` (configured)
    Specifies the path to the ``echo`` tool for printing output.

``EXEEXT`` (configured)
    Provides the extension to be used on executables built by the makefiles.
    The value may be empty on platforms that do not use file extensions for
    executables (e.g. Unix).

``INSTALL`` (configured)
    Specifies the path to the ``install`` tool.

``LDFLAGS`` (configured)
    Allows users to specify additional flags to pass to the linker.

``LIBS`` (configured)
    The list of libraries that should be linked with each tool.

``LIBTOOL`` (configured)
    Specifies the path to the ``libtool`` tool. This tool is renamed ``mklib``
    by the ``configure`` script.

``LLVMAS`` (defaulted)
    Specifies the path to the ``llvm-as`` tool.

``LLVMGCC`` (defaulted)
    Specifies the path to the LLVM version of the GCC 'C' Compiler.

``LLVMGXX`` (defaulted)
    Specifies the path to the LLVM version of the GCC C++ Compiler.

``LLVMLD`` (defaulted)
    Specifies the path to the LLVM bitcode linker tool

``LLVM_OBJ_ROOT`` (configured)
    Specifies the top directory into which the output of the build is placed.

``LLVM_SRC_ROOT`` (configured)
    Specifies the top directory in which the sources are found.

``LLVM_TARBALL_NAME`` (configured)
    Specifies the name of the distribution tarball to create. This is configured
    from the name of the project and its version number.

``MKDIR`` (defaulted)
    Specifies the path to the ``mkdir`` tool that creates directories.

``ONLY_TOOLS``
    If set, specifies the list of tools to build.

``PLATFORMSTRIPOPTS``
    The options to provide to the linker to specify that a stripped (no symbols)
    executable should be built.

``RANLIB`` (defaulted)
    Specifies the path to the ``ranlib`` tool.

``RM`` (defaulted)
    Specifies the path to the ``rm`` tool.

``SED`` (defaulted)
    Specifies the path to the ``sed`` tool.

``SHLIBEXT`` (configured)
    Provides the filename extension to use for shared libraries.

``TBLGEN`` (defaulted)
    Specifies the path to the ``tblgen`` tool.

``TAR`` (defaulted)
    Specifies the path to the ``tar`` tool.

``ZIP`` (defaulted)
    Specifies the path to the ``zip`` tool.

Readable Variables
------------------

Variables listed in the table below can be used by the user's Makefile but
should not be changed. Changing the value will generally cause the build to go
wrong, so don't do it.

``bindir``
    The directory into which executables will ultimately be installed. This
    value is derived from the ``--prefix`` option given to ``configure``.

``BuildMode``
    The name of the type of build being performed: Debug, Release, or
    Profile.

``bytecode_libdir``
    The directory into which bitcode libraries will ultimately be installed.
    This value is derived from the ``--prefix`` option given to ``configure``.

``ConfigureScriptFLAGS``
    Additional flags given to the ``configure`` script when reconfiguring.

``DistDir``
    The *current* directory for which a distribution copy is being made.

.. _Echo:

``Echo``
    The LLVM Makefile System output command. This provides the ``llvm[n]``
    prefix and starts with ``@`` so the command itself is not printed by
    ``make``.

``EchoCmd``
    Same as `Echo`_ but without the leading ``@``.

``includedir``
    The directory into which include files will ultimately be installed.  This
    value is derived from the ``--prefix`` option given to ``configure``.

``libdir``
    The directory into which native libraries will ultimately be installed.
    This value is derived from the ``--prefix`` option given to
    ``configure``.

``LibDir``
    The configuration specific directory into which libraries are placed before
    installation.

``MakefileConfig``
    Full path of the ``Makefile.config`` file.

``MakefileConfigIn``
    Full path of the ``Makefile.config.in`` file.

``ObjDir``
    The configuration and directory specific directory where build objects
    (compilation results) are placed.

``SubDirs``
    The complete list of sub-directories of the current directory as
    specified by other variables.

``Sources``
    The complete list of source files.

``sysconfdir``
    The directory into which configuration files will ultimately be
    installed. This value is derived from the ``--prefix`` option given to
    ``configure``.

``ToolDir``
    The configuration specific directory into which executables are placed
    before they are installed.

``TopDistDir``
    The top most directory into which the distribution files are copied.

``Verb``
    Use this as the first thing on your build script lines to enable or disable
    verbose mode. It expands to either an ``@`` (quiet mode) or nothing (verbose
    mode).

Internal Variables
------------------

Variables listed below are used by the LLVM Makefile System and considered
internal. You should not use these variables under any circumstances.

.. code-block:: makefile

    Archive
    AR.Flags
    BaseNameSources
    BCLinkLib
    C.Flags
    Compile.C
    CompileCommonOpts
    Compile.CXX
    ConfigStatusScript
    ConfigureScript
    CPP.Flags
    CPP.Flags 
    CXX.Flags
    DependFiles
    DestArchiveLib
    DestBitcodeLib
    DestModule
    DestSharedLib
    DestTool
    DistAlways
    DistCheckDir
    DistCheckTop
    DistFiles
    DistName
    DistOther
    DistSources
    DistSubDirs
    DistTarBZ2
    DistTarGZip
    DistZip
    ExtraLibs
    FakeSources
    INCFiles
    InternalTargets
    LD.Flags
    LibName.A
    LibName.BC
    LibName.LA
    LibName.O
    LibTool.Flags
    Link
    LinkModule
    LLVMLibDir
    LLVMLibsOptions
    LLVMLibsPaths
    LLVMToolDir
    LLVMUsedLibs
    LocalTargets
    Module
    ObjectsLO
    ObjectsO
    ObjMakefiles
    ParallelTargets
    PreConditions
    ProjLibsOptions
    ProjLibsPaths
    ProjUsedLibs
    Ranlib
    RecursiveTargets
    SrcMakefiles
    Strip
    StripWarnMsg
    TableGen
    TDFiles
    ToolBuildPath
    TopLevelTargets
    UserTargets
