明日にはでっかい太陽が昇るかもしれません。

「覚悟」とは!! 暗闇の荒野に!!進むべき道を切り開く事だッ!

ビルド環境の構築を行う

どんなツールを使うのか

メインで利用するのは C 言語になるので、C 言語界隈の気になるツールを片っ端から導入し試してみる。

私は組み込み開発従事者なので、どうしてもGUIIDEなどの派手なツールの利用は機会がありません。(大抵のプロジェクトで利用できるCUI最高!という感じ)

ツール 目的 備考
Vim エディタ 経験値はひよこレベル
ag 検索 高速 grep 。ファイル名も grep の 50% !!
cmake ビルドスクリプト gnu make の Makefile ジェネレータ?
GCC コンパイラ 言わずと知れた業界標準コンパイラ
LLVM+Clang コンパイラ 次世代のコンパイラ。これからの時代は複数コンパイラに対応しないとね
ClangFormat フォーマッタ Clangに含まれるツール。コードレビューでスタイルを指摘するのはうんざり
cpplint フォーマットチェッカ Phython の単一コードなのでカスタマイズすれば利用の幅が広がるかも
CppUTest ユニットテスト 組み込みも意識した GoogleTest と双璧をなすツール
CppCheck 静的アナライザ フリーツールの中では標準か!?
Valgrind 動的アナライザ 使ったこと無いけど、歴史は長い。
Git バージョン管理 業界の新標準。
bugspots バグ予測 Google 謹製。 Git のコミット履歴から予測する

Vim をインストールする

Vim 自体はすでにインストール済みなのですが、標準では Lua を利用できないため NoeBundle の力をフル活用できません。

そのため、 Lua を利用できるようにするため、 vim-nox パッケージをインストールします。

$ sudo apt-get install -y vim-nox
  • vim-nox インストール前
$ vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jan  2 2014 19:39:32)
...
+dialog_con      -lua             +rightleft       +windows
...
  • vim-nox インストール後
$ vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jan  2 2014 19:39:34)
...
+dialog_con      +lua             +rightleft       +windows
...

次に、 Vim を便利に使うための NeoBundle 周りの環境を構築する。

もう、数回目の構築になるが、毎回ベストプラクティスを探して数時間かかってしまう。。。

何はともあれ、 ~/.vimrc に NeoBundle の設定(インストールするプラグイン)を記載していく。

$ cat ~/.vimrc
" neobundle settings {{{
if has('vim_starting')
  set nocompatible

  if !isdirectory(expand('~/.vim/bundle/neobundle.vim/'))
    echo 'install neobundle...'
    :call system('git clone git://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim')
  endif

  set runtimepath+=~/.vim/bundle/neobundle.vim
endif

call neobundle#begin(expand('~/.vim/bundle'))
let g:neobundle_default_git_protocol='https'

NeoBundleFetch 'Shougo/neobundle.vim'
NeoBundle 'Shougo/unite.vim'
NeoBundle 'Shougo/neomru.vim', {
  \ 'depends' : 'Shougo/unite.vim'
  \ }
NeoBundle 'Shougo/unite-outline', {
  \ 'depends' : 'Shougo/unite.vim'
  \ }
NeoBundle 'Shougo/vimproc', {
  \ 'build' : {
  \   'windows' : 'make -f make_mingw32.mak',
  \   'cygwin'  : 'make -f make_cygwin.mak',
  \   'mac'     : 'make -f make_mac.mak',
  \   'unix'    : 'make -f make_unix.mak'
  \   }
  \ }
if has('lua')
  NeoBundleLazy 'Shougo/neocomplete.vim', {
  \ 'depends'  : 'Shougo/vimproc',
  \ 'autoload' : { 'insert' : 1, }
  \ }
endif
NeoBundleLazy 'Shougo/vimshell', {
  \ 'depends'  : 'Shougo/vimproc',
  \ 'autoload' : {
  \   'commands' : [{ 'name' : 'VimShell', 'complete' : 'customlist,vimshell#complete' },
  \                 'VimShellExecute', 'VimShellInteractive',
  \                 'VimShellTerminal', 'VimShellPop'],
  \   'mappings' : ['<Plug>(vimshell_switch)']
  \   }
  \ }
NeoBundle 'Townk/vim-autoclose'
NeoBundleLazy 'tpope/vim-endwise', {
  \ 'autoload' : { 'insert' : 1 }
  \ }
NeoBundleLazy 'Shougo/neosnippet', {
  \ 'depends'  : 'Shougo/neosnippet-snippets',
  \ 'autoload' : {
  \   'insert'    : 1,
  \   'filetypes' : 'snippet'
  \   }
  \ }
NeoBundle 'Shougo/neosnippet-snippets'
NeoBundle 'itchyny/lightline.vim'
NeoBundle 'nathanaelkane/vim-indent-guides.git'

NeoBundle 'tomasr/molokai'

" install check for plugin
NeoBundleCheck
call neobundle#end()
" }}}

" neocomplete settings {{{
let g:neocomplete#enable_at_startup               = 1
let g:neocomplete#auto_completion_start_length    = 3
let g:neocomplete#enable_ignore_case              = 1
let g:neocomplete#enable_smart_case               = 1
let g:neocomplete#enable_camel_case               = 1
let g:neocomplete#use_vimproc                     = 1
let g:neocomplete#sources#buffer#cache_limit_size = 1000000
let g:neocomplete#sources#tags#cache_limit_size   = 30000000
let g:neocomplete#enable_fuzzy_completion         = 1
let g:neocomplete#lock_buffer_name_pattern        = '\*ku\*'
" }}}

" vimshell settings {{{
nmap <silent> vs :<C-u>VimShell<CR>
nmap <silent> vp :<C-u>VimShellPop<CR>
" }}}

" neosnippet settings {{{
imap <C-k> <Plug>(neosnippet_expand_or_jump)
smap <C-k> <Plug>(neosnippet_expand_or_jump)
" }}}

" common settings {{{
filetype plugin indent on

colorscheme molokai
set t_Co=256
set background=dark
syntax on

set list
set listchars=tab:>.,trail:_,extends:>,precedes:<,nbsp:%,eol:$
function! ZenkakuSpace()
  highlight ZenkakuSpace cterm=reverse ctermfg=DarkMagenta gui=reverse guifg=DarkGray
endfunction
if has('syntax')
  augroup ZenkakuSpace
    autocmd!
    autocmd ColorScheme * call ZenkakuSpace()
    autocmd BufNew,BufRead * match ZenkakuSpace /!!/
  augroup END
  call ZenkakuSpace()
endif

set number
set ts=4
set sw=4
set showmatch
set ruler
set scrolloff=7
set laststatus=2
set showmode
set showcmd

set encoding=utf-8
set fileencodings=iso-2022-jp,euc-jp,euc-jisx0213,sjis,utf-8
set fileformats=unix,dos,mac
set formatoptions+=mm
if exists('&ambiwidth')
  set ambiwidth=double
endif

set pastetoggle=

set wrapscan
set ignorecase
set smartcase
set incsearch
set hlsearch

set nobackup
set noswapfile
" }}}

いつもながら結論が出ないな。ファイラも入れたいが、 vimfilerNERDTree もどこか合わなかったので、今回は見合わせた。

ag のインストール

最新を使いたいので、ソースからインストールする。

手順は 公式 の通りに。

ビルドに必要なツールのインストール

$ sudo apt-get install -y automake pkg-config libpcre3-dev zlib1g-dev liblzma-dev

ビルド

$ tar zxvf 0.31.0.tar.gz
$ cd the_silver_searcher-0.31.0/
$ ./build.sh
$ sudo make install
$ ag --version
ag version 0.31.0

Features:
  +jit +lzma +zlib

cmake のインストール

公式で配布されるインストールスクリプトは、対話的になっているため、圧縮ファイルからインストールする。

### ファイルのダウンロード&展開
$ curl -LO https://cmake.org/files/v3.3/cmake-3.3.2-Linux-x86_64.tar.gz
$ tar zxvf cmake-3.3.2-Linux-x86_64.tar.gz
$ sudo cp -af cmake-3.3.2-Linux-x86_64 /opt/toolchain/cmake
$ sudo chown root:root -R /opt/toolchain/cmake/
### 環境変数へパスを通す
$ echo 'PATH="/opt/toolchain/cmake/bin:$PATH"' >> ~/.profile
$ . ~/.profile
### 実行確認
$ cmake --version
cmake version 3.3.2

CMake suite maintained and supported by Kitware (kitware.com/cmake).

GCC のインストール

インストール済みのため省略!

LLVM+Clang のインストール

以前の記事を参考にインストールします。

agekuno.hatenablog.com

$ sudo apt-get install -y libpython2.7 libpython2.7-dev swig libedit2 libedit-dev libncurses5-dev libxml2-dev
$ git clone http://llvm.org/git/llvm.git
$ cd llvm
$ (cd tools && git clone http://llvm.org/git/clang.git)
$ (cd projects && git clone http://llvm.org/git/libcxx)
$ (cd projects && git clone http://llvm.org/git/libcxxabi)
$ (cd projects && git clone http://llvm.org/git/compiler-rt)
$ (cd tools && git clone http://llvm.org/git/lldb)
$ (cd tools && git clone http://llvm.org/git/lld)
$ mkdir build
$ cd build
$ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/opt/toolchain/llvm+clang -DCMAKE_C_COMPILER=/usr/
bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g++ ..
$ make -j 2
$ sudo make install
$ echo 'PATH="/opt/toolchain/llvm+clang/bin:$PATH"' >> ~/.profile
$ . ~/.profile

cpplint のインストール

Github からクローンします。

github.com

$ git clone https://github.com/google/styleguide.git
$ sudo mv styleguide /opt/analyzer/
$ sudo chown root:root -R /opt/analyzer/styleguide

これから使うので、最終的なビルドシステムからは外すかも。

CppUTest のインストール

こちらも、 Github からクローンしインストールします。

$ git clone https://github.com/cpputest/cpputest.git
$ cd cpputest
$ mkdir cpputest
$ cd cpputest
$ cmake -DCMAKE_INSTALL_PREFIX=/opt/toolchain/cpputest -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCOVERAGE=ON ..
$ make
$ sudo make install

CppCheck のインストール

こちらも、 Github からクローンし、インストールします。

github.com

有料の静的解析ツール(e.g. coverity)については、プロジェクトにより利用できるかどうかが変わるため、基本的な品質をキープするために確実に導入できるツールが必要になると考えています。

$ git clone https://github.com/danmar/cppcheck.git
$ cd cppcheck
$ mkdir build
$ cd build
$ cmake -DCMAKE_INSTALL_PREFIX=/opt/analyzer/cppcheck -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_BUILD_TYPE=Release ..
$ make
$ sudo make install
$ sudo bash -c 'echo "/opt/analyzer/cppcheck/lib" > /etc/ld.so.conf.d/cppcheck.conf'
$ echo 'PATH="/opt/analyzer/cppcheck/bin:$PATH"' >> ~/.profile
$ . ~/.profile

Valgrind のインストール

ソースからインストールします。

$ curl -LO http://valgrind.org/downloads/valgrind-3.11.0.tar.bz2
$ tar jxvf valgrind-3.11.0.tar.bz2
$ cd valgrind-3.11.0
$ ./configure --prefix=/opt/analyzer/valgrind
$ make
$ sudo make install
$ echo 'PATH="/opt/analyzer/valgrind/bin:$PATH"' >> ~/.profile

Valgrind も、使ったこと無いので、どんな感じになるのかは試してからのお楽しみ。

Git のインストール

すでに導入済みなので省略。

bugspots のインストール

bugspots は ruby せいなので、 gem でインストールできます。

github.com

$ gem install bugspots

bugspots はコミットログを解析するため、コミットログに工夫をする必要があります。(デフォルトでは、 fix が含まれるコミットログを不具合修正コミットとみなす)

この辺りは、ルール付けをして新しいコミットから適用すれば、すんなり運用に乗せられそう。

あとは、 cmake の代わりに gyp とかも気になるけど、情報量が少ないのでひとまず cmake を使い込んでみる。

cmake に不満がでたら gyp も検討してみよう。