自分のつかってる開発環境を公開してみる

この記事は[Chromium Browser Advent Calendar 2017](https://qiita.com/advent-calendar/2017/chromium)の9日目の記事です。
いま砂漠にいてネットがないという噂のyuryuさんの代理で投稿させてもらいます・・・！

今回は、自分の普段のワークフローで使っている環境として、diffビューワー & mergeツールである[meld](http://meldmerge.org/)、ビルドするために使ってる簡単なスクリプト（build.sh）、あとEmacsの設定を少し紹介したいと思います。
もしこうしたほうが便利だよ！みたいなのがあったらぜひ教えてください：）

# meld
普段Emacsを使っているのでプライベートでは[magit](https://github.com/magit/magit)を使っているのですが、chromiumのリポジトリがあまりに重すぎてmagitが使い物にならないので、[meld](http://meldmerge.org/)を使っています。
mergetoolとして見やすく、ショートカットキーを使うことでサクサク作業できるので便利です。

.gitconfigに以下を追加することで、`git difftool -d`とか`git mergetool`とかのツールとして使うことができます。

```:~/.gitconfig
[diff]
        tool = meld
[merge]
        tool = meld
[mergetool "meld"]
    cmd = meld $LOCAL $MERGED $REMOTE
    keepBackup = false
```

# build.sh（適当につくったスクリプト）

普段複数のパッチを別のブランチで作業していますが、パッチAをレビューに投げる→パッチBを書く→パッチAに戻る、としたときにビルドしたバイナリがそのままのこっていると何かと便利だなということを感じていました。
そこで、適当にninjaを叩く代わりのラッパースクリプトをかいて、ブランチごと＆ビルドオプションごとのディレクトリを掘ってビルドするようにしています。
https://gist.github.com/makotoshimazu/1a9bd0a3f43a471057fc587f192571f9

やってくれることとしては、ブランチごと＆ビルドタイプごとに別のoutディレクトリを作ってくれること、特に指定しなくても適当なビルドターゲットでコンパイルしてくれること、あと後述するEmacsの予測変換に必要なファイル（.clang_complete）を吐いてくれることの３つになります。

## つかいかた

```sh
# chromiumのソースがあるディレクトリの中にbuild.shを置く
$ cd chromium/src
$ wget https://gist.githubusercontent.com/makotoshimazu/1a9bd0a3f43a471057fc587f192571f9/raw/abf1026b3e70b3059d8f1d11fd58b327c18ffab1/build.sh
$ chmod +x build.sh
$ gn gen out/release #同様に、debug用のバイナリを作りたいときにはout/debugを作る
$ gn args out/release
# releaseビルド用のGNの設定を書く。
$ ./build.sh release
```

こうすると、`out/branchname_release`というディレクトリを作成し、`out/release`からgnの設定（args.gn）をコピーしてきて、そのディレクトリに適当なバイナリをビルドしてくれます。
もし.clang_completeが必要ない場合は、build.shの最後から２行目、update_clang_completeの行をコメントアウトすると動くと思います。

以下に僕がつかってるgnの設定をメモしておきます。

```:out/release/args.gn
is_component_build = true
is_debug = false
enable_nacl = false
dcheck_always_on = true
```

```:out/debug/args.gn
is_component_build = true
is_debug = true
enable_nacl = false
dcheck_always_on = true
```

```:out/android/args.gn
is_debug = false
target_os = "android"
target_cpu = "arm"
symbol_level = 0
# enable_incremental_javac = true
# is_component_build = true
```

```:out/asan/args.gn
is_asan = true
is_lsan = true
is_debug = false
enable_nacl = false  # Necessary until the NaCl GN build is more complete.
```
```:out/tsan/args.gn
is_component_build = true
is_debug = false
enable_nacl = false
is_tsan = true
```

```:out/msan/args.gn
is_msan = true
use_prebuilt_instrumented_libraries = true
is_debug = false
enable_nacl = false  # Necessary until the NaCl GN build is more complete.
```



# Emacs

エディタの設定です。人によってそれぞれだと思うので、こうした方がいいよ！とかあったらめっちゃ知りたいです・・・

とりあえず記事に書いた部分の.emacs.dを[ここ](https://github.com/makotoshimazu/emacs_chromium_adv2017)に公開しておきました。参考にどうぞ。

## 基本設定

```emacs:~/.emacs.d/init.el
;; == Basic settings ==
;; Remove tool bar
(tool-bar-mode 0)
;; Remove menu bar
(menu-bar-mode 0)
;; Use y/n instead of yes/no
(fset 'yes-or-no-p 'y-or-n-p)
;; No *.~ files
(setq make-backup-files nil)
;; No .#* files
(setq auto-save-default nil)
;; Use C-h as backspace
(keyboard-translate ?\C-h ?\C-?)
;; Highlight relevant parenthesis
(show-paren-mode t)
;; Show underline
(setq hl-line-face 'underline)
(global-hl-line-mode)
;; Share clipboard with X
(setq x-select-enable-clipboard t)
;; Highlight the target words
(setq search-highlight t)
(setq query-replace-highlight t)
;; Auto indent on newline
(global-set-key "\C-m" 'newline-and-indent)
;; Kill whole line including newline by one C-k
(setq kill-whole-line t)
```

## Package.el
デフォルトで入ってるしそれなりに便利なのでつかってます。Caskとかあるみたいだけどpackage.elと比較したときの嬉しさをあまり良くわかってないです。

まず、初めてM-x list-packageすると勝手に以下のやつをinit.elに雑な感じで突っ込んでくるので、適当に見た目よさそうなところへ移動させます。

```emacs
;; Added by Package.el.  This must come before configurations of
;; installed packages.  Don't delete this line.  If you don't want it,
;; just comment it out by adding a semicolon to the start of the line.
;; You may delete these explanatory comments.
(package-initialize)
```
さすがにデフォルトだとパッケージが足りないので、melpaを追加します。

```emacs-lisp
;; Add mepla
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t)
```

## 予測変換（company, irony)

`M-x list-package`をして、companyを検索。iをおしてinstall状態にします。
ついでにironyとcompany-ironyもやっちゃおう。
さいごにxでまとめて実行。
Emacs起動し直して、`M-x install-irony-server`をすると、ironyのために裏でclangを回すプログラムがビルドできます。

```emacs
;; == company ==
(add-hook 'after-init-hook 'global-company-mode)
(setq company-idle-delay 0.1)
(setq company-minimum-prefix-length 2)

;; == irony ==
(add-hook 'c++-mode-hook 'irony-mode)
(add-hook 'c-mode-hook 'irony-mode)
(add-hook 'irony-mode-hook 'company-irony-setup-begin-commands)
(add-to-list 'company-backends 'company-irony)
```

再起動してC++かいてみるとこんな感じ。
![Screenshot from 2017-12-22 13-26-12.png](https://qiita-image-store.s3.amazonaws.com/0/103582/3d1e85aa-f041-4b06-13b7-2c12c329fedc.png)

## 文法チェック（flycheck-irony）
全体をビルドする前にローカルでチェックしてくれるので、凡ミスに気づけます。
`M-x list-packages`からflycheckとflycheck-ironyをiしてxでインストールしましょう。
さっきまでのcompany, ironyの設定も含めて書くとこんな感じになります。

```emacs
;; == company ==
(require 'company)
(add-hook 'after-init-hook 'global-company-mode)
(setq company-idle-delay 0.1)
(setq company-minimum-prefix-length 2)

;; == flycheck ==
(add-hook 'after-init-hook #'global-flycheck-mode)
(define-key global-map (kbd "C-M-P") 'flycheck-previous-error)
(define-key global-map (kbd "C-M-N") 'flycheck-next-error)

;; == irony ==
(add-hook 'c++-mode-hook 'irony-mode)
(add-hook 'c-mode-hook 'irony-mode)
(add-hook 'irony-mode-hook 'company-irony-setup-begin-commands)
(add-to-list 'company-backends 'company-irony)
(eval-after-load 'flycheck
  '(add-hook 'flycheck-mode-hook #'flycheck-irony-setup))
```

再起動してチェックしてみると、さっき例で書いたプログラムに文法エラーがあったことがわかります。

![Screenshot from 2017-12-22 13-32-38.png](https://qiita-image-store.s3.amazonaws.com/0/103582/377720e6-21db-5a72-a7ac-e24baa7edf01.png)

`C-M-P`とか`C-M-N`でエラー一覧見れたり、`C-! l`でエラーの一覧がでてきたりするので便利です。

### ところでchromiumのリポジトリで動かしたい
わかります。インクルードするパスをGNで設定してあったりするので、それをどこかに書かないとぜんぜんヘッダが読み込まれません。

ということで、まず.clang_completeという設定ファイルを自動で読み込むように設定しましょう。すると、バックエンドで走らせるclangのコンパイルオプションをディレクトリごとにいじることが出来ます。
これを足せばOKです。

```emacs
(add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)
```

ironyの設定はこんな感じになると思います。

```emacs
;; == irony ==
(add-hook 'c++-mode-hook 'irony-mode)
(add-hook 'c-mode-hook 'irony-mode)
(add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)
(add-hook 'irony-mode-hook 'company-irony-setup-begin-commands)
(add-to-list 'company-backends 'company-irony)
(eval-after-load 'flycheck
  '(add-hook 'flycheck-mode-hook #'flycheck-irony-setup))
```

とりあえずこれをchromium/srcのしたに.clang_completeという名前で置きましょう。すると（だいたい）救われます。

```text:~/chromium/src/.clang_complete
-std=c++14
-DCONTENT_IMPLEMENTATION
-I.
-I./third_party/khronos 
-I./gpu 
-I./third_party/libwebp 
-I./testing/gtest/include 
-I./skia/config 
-I./skia/ext 
-I./third_party/skia/include/c 
-I./third_party/skia/include/config 
-I./third_party/skia/include/core 
-I./third_party/skia/include/effects 
-I./third_party/skia/include/images 
-I./third_party/skia/include/lazy 
-I./third_party/skia/include/pathops 
-I./third_party/skia/include/pdf 
-I./third_party/skia/include/pipe 
-I./third_party/skia/include/ports 
-I./third_party/skia/include/utils 
-I./third_party/skia/include/gpu 
-I./third_party/skia/src/gpu 
-I./third_party/skia/src/sksl 
-I./third_party/icu/source/common 
-I./third_party/icu/source/i18n 
-I./third_party/mesa/src/include 
-I./third_party/libwebm/source 
-I./third_party/protobuf/src
-I./third_party/googletest/src/googletest/include/
-Iout/Default/gen/protoc_out 
-Iout/Default/gen 
-Iout/Default/gen/blink 
-Iout/Default/gen/third_party/WebKit
-Iout/Default/gen/ui/resources 
-Iout/Default/gen/v8/include 
-I./build/linux/debian_jessie_amd64-sysroot/usr/include/glib-2.0
-I./build/linux/debian_jessie_amd64-sysroot/usr/include/nspr
-I./build/linux/debian_jessie_amd64-sysroot/usr/include/nss
-I./build/linux/debian_jessie_amd64-sysroot/usr/lib/x86_64-linux-gnu/glib-2.0/include
-I./testing/gmock/include 
-I./testing/gmock_custom 
-I./third_party 
-I./third_party/WebKit 
-I./third_party/WebKit/Source 
-I./third_party/boringssl/src/include 
-I./third_party/ced/src 
-I./third_party/iccjpeg 
-I./third_party/leveldatabase 
-I./third_party/leveldatabase/src 
-I./third_party/leveldatabase/src/include 
-I./third_party/libjpeg_turbo 
-I./third_party/libpng 
-I./third_party/libvpx/source/libvpx
-I./third_party/libyuv/include 
-I./third_party/ots/include 
-I./third_party/webrtc_overrides 
-I./third_party/zlib 
-I./v8/include 
-isystem./buildtools/third_party/libc++/trunk/include
-isystem./buildtools/third_party/libc++abi/trunk/include
--sysroot=./build/linux/debian_jessie_amd64-sysroot
```

Blinkのほうもそれなりにいじる機会があるので、こんなのをsrc/third_party/WebKit/.clang_completeに足してます。

```text:~/chromium/src/third_party/WebKit/.clang_complete
-std=c++14
-DBLINK_MODULES_IMPLEMENTATION=1
-DCHROMIUM_BUILD
-DCOMPONENT_BUILD
-DDYNAMIC_ANNOTATIONS_ENABLED=1
-DENABLE_MEDIA_ROUTER=1
-DFIELDTRIAL_TESTING_ENABLED
-DFULL_SAFE_BROWSING
-DSAFE_BROWSING_CSD
-DSAFE_BROWSING_DB_LOCAL
-DUSE_AURA=1
-DUSE_CAIRO=1
-DUSE_GLIB=1
-DUSE_NSS_CERTS=1
-DUSE_PANGO=1
-DUSE_UDEV
-DUSE_X11=1
-DV8_DEPRECATION_WARNINGS
-DWTF_USE_DYNAMIC_ANNOTATIONS=1
-D_FILE_OFFSET_BITS=64
-D_LARGEFILE64_SOURCE
-D_LARGEFILE_SOURCE
-D__STDC_CONSTANT_MACROS
-D__STDC_FORMAT_MACROS
-DBLINK_IMPLEMENTATION=1
-DINSIDE_BLINK
-DGLIB_VERSION_MAX_ALLOWED=GLIB_VERSION_2_32
-DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_26
-DGL_GLEXT_PROTOTYPES
-DUSE_GLX
-DUSE_EGL
-DSK_IGNORE_LINEONLY_AA_CONVEX_PATH_OPTS
-DSKIA_DLL
-DGR_GL_IGNORE_ES3_MSAA=0
-DSK_SUPPORT_GPU=1
-DENABLE_LAYOUT_UNIT_IN_INLINE_BOXES=0
-DENABLE_OILPAN=1
-DWTF_USE_CONCATENATED_IMPULSE_RESPONSES=1
-DWTF_USE_WEBAUDIO_FFMPEG=1
-DWTF_USE_DEFAULT_RENDER_THEME=1
-DU_USING_ICU_NAMESPACE=0
-DU_ENABLE_DYLOAD=0
-DICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE
-DANGLE_ENABLE_RELEASE_ASSERTS
-DLIBXSLT_STATIC
-DUSING_V8_SHARED
-DGOOGLE_PROTOBUF_NO_RTTI
-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER
-DHAVE_PTHREAD
-DPROTOBUF_USE_DLLS
-DBORINGSSL_SHARED_LIBRARY
-DUSE_LIBJPEG_TURBO=1
-I../..
-I../../build/linux/debian_jessie_amd64-sysroot/usr/include/glib-2.0
-I../../build/linux/debian_jessie_amd64-sysroot/usr/include/nspr
-I../../build/linux/debian_jessie_amd64-sysroot/usr/include/nss
-I../../build/linux/debian_jessie_amd64-sysroot/usr/lib/x86_64-linux-gnu/glib-2.0/include
-I../../gpu
-I../../skia/config
-I../../skia/ext
-I../../third_party/WebKit
-I../../third_party/WebKit/Source
-I../../third_party/WebKit/Source/platform
-I../../third_party/angle/include
-I../../third_party/angle/src/common/third_party/numerics
-I../../third_party/boringssl/src/include
-I../../third_party/iccjpeg
-I../../third_party/icu/source/common
-I../../third_party/icu/source/i18n
-I../../third_party/khronos
-I../../third_party/libjpeg_turbo
-I../../third_party/libpng
-I../../third_party/libwebm/source
-I../../third_party/libwebp
-I../../third_party/libxml/linux/include
-I../../third_party/libxml/src/include
-I../../third_party/libxslt
-I../../third_party/mesa/src/include
-I../../third_party/ots/include
-I../../third_party/protobuf/src
-I../../third_party/skia/include/c
-I../../third_party/skia/include/config
-I../../third_party/skia/include/core
-I../../third_party/skia/include/effects
-I../../third_party/skia/include/gpu
-I../../third_party/skia/include/images
-I../../third_party/skia/include/lazy
-I../../third_party/skia/include/pathops
-I../../third_party/skia/include/pdf
-I../../third_party/skia/include/pipe
-I../../third_party/skia/include/ports
-I../../third_party/skia/include/utils
-I../../third_party/skia/src/gpu
-I../../third_party/skia/src/sksl
-I../../third_party/snappy/linux
-I../../third_party/snappy/src
-I../../third_party/zlib
-I../../v8/include
-I../../out/Default/gen
-I../../out/Default/gen/angle
-I../../out/Default/gen/blink
-I../../out/Default/gen/protoc_out
-I../../out/Default/gen/third_party/WebKit
-I../../out/Default/gen/v8/include
-isystem../../buildtools/third_party/libc++/trunk/include
-isystem../../buildtools/third_party/libc++abi/trunk/include
--sysroot=../../build/linux/debian_jessie_amd64-sysroot
```

この辺は、ninjaを実行するときに-vオプションをつけて適当なシンボルをビルドするときの設定をコピーしてきました。

あと細かいですが、.clang_completeがgitでコミットされないようにしときましょう。

```shell
# Run this in your chromium/src directory
$ echo ".clang_complete" >> .git/info/exclude
```

## .clang_completeの中のoutディレクトリが今つかってるoutディレクトリが違うんだけど
そうなんですよね。outディレクトリにあるヘッダを適切に読み込めないとmojoのインターフェースが補完されなくて不便です。ということで[build.sh](https://gist.github.com/makotoshimazu/1a9bd0a3f43a471057fc587f192571f9)が自動でoutディレクトリに合わせてくれるようにしたら意外と便利でした。
詳細は[build.sh](https://gist.github.com/makotoshimazu/1a9bd0a3f43a471057fc587f192571f9)を見てもらえばわかるかと思いますが、`update_clang_complete`では.clang_complete.templateを読み取り、`%OUTDIR%`と書いてある部分を正しいoutディレクトリのパスに置換して.clang_completeをアップデートしてくれます。

```bash
function update_clang_complete() {
    OUTDIR_TAG="%OUTDIR%"
    TARGET_PATHS=("$script_dir/.clang_complete" "$script_dir/third_party/WebKit/.clang_complete")
    outdir="$1"
    for target in ${TARGET_PATHS[@]}; do
      template_path="${target}.template"
      sed -e "s|${OUTDIR_TAG}|${outdir}|" $template_path > $target
    done
}
```

つまり、前述の.clang_completeの代わりに.clang_complete.templateを以下のようにしておいておけばOKです。

```:~/chromium/src/.clang_complete.template
```text:~/chromium/src/.clang_complete
-std=c++14
-DCONTENT_IMPLEMENTATION
-I.
-I./third_party/khronos 
-I./gpu 
-I./third_party/libwebp 
-I./testing/gtest/include 
-I./skia/config 
-I./skia/ext 
-I./third_party/skia/include/c 
-I./third_party/skia/include/config 
-I./third_party/skia/include/core 
-I./third_party/skia/include/effects 
-I./third_party/skia/include/images 
-I./third_party/skia/include/lazy 
-I./third_party/skia/include/pathops 
-I./third_party/skia/include/pdf 
-I./third_party/skia/include/pipe 
-I./third_party/skia/include/ports 
-I./third_party/skia/include/utils 
-I./third_party/skia/include/gpu 
-I./third_party/skia/src/gpu 
-I./third_party/skia/src/sksl 
-I./third_party/icu/source/common 
-I./third_party/icu/source/i18n 
-I./third_party/mesa/src/include 
-I./third_party/libwebm/source 
-I./third_party/protobuf/src
-I./third_party/googletest/src/googletest/include/
-I%OUTDIR%/gen/protoc_out 
-I%OUTDIR%/gen 
-I%OUTDIR%/gen/blink 
-I%OUTDIR%/gen/third_party/WebKit
-I%OUTDIR%/gen/ui/resources 
-I%OUTDIR%/gen/v8/include 
-I./build/linux/debian_jessie_amd64-sysroot/usr/include/glib-2.0
-I./build/linux/debian_jessie_amd64-sysroot/usr/include/nspr
-I./build/linux/debian_jessie_amd64-sysroot/usr/include/nss
-I./build/linux/debian_jessie_amd64-sysroot/usr/lib/x86_64-linux-gnu/glib-2.0/include
-I./testing/gmock/include 
-I./testing/gmock_custom 
-I./third_party 
-I./third_party/WebKit 
-I./third_party/WebKit/Source 
-I./third_party/boringssl/src/include 
-I./third_party/ced/src 
-I./third_party/iccjpeg 
-I./third_party/leveldatabase 
-I./third_party/leveldatabase/src 
-I./third_party/leveldatabase/src/include 
-I./third_party/libjpeg_turbo 
-I./third_party/libpng 
-I./third_party/libvpx/source/libvpx
-I./third_party/libyuv/include 
-I./third_party/ots/include 
-I./third_party/webrtc_overrides 
-I./third_party/zlib 
-I./v8/include 
-isystem./buildtools/third_party/libc++/trunk/include
-isystem./buildtools/third_party/libc++abi/trunk/include
--sysroot=./build/linux/debian_jessie_amd64-sysroot
```


```text:~/chromium/src/third_party/WebKit/.clang_complete.template
-std=c++14
-DBLINK_MODULES_IMPLEMENTATION=1
-DCHROMIUM_BUILD
-DCOMPONENT_BUILD
-DDYNAMIC_ANNOTATIONS_ENABLED=1
-DENABLE_MEDIA_ROUTER=1
-DFIELDTRIAL_TESTING_ENABLED
-DFULL_SAFE_BROWSING
-DSAFE_BROWSING_CSD
-DSAFE_BROWSING_DB_LOCAL
-DUSE_AURA=1
-DUSE_CAIRO=1
-DUSE_GLIB=1
-DUSE_NSS_CERTS=1
-DUSE_PANGO=1
-DUSE_UDEV
-DUSE_X11=1
-DV8_DEPRECATION_WARNINGS
-DWTF_USE_DYNAMIC_ANNOTATIONS=1
-D_FILE_OFFSET_BITS=64
-D_LARGEFILE64_SOURCE
-D_LARGEFILE_SOURCE
-D__STDC_CONSTANT_MACROS
-D__STDC_FORMAT_MACROS
-DBLINK_IMPLEMENTATION=1
-DINSIDE_BLINK
-DGLIB_VERSION_MAX_ALLOWED=GLIB_VERSION_2_32
-DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_26
-DGL_GLEXT_PROTOTYPES
-DUSE_GLX
-DUSE_EGL
-DSK_IGNORE_LINEONLY_AA_CONVEX_PATH_OPTS
-DSKIA_DLL
-DGR_GL_IGNORE_ES3_MSAA=0
-DSK_SUPPORT_GPU=1
-DENABLE_LAYOUT_UNIT_IN_INLINE_BOXES=0
-DENABLE_OILPAN=1
-DWTF_USE_CONCATENATED_IMPULSE_RESPONSES=1
-DWTF_USE_WEBAUDIO_FFMPEG=1
-DWTF_USE_DEFAULT_RENDER_THEME=1
-DU_USING_ICU_NAMESPACE=0
-DU_ENABLE_DYLOAD=0
-DICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE
-DANGLE_ENABLE_RELEASE_ASSERTS
-DLIBXSLT_STATIC
-DUSING_V8_SHARED
-DGOOGLE_PROTOBUF_NO_RTTI
-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER
-DHAVE_PTHREAD
-DPROTOBUF_USE_DLLS
-DBORINGSSL_SHARED_LIBRARY
-DUSE_LIBJPEG_TURBO=1
-I../..
-I../../build/linux/debian_jessie_amd64-sysroot/usr/include/glib-2.0
-I../../build/linux/debian_jessie_amd64-sysroot/usr/include/nspr
-I../../build/linux/debian_jessie_amd64-sysroot/usr/include/nss
-I../../build/linux/debian_jessie_amd64-sysroot/usr/lib/x86_64-linux-gnu/glib-2.0/include
-I../../gpu
-I../../skia/config
-I../../skia/ext
-I../../third_party/WebKit
-I../../third_party/WebKit/Source
-I../../third_party/WebKit/Source/platform
-I../../third_party/angle/include
-I../../third_party/angle/src/common/third_party/numerics
-I../../third_party/boringssl/src/include
-I../../third_party/iccjpeg
-I../../third_party/icu/source/common
-I../../third_party/icu/source/i18n
-I../../third_party/khronos
-I../../third_party/libjpeg_turbo
-I../../third_party/libpng
-I../../third_party/libwebm/source
-I../../third_party/libwebp
-I../../third_party/libxml/linux/include
-I../../third_party/libxml/src/include
-I../../third_party/libxslt
-I../../third_party/mesa/src/include
-I../../third_party/ots/include
-I../../third_party/protobuf/src
-I../../third_party/skia/include/c
-I../../third_party/skia/include/config
-I../../third_party/skia/include/core
-I../../third_party/skia/include/effects
-I../../third_party/skia/include/gpu
-I../../third_party/skia/include/images
-I../../third_party/skia/include/lazy
-I../../third_party/skia/include/pathops
-I../../third_party/skia/include/pdf
-I../../third_party/skia/include/pipe
-I../../third_party/skia/include/ports
-I../../third_party/skia/include/utils
-I../../third_party/skia/src/gpu
-I../../third_party/skia/src/sksl
-I../../third_party/snappy/linux
-I../../third_party/snappy/src
-I../../third_party/zlib
-I../../v8/include
-I../../%OUTDIR%/gen
-I../../%OUTDIR%/gen/angle
-I../../%OUTDIR%/gen/blink
-I../../%OUTDIR%/gen/protoc_out
-I../../%OUTDIR%/gen/third_party/WebKit
-I../../%OUTDIR%/gen/v8/include
-isystem../../buildtools/third_party/libc++/trunk/include
-isystem../../buildtools/third_party/libc++abi/trunk/include
--sysroot=../../build/linux/debian_jessie_amd64-sysroot
```

さいごにこれも忘れずにignoreしましょう。

```shell
# Run this in your chromium/src directory
$ echo ".clang_complete.template" >> .git/info/exclude
```


## そのほか好きなパッケージ
- [helm](https://github.com/emacs-helm/helm)
  - 適当にボタンおしたらインクリメンタルサーチでコマンド使えるのでとても便利。
- [magit](https://github.com/magit/magit)
  - ぱっと見た目がわかりやすいしhunkだけコミットとかしやすくて好きだけど、chromiumのリポジトリではおもすぎて使えないので悲しい。こないだキックスターターでお金集めてたけど、成功したみたいでよかったです。
- [moe-theme](https://github.com/kuanyui/moe-theme.el)
  - いい感じの見た目になるので好き。moe-darkとpowerline-moe-themeを使っています。
- mojo-mode
  - mojomという拡張子のchromiumで使っているIPCを記述するためのファイルのために、雑な感じでmajorモードを作りました。ただあまりに雑すぎていろいろバグってるので公開するレベルにないのでなんとかしたい・・・　もしちゃんとできたら[src/tools/emacs](https://cs.chromium.org/chromium/src/tools/emacs/)とかに公開してもいいかも。それか、もしどなたか作ってたら教えて下さい。。
- [flyspell](https://www.emacswiki.org/emacs/FlySpell)
  - EIGO苦手なので、スペルチェッカを常時動かしています。バックエンドとしては[aspell](http://aspell.net/)を使っています。