Как правильно определить свою сборочную платформу? - PullRequest
3 голосов
/ 27 мая 2009

Я хочу знать параметр, который является индикатором текущей ОС. Если я поддерживаю Windows и Linux, как я могу получить системный параметр, который различает типы ОС. Это для независимого от ОС make-файла, который запускается как в Windows, так и в Linux, проверяя параметр в «if».

Ответы [ 2 ]

3 голосов
/ 27 мая 2009

В прошлом я проверял значение переменной среды ОС. Это установлено в Windows. Для других платформ я явно установил его в среде. Затем вы можете перенести специфичные для платформы настройки в make-файлы, называемые ...

makefile.Windows_NT
makefile.Linux
makefile.HPUX

В моем главном make-файле я просто делаю

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)

Это общая сумма моего основного make-файла, который компилируется для семи разных платформ. Вы можете сделать обнаружение более умным, но это снизит понятность.

В каждом файле make.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

Очевидно, что это довольно make-файл для фокуса на C / C ++, но он доказывает, что вы можете абстрагироваться от всех особенностей платформы.

Chris

0 голосов
/ 28 мая 2009

Вас может заинтересовать проверка: Предопределенные макросы компилятора C / C ++ . Это золотая жила.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...