アプリ版:「スタンプのみでお礼する」機能のリリースについて

最近、コンピュータシミュレーションも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に従って操作すべき、ということになるでしょうか。
よろしくお願いします。

A 回答 (3件)

それを見る限り、次の通りです。


・Makefile の書式は、標準的なもので、大抵のmakeコマンドで使用できる
・使われているコマンドやオプションが、UNIX系のもの。

よってWindowsで使うには
・UNIX系コマンドが使える状態にして、UNIX系のmakeコマンドを使う。
 GOWが使えるなら、多分使える
・Windows標準のコマンドに書き換える。
のどちらか、となります。

使うコンパイラによっては
・オプションの書式を変える
・使われている拡張子を変える(.o→.obj等)
が必要かもしれません。


Fortranはそれほど詳しくないんで、これ以上はわかりません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。Windowsでunix環境を実現するというソフトはいくつかありますが、それらは環境変数などを始め前提条件がunixにどこまで合わせられているかということにも依存するような気がしています。とにかくプログラム実行環境について悩やむということはプログラムアルゴリズムに頭をひねる前の問題であり、正直、辟易するところではありますが。お付き合いいただきありがとうございました。

お礼日時:2017/09/29 13:49

> make.exeがPCの中に複数ある場合、どれを使うようになっているかを判別する方法が分かればありがたいのですが



どのmakeに対応したものか、は、そのMakefileの中で使われている変数や関数、ルールの書式に、特定のmake独自のものが含まれているか、を調べます。
標準のものだったら、大抵のmakeコマンドで利用できるはずです。

どの環境に対応しているかは、使われているファイル名やコマンド名から判断します。
.c→.o→ 拡張子無し というルールなら、Windowsでの nmake+Visual C用ではない、と予想できます。

判断できなかったら、実際にやってエラーが出ないか確かめてみるのもよいでしょう。


一般論で言えるのは、せいぜいこれくらいです。
これ以上は、実際のソースコード一式を見ないことにはわかりません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。提供されている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でもできなくはないですが。これらから読み取れる環境の情報があるでしょうか。

お礼日時:2017/09/27 17:27

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を作成

といったように、コンパイルの必要性を確認して、必要なところだけ実行します。
    • good
    • 0
この回答へのお礼

懇篤な回答をありがとうございます。まず分かっていることはLinuxなどのunix環境で開発されたものではなく、Windowsをベースに作成されたものであるということです。unixでも環境によって書き方が違っていたと思いますが、その差はではないと思います(System Vなどいろいろ)。そうしますと、makefileの差異はコンパイラ呼び出しのコマンド名でわかるということになるでしょうか。また、make.exeがPCの中に複数ある場合、どれを使うようになっているかを判別する方法が分かればありがたいのですが。
makeはmakefileなどを参照しながらコンパイルに必要な情報を集めるのだろうと思いますが、それはmakeを実行する前の環境変数などで整えておくということになるのでしょうか。結局は人間がPCの前でキー入力していることを自動でやっているだけであり、makeコマンドが特別に何かを作り出しているわけではない、という理解でよいのでしょうか。
いずれにしましても、makeはコンパイル補助、プログラム開発補助をやっているのであり、それ自体で悩むのはナンセンスなのにと感じているのですが。

お礼日時:2017/09/25 07:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!