c - 如何正确识别我的构建平台?

标签 c operating-system makefile

我想知道一个参数,它是当前操作系统的指标。如果支持 Windows 和 Linux,我如何获得区分操作系统类型的系统参数。这是一个独立于操作系统的 makefile,它通过检查“if”中的参数在 Windows 和 Linux 中运行。

最佳答案

过去我检查过环境变量 OS 的值。这是在 Windows 上设置的。对于其他平台,我已经在环境中明确设置了它。然后,您可以将特定于平台的设置推送到名为 ... 的 makefile 中。

makefile.Windows_NT
makefile.Linux
makefile.HPUX

然后在我的主 makefile 中做

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.$(OS) 引入特定于平台的设置

这是我的主要 makefile 的总和,它针对七个不同的平台进行编译。您可以使检测更聪明,但这会降低可理解性。

在每个 makefile.WHATEVER 中,我提供了诸如此类的定义

#*******************************************************************************
#
#   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

显然,这是一个非常注重 C/C++ 的 makefile,但它证明您可以抽象出所有平台细节。

克里斯

关于c - 如何正确识别我的构建平台?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/916186/

相关文章:

java - 为什么这个Java程序会导致UDP丢包?

linux - Makefile 搜索库文件

makefile - 如何从Makefile中的.env文件加载和导出变量?

makefile - makefile 中的级联通配符

c# - 游戏编程 ~ SDL/Allegro/SFML/或游戏引擎

c - C 中的嵌套链表

multithreading - 监视器与互斥体

c# - MonoDevelop 在 Linux 上错误地报告我的平台

c - 如何在不使用临时节点的情况下在单链表中插入新节点?

c++ - 如何在c中使用c++函数?