研究で必要な雑多な知識をごった煮で
プロフィール

termoshtt

Author:termoshtt
大学院生
専攻:流体物理学
Editor: vim
Language: C++,python

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--/--/-- --:-- スポンサー広告 TB(-) CM(-)
自動化は素晴らしい。適切に構築された自動化スクリプトは単調な作業からの開放を約束し、人為的ミスを事前に防ぐ。
ということでコンパイル時の依存関係の解決の自動化である。
結局は偉大な先人のあしあとをたどるだけなのだが、
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]は不可能、バックスラッシュ\も不可能。他の文字は可能のようだ。

思っても見なかった知識を得た。
2011/02/16 02:54 Programming TB(0) CM(0)
コメント















 管理者にだけ表示を許可する

トラックバック
http://termoshtt.blog110.fc2.com/tb.php/7-390b5172
検索フォーム
ブロとも申請フォーム
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。