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

发布于 2024-07-21 20:40:05 字数 125 浏览 4 评论 0原文

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

I want to know a parameter which is an indicator of the current OS. If am supporting Windows and Linux, how can I get a system parameter which differentiates the OS types. This for an OS independent makefile which runs both in Windows and Linux by checking the parameter in an 'if'.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

放手` 2024-07-28 20:40:06

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

makefile.Windows_NT
makefile.Linux
makefile.HPUX

的 makefile 中,然后在我的主 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”之类的定义,但它证明您可以抽象出所有平台细节。

克里斯

In the past I've checked the value of the environment variable OS. This is set on Windows. For other platforms I've explicitly set it in the environment. This then lets you push platform specific settings into makefiles called ...

makefile.Windows_NT
makefile.Linux
makefile.HPUX

In my main makefile I then just do

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

This all works because I can pull in the platform specific settings via makefile.$(OS)

That's the sum total of my main makefile and it compiles for seven different platforms. You could make the detection cleverer but that would reduce comprehensability.

In each makefile.WHATEVER I provide definitions of things like

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

Obviously this is quite a C/C++ focus makefile but it proves that you can abstract away all of the platform specifics.

Chris

猫九 2024-07-28 20:40:06

您可能有兴趣查看:预定义 C/C++ 编译器宏。 这是一座金矿。

You may be interested in checking out: Pre-defined C/C++ Compiler Macros. It's a goldmine.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文