- 締切済み
makeで環境に応じ処理を変える際、綺麗な書き方
とあるプロジェクトをビルドしようとしていて、makefileを書いています。 make installで、環境に応じ処理が適切に切り替わるようにしようとしてますが、 ifdef, ifeq, もしくはシェルコマンドのif以外で良い方法はないでしょうか。 具体的に一例をあげると、scp, sshが使える環境(typeで判断)と、ftp, telnetしかない 環境で、インストール(コピー)に使うコマンドを変えたいという感じです。 (実際はもっと違いますが、OSにインストールされてるコマンドの中で最適なものを 使いたいという意味では同じ) ・ifdef, ifeqの場合 make実行直後のmakefile解析時に評価されるため、makefileに分岐の条件になる定数を 宣言するか、手動でmake install PARAMXXX=VALUEXXXのように書くしかなく、 makeのお任せ感が弱まる。 手順書に書かないといけないとすると、その手間の方がキツイ。 しかし、シェルのif文のように、改行をエスケープする'\'を乱発しなくてもよいので makefileの見た目は綺麗になる ・シェルのifの場合 シェルコマンドがtest部分に使え、しかもターゲット作成コマンド実行時に評価される ので、コマンドの有無を調べて条件分岐という今回のような趣旨に合う。 しかし、各コマンドは一行で完結してないといけないという制約のため、比較的長めの 処理(ビルドした内容のインストールなど)は、'\'の連続でmakefileが汚くなる。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- kmee
- ベストアンサー率55% (1857/3366)
・makefileを作成するプログラム(シェルスクリプト等)を使う よくある ./configure ですね。 #1にある autoconf/automake とか。 qmakeとか。他にも専用ツールがあったと思います ・シェルスクリプトからmakeを実行する。 > 手動でmake install PARAMXXX=VALUEXXX の部分をシェルスクリプトでやるものです。 ## build.sh MAkEFLAG= if SSHが使える ; MAKEFLAG="${MAKEFLAG} PARAMSSH=YES" fi .... make ${MAKEFILE} みたいな感じ ・シェルスクリプトでやる。 関数を使ったりといった工夫をすれば、そんなに「汚くなる」ことも無いと思います。 長い引数も FLAGS=-AA FLAGS=$FLAGS -B ... command $FLAGS みたいにすればバックスラッシュを使わないで書けますし。
- Tacosan
- ベストアンサー率23% (3656/15482)
「使う Make 次第」という側面もないわけじゃないけど autoconf/automake かなぁ?