LinuxとWindowsでビルドするために同じMakefileが欲しいです。 LinuxではデフォルトのGNU makeを使用し、Windowsではmingw32-make(GNU make)を使用します。
MakefileがWindowsで動作するかLinuxで動作するかを検出したい。
例えば make clean
Windowsのコマンドは次のようになります。
clean:
del $(DESTDIR_TARGET)
しかし、Linuxの場合:
clean:
rm $(DESTDIR_TARGET)
また、Windowsで別のディレクトリ区切り文字を使用したい(\
)およびLinux(/
)。
MakefileでWindowsオペレーティングシステムを検出できますか?
PS:WindowsでLinuxをエミュレートしたくない(cygwinなど)
同様の質問があります: OS検出makefile ですが、ここで答えが見つかりませんでした。
Windowsでのみ設定されるenv変数を探すことでこれを解決しました。
ifdef OS
RM = del /Q
FixPath = $(subst /,\,$1)
else
ifeq ($(Shell uname), Linux)
RM = rm -f
FixPath = $1
endif
endif
clean:
$(RM) $(call FixPath,objs/*)
%OS%はウィンドウの種類であるため、LinuxではなくすべてのWindowsコンピューターで設定する必要があります。
次に、ブロックは、さまざまなプログラムの変数と、スラッシュをバックスラッシュに変換する関数をセットアップします。
外部コマンドを呼び出すときは、$(call FixPath、path)を使用する必要があります(内部コマンドは正常に機能します)。次のようなものも使用できます。
/ := /
その後
objs$(/)*
あなたはその形式が好きなら。
SystemRootのトリックは、Windowsで動作しませんでしたXPしかし、これは動作しました:
ifeq ($(OS),Windows_NT)
#Windows stuff
...
else
#Linux stuff
....
endif
一部のファイルを削除するには、おそらく$(RM)変数を使用する必要があります。
LinuxとWindowsでビルドするために同じMakefileが欲しいです。
多分あなたは好きになるでしょう CMake
WINDIRまたはCOMSPECの確認では、大文字と小文字が区別されます。代わりに、私は次の解決策を思いつきました。いつか誰かを助けることを願っています:
# detect if running under unix by finding 'rm' in $PATH :
ifeq ($(wildcard $(addsuffix /rm,$(subst :, ,$(PATH)))),)
WINMODE=1
else
WINMODE=0
endif
ifeq ($(WINMODE),1)
# native windows setup :
UNLINK = del $(subst /,\,$(1))
CAT = type $(subst /,\,$(1))
else
# cross-compile setup :
UNLINK = $(RM) $(1)
CAT = cat $(1)
endif