Je veux connaître un paramètre qui est un indicateur du système d'exploitation actuel. Si je suis compatible avec Windows et Linux, comment puis-je obtenir un paramètre système qui différencie les types de systèmes d'exploitation. Ceci pour un makefile indépendant du système d'exploitation qui fonctionne sous Windows et Linux en vérifiant le paramètre dans un 'if'.Comment puis-je identifier ma plate-forme de construction correctement?
Répondre
Dans le passé, j'ai vérifié la valeur de la variable d'environnement OS. Ceci est défini sur Windows. Pour les autres plateformes, je l'ai explicitement défini dans l'environnement. Cela vous permet de pousser les paramètres spécifiques de la plate-forme dans makefiles appelé ...
makefile.Windows_NT
makefile.Linux
makefile.HPUX
Dans mon principal makefile je puis juste faire
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
Tout cela fonctionne parce que je peux tirer dans les paramètres spécifiques de la plate-forme via makefile $ (OS)
C'est la somme totale de mon makefile principal et il compile pour sept plates-formes différentes. Vous pourriez rendre la détection plus intelligente mais cela réduirait la compréhensibilité.
Dans chaque makefile.WHATEVER je fournir les définitions des choses comme
#*******************************************************************************
#
# 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
Évidemment, cela est tout à fait un point C++/C makefile, mais cela prouve que vous pouvez abstraire toutes les spécificités de la plate-forme.
Chris
Vous pouvez être intéressé à vérifier: Pre-defined C/C++ Compiler Macros. C'est une mine d'or.
Vous devriez être un peu plus précis sur l'environnement dont vous parlez. Des exemples peuvent être C/C++, Java, .NET, Python, Créer des fichiers, etc – tronda
makefile environnement pour construire des codes source C. –
Quelles sont les implémentations? – unwind