web-dev-qa-db-ja.com

WindowsシステムとUnixライクシステムを区別するMakefile

LinuxとWindowsでビルドするために同じMakefileが欲しいです。 LinuxではデフォルトのGNU makeを使用し、Windowsではmingw32-makeGNU 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 ですが、ここで答えが見つかりませんでした。

42
Tom Pažourek

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$(/)*

あなたはその形式が好きなら。

42
Paul Hutchinson

SystemRootのトリックは、Windowsで動作しませんでしたXPしかし、これは動作しました:

ifeq ($(OS),Windows_NT)
    #Windows stuff
    ...
else
    #Linux stuff
    ....
endif
39
tomsgd

一部のファイルを削除するには、おそらく$(RM)変数を使用する必要があります。

8
Antoine Pelisse

LinuxとWindowsでビルドするために同じMakefileが欲しいです。

多分あなたは好きになるでしょう CMake

3
Mads Elvheim

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
1
sezero