Jak odróżnić platformę kompilacji

Niekiedy trzeba w trakcie kompilacji odróżnić, na jakiej platformie się kompilujemy (notabene zachęcam by wszelkie różnice międzyplatformowe enkapsulować w bibliotekach o niezależnym od platformy interfejsie a nie w kodzie realizującym funkcje biznesowe). Przydatna lista obejmująca kilka systemów, z których korzystam:

  • na VMS definiowane jest makro __VMS
  • na wielu (wszystkich?) Unixach __unix
  • na Linuxie także mamy __unix a możemy również użyć __linux
  • na Windows _WIN32 (definiują to przynajmniej zarówno Visual C++ jak C++ Builder).

Może się też przyda komuś fragment Makefile dla gnumake próbującego zgadnąć platformę kompilacji i odpowiednio zdefiniować zmienną PLATFORM a następnie na jej podstawie można potem włączyć odpowiedni plik reguł kompilacji). Jest to trochę naiwne (sprawdzam czy nie działam na vms, Digital Unixie lub NT - a gdy nie, zakładam Linuxa) ale powinno być łatwe do ewentualnego rozwinięcia:

# Zgadywanie platformy
PLATFORM:=linux
ifneq (,$(findstring [,$(MAKE)))
	PLATFORM:=vms
else
    ifneq (,$(findstring .exe,$(SHELL)))
	PLATFORM:=nt
    else 
        ifeq ($(OSTYPE),OSF1)
	    PLATFORM:=dunix
        endif
    endif
endif

# Wybór reguł kompilacji
ifeq ($(PLATFORM),linux)
include rules_linux.mak
endif

ifeq ($(PLATFORM),dunix)
include rules_dunix.mak
endif

ifeq ($(PLATFORM),nt)
include rules_visualcpp.mak
endif

ifeq ($(PLATFORM),vms)
include rules_vms.mak
endif
komentarze obsługiwane przez Disqus