2012年1月30日月曜日

bashを利用した簡単コンパイル

ヘッダやライブラリを使ってプログラムを書いていると,
徐々にgccのコマンドが伸びてきて打つのが大変になってきます.
たとえば僕の例だとプログラムフォルダの上に utility/ というフォルダを
作ってそこにヘッダファイルを入れているので,
$ gcc -O3 -o main main.c ../utility/hoge.c ../utility/hugya.c -lfftw3 -g
みたいな感じでいちいち打っていました.長くてめんどくさいですね.
こんなとき,makefileを使うのがひとつの手段としてありますが,他にスクリプトを利用する方法があるので参考程度にご紹介します.
まず適当にc.shという名前のファイルを作ってヘッダと同じフォルダに入れておきます.

#!/bin/sh
gcc -O3 -o $1 $1.c ../utility/hoge.c ../utility/hugya.c -lfftw3 -g

gccの行は自分がいつもコンパイルする時のスタイルで書きます.
$1c.shの引数をあらわしていて,
この場合ターミナル上でプログラムフォルダから,
$ ../utility/c.sh main
みたいな感じで書くとmain.cがコンパイルされて同名のプログラムができます.

これでもまだちょっとコマンドがめんどくさいので,
ここからさらに短くするためにbashの設定ファイルをいじります.
ochiailabの人は,~/emacslib/ の中に dotbashrc ってファイルがあると思うので,
それをemacsかなんかで開いて以下を追記します.

alias c="../utility/c.s"

これはエイリアスといって,ターミナルで入力される文字列(ここでは c )に
"" の中の文字列をあてがっててくれる便利なものです.
これで,ターミナル上でコンパイルしたいプログラムのあるフォルダに移動して,
$ c main
と打ち込むと,これだけでコンパイルできるようになります.

これは自分の今の方法ですが,最近ヘッダがでかくなってきたせいで,
コンパイルに時間がかかるので,分割コンパイルと併用してこうと考えています.

あと,スクリプトを工夫することでmakeっぽく使うことも出来るはずなので,
試してみてできたら書きます.

※蛇足
emacslibにはemacsやターミナル等の設定ファイルが入っているので,
Sugarsyncなんかで同期しとくとどこのPCでも同じ環境が使えて便利です.
このとき異なるPCでコンパイルしようとすると,
ファイル権限の関係で permission denied. と言われることがありますが,
$ chmod a+x c.sh
とすると使えます.


2 件のコメント :

  1. これが難しそうなので、僕はbashrcのfunctionを使いました。
    参考URL:
    http://macwiki.sourceforge.jp/wiki/index.php/bash#.E9.96.A2.E6.95.B0.E3.82.92.E5.AE.9A.E7.BE.A9.E3.81.99.E3.82.8B

    返信削除