sdk/Build System: Improved the bootstrap Makefiles
[sdk] / crossplatform.mk
1 # HOST PLATFORM DETECTION
2 ifeq "$(OS)" "Windows_NT"
3    HOST_PLATFORM := win32
4    WINDOWS_HOST := defined
5 else
6 ifeq "$(OSTYPE)" "FreeBSD"
7 # tocheck: temporarily using linux when on bsd
8 #   HOST_PLATFORM := bsd
9 #   BSD_HOST := defined
10    HOST_PLATFORM := linux
11    LINUX_HOST := defined
12 else
13 ifeq "$(shell uname)" "Darwin"
14    HOST_PLATFORM := apple
15    OSX_HOST := defined
16 else
17    HOST_PLATFORM := linux
18    LINUX_HOST := defined
19 endif
20 endif
21
22 UNAME_P := $(shell uname -p)
23 ifeq ($(UNAME_P),x86_64)
24   HOST_ARCH = X64
25 else
26 ifneq ($(filter %86,$(UNAME_P)),)
27   HOST_ARCH = X86
28 else
29 ifneq ($(filter arm%,$(UNAME_P)),)
30   HOST_ARCH = ARM
31 endif
32 endif
33 endif
34 endif
35
36 # TARGET_PLATFORM
37 ifndef TARGET_PLATFORM
38 ifdef PLATFORM
39    TARGET_PLATFORM := $(PLATFORM)
40 endif
41 endif
42 ifndef TARGET_PLATFORM
43 ifdef WINDOWS_HOST
44    TARGET_PLATFORM := win32
45 else
46 ifdef OSX_HOST
47    TARGET_PLATFORM := apple
48 else
49 ifdef BSD_HOST
50    TARGET_PLATFORM := bsd
51 else
52    TARGET_PLATFORM := linux
53 endif
54 endif
55 endif
56 endif
57 ifndef PLATFORM
58    PLATFORM := $(TARGET_PLATFORM)
59 endif
60 ifeq "$(TARGET_PLATFORM)" "win32"
61    WINDOWS_TARGET := defined
62 else
63 ifeq "$(TARGET_PLATFORM)" "apple"
64    OSX_TARGET := defined
65 else
66 ifeq "$(TARGET_PLATFORM)" "bsd"
67    BSD_TARGET := defined
68 else
69    LINUX_TARGET := defined
70 endif
71 endif
72 endif
73
74 # CROSS_TARGET
75 ifneq "$(TARGET_PLATFORM)" "$(HOST_PLATFORM)"
76    CROSS_TARGET := defined
77 endif
78
79 # TARGET_TYPE
80 ifeq "$(TARGET_TYPE)" "staticlib"
81    STATIC_LIBRARY_TARGET := defined
82 else
83 ifeq "$(TARGET_TYPE)" "sharedlib"
84    SHARED_LIBRARY_TARGET := defined
85 else
86 ifeq "$(TARGET_TYPE)" "executable"
87    EXECUTABLE_TARGET := defined
88 endif
89 endif
90 endif
91
92 # DEBUG SUFFIX
93 ifdef DEBUG
94 DEBUG_SUFFIX := .debug
95 endif
96
97 # COMPILER SUFFIX
98 ifdef COMPILER
99 ifneq "$(COMPILER)" "default"
100 COMPILER_SUFFIX := .$(COMPILER)
101 endif
102 endif
103
104 # MISC STRING TOOLS
105 empty :=
106 space := $(empty) $(empty)
107 comma := ,
108 escspace = $(subst $(space),\$(space),$(subst \$(space),$(space),$1))
109 hidspace = $(subst $(space),\7f,$(subst \$(space),\7f,$1))
110 shwspace = $(subst \7f,\$(space),$1)
111
112 # PATH SEPARATOR STRING TOOLS
113 ifdef WINDOWS_HOST
114 ifndef MSYSCON
115    WIN_PS_TOOLS := defined
116 endif
117 endif
118 ifdef WIN_PS_TOOLS
119    fixps = $(subst \,/,$(1))
120    psep = $(subst \\,/,$(subst /,\,$(1)))
121    PS := $(strip \)
122 else
123    fixps = $(1)
124    PS := $(strip /)
125    psep = $(1)
126 endif
127
128 # PREFIXES AND EXTENSIONS
129 .SUFFIXES: .c .ec .sym .imp .bowl .o .a
130 EC := .ec
131 S := .sym
132 I := .imp
133 B := .bowl
134 C := .c
135 O := .o
136 A := .a
137 E := $(if $(WINDOWS_TARGET),.exe,)
138 SO := $(if $(WINDOWS_TARGET),.dll,$(if $(OSX_TARGET),.dylib,.so))
139 LP := $(if $(WINDOWS_TARGET),$(if $(STATIC_LIBRARY_TARGET),lib,),lib)
140 HOST_E := $(if $(WINDOWS_HOST),.exe,)
141 HOST_SO := $(if $(WINDOWS_HOST),.dll,$(if $(OSX_HOST),.dylib,.so))
142 HOST_LP := $(if $(WINDOWS_HOST),$(if $(STATIC_LIBRARY_TARGET),lib,),lib)
143
144 # SUPER TOOLS
145 ifdef CCACHE
146    CCACHE_COMPILE := ccache$(space)
147 ifdef DISTCC
148    DISTCC_COMPILE := distcc$(space)
149 endif
150 else
151 ifdef DISTCC
152    DISTCC_COMPILE := distcc$(space)
153 endif
154 endif
155
156 _CPP = $(if $(findstring $(space),$(CPP)),"$(CPP)",$(CPP))
157
158 # SHELL COMMANDS
159 ifdef WINDOWS_HOST
160 ifndef MSYSCON
161    WIN_SHELL_COMMANDS := defined
162 endif
163 endif
164 ifdef WIN_SHELL_COMMANDS
165    echo = $(if $(1),echo $(1))
166    cpq = $(if $(1),@cmd /c for %%I in ($(call psep,$(1))) do @copy /y %%I $(call psep,$(2)) > nul 2>&1)
167    rmq = $(if $(1),-@del /f /q $(call psep,$(1)) > nul 2>&1)
168    rmrq = $(if $(1),-@rmdir /q /s $(call psep,$(1)) > nul 2>&1)
169    mkdirq = $(if $(1),-@mkdir $(call psep,$(1)) > nul 2>&1)
170    rmdirq = $(if $(1),-@rmdir /q $(call psep,$(1)) > nul 2>&1)
171 else
172    echo = $(if $(1),echo "$(1)")
173    cpq = $(if $(1),@cp $(1) $(2))
174    rmq = $(if $(1),-@rm -f $(1))
175    rmrq = $(if $(1),-@rm -f -r $(1))
176    mkdirq = $(if $(1),-@mkdir -p $(1))
177    rmdirq = $(if $(1),-@rmdir $(1))
178 endif
179
180 # COMPILER OPTIONS
181 ECSLIBOPT := $(if $(STATIC_LIBRARY_TARGET),-staticlib,$(if $(SHARED_LIBRARY_TARGET),-dynamiclib,))
182 FVISIBILITY := $(if $(WINDOWS_TARGET),,-fvisibility=hidden)
183 FPIC := $(if $(WINDOWS_TARGET),,-fPIC)
184 EXECUTABLE := $(if $(WINDOWS_TARGET),$(if $(EXECUTABLE_TARGET),$(CONSOLE),),)
185 INSTALLNAME := $(if $(OSX_TARGET),$(if $(STATIC_LIBRARY_TARGET),-install_name $(LP)$(MODULE)$(SO),),)
186
187 # LINKER OPTIONS
188 SHAREDLIB := $(if $(SHARED_LIBRARY_TARGET),$(if $(OSX_TARGET),-dynamiclib -single_module -multiply_defined suppress,-shared),)
189 LINKOPT :=
190 STRIPOPT := $(if $(OSX_TARGET),$(if $(SHARED_LIBRARY_TARGET),-x, -u -r), -x --strip-unneeded --remove-section=.comment --remove-section=.note)
191 SODESTDIR := $(if $(WINDOWS_TARGET),obj/$(TARGET_PLATFORM)/bin/,obj/$(TARGET_PLATFORM)/lib/)
192
193 # EXCLUDED_LIBS TOOL
194 _L = $(if $(filter $(1),$(EXCLUDED_LIBS)),,-l$(1))
195
196 # DEBIAN
197 ifdef DEBIAN_PACKAGE
198 OFLAGS += $(LDFLAGS)
199 endif
200
201 # COMMON LIBRARIES DETECTION
202 ifdef WINDOWS_TARGET
203 ifdef OPENSSL_CONF
204 _OPENSSL_CONF = $(call hidspace,$(call fixps,$(OPENSSL_CONF)))
205 OPENSSL_INCLUDE_DIR = $(call shwspace,$(subst /bin/openssl.cfg,/include,$(_OPENSSL_CONF)))
206 OPENSSL_LIB_DIR = $(call shwspace,$(subst /bin/openssl.cfg,/lib,$(_OPENSSL_CONF)))
207 OPENSSL_BIN_DIR = $(call shwspace,$(subst /bin/openssl.cfg,/bin,$(_OPENSSL_CONF)))
208 else
209 # to avoid issues with empty -L/-I
210 OPENSSL_INCLUDE_DIR = .
211 OPENSSL_LIB_DIR = .
212 OPENSSL_BIN_DIR = .
213 endif
214 else
215 OFLAGS += -L/usr/lib/ec
216 endif