
最近、コンピュータシミュレーションもWindows環境でされることが多くなっているみたいで、MPIの環境もマイクロソフトが提供したりしているようです。
そのような前提で、makeによってコンパイルするように指示されているプログラムのセットがあります。makeコマンドはmakefileに書いてある内容に従ってコンパイルしていくことになりますが、makeコマンドはWindows環境ではどこから提供されるのが一般的なのでしょうか。Linuxの場合は1つしかありませんが、Windowsの場合は、Gowとかcygwinなど自分がどういう環境を作っているかに依存すると思います。visual studioもmakeを持っているのではないかと思います。今、コマンドプロンプトでwhich makeとするとGowが提供していることになっています。どのmakeでも同じ、ということになるのでしょうか。MS-DOSではnmakeなんてのもあったと思います。
また、makeとは結局、コマンドをキーボードで入力する手間を省くものであり、キーボードマクロのようなものなのだろうか?とも思いますが(ユーザ側の印象)。Windowsのバッチのようなものか?ということなのですが。unixではmakeはシステムとかシェルによって違う?というようなことがあったと思います。makefileの書式もいろいろとあって空白とかタブとかの違いとかもあったような?
そのあたりをまず、ざっくりと理解しておきたいと思っているのですが。
ケースバイケース(一般論がない)だから、自分の環境でやるというよりも、指定された?makeに従って操作すべき、ということになるでしょうか。
よろしくお願いします。
No.3ベストアンサー
- 回答日時:
それを見る限り、次の通りです。
・Makefile の書式は、標準的なもので、大抵のmakeコマンドで使用できる
・使われているコマンドやオプションが、UNIX系のもの。
よってWindowsで使うには
・UNIX系コマンドが使える状態にして、UNIX系のmakeコマンドを使う。
GOWが使えるなら、多分使える
・Windows標準のコマンドに書き換える。
のどちらか、となります。
使うコンパイラによっては
・オプションの書式を変える
・使われている拡張子を変える(.o→.obj等)
が必要かもしれません。
Fortranはそれほど詳しくないんで、これ以上はわかりません。
回答ありがとうございます。Windowsでunix環境を実現するというソフトはいくつかありますが、それらは環境変数などを始め前提条件がunixにどこまで合わせられているかということにも依存するような気がしています。とにかくプログラム実行環境について悩やむということはプログラムアルゴリズムに頭をひねる前の問題であり、正直、辟易するところではありますが。お付き合いいただきありがとうございました。
No.2
- 回答日時:
> make.exeがPCの中に複数ある場合、どれを使うようになっているかを判別する方法が分かればありがたいのですが
どのmakeに対応したものか、は、そのMakefileの中で使われている変数や関数、ルールの書式に、特定のmake独自のものが含まれているか、を調べます。
標準のものだったら、大抵のmakeコマンドで利用できるはずです。
どの環境に対応しているかは、使われているファイル名やコマンド名から判断します。
.c→.o→ 拡張子無し というルールなら、Windowsでの nmake+Visual C用ではない、と予想できます。
判断できなかったら、実際にやってエラーが出ないか確かめてみるのもよいでしょう。
一般論で言えるのは、せいぜいこれくらいです。
これ以上は、実際のソースコード一式を見ないことにはわかりません。
回答ありがとうございます。提供されているmakefileを抜粋したものは以下のようです。
---
#
# Makefile
#
LOAD = xxx.out
FC = mpif90
#COPT = -O3 -xHost -fpconstant -zero
#COPT = -O0 -C -fpe0 -traceback -warn all -nogen-interfaces
COPT = -O
LOPT = $(COPT)
# Source files
SRCS = typeDef.f90 \
xxx.f90 \
yyy.f90 \
zzz.f90
# Object files
OBJS = $(SRCS:.f90=.o)
# Module files
MODS = typedef.mod \
zzz.mod
# Make LOAD
$(LOAD): $(OBJS) $(MODS)
$(FC) -o $@ $(OBJS) $(LOPT)
# Suffixes
.SUFFIXES: .f90 .o .mod
# General rules
%.o: %.f90
$(FC) -c $(COPT) $< -o $@
%.mod: %.f90 %.o
@:
# Utility targets
clean:
rm -f $(OBJS) $(MODS) $(LOAD)
#
allocMemory.mod: typedef.mod
commSendRecv.mod: typedef.mod aaa.mod
kernel.mod: ccc.mod
commDecmp.mod: typedef.mod xxx.mod
2,3行省略
main.mod: typedef.mod allocmemory.mod \
aaa.mod
comm_debug.o: typedef.mod
sssSubs.o: aaa.mod jjj.mod \
ccc.mod
---
fortran90のソースであり、モジュール(mod)が多く見られます。コンパイラmpif90が必要で、rmコマンドですからLinuxでしょうか。Windowsでもできなくはないですが。これらから読み取れる環境の情報があるでしょうか。
No.1
- 回答日時:
make は、UNIX用として作られたものが基になっています。
Makefileの内容には
・標準規格に準拠したもの(UNIX等には POSIXという規格があります)
・そのmakeコマンドで独自に拡張されたもの
の2つがあります。
また、組込まれてるルールに違いがあります。
(.cファイルからオブジェクトファイルを作るときに、どのコンパイラを使うのか、オブジェクトファイルの拡張子は、等)
Makefileには、コンパイル以外のコマンドも記述されています。
(make clean で中間ファイルを消去するためのコマンド等)
また、外部コマンドを実行する際に、シェルを使用することもあります。
なので、Makefileの内容を確認して、使用されるコンパイラや他コマンドの種類を確認し、それらに合うもの、ということになります。
元のMakefileがUNIXで使用しているものならば、UNIXに近い環境を一通り用意するのが確実性が高くなります。
今なら、 MSYS2 + MinGW でしょうか。
Windowsでは、Visual StudioやSDK等についてくる nmake コマンドがあります。
これは、若干UNIXのMakefileとは書式が違いますし、組込まれているルールもWindowsのものが(Cコンパイラはcl 等)になっています。
内容次第では、共通で使えることもあります。
使えなかったときは、nmake 用に修正することになります。
このような差を解消するため、昨今の公開されているパッケージでは、Makefile( や、それに相当するもの、例えば、Visual Studioのプロジェクト等)を作るための仕組みを用意しています。
そのプログラムに付いてくるファイルを確認してみましょう。
Windowsでのコンパイル方法が書いてあるかもしれません。
makeコマンドは、バッチファイルのように、コマンドを順番に実行します。
最大の違いは、make は ファイルの依存関係を使って、必要なコマンドを実行する、ということです。
a1.c a2.c a3.c という3つのファイルから a0.exe を作るとき、
バッチファイルでは 実行するコマンドを全部書く、というのが普通です。
この場合、 例えば a1.cだけ更新した場合でも、a2.c,a3.cもコンパイルしなおします。
make では、
a0.exe を作るには a1.obj a2.obj a3.obj が必要
→ a1.obj を作るには a1.c が必要
→ a1.cが更新されているのでコンパイル実行
→ a2.obj を作るには a2.c が必要
→ a2.cは更新されていないので、何もする必要はない
…
→ 更新されたので、a1.obj a2.obj a3.objを使ってa0.exeを作成
といったように、コンパイルの必要性を確認して、必要なところだけ実行します。
懇篤な回答をありがとうございます。まず分かっていることはLinuxなどのunix環境で開発されたものではなく、Windowsをベースに作成されたものであるということです。unixでも環境によって書き方が違っていたと思いますが、その差はではないと思います(System Vなどいろいろ)。そうしますと、makefileの差異はコンパイラ呼び出しのコマンド名でわかるということになるでしょうか。また、make.exeがPCの中に複数ある場合、どれを使うようになっているかを判別する方法が分かればありがたいのですが。
makeはmakefileなどを参照しながらコンパイルに必要な情報を集めるのだろうと思いますが、それはmakeを実行する前の環境変数などで整えておくということになるのでしょうか。結局は人間がPCの前でキー入力していることを自動でやっているだけであり、makeコマンドが特別に何かを作り出しているわけではない、という理解でよいのでしょうか。
いずれにしましても、makeはコンパイル補助、プログラム開発補助をやっているのであり、それ自体で悩むのはナンセンスなのにと感じているのですが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(ソフトウェア) Makefileが実行できない 2 2022/07/28 23:49
- 英語 「再び」の接頭辞”re-"を有する単語と文末に"again"を付けた表現のニュアンスに違いについて 1 2022/12/13 12:40
- 英語 提示文の構造について 3 2022/06/27 18:03
- その他(プログラミング・Web制作) Pythonの作業環境・作業フォルダの迅速な設定・指定方法 3 2022/04/01 07:55
- 英語 ①普通名詞の所有格+②普通名詞で、①普通名詞に定冠詞の意味を付加したい場合の表現方法等について 23 2022/09/30 12:47
- Mac OS El Capitanがインストールできない… 1 2023/06/16 13:05
- 英語 第5文型及び第4文型で同じ動詞が反復する場合のその動詞の省略の可否について 7 2022/09/27 11:02
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- 教育・文化 世の中って結局環境ゲーですよね。 6 2023/05/20 14:14
- 英語 英文の構造 3 2022/06/21 05:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイルの拡張子だけを表示したい
-
DJGPPについての質問です。
-
バッチ終了時にDOS窓を閉じるコ...
-
コマンドの実行
-
iPhoneにて、FTP接続で名前変更
-
MS-Dosのcopyコマンド...
-
名前を変更するには
-
他のコマンドの読み書き
-
sedコマンドで改行コードを削除...
-
バッチコマンド+VBでできること
-
次のようなvbsを作ろうとしてい...
-
make test って何をするための...
-
Windowsのバッチ(bat)ファイル...
-
困っています
-
複数のフォルダを開くバッチフ...
-
大量のフォルダからひとつのフ...
-
コマンドプロンプトのエラーに...
-
これってパソコンの最適化が完...
-
コマンドプロンプトの「%1」と...
-
一括でフォルダと同じ名前にフ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチ終了時にDOS窓を閉じるコ...
-
バッチファイル 文字列にスペ...
-
make test って何をするための...
-
シェルの「:コマンドが見つか...
-
コマンドプロンプトをクリック...
-
ftpコマンドを実行すると「425 ...
-
findstrでヒットした1行前の文...
-
ショートカットをデスクトップ...
-
バッチファイルを使ってテキス...
-
Pythonで単純にファイルを結合...
-
フォルダ、ファイル操作に最適...
-
ftpコマンド出力結果の取得
-
シェルスクリプト内のcdで、カ...
-
AccessVBAで実行時間を指定する...
-
powershellでlinuxのduコマンド...
-
SSH接続でwindowsサーバのコマ...
-
FTPの連続実行でフリーズする
-
コマンドプロンプトとCygwinの違い
-
Windowsのバッチ(bat)ファイル...
-
xCopyコマンドでネットワークご...
おすすめ情報