- 締切済み
makefileでのファイル指定について
プログラムを実行するためのコンパイルでは、makeを使うことが多いと思います。makefileというファイルにその内容を書いておくわけですが、makeというのは必要なものをかき集めて(不必要なものは集めない)セットしていくということなるわけですね。ファイルを集めるというのは結局はフォルダを指定するということなのですが、そのフォルダとは相対パスで指定するのか、絶対パスで指定するのか考え方を教えて頂きたいのですが。私の予想では当然ながら相対パスが普通だということなのですが。また絶対パスでもいいということにもなるでしょうか。./とかつけてフォルダ指定すると相対パスになるとか。makeは苦手でそこを確認したいと思いました。 あと、必ずではありませんが./configureとかしますが、これは何をしているのでしょうか。 よろしくお願いします。OSとしてはWindows, WSLというところでの利用を考えています。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- wormhole
- ベストアンサー率28% (1626/5665)
>追加で1つ質問ですが、make.incっていうのは特別な機能があるのでしょうか。 そのmake.incを使うものを組んだ人たち次第なのでドキュメントを読んでください。 make.incという名前からある程度は想像できますけど、絶対にそうしなければならないという決まりはありませんので。
- wormhole
- ベストアンサー率28% (1626/5665)
>今回、WIndowsなのですが、configure.exeはありません。 configureの多くはautoconfを使ってconfigure.inから作られるshellスクリプトなので・・・ cmakeを使うって手もありますが。 >makeも複数あってどれが動けば都合がいいのかわかりません。 INSTALLなどのドキュメントファイルに想定しているmakeなど書かれてることもあります。 >呼び出されるmakeによって仕様が違うんだろうなあとは思います。 はい、makeによって違います。 linuxのディストリビューションだとGNU makeがほとんどでしょうけど。
お礼
ありがとうございます。 追加で1つ質問ですが、make.incっていうのは特別な機能があるのでしょうか。 makeにダイレクトに結びつくのはmakefileのみだと思っていたのですが。make.incがどうのこうのというreadmeのようなファイルを読んでいるところなのですが。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>makeというのは必要なものをかき集めて(不必要なものは集めない)セットしていくということなるわけですね。 違います。makeは必要なファイルを集めたりはしません。不必要なファイルを集めない、ということもしません。 makefileは「ファイルAがファイルBより古かったらコマンドCを実行しなさい」というのが、複数、記述されている物です。 そして、コマンドCは「ファイルAを、ファイルBよりも新しくするコマンド」にしておきます。 なお、コマンドCを「ファイルAを新しくしないコマンド」にしておくと、いつまでもファイルAが新しくならないので「毎回、コマンドCが実行される」と言う事になります。 このように「風数のファイルの依存関係」と「新旧逆転している場合にすべきこと」を書いておくのがmakefileです。 例えば「ソースファイルAは、ヘッダファイルBに依存している」つまり「ソースファイルAはヘッダファイルBを利用している」と記述して、ヘッダファイルBの方が新しい場合は「ソースファイルAの更新時間を現在時間に変えるコマンド」を指定します。 それと同時に「コンパイル済みオブジェクトファイルCは、ソースファイルAに依存している」と記述して、ソースファイルAの方が新しい場合は「ソースファイルAをコンパイルして、コンパイル済みオブジェクトファイルCを更新するコマンド」を指定します。 この状態でmakeを行うと「ヘッダファイルBまたは、ソースファイルAが編集されて新しくなってたら、コンパイルして、コンパイル済みオブジェクトファイルCが新しくなる」と言う事が起きます。 なので「依存関係を書き間違える」と「実行する必要のないコマンドを毎回実行する」とか「実行する必要のあるコマンドを実行しないので、ソースファイルを書き換えた内容が最終実行ファイルに反映されない」などの問題が起きます。 >私の予想では当然ながら相対パスが普通だということなのですが。また絶対パスでもいいということにもなるでしょうか。 ファイルを指定する際の「パス」は「自由」なので、相対パスでも絶対パスでも、何でも構いません。重要なのは「依存関係が正しく記述されているかどうか」だけです。 >あと、必ずではありませんが./configureとかしますが、これは何をしているのでしょうか。 ./configureには「コンパイラやライブラリアンなどが、正常に動くための、初期設定コマンド」を書いておきます。そして、依存関係記述を工夫して「makeのたびに、毎回実行する」としておけば、毎回、正しく初期設定されます。例えば「gnu-cでコンパイルする初期設定」を書いておけば、異なるCコンパイラを使う環境になっている状態でも、正しくgnu-cでコンパイルされます。つまり「複数のコンパイラを使い分けしている場合」を想定している訳です。 ソースレベルでプログラムを公開しようとした場合、利用者が正しく環境設定してコンパイル出来るようにするのが、./configureを用意しておく理由です。
お礼
懇篤なご説明をありがとうございます。私は、今まで、長くても数万行のプログラム程度までしか編集してきませんでした。そのため、毎回全部1つのファイルにまとめてすべてコンパイルするということをやってきたのでソースプログラムが分散しているとかライブラリが別のところにあるとかそういう環境がありませんでした。コンパイルに時間がかかるということは全くなく、makeにしなければならないという積極的な理由を感じませんでした。ところが、ここへきて開発者が別の人のプログラムセットがあり、ソースファイル群が50ぐらいあって、何をするかによってコンパイルするファイルを取捨選択したりするようです。私は先の書いたように1つのソースあるいは、多くても2,3個のソースだけでやってきたので、すべてを1つのフォルダに入れてソースとかオブジェクトを羅列する(gfortran a.f95 b.f95 c.f95 xxx.o)ということしかしてきませんでしたので、あちこちに分散している(場合によってはフォルダさえ違う)ファイルを"集めて"コンパイルする、それがmakeだという印象をもったわけです。ご説明で、依存関係上コンパイルしなければならないものと、しなくてもいいものを選択してコンパイルの効率化を図るということをしているのかなと思ったのですが、先ほどにも書いたように私がやっているような全部まるっきりコンパイルしてしまえばそれはそれで問題ないということになるのでしょうか。 この質問の動機としては前述のように、makeで何を作るかをコントロールする必要が生じたので確認でお尋ねしました。 環境はWindows10なのですが、which make -aとすると、候補が4つぐらい出てきてmakeによって結果が違うんだろうなあと思います。インストールしたら勝手に入ってきて、パスすら設定されているという状態です。GnuWin32\binが最初に来るからこれだったら標準かな思いますが。Linuxだったらmakeは1つであり、OSがしっかり管理しているはずですね。 動作がおかしいときに何を疑っていいのかわからなくなったのでこの辺からお尋ねしたところです。
- f272
- ベストアンサー率46% (8467/18126)
> makeというのは必要なものをかき集めて(不必要なものは集めない)セットしていくということなるわけですね。 オプションなし,引数なしで実行させると,makefileを参照して,makefileのデフォルト処理を行う。たいていはコンパイルやリンクを行うことで実行ファイルを作成することが多い。 「ファイルを集める」というのとはイメージが異なる。実行ファイルを作成するのなら,必要なファイルがあって,その指定は相対パスでも絶対パスでもなんでもかまわない。とはいえ相対パスでの指定の方が移植性が格段に良い。 configureはインストールに必要な環境変数やライブラリが正しく設定,設置されているか等をチェックする。その結果としてmakefileが作成される。
お礼
ありがとうございました。Linuxでは以下の手順を毎度ブラックボックスのようにやっていました。 ./configure make clean make make install 今回、WIndowsなのですが、configure.exeはありません。 makeも複数あってどれが動けば都合がいいのかわかりません。呼び出されるmakeによって仕様が違うんだろうなあとは思います。WSLに移してそこでやるかなとは思いますが、生のWindowsの環境でやれたらいいとは思っています。
お礼
回答ありがとうございました。 incということなのでincludeファイルだとは思います。 makeというコマンドがmakefileという名前に対して(脊髄反射的に)反応するのは間違いないはずで、makefileの中で呼ばれてるんだろうなとは思います。つまりmakeはmake.incには直接には対応しない、ただ呼び出されるのだろうと予想します。 ※makeは簡単、という評価がありますが、慣れないと肝心のプログラム開発(こちらが戦場)と同じように難航しそうです。今回はこちらがプログラム開発のカヤの外なのでこちらが型にはまってしまえばいいのですが、開発者が、”そんなの当たり前”と思って説明の手を抜くと混乱しそうですが。