- [Perl]Module::Buildを使ってると勝手にshebangが書き換わる
- [その他]直ったかも?!→Re: Googleカレンダーの「毎日の予定リスト」通知メールが止まらない
- [その他]20歳になりました!
- [Shell]lessでタブ文字を表示する
- [Emacs]ミニバッファの邪魔な履歴を削除する
- [Emacs]Emacsのiswitchbで、普段は*...*を完全無視して必要なときだけ出す設定
- [Emacs][Thunderbird]コマンドラインからMessage-IDを指定してメールを開く方法。それをOrgMode(Emacs)からも開けるようにする。
- [ソフトウェア][Perl]tiarraのSystem::SendMessage(ControlPort経由)のログをLog::Channel経由で記録する
- [ソフトウェア][Perl]tiarraのSystem::SendMessage(ControlPort経由)でnick宛に送信するパッチ
- [開発]GNU makeのMakefileに、シェルスクリプトを自然に書くたった一つの方法
2011年08月23日
■ [開発]GNU makeのMakefileに、シェルスクリプトを自然に書くたった一つの方法
たった一つとか嘘です。
ググッても中々出てこなくて、ちょっといじってたらできちゃったので書き残しておきます。
GNU makeでは1行毎に1つのシェルで実行されるので、
foo:: if true ; then echo "make love" ; fi
は
foo:: $(SHELL) -c 'if true ; then echo "make love" ; fi'
と同じような挙動になります。
よってシェルスクリプトが複数行に渡る場合、
foo:: if true then echo "make love" fi
なんて書いてしまうと、
foo:: $(SHELL) -c 'if true' $(SHELL) -c 'then' $(SHELL) -c ' echo "make love"' $(SHELL) -c 'fi'
という感じで実行されることになるので当然エラーになります。
そこで以下のような書き方が良く用いられています。
foo:: if true ;\ then \ echo "make love" ;\ fi
これ見た目上は複数行に分けて書けてはいますが、セミコロンの有無がワケワカランことになる上に、長くなってくると非常に猛烈に見辛くなります。しんどいです。
ここで、GNU makeでヒアドキュメントのようなことをする方法を紹介しておきます。
defineを使うと、通常の変数宣言とは違って改行を含めることができます。GNU make 日本語訳(Coop編) - 変数の利用法
define FOO a b c endef
ただこれをそのまま変数として
foo:: echo "$(FOO)"
のように使ってしまうと
foo:: echo "a b c "
と展開され、これまた各行が1行ずつシェルに実行されてしまうのでエラーになります。
そこで、変数をexportして環境変数として扱います。
export FOO foo:: echo "$${FOO}"
ここまでくれば後は簡単でしょう。
echoしたものをshに食わせれば良いだけです。
define MAKELOVE if true then echo "make love" fi endef export MAKELOVE foo:: echo "$${MAKELOVE}" | $(SHELL)あら?インタラクティブシェルじゃなくなってしまって困るぞ…。
foo:: echo "$${MAKELOVE}" > /tmp/$$$$ ; $(SHELL) /tmp/$$$$ ; rm -f /tmp/$$$$とりあえずこれでお茶を濁し中…
どや?
ちなみに、シェル変数は相変わらず$$varnameと$を重ねて書かないといけないので、完璧に自然なシェルスクリプトになるわけではありません。あしからず。
みんなもっとmake loveしようぜ。
make: don't know how to make love. Stop.
トラックバック - http://d.hatena.ne.jp/holidays-l/20110823/p1
リンク元
- 211 http://www.facebook.com/plugins/like.php?channel_url=http://d.hatena.ne.jp/holidays-l/20080206/p1?fb_xd_fragment#?=&cb=f23aa298d2dba2&relation=parent.parent&transport=fragment&href=http://d.hatena.ne.jp/holidays-l%2
- 123 http://www.google.co.jp/url?sa=t&source=web&cd=1&ved=0CBkQFjAA&url=http://d.hatena.ne.jp/holidays-l/20070602/p1&rct=j&q=emacs 正規表現 空白&ei=3zZTTrqeItTWiAKW-5DMDA&usg=AFQjCNEdaWFNqF839yoMr1xENtX
- 43 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4ADRA_jaJP446&q=Oracle+Client+perl
- 37 http://www.google.co.jp/url?sa=t&rct=j&q=makefile シェルスクリプト&source=web&cd=6&ved=0CFEQFjAF&url=http://d.hatena.ne.jp/holidays-l/20110823/p1&ei=YQ-iTsWsGZHnmAX4-vyeCQ&usg=AFQjCNEo9
- 35 http://www.google.co.jp/url?sa=t&source=web&cd=2&ved=0CCAQFjAB&url=http://d.hatena.ne.jp/holidays-l/20070502/p1&rct=j&q=install_driver(Oracle)&ei=E8FUTsj0GcKJmQX-6vnzDw&usg=AFQjCNGBg-4ljAdZ0HWcfHDZjSv0z3adzA
- 34 http://www.google.co.jp/url?sa=t&source=web&cd=1&ved=0CBoQFjAA&url=http://d.hatena.ne.jp/holidays-l/20061013/p1&rct=j&q=innerhtml ie&ei=eCxoTu-ENIeGmQXZm_SpDA&usg=AFQjCNFGZYRCVfseE-R-_RIgmtxApD8D8w
- 32 http://www.google.co.jp/url?sa=t&source=web&cd=2&ved=0CCEQFjAB&url=http://d.hatena.ne.jp/holidays-l/20070601/p1&rct=j&q=perl build.pl アンインストール&ei=IHpTTrLiJqPRmAWE_cAC&usg=AFQj
- 31 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cts=1331117275243&ved=0CDEQFjAB&url=http://d.hatena.ne.jp/holidays-l/20110823/p1&ei=zjxXT-OjGKyQiQf7psDPDQ&usg=AFQjCNEo9ZiEDa2y55T6NaxxRnyYZZwwTA
- 30 http://cast-a-spell.at.webry.info/200706/article_1.html
- 30 http://dl.dropbox.com/u/264781/gadgets/hatena-bookmarklist.html
