47

LinuxとWindowsでビルドするために同じMakefileが欲しいのですが。Linuxでは デフォルトのGNUmakeを使用し、 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:Linux on Windows(cygwinなど)をエミュレートしたくない

同様の質問があります:OSがmakefileを検出していますが、ここで答えが見つかりませんでした。

4

5 に答える 5

51

Windowsでのみ設定される環境変数を探すことでこれを解決しました。

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%はWindowsの種類であるため、すべてのWindowsコンピューターで設定する必要がありますが、Linuxでは設定しないでください。

次に、ブロックは、さまざまなプログラムの変数と、スラッシュを円記号に変換するための関数を設定します。

外部コマンドを呼び出すときは、$(FixPath、pathを呼び出す)を使用する必要があります(内部コマンドは正常に機能します)。次のようなものを使用することもできます。

/ := /

その後

objs$(/)*

あなたがそのフォーマットがもっと好きなら。

于 2010-12-22T16:15:35.110 に答える
44

SystemRootのトリックは、Windows XPでは機能しませんでしたが、これは機能しました。

ifeq ($(OS),Windows_NT)
    #Windows stuff
    ...
else
    #Linux stuff
    ....
endif
于 2011-06-16T12:19:51.183 に答える
9

おそらく$(RM)変数を使用していくつかのファイルを削除する必要があります。

于 2010-10-30T13:23:34.467 に答える
2

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

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

于 2010-10-30T15:36:33.677 に答える
1

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
于 2018-08-25T10:58:12.100 に答える