2009-05-27 4 views
3

現在のOSのインジケータであるパラメータを知りたい。 WindowsとLinuxをサポートしている場合、どのようにしてOSのタイプを区別するシステムパラメータを取得できますか?これは、WindowsとLinuxの両方で実行されるOSに依存しないmakefileの場合、 'if'のパラメータをチェックすることで実現します。ビルドプラットフォームを適切に特定するにはどうすればよいですか?

+2

あなたは、あなたが話している環境についてもう少し具体的にする必要があります。例としてC/C++、Java、.NET、Python、Makeファイルなどがあります。 – tronda

+0

makefile環境でCソースコードをビルドします。 –

+0

これはどの実装ですか? – unwind

答えて

3

これまでは、環境変数OSの値を確認しました。これはWindows上で設定されます。他のプラットフォームでは、明示的に環境内に設定しています。これは、私はメイクを経由して、プラットフォーム固有の設定に引き出すことができるので、私はそれからちょうど

SUPPORTED_PLATFORMS=Windows_NT AIX AIX32 Solaris8 Linux HPUX Solaris_64 

ifeq (,$(findstring $(OS),$(SUPPORTED_PLATFORMS))) 

all %: 
     @echo The OS environment variable is set to [$(OS)]. 
     @echo Please set the OS environment variable to one of the following: 
     @echo $(SUPPORTED_PLATFORMS) 

else 


include makefile.$(OS) 


all: 
     @$(TCLSH) makefile.tcl 
     @$(MAKE) -f makefile.gen 


clean: 
     @$(TCLSH) makefile.tcl 
     @$(MAKE) -f makefile.gen clean 
     @$(RM) makefile.gen 

etags: 
     @$(RM) TAGS 
     @etags *.cpp *.h TAGS 
     @$(MAKE) -C Core etags 
     @$(MAKE) -C Components etags 
     @$(MAKE) -C Repository etags 

tags: ctags 

ctags: 
     @ctags *.h 
     @$(MAKE) -C Core ctags 
     @$(MAKE) -C Components ctags 
     @$(MAKE) -C Repository ctags 

lint: 
     @$(TCLSH) makefile.tcl 
     @$(MAKE) -f makefile.gen lint 

depends: 
     @$(TCLSH) makefile.tcl 
     @$(MAKE) -f makefile.gen depends 

endif 

このすべての作品をやる私のメインのmakefileで

makefile.Windows_NT 
makefile.Linux 
makefile.HPUX 

...あなたが呼ばれるのmakefileにプラットフォーム固有の設定をプッシュすることができます$(OS)

これは、私のメインメークファイルの合計であり、7つの異なるプラットフォームでコンパイルされます。検出をより鮮明にすることができますが、それは理解力を低下させます。私は

#******************************************************************************* 
# 
# Platform specific tools 
# 
CC    = CL 
RM    = rm 
LINK   = LINK 
ETAGS   = c:\emacs\bin\etags 
TCLSH   = tclsh83 

#******************************************************************************* 
# 
# Platform specific CC definitions 
# 
INCLUDE := $(SYS_INCDIR);$(INCLUDE);$(SOURCE_ROOT_DIR)/SivTech/cpp;$(ORACLE_INCDIR);$(DB2_INCDIR);$(ODBC_INCDIR);$(MYSQL_INCDIR);$(TCL_INCDIR);$(XML_INCDIR);$(XSLT_INCDIR);$(JNI_INCLUDE);$(ACE_INCDIR);$(TAO_INCDIR);$(TAO_SERVICES_INC);$(CPPUNIT_INCDIR);$(ICU_INCDIR);$(SAP_INCDIR);$(QAS_INCDIR);$(INFA_INCDIR);$(MELISSADATA_INCDIR);$(ADDRESSDOCTOR_INCDIR) 

CC_DEFS := $(CC_DEFS) -DOS_WIN_95 -D_WIN32_WINNT=0x400 -D_MBCS -DWIN32_LEAN_AND_MEAN -DWIN32 -DWIN32_EXTRA_LEAN $(CC_DEFINES) 

CC_FLAGS_CMN := /c /nologo /G7 /EHsc /W3 $(CC_FLAGS$) $(CC_DEFS) $(MYFLAGS) 
CC_FLAGS_DBG := $(CC_FLAGS_CMN) /Gi /MDd /Od /Zi /RTCu /RTCs /GZ 

のようなものの定義を提供し、各makefile.WHATEVERで

は明らかにこれは非常にC/C++フォーカスメイクファイルですが、それはあなたが抽象離れて、すべてのプラットフォームの仕様のできることを証明しています。

クリス

関連する問題