<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#orgheadline16">1. Setup Cpp/C Development Environment in Spacemacs</a>
<ul>
<li><a href="#orgheadline2">1.1. 1. Add c/c++ layer</a>
<ul>
<li><a href="#orgheadline1">1.1.1. Notes</a></li>
</ul>
</li>
<li><a href="#orgheadline3">1.2. 2. Makefile and Source code in the same directory</a></li>
<li><a href="#orgheadline7">1.3. 3. Makefile in different directory</a>
<ul>
<li><a href="#orgheadline6">1.3.1. Notes</a></li>
</ul>
</li>
<li><a href="#orgheadline10">1.4. 4. Clang Complete</a>
<ul>
<li><a href="#orgheadline9">1.4.1. Usage</a></li>
</ul>
</li>
<li><a href="#orgheadline13">1.5. 5. Debug</a>
<ul>
<li><a href="#orgheadline11">1.5.1. Compile source files with <code>-g</code> flag</a></li>
<li><a href="#orgheadline12">1.5.2. <code>SPC :</code> -&gt; <code>gdb</code> invoke gdb inside Spacemacs</a></li>
</ul>
</li>
<li><a href="#orgheadline15">1.6. Todo</a>
<ul>
<li><a href="#orgheadline14">1.6.1. Try <code>rtags</code> for better code navigation.</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>

# Setup Cpp/C Development Environment in Spacemacs<a id="orgheadline16"></a>

Based on Eivind Fonn's tutorial [<https://www.youtube.com/watch?v=OjbkCEkboA8>]

## 1. Add c/c++ layer<a id="orgheadline2"></a>

Simply add this `(c-c++ :variables c-c++-enable-clang-support t)`
in `dotspacemacs-configuration-layers`, like this:

    ...
    dotspacemacs-configuration-layers
    '( ...
      (c-c++ :variables c-c++-enable-clang-support t)
      ...
      )
    ...

### Notes<a id="orgheadline1"></a>

This configuration will enable `clang` support, so you have to 
guarantee `clang` has been installed. 

## 2. Makefile and Source code in the same directory<a id="orgheadline3"></a>

This is the simplest situation, that you can open any source code file,
then type `SPC c c` for compilation. 
`SPC c C` is for specifying compilation command, sometimes need this
for enabling debug mode.

## 3. Makefile in different directory<a id="orgheadline7"></a>

In this situation we need to specify the location of `Makefile`. 
`.dir-locals.el` file is needed for this purpose. `.dir-locals.el` 
should be placed in project root. The file content looks like this:

    ((c++-mode (helm-make-build-dir . "build/")))

### Notes<a id="orgheadline6"></a>

1.  The path `build/` is relative to project root directory.

2.  Emacs will ask if the variable `helm-make-build-dir` is safe.

    Put the configuration in `.spacemacs` to prevent this.
    
        (put 'helm-make-build-dir 'safe-local-variable 'stringp)

## 4. Clang Complete<a id="orgheadline10"></a>

If the project depends on third party libraries or header files in special locations,
 `clang` will not figure out how to analyze source codes and provide auto-complete tips. We need
the `.clang_complete` file to specify the compilation flags. That 
file can be generated by `cc_args.py`, which is a tool provided by 
`clang-complete` project. Otherwise,  The simplest way to install `cc_args.py`, I 
think is move the file to `/usr/local/bin/`.

### Usage<a id="orgheadline9"></a>

The video by Eivind Fonn demonstrates how to use `cc_args.py` with 
`cmake`. [28:00 - 29:40]. 

    CXX="cc_args.py g++" cmake ...#other flags

I find the codes below can work with `Makefile` and `make` system directly, but
it will invoke the compilation process. And the compilation process
always been interrupted by errors, though it can generate the 
`.clang_complete` file. This may cause incomplete compilation flags
in `.clang_complete`.

    CXX="cc_args.py g++" make all

1.  Turn off Warnings about unused variables

    Add `-Wno-unused-parameter` to `.clang_complete` file.

## 5. Debug<a id="orgheadline13"></a>

### Compile source files with `-g` flag<a id="orgheadline11"></a>

So the target executable file will contain debug information.

### `SPC :` -> `gdb` invoke gdb inside Spacemacs<a id="orgheadline12"></a>

The GUD interface in Spacemacs has a problem, which cause the
current line indicator disappeared. 

## Rtags for code navigation
https://github.com/lujun9972/emacs-document/blob/master/emacs-common/%E5%9C%A8spacemacs%E4%B8%AD%E4%BD%BF%E7%94%A8rtags.org