===================
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 complete details on setting up your projects configuration, simply mimic the
``llvm/projects/sample`` project. Or 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
