腐ったmakeを支える技術
まさか自分と同い年のMakefileと戦うことになるとは。
— Tsushimaさん (@utisam) 12月 26, 2012
あんまり身に付けたくない力だけど付いてしまったものは仕方がない. これ以上C/C++のビルドごときで時間を取られたくないので文章化したい(パズルみたいでちょっと楽しいけど).
なぜビルドが通らないのか
- 依存するライブラリが無い
- 古い文法や関数が使われている
- コマンドのバージョンが変わっている
- 腐ってやがる
1. 依存するライブラリが無い
configureでエラー
ラッキーです. ディストリのリポジトリ,もしくは本家からダウンロードしましょう.
リンカエラー
関数名で調べてみましょう. 何か見つかるかもしれません.
ネット上に無い
あきらめてそいつをbuildしない方法を考えましょう.
2. 古い文法や関数が使われている
gcc3/4の違いでいろいろあるっぽい.
プロトタイプ宣言が関数内部に書かれている
3では通りますが4だと構造体と勘違いした感じのエラーを吐きます. グローバル領域に動かしましょう. staticをつけると安全です.
古いスタイルの宣言
VC++だとエラーになるらしいです. また,gcc-3.xは引数リストが一致しなくてもプロトタイプ宣言として有効らしいので, 4.xでコンパイルすると名前被りでエラーになります. 昔適当に書いていた野郎を恨みましょう.
varargs.h
冒頭のツイートの時に最も困ったのがこれ. 現在は stdarg.h があって varargs.h をincludeするとご丁寧にエラーにしてくれる.
解決策としては
- 昔のコンパイラをインストール
- varargs.h を自作する(探したらあるかも)
- ソースを修正する
3. コマンドのバージョンが変わっている
makeやスクリプトの内部で起動するコマンドのパスやバージョンが変わって,うまく動かない場合があります. gccのアーキテクチャの指定なんかは gcc -march=native で良いと思うので, エラーを吐いてるなら置き換えましょう.
bison とか flex っぽい拡張子でエラー吐くとかなり苦しい.
4. 腐ってやがる
f**k!!
エラーメッセージを注意深く読むしかありません. 何か分かるかも.
実行時エラー
- デバッガを使う
- strcpy -> strncpy など
- const をつける
- 最適化オプションを外す
逃げる
あなたの目的はビルドを通すことではなく問題を解決することのはずです. 他の手段を探した方が効率が良いかもしれません.
将来迷惑をかけないために
- configure をちゃんと書く
- READMEを作る
- 作った年ぐらいは書いておく
- 標準的な書き方に従う
- const をつける
- 保守する
「昔の環境で使っている人ガー……」ってのはあまり良い言い訳ではないと思う. 趣味とかで作ったものを保守するのってめんどくさいけどね.