ビルド環境の構築を行う
どんなツールを使うのか
メインで利用するのは C 言語になるので、C 言語界隈の気になるツールを片っ端から導入し試してみる。
私は組み込み開発従事者なので、どうしてもGUIやIDEなどの派手なツールの利用は機会がありません。(大抵のプロジェクトで利用できる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 " }}}
いつもながら結論が出ないな。ファイラも入れたいが、 vimfiler も NERDTree もどこか合わなかったので、今回は見合わせた。
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 のインストール
以前の記事を参考にインストールします。
$ 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 からクローンします。
$ 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 からクローンし、インストールします。
有料の静的解析ツール(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 でインストールできます。
$ gem install bugspots
bugspots はコミットログを解析するため、コミットログに工夫をする必要があります。(デフォルトでは、 fix
が含まれるコミットログを不具合修正コミットとみなす)
この辺りは、ルール付けをして新しいコミットから適用すれば、すんなり運用に乗せられそう。
あとは、 cmake の代わりに gyp とかも気になるけど、情報量が少ないのでひとまず cmake を使い込んでみる。
cmake に不満がでたら gyp も検討してみよう。