• 締切済み

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が汚くなる。

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

・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)
回答No.1

「使う Make 次第」という側面もないわけじゃないけど autoconf/automake かなぁ?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Windows環境へのmakeについて

    Windowsの開発環境でmakeを使用したいと思います。シェルでフォルダを選んでmakeコマンドを投入するとmakefileの指示に従ってそのフォルダのソースファイルなどを集めて実行ファイルを作成するところまでやってくれるというものです。 Linuxはmakeコマンドが当然ながら普通に利用できるのでその方向に沿ってシェルに依存したmakefileを作成すると思います。Windowsの場合は基本はmakeコマンドがないので、別途、取り寄せるのだと思います。 今の状態で、Windowsのパワーシェルでwhich make -a とすると、Rtools, bcc55, Gow(Gnu on Windows)のmake.exeが出てきます。適切なmakeが最初に呼ばれるように環境を編集してあとはmakefileを編集すればいいということなのでしょうか。Windowsにはnmake, cmakeなどいろんなものもありますが。コンパイラはgfortranとかgccなどのGNUのコンパイラで、これはシェルからコンパイルできるようになっています。Visual studio系はすぐには使いません。 Windowsのシェルでmakeを利用する手順を教えて頂きたいと思います。よろしくお願いします。

  • GNU make終了時にコマンドを実行できますか?

    GNU make 4.x(4.1か4.2)を使ってMakefileを実行したとき、そのMakefileが成功しても失敗しても、make終了時に何かを実行させる方法は用意されていますか? "make && コマンド"や"make || コマンド"などの複合コマンドのほか、シェルスクリプト内で"make"とコマンドを連続実行するという方法は除きます。あくまでも"make"単体で実行するものとします。 実際そういうことをしたいというのではなく、"make"実行後、Makefile中で生成した一部の中間ファイルが勝手に削除されるという謎の現象が発生しており、その原因を探りたいです。 Makefile中の実行コマンドにわざとエラーを起こすようなコマンドを入れてみても(例えば存在しない"hogehoge"のようなコマンド)、そのエラーが表示された直後に、"rm XXXX YYYY"(XXXXとYYYYはMakefile内部で生成したファイル名)のようなコマンドが表示されて、実際にそのファイルは生成しているはずなのに消えてしまっています。 上記のエラーを起こすコマンドの前に"ls -l ディレクトリ名"を実行するようにして、エラーを起こす直前に中間ファイルが存在することは確認できています。しかしその後、勝手に"rm"が実行されてそのファイルは消されてしまいます。 よろしくお願いします。

  • Windowsのmakeについて特にpython

    ソースプログラムを実行するための環境を作るmakeについてお尋ねします。Linuxなどでは、OSをインストールした時点で1つ有効なmakeがg++, gcc等で使用することを目指して利用できるようになっていると思います。アプリのインストールでさえmakeですね(./configure, make cleanとかの定型処理)。Windowsだとmakeを提供する元がいっぱいあってプロンプトでwhere make とすると4つぐらい出てきます。そこで質問なのですが、makeという操作は提供元によって全然文法その他の仕様が違うものなのでしょうか。つまり、一般性が高いmakefileというものあるのか?という質問にもなりますが。コマンドプロンプトでmakeをやるとpathの最初に出てくるmakeが呼ばれるようです。Windowsのmakeは一般論では何も言えないでしょうか。大昔,マイクロソフトはnmakeで名前を変えて唯一のものとして確定していたようですが。 さらにpython3.6についてお尋ねしたいと思います。あるプログラムのソースをダウンロードして、広げてみるとソースファイル軍とmakefileがあり、makefileの冒頭に、 ## The present Makefile is a pure configuration file, in which ## you can select compilation options. Compilation dependencies ## are managed automatically through the Python library SConstruct. 上記はmakeの一般論のあとPythonでもライブラリがあれば使えるという風に読める記述があります。そもそもPythonってインタプリターとかソースにpythonコマンドで利用するということであり、実行ファイルは作らないものだと思っていたのでどういうことだろうと思うのですが。makefileをmakeで呼び出して利用するにしてもどのmake.exeでもいいってことではないと思うのですが。pythonで使用するmakefileということですが。 よろしくお願いします。

  • コマンドプロンプト(2000)で入力値によって処理を変えたい

    コマンドプロンプト(bat)プログラムの途中で ユーザからの入力を促して入力された値を 変数としてセットし、その値をif文などで 評価することにより分岐させて入力された値によって 様々な処理を行わすことは可能でしょうか。 シェルスクリプトであればreadコマンドのような ものに変わるコマンドを期待しています。 宜しくお願いいたします。

  • eclipse3.3 CDTビルド環境

    WindowsXPのeclipse3.3EEにCDTをインストールしてCygwin/bccのビルド環境構築を試みています。 C/C++パースペクティブからファイル→新規→Cプロジェクト→実行可能で空のプロジェクトを作成してhelloworld.cとgygwin/bash上で実際にビルドできたMakefileを入れ、プロジェクト名右クリック - [プロジェクトのビルド] を実行したのですが、自作したMakefileは使用されずeclipseが自動生成したMakeが実行されます。 また、ファイル→新規→Cプロジェクト→実行可能からMakefileプロジェクトHello World C++を選択してプロジェクトを作成しビルドすると以下のようなエラーが出ます。 (ビルドエラー) **** プロジェクト hello01 の構成 Cygwin GCC の ビルド **** (Exec error:?w?????t?@?C?) Eclipse3.3EE CDTで自作Makefileビルドできる環境を構築する方法をご教示ください。 よろしくお願いします。

  • Cygwinでmakeコマンドが使えない(Vista)

    今までFedora-Linuxで使っていたプログラムをWindows上で実行するために、VistaにCygwinをインストールし、使い始めていることろです。 Makefileを使いコンパイルをするため [make]や[make -f Makefile]などをコンソールに入力しても、 bash: make: command not found が出てしまいます・・・。これを解決したいのです。 これは、Linux上でいつも行っていた操作と全く同じです。 Cygwin用にMakefileを書き換える必要がある、何かのツールをインストールする必要がある、makeに代わる何かのコマンドが存在する・・・ など、あるのでしょうか?

  • Cygwinで、makeコマンドが使えない(Vista)

    今までFedora-Linuxで使っていたプログラムをWindows上で実行するために、VistaにCygwinをインストールし、使い始めていることろです。 Makefileを使いコンパイルをするため [make]や[make -f Makefile]などをコンソールに入力しても、 bash: make: command not found が出てしまいます・・・。これを解決したいのです。 これは、Linux上でいつも行っていた操作と全く同じです。 Cygwin用にMakefileを書き換える必要がある、何かのツールをインストールする必要がある、makeに代わる何かのコマンドが存在する・・・ など、あるのでしょうか?

  • makeというコマンドに関する質問

    おちゅーしゃという2chブラウザをturboLinuxにインストールしようと思うのですが、Makeするところがわかりません。 makeというコマンド事は調べたのですが、「make」とだけ打って実行すれば、makeできると書いてあったのでochusha-0.5.8.2というディレクトリに移動して実行してみた所 make: *** ターゲットが指定されておらず、makefile も見つかりません。中止。 と表示されました。 他にも色々な事をやってみましたがどれも失敗でした 誰かMakeのやり方をしっている人が居たら教えてください

  • Makeについての質問

    こんにちは、Makotoと申します。 AIX上でCの開発を行っているのですが、 各ディレクトリにMakeFileがあり、 コンパイルのたびに各ディレクトリに移動して Makeを行っているのですが、面倒になってきたので、 以下のような簡単なシェルを作成しました。 cd /目的のディレクトリ make depend make clean make 上記と同じ記述が続く.... 始めの内は、規模が小さかったのでよかったのですが、 新しいプログラムが増えるたびに、同じ記述をするのも あまりきれいではないのでMakeFileを検出して Makeを実行させるといったことはできるのでしょうか?

  • makeコマンドについて

    こんにちは、 CentOS4.0に、Snortをインストールしようと思い、下記のように 解凍し、インストールを行ったのですが、 $ tar -zxvf snort-2.6.0.tar.gz $ cd snort-2.6.0 $ ./configure $ make # make install $ ./configure までは上手くいったのですが、 $ make のコマンドを実行したとき、 make: *** ターゲットが指定されておらず、makefile も見つかりません。中止。 のメッセージが表示され、上手くインストールできません。 実は恥ずかしながら、makeコマンドを使用してソフトをインストールする時は いつもこのメッセージが表示され、上手くセットアップ出来たことがありません。 原因として何が考えられるでしょうか? どなたかご存知の方がいらっしゃいましたらアドバイスよろしく お願いいたします。