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