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
- «Microsoft + template + DLL = kłopoty
- Strumienie w GCC nie lubią setw dla obiektów string»
- ↑C++ - sztuczki i niebezpieczeństwa