head	1.1;
branch	1.1.1;
access;
symbols
	netbsd-11-0-RC5:1.1.1.4
	netbsd-11-0-RC4:1.1.1.4
	netbsd-11-0-RC3:1.1.1.4
	netbsd-11-0-RC2:1.1.1.4
	netbsd-11-0-RC1:1.1.1.4
	perseant-exfatfs-base-20250801:1.1.1.4
	netbsd-11:1.1.1.4.0.10
	netbsd-11-base:1.1.1.4
	netbsd-10-1-RELEASE:1.1.1.4
	perseant-exfatfs-base-20240630:1.1.1.4
	perseant-exfatfs:1.1.1.4.0.8
	perseant-exfatfs-base:1.1.1.4
	netbsd-8-3-RELEASE:1.1.1.2
	netbsd-9-4-RELEASE:1.1.1.3
	netbsd-10-0-RELEASE:1.1.1.4
	netbsd-10-0-RC6:1.1.1.4
	netbsd-10-0-RC5:1.1.1.4
	netbsd-10-0-RC4:1.1.1.4
	netbsd-10-0-RC3:1.1.1.4
	netbsd-10-0-RC2:1.1.1.4
	netbsd-10-0-RC1:1.1.1.4
	netbsd-10:1.1.1.4.0.6
	netbsd-10-base:1.1.1.4
	netbsd-9-3-RELEASE:1.1.1.3
	cjep_sun2x:1.1.1.4.0.4
	cjep_sun2x-base:1.1.1.4
	cjep_staticlib_x-base1:1.1.1.4
	netbsd-9-2-RELEASE:1.1.1.3
	cjep_staticlib_x:1.1.1.4.0.2
	cjep_staticlib_x-base:1.1.1.4
	netbsd-9-1-RELEASE:1.1.1.3
	phil-wifi-20200421:1.1.1.4
	phil-wifi-20200411:1.1.1.4
	phil-wifi-20200406:1.1.1.4
	netbsd-8-2-RELEASE:1.1.1.2
	netbsd-9-0-RELEASE:1.1.1.3
	netbsd-9-0-RC2:1.1.1.3
	netbsd-9-0-RC1:1.1.1.3
	netbsd-9:1.1.1.3.0.2
	netbsd-9-base:1.1.1.3
	phil-wifi-20190609:1.1.1.3
	netbsd-8-1-RELEASE:1.1.1.2
	netbsd-8-1-RC1:1.1.1.2
	pgoyette-compat-merge-20190127:1.1.1.2.12.1
	pgoyette-compat-20190127:1.1.1.3
	pgoyette-compat-20190118:1.1.1.3
	pgoyette-compat-1226:1.1.1.3
	pgoyette-compat-1126:1.1.1.3
	pgoyette-compat-1020:1.1.1.3
	pgoyette-compat-0930:1.1.1.3
	pgoyette-compat-0906:1.1.1.3
	netbsd-7-2-RELEASE:1.1.1.1
	pgoyette-compat-0728:1.1.1.3
	clang-337282:1.1.1.3
	netbsd-8-0-RELEASE:1.1.1.2
	phil-wifi:1.1.1.2.0.14
	phil-wifi-base:1.1.1.2
	pgoyette-compat-0625:1.1.1.2
	netbsd-8-0-RC2:1.1.1.2
	pgoyette-compat-0521:1.1.1.2
	pgoyette-compat-0502:1.1.1.2
	pgoyette-compat-0422:1.1.1.2
	netbsd-8-0-RC1:1.1.1.2
	pgoyette-compat-0415:1.1.1.2
	pgoyette-compat-0407:1.1.1.2
	pgoyette-compat-0330:1.1.1.2
	pgoyette-compat-0322:1.1.1.2
	pgoyette-compat-0315:1.1.1.2
	netbsd-7-1-2-RELEASE:1.1.1.1
	pgoyette-compat:1.1.1.2.0.12
	pgoyette-compat-base:1.1.1.2
	netbsd-7-1-1-RELEASE:1.1.1.1
	clang-319952:1.1.1.2
	matt-nb8-mediatek:1.1.1.2.0.10
	matt-nb8-mediatek-base:1.1.1.2
	clang-309604:1.1.1.2
	perseant-stdc-iso10646:1.1.1.2.0.8
	perseant-stdc-iso10646-base:1.1.1.2
	netbsd-8:1.1.1.2.0.6
	netbsd-8-base:1.1.1.2
	prg-localcount2-base3:1.1.1.2
	prg-localcount2-base2:1.1.1.2
	prg-localcount2-base1:1.1.1.2
	prg-localcount2:1.1.1.2.0.4
	prg-localcount2-base:1.1.1.2
	pgoyette-localcount-20170426:1.1.1.2
	bouyer-socketcan-base1:1.1.1.2
	pgoyette-localcount-20170320:1.1.1.2
	netbsd-7-1:1.1.1.1.0.16
	netbsd-7-1-RELEASE:1.1.1.1
	netbsd-7-1-RC2:1.1.1.1
	clang-294123:1.1.1.2
	netbsd-7-nhusb-base-20170116:1.1.1.1
	bouyer-socketcan:1.1.1.2.0.2
	bouyer-socketcan-base:1.1.1.2
	clang-291444:1.1.1.2
	pgoyette-localcount-20170107:1.1.1.1
	netbsd-7-1-RC1:1.1.1.1
	pgoyette-localcount-20161104:1.1.1.1
	netbsd-7-0-2-RELEASE:1.1.1.1
	localcount-20160914:1.1.1.1
	netbsd-7-nhusb:1.1.1.1.0.14
	netbsd-7-nhusb-base:1.1.1.1
	clang-280599:1.1.1.1
	pgoyette-localcount-20160806:1.1.1.1
	pgoyette-localcount-20160726:1.1.1.1
	pgoyette-localcount:1.1.1.1.0.12
	pgoyette-localcount-base:1.1.1.1
	netbsd-7-0-1-RELEASE:1.1.1.1
	clang-261930:1.1.1.1
	netbsd-7-0:1.1.1.1.0.10
	netbsd-7-0-RELEASE:1.1.1.1
	netbsd-7-0-RC3:1.1.1.1
	netbsd-7-0-RC2:1.1.1.1
	netbsd-7-0-RC1:1.1.1.1
	clang-237755:1.1.1.1
	clang-232565:1.1.1.1
	clang-227398:1.1.1.1
	tls-maxphys-base:1.1.1.1
	tls-maxphys:1.1.1.1.0.8
	netbsd-7:1.1.1.1.0.6
	netbsd-7-base:1.1.1.1
	clang-215315:1.1.1.1
	clang-209886:1.1.1.1
	yamt-pagecache:1.1.1.1.0.4
	yamt-pagecache-base9:1.1.1.1
	tls-earlyentropy:1.1.1.1.0.2
	tls-earlyentropy-base:1.1.1.1
	riastradh-xf86-video-intel-2-7-1-pre-2-21-15:1.1.1.1
	riastradh-drm2-base3:1.1.1.1
	clang-202566:1.1.1.1
	clang-201163:1.1.1.1
	clang-199312:1.1.1.1
	clang-198450:1.1.1.1
	clang-196603:1.1.1.1
	clang-195771:1.1.1.1
	LLVM:1.1.1;
locks; strict;
comment	@# @;


1.1
date	2013.11.28.14.14.47;	author joerg;	state Exp;
branches
	1.1.1.1;
next	;
commitid	ow8OybrawrB1f3fx;

1.1.1.1
date	2013.11.28.14.14.47;	author joerg;	state Exp;
branches
	1.1.1.1.4.1
	1.1.1.1.8.1
	1.1.1.1.12.1;
next	1.1.1.2;
commitid	ow8OybrawrB1f3fx;

1.1.1.2
date	2017.01.11.10.40.27;	author joerg;	state Exp;
branches
	1.1.1.2.12.1
	1.1.1.2.14.1;
next	1.1.1.3;
commitid	CNnUNfII1jgNmxBz;

1.1.1.3
date	2018.07.17.18.32.09;	author joerg;	state Exp;
branches;
next	1.1.1.4;
commitid	wDzL46ALjrCZgwKA;

1.1.1.4
date	2019.11.13.22.19.10;	author joerg;	state dead;
branches;
next	;
commitid	QD8YATxuNG34YJKB;

1.1.1.1.4.1
date	2013.11.28.14.14.47;	author yamt;	state dead;
branches;
next	1.1.1.1.4.2;
commitid	WSrDtL5nYAUyiyBx;

1.1.1.1.4.2
date	2014.05.22.16.18.19;	author yamt;	state Exp;
branches;
next	;
commitid	WSrDtL5nYAUyiyBx;

1.1.1.1.8.1
date	2013.11.28.14.14.47;	author tls;	state dead;
branches;
next	1.1.1.1.8.2;
commitid	jTnpym9Qu0o4R1Nx;

1.1.1.1.8.2
date	2014.08.19.23.47.19;	author tls;	state Exp;
branches;
next	;
commitid	jTnpym9Qu0o4R1Nx;

1.1.1.1.12.1
date	2017.03.20.06.52.30;	author pgoyette;	state Exp;
branches;
next	;
commitid	jjw7cAwgyKq7RfKz;

1.1.1.2.12.1
date	2018.07.28.04.33.07;	author pgoyette;	state Exp;
branches;
next	;
commitid	1UP1xAIUxv1ZgRLA;

1.1.1.2.14.1
date	2019.06.10.21.45.09;	author christos;	state Exp;
branches;
next	1.1.1.2.14.2;
commitid	jtc8rnCzWiEEHGqB;

1.1.1.2.14.2
date	2020.04.13.07.46.20;	author martin;	state dead;
branches;
next	;
commitid	X01YhRUPVUDaec4C;


desc
@@


1.1
log
@Initial revision
@
text
@===================================
How To Setup Clang Tooling For LLVM
===================================

Clang Tooling provides infrastructure to write tools that need syntactic
and semantic information about a program. This term also relates to a set
of specific tools using this infrastructure (e.g. ``clang-check``). This
document provides information on how to set up and use Clang Tooling for
the LLVM source code.

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

Clang Tooling needs a compilation database to figure out specific build
options for each file. Currently it can create a compilation database
from the ``compilation_commands.json`` file, generated by CMake. When
invoking clang tools, you can either specify a path to a build directory
using a command line parameter ``-p`` or let Clang Tooling find this
file in your source tree. In either case you need to configure your
build using CMake to use clang tools.

Setup Clang Tooling Using CMake and Make
========================================

If you intend to use make to build LLVM, you should have CMake 2.8.6 or
later installed (can be found `here <http://cmake.org>`_).

First, you need to generate Makefiles for LLVM with CMake. You need to
make a build directory and run CMake from it:

.. code-block:: console

  $ mkdir your/build/directory
  $ cd your/build/directory
  $ cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON path/to/llvm/sources

If you want to use clang instead of GCC, you can add
``-DCMAKE_C_COMPILER=/path/to/clang -DCMAKE_CXX_COMPILER=/path/to/clang++``.
You can also use ``ccmake``, which provides a curses interface to configure
CMake variables for lazy people.

As a result, the new ``compile_commands.json`` file should appear in the
current directory. You should link it to the LLVM source tree so that
Clang Tooling is able to use it:

.. code-block:: console

  $ ln -s $PWD/compile_commands.json path/to/llvm/source/

Now you are ready to build and test LLVM using make:

.. code-block:: console

  $ make check-all

Using Clang Tools
=================

After you completed the previous steps, you are ready to run clang tools. If
you have a recent clang installed, you should have ``clang-check`` in
``$PATH``. Try to run it on any ``.cpp`` file inside the LLVM source tree:

.. code-block:: console

  $ clang-check tools/clang/lib/Tooling/CompilationDatabase.cpp

If you're using vim, it's convenient to have clang-check integrated. Put
this into your ``.vimrc``:

::

    function! ClangCheckImpl(cmd)
      if &autowrite | wall | endif
      echo "Running " . a:cmd . " ..."
      let l:output = system(a:cmd)
      cexpr l:output
      cwindow
      let w:quickfix_title = a:cmd
      if v:shell_error != 0
        cc
      endif
      let g:clang_check_last_cmd = a:cmd
    endfunction

    function! ClangCheck()
      let l:filename = expand('%')
      if l:filename =~ '\.\(cpp\|cxx\|cc\|c\)$'
        call ClangCheckImpl("clang-check " . l:filename)
      elseif exists("g:clang_check_last_cmd")
        call ClangCheckImpl(g:clang_check_last_cmd)
      else
        echo "Can't detect file's compilation arguments and no previous clang-check invocation!"
      endif
    endfunction

    nmap <silent> <F5> :call ClangCheck()<CR><CR>

When editing a .cpp/.cxx/.cc/.c file, hit F5 to reparse the file. In
case the current file has a different extension (for example, .h), F5
will re-run the last clang-check invocation made from this vim instance
(if any). The output will go into the error window, which is opened
automatically when clang-check finds errors, and can be re-opened with
``:cope``.

Other ``clang-check`` options that can be useful when working with clang
AST:

* ``-ast-print`` --- Build ASTs and then pretty-print them.
* ``-ast-dump`` --- Build ASTs and then debug dump them.
* ``-ast-dump-filter=<string>`` --- Use with ``-ast-dump`` or ``-ast-print`` to
  dump/print only AST declaration nodes having a certain substring in a
  qualified name. Use ``-ast-list`` to list all filterable declaration node
  names.
* ``-ast-list`` --- Build ASTs and print the list of declaration node qualified
  names.

Examples:

.. code-block:: console

  $ clang-check tools/clang/tools/clang-check/ClangCheck.cpp -ast-dump -ast-dump-filter ActionFactory::newASTConsumer
  Processing: tools/clang/tools/clang-check/ClangCheck.cpp.
  Dumping ::ActionFactory::newASTConsumer:
  clang::ASTConsumer *newASTConsumer() (CompoundStmt 0x44da290 </home/alexfh/local/llvm/tools/clang/tools/clang-check/ClangCheck.cpp:64:40, line:72:3>
    (IfStmt 0x44d97c8 <line:65:5, line:66:45>
      <<<NULL>>>
        (ImplicitCastExpr 0x44d96d0 <line:65:9> '_Bool':'_Bool' <UserDefinedConversion>
  ...
  $ clang-check tools/clang/tools/clang-check/ClangCheck.cpp -ast-print -ast-dump-filter ActionFactory::newASTConsumer
  Processing: tools/clang/tools/clang-check/ClangCheck.cpp.
  Printing <anonymous namespace>::ActionFactory::newASTConsumer:
  clang::ASTConsumer *newASTConsumer() {
      if (this->ASTList.operator _Bool())
          return clang::CreateASTDeclNodeLister();
      if (this->ASTDump.operator _Bool())
          return clang::CreateASTDumper(this->ASTDumpFilter);
      if (this->ASTPrint.operator _Bool())
          return clang::CreateASTPrinter(&llvm::outs(), this->ASTDumpFilter);
      return new clang::ASTConsumer();
  }

(Experimental) Using Ninja Build System
=======================================

Optionally you can use the `Ninja <https://github.com/martine/ninja>`_
build system instead of make. It is aimed at making your builds faster.
Currently this step will require building Ninja from sources.

To take advantage of using Clang Tools along with Ninja build you need
at least CMake 2.8.9.

Clone the Ninja git repository and build Ninja from sources:

.. code-block:: console

  $ git clone git://github.com/martine/ninja.git
  $ cd ninja/
  $ ./bootstrap.py

This will result in a single binary ``ninja`` in the current directory.
It doesn't require installation and can just be copied to any location
inside ``$PATH``, say ``/usr/local/bin/``:

.. code-block:: console

  $ sudo cp ninja /usr/local/bin/
  $ sudo chmod a+rx /usr/local/bin/ninja

After doing all of this, you'll need to generate Ninja build files for
LLVM with CMake. You need to make a build directory and run CMake from
it:

.. code-block:: console

  $ mkdir your/build/directory
  $ cd your/build/directory
  $ cmake -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON path/to/llvm/sources

If you want to use clang instead of GCC, you can add
``-DCMAKE_C_COMPILER=/path/to/clang -DCMAKE_CXX_COMPILER=/path/to/clang++``.
You can also use ``ccmake``, which provides a curses interface to configure
CMake variables in an interactive manner.

As a result, the new ``compile_commands.json`` file should appear in the
current directory. You should link it to the LLVM source tree so that
Clang Tooling is able to use it:

.. code-block:: console

  $ ln -s $PWD/compile_commands.json path/to/llvm/source/

Now you are ready to build and test LLVM using Ninja:

.. code-block:: console

  $ ninja check-all

Other target names can be used in the same way as with make.

@


1.1.1.1
log
@Import Clang 3.4rc1 r195771.
@
text
@@


1.1.1.1.12.1
log
@Sync with HEAD
@
text
@d16 1
a16 1
from the ``compile_commands.json`` file, generated by CMake. When
@


1.1.1.2
log
@Import Clang pre-4.0.0 r291444.
@
text
@d16 1
a16 1
from the ``compile_commands.json`` file, generated by CMake. When
@


1.1.1.2.14.1
log
@Sync with HEAD
@
text
@d136 1
a136 2
          return clang::CreateASTDumper(nullptr /*Dump to stdout.*/,
                                        this->ASTDumpFilter);
@


1.1.1.2.14.2
log
@Mostly merge changes from HEAD upto 20200411
@
text
@@


1.1.1.2.12.1
log
@Sync with HEAD
@
text
@d136 1
a136 2
          return clang::CreateASTDumper(nullptr /*Dump to stdout.*/,
                                        this->ASTDumpFilter);
@


1.1.1.3
log
@Import clang r337282 from trunk
@
text
@d136 1
a136 2
          return clang::CreateASTDumper(nullptr /*Dump to stdout.*/,
                                        this->ASTDumpFilter);
@


1.1.1.4
log
@Mark old LLVM instance as dead.
@
text
@@


1.1.1.1.8.1
log
@file HowToSetupToolingForLLVM.rst was added on branch tls-maxphys on 2014-08-19 23:47:19 +0000
@
text
@d1 199
@


1.1.1.1.8.2
log
@Rebase to HEAD as of a few days ago.
@
text
@a0 199
===================================
How To Setup Clang Tooling For LLVM
===================================

Clang Tooling provides infrastructure to write tools that need syntactic
and semantic information about a program. This term also relates to a set
of specific tools using this infrastructure (e.g. ``clang-check``). This
document provides information on how to set up and use Clang Tooling for
the LLVM source code.

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

Clang Tooling needs a compilation database to figure out specific build
options for each file. Currently it can create a compilation database
from the ``compilation_commands.json`` file, generated by CMake. When
invoking clang tools, you can either specify a path to a build directory
using a command line parameter ``-p`` or let Clang Tooling find this
file in your source tree. In either case you need to configure your
build using CMake to use clang tools.

Setup Clang Tooling Using CMake and Make
========================================

If you intend to use make to build LLVM, you should have CMake 2.8.6 or
later installed (can be found `here <http://cmake.org>`_).

First, you need to generate Makefiles for LLVM with CMake. You need to
make a build directory and run CMake from it:

.. code-block:: console

  $ mkdir your/build/directory
  $ cd your/build/directory
  $ cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON path/to/llvm/sources

If you want to use clang instead of GCC, you can add
``-DCMAKE_C_COMPILER=/path/to/clang -DCMAKE_CXX_COMPILER=/path/to/clang++``.
You can also use ``ccmake``, which provides a curses interface to configure
CMake variables for lazy people.

As a result, the new ``compile_commands.json`` file should appear in the
current directory. You should link it to the LLVM source tree so that
Clang Tooling is able to use it:

.. code-block:: console

  $ ln -s $PWD/compile_commands.json path/to/llvm/source/

Now you are ready to build and test LLVM using make:

.. code-block:: console

  $ make check-all

Using Clang Tools
=================

After you completed the previous steps, you are ready to run clang tools. If
you have a recent clang installed, you should have ``clang-check`` in
``$PATH``. Try to run it on any ``.cpp`` file inside the LLVM source tree:

.. code-block:: console

  $ clang-check tools/clang/lib/Tooling/CompilationDatabase.cpp

If you're using vim, it's convenient to have clang-check integrated. Put
this into your ``.vimrc``:

::

    function! ClangCheckImpl(cmd)
      if &autowrite | wall | endif
      echo "Running " . a:cmd . " ..."
      let l:output = system(a:cmd)
      cexpr l:output
      cwindow
      let w:quickfix_title = a:cmd
      if v:shell_error != 0
        cc
      endif
      let g:clang_check_last_cmd = a:cmd
    endfunction

    function! ClangCheck()
      let l:filename = expand('%')
      if l:filename =~ '\.\(cpp\|cxx\|cc\|c\)$'
        call ClangCheckImpl("clang-check " . l:filename)
      elseif exists("g:clang_check_last_cmd")
        call ClangCheckImpl(g:clang_check_last_cmd)
      else
        echo "Can't detect file's compilation arguments and no previous clang-check invocation!"
      endif
    endfunction

    nmap <silent> <F5> :call ClangCheck()<CR><CR>

When editing a .cpp/.cxx/.cc/.c file, hit F5 to reparse the file. In
case the current file has a different extension (for example, .h), F5
will re-run the last clang-check invocation made from this vim instance
(if any). The output will go into the error window, which is opened
automatically when clang-check finds errors, and can be re-opened with
``:cope``.

Other ``clang-check`` options that can be useful when working with clang
AST:

* ``-ast-print`` --- Build ASTs and then pretty-print them.
* ``-ast-dump`` --- Build ASTs and then debug dump them.
* ``-ast-dump-filter=<string>`` --- Use with ``-ast-dump`` or ``-ast-print`` to
  dump/print only AST declaration nodes having a certain substring in a
  qualified name. Use ``-ast-list`` to list all filterable declaration node
  names.
* ``-ast-list`` --- Build ASTs and print the list of declaration node qualified
  names.

Examples:

.. code-block:: console

  $ clang-check tools/clang/tools/clang-check/ClangCheck.cpp -ast-dump -ast-dump-filter ActionFactory::newASTConsumer
  Processing: tools/clang/tools/clang-check/ClangCheck.cpp.
  Dumping ::ActionFactory::newASTConsumer:
  clang::ASTConsumer *newASTConsumer() (CompoundStmt 0x44da290 </home/alexfh/local/llvm/tools/clang/tools/clang-check/ClangCheck.cpp:64:40, line:72:3>
    (IfStmt 0x44d97c8 <line:65:5, line:66:45>
      <<<NULL>>>
        (ImplicitCastExpr 0x44d96d0 <line:65:9> '_Bool':'_Bool' <UserDefinedConversion>
  ...
  $ clang-check tools/clang/tools/clang-check/ClangCheck.cpp -ast-print -ast-dump-filter ActionFactory::newASTConsumer
  Processing: tools/clang/tools/clang-check/ClangCheck.cpp.
  Printing <anonymous namespace>::ActionFactory::newASTConsumer:
  clang::ASTConsumer *newASTConsumer() {
      if (this->ASTList.operator _Bool())
          return clang::CreateASTDeclNodeLister();
      if (this->ASTDump.operator _Bool())
          return clang::CreateASTDumper(this->ASTDumpFilter);
      if (this->ASTPrint.operator _Bool())
          return clang::CreateASTPrinter(&llvm::outs(), this->ASTDumpFilter);
      return new clang::ASTConsumer();
  }

(Experimental) Using Ninja Build System
=======================================

Optionally you can use the `Ninja <https://github.com/martine/ninja>`_
build system instead of make. It is aimed at making your builds faster.
Currently this step will require building Ninja from sources.

To take advantage of using Clang Tools along with Ninja build you need
at least CMake 2.8.9.

Clone the Ninja git repository and build Ninja from sources:

.. code-block:: console

  $ git clone git://github.com/martine/ninja.git
  $ cd ninja/
  $ ./bootstrap.py

This will result in a single binary ``ninja`` in the current directory.
It doesn't require installation and can just be copied to any location
inside ``$PATH``, say ``/usr/local/bin/``:

.. code-block:: console

  $ sudo cp ninja /usr/local/bin/
  $ sudo chmod a+rx /usr/local/bin/ninja

After doing all of this, you'll need to generate Ninja build files for
LLVM with CMake. You need to make a build directory and run CMake from
it:

.. code-block:: console

  $ mkdir your/build/directory
  $ cd your/build/directory
  $ cmake -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON path/to/llvm/sources

If you want to use clang instead of GCC, you can add
``-DCMAKE_C_COMPILER=/path/to/clang -DCMAKE_CXX_COMPILER=/path/to/clang++``.
You can also use ``ccmake``, which provides a curses interface to configure
CMake variables in an interactive manner.

As a result, the new ``compile_commands.json`` file should appear in the
current directory. You should link it to the LLVM source tree so that
Clang Tooling is able to use it:

.. code-block:: console

  $ ln -s $PWD/compile_commands.json path/to/llvm/source/

Now you are ready to build and test LLVM using Ninja:

.. code-block:: console

  $ ninja check-all

Other target names can be used in the same way as with make.

@


1.1.1.1.4.1
log
@file HowToSetupToolingForLLVM.rst was added on branch yamt-pagecache on 2014-05-22 16:18:19 +0000
@
text
@d1 199
@


1.1.1.1.4.2
log
@sync with head.

for a reference, the tree before this commit was tagged
as yamt-pagecache-tag8.

this commit was splitted into small chunks to avoid
a limitation of cvs.  ("Protocol error: too many arguments")
@
text
@a0 199
===================================
How To Setup Clang Tooling For LLVM
===================================

Clang Tooling provides infrastructure to write tools that need syntactic
and semantic information about a program. This term also relates to a set
of specific tools using this infrastructure (e.g. ``clang-check``). This
document provides information on how to set up and use Clang Tooling for
the LLVM source code.

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

Clang Tooling needs a compilation database to figure out specific build
options for each file. Currently it can create a compilation database
from the ``compilation_commands.json`` file, generated by CMake. When
invoking clang tools, you can either specify a path to a build directory
using a command line parameter ``-p`` or let Clang Tooling find this
file in your source tree. In either case you need to configure your
build using CMake to use clang tools.

Setup Clang Tooling Using CMake and Make
========================================

If you intend to use make to build LLVM, you should have CMake 2.8.6 or
later installed (can be found `here <http://cmake.org>`_).

First, you need to generate Makefiles for LLVM with CMake. You need to
make a build directory and run CMake from it:

.. code-block:: console

  $ mkdir your/build/directory
  $ cd your/build/directory
  $ cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON path/to/llvm/sources

If you want to use clang instead of GCC, you can add
``-DCMAKE_C_COMPILER=/path/to/clang -DCMAKE_CXX_COMPILER=/path/to/clang++``.
You can also use ``ccmake``, which provides a curses interface to configure
CMake variables for lazy people.

As a result, the new ``compile_commands.json`` file should appear in the
current directory. You should link it to the LLVM source tree so that
Clang Tooling is able to use it:

.. code-block:: console

  $ ln -s $PWD/compile_commands.json path/to/llvm/source/

Now you are ready to build and test LLVM using make:

.. code-block:: console

  $ make check-all

Using Clang Tools
=================

After you completed the previous steps, you are ready to run clang tools. If
you have a recent clang installed, you should have ``clang-check`` in
``$PATH``. Try to run it on any ``.cpp`` file inside the LLVM source tree:

.. code-block:: console

  $ clang-check tools/clang/lib/Tooling/CompilationDatabase.cpp

If you're using vim, it's convenient to have clang-check integrated. Put
this into your ``.vimrc``:

::

    function! ClangCheckImpl(cmd)
      if &autowrite | wall | endif
      echo "Running " . a:cmd . " ..."
      let l:output = system(a:cmd)
      cexpr l:output
      cwindow
      let w:quickfix_title = a:cmd
      if v:shell_error != 0
        cc
      endif
      let g:clang_check_last_cmd = a:cmd
    endfunction

    function! ClangCheck()
      let l:filename = expand('%')
      if l:filename =~ '\.\(cpp\|cxx\|cc\|c\)$'
        call ClangCheckImpl("clang-check " . l:filename)
      elseif exists("g:clang_check_last_cmd")
        call ClangCheckImpl(g:clang_check_last_cmd)
      else
        echo "Can't detect file's compilation arguments and no previous clang-check invocation!"
      endif
    endfunction

    nmap <silent> <F5> :call ClangCheck()<CR><CR>

When editing a .cpp/.cxx/.cc/.c file, hit F5 to reparse the file. In
case the current file has a different extension (for example, .h), F5
will re-run the last clang-check invocation made from this vim instance
(if any). The output will go into the error window, which is opened
automatically when clang-check finds errors, and can be re-opened with
``:cope``.

Other ``clang-check`` options that can be useful when working with clang
AST:

* ``-ast-print`` --- Build ASTs and then pretty-print them.
* ``-ast-dump`` --- Build ASTs and then debug dump them.
* ``-ast-dump-filter=<string>`` --- Use with ``-ast-dump`` or ``-ast-print`` to
  dump/print only AST declaration nodes having a certain substring in a
  qualified name. Use ``-ast-list`` to list all filterable declaration node
  names.
* ``-ast-list`` --- Build ASTs and print the list of declaration node qualified
  names.

Examples:

.. code-block:: console

  $ clang-check tools/clang/tools/clang-check/ClangCheck.cpp -ast-dump -ast-dump-filter ActionFactory::newASTConsumer
  Processing: tools/clang/tools/clang-check/ClangCheck.cpp.
  Dumping ::ActionFactory::newASTConsumer:
  clang::ASTConsumer *newASTConsumer() (CompoundStmt 0x44da290 </home/alexfh/local/llvm/tools/clang/tools/clang-check/ClangCheck.cpp:64:40, line:72:3>
    (IfStmt 0x44d97c8 <line:65:5, line:66:45>
      <<<NULL>>>
        (ImplicitCastExpr 0x44d96d0 <line:65:9> '_Bool':'_Bool' <UserDefinedConversion>
  ...
  $ clang-check tools/clang/tools/clang-check/ClangCheck.cpp -ast-print -ast-dump-filter ActionFactory::newASTConsumer
  Processing: tools/clang/tools/clang-check/ClangCheck.cpp.
  Printing <anonymous namespace>::ActionFactory::newASTConsumer:
  clang::ASTConsumer *newASTConsumer() {
      if (this->ASTList.operator _Bool())
          return clang::CreateASTDeclNodeLister();
      if (this->ASTDump.operator _Bool())
          return clang::CreateASTDumper(this->ASTDumpFilter);
      if (this->ASTPrint.operator _Bool())
          return clang::CreateASTPrinter(&llvm::outs(), this->ASTDumpFilter);
      return new clang::ASTConsumer();
  }

(Experimental) Using Ninja Build System
=======================================

Optionally you can use the `Ninja <https://github.com/martine/ninja>`_
build system instead of make. It is aimed at making your builds faster.
Currently this step will require building Ninja from sources.

To take advantage of using Clang Tools along with Ninja build you need
at least CMake 2.8.9.

Clone the Ninja git repository and build Ninja from sources:

.. code-block:: console

  $ git clone git://github.com/martine/ninja.git
  $ cd ninja/
  $ ./bootstrap.py

This will result in a single binary ``ninja`` in the current directory.
It doesn't require installation and can just be copied to any location
inside ``$PATH``, say ``/usr/local/bin/``:

.. code-block:: console

  $ sudo cp ninja /usr/local/bin/
  $ sudo chmod a+rx /usr/local/bin/ninja

After doing all of this, you'll need to generate Ninja build files for
LLVM with CMake. You need to make a build directory and run CMake from
it:

.. code-block:: console

  $ mkdir your/build/directory
  $ cd your/build/directory
  $ cmake -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON path/to/llvm/sources

If you want to use clang instead of GCC, you can add
``-DCMAKE_C_COMPILER=/path/to/clang -DCMAKE_CXX_COMPILER=/path/to/clang++``.
You can also use ``ccmake``, which provides a curses interface to configure
CMake variables in an interactive manner.

As a result, the new ``compile_commands.json`` file should appear in the
current directory. You should link it to the LLVM source tree so that
Clang Tooling is able to use it:

.. code-block:: console

  $ ln -s $PWD/compile_commands.json path/to/llvm/source/

Now you are ready to build and test LLVM using Ninja:

.. code-block:: console

  $ ninja check-all

Other target names can be used in the same way as with make.

@


