Headerの依存関係を自動処理

自動化は素晴らしい。適切に構築された自動化スクリプトは単調な作業からの開放を約束し、人為的ミスを事前に防ぐ。 ということでコンパイル時の依存関係の解決の自動化である。 結局は偉大な先人のあしあとをたどるだけなのだが、 http://d.hatena.ne.jp/ritchey/20070519/1179595462 ちょっとそのままでは問題が生じたので変更点をメモ。 上サイトから拝借した、
%.d: %.c
        @set -e; $(CC) -MM $(CPPFLAGS) $< \
                | sed 's/\($*\)\.o[ :]*/\1.o $@ : /g' > $@; \
                [ -s $@ ] || rm -f $@
が問題の部分。sedの所が問題で、もしファイル名に/が含まれる場合、それをsedコマンドが間違えて読んでしまうため、"「s」へのオプションが未知です"って怒られる。例えば一つ親のフォルダの.cppが必要なときはファイル名が../some.cppとなり/が含まれてしまう。 解決策1:$*を$(echo $* | sed 's/\//\\\//g')などとして、/を\/に置き換えてやる。こうするとsedは\/を文字の/として認識するのでのぞみの結果が得られる。 これならわざわざlogに残すまでもないことなのだが、その後とあることに気がついた。 解決策2:sedのパターンを区切る文字は「/」以外でも可。 参考HP:http://www.geocities.co.jp/geo_sunisland/filter_sed.html なので例えば
sed 's%\($*\)\.o[ :]*%\1.o $@ : %g' > $@
とする。こうすれば$*に/が含まれていても問題なく処理できる。 なお、同様のことがvimのコマンドにも使える。つまり
:%s%before%after%g
とできる。これを使えば、基本的に特殊文字をエスケープする必要がなくなる。 使える文字としては、アルファベット[a-zA-Z]は不可能、バックスラッシュ\も不可能。他の文字は可能のようだ。 思っても見なかった知識を得た。