buildsystem,epj2make,ide; new per-file-config-platform CFLAGS generation method....
[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 # DEBUG SUFFIX
75 ifdef DEBUG
76 DEBUG_SUFFIX := .debug
77 endif
78
79 ifdef COMPILER
80 ifneq "$(COMPILER)" "default"
81 COMPILER_SUFFIX := .$(COMPILER)
82 endif
83 endif
84
85 # MISC STRING TOOLS
86 empty :=
87 space := $(empty) $(empty)
88 escspace = $(subst $(space),\$(space),$(subst \$(space),$(space),$1))
89 hidspace = $(subst $(space),\7f,$(subst \$(space),\7f,$1))
90 shwspace = $(subst \7f,\$(space),$1)
91
92 # PATH SEPARATOR STRING TOOLS
93 ifdef WINDOWS_HOST
94 ifndef MSYSCON
95    WIN_PS_TOOLS := defined
96 endif
97 endif
98 ifdef WIN_PS_TOOLS
99    fixps = $(subst \,/,$(1))
100    psep = $(subst \\,/,$(subst /,\,$(1)))
101    PS := $(strip \)
102 else
103    fixps = $(1)
104    PS := $(strip /)
105    psep = $(1)
106 endif
107
108 # PREFIXES AND EXTENSIONS
109 .SUFFIXES: .c .ec .sym .imp .bowl .o .a
110 EC := .ec
111 S := .sym
112 I := .imp
113 B := .bowl
114 C := .c
115 O := .o
116 A := .a
117 ifdef WINDOWS_TARGET
118    E := .exe
119 ifeq "$(TARGET_TYPE)" "staticlib"
120    LP := lib
121 else
122    LP :=
123 endif
124    SO := .dll
125 else
126 ifdef OSX_TARGET
127    E :=
128    LP := lib
129    SO := .dylib
130 else
131    E :=
132    LP := lib
133    SO := .so
134 endif
135 endif
136
137 # SUPER TOOLS
138 ifdef CCACHE
139    CCACHE_COMPILE := ccache
140 ifdef DISTCC
141    DISTCC_COMPILE := distcc
142 endif
143 else
144 ifdef DISTCC
145    DISTCC_COMPILE := distcc
146 endif
147 endif
148
149 # SHELL COMMANDS
150 ifdef WINDOWS_HOST
151 ifndef MSYSCON
152    WIN_SHELL_COMMANDS := defined
153 endif
154 endif
155 ifdef WIN_SHELL_COMMANDS
156    echo = $(if $(1),echo $(1))
157    cpq = $(if $(1),@cmd /c for %%I in ($(call psep,$(1))) do @copy /y %%I $(call psep,$(2)) > nul 2>&1)
158    rmq = $(if $(1),-@del /f /q $(call psep,$(1)) > nul 2>&1)
159    rmrq = $(if $(1),-@rmdir /q /s $(call psep,$(1)) > nul 2>&1)
160    mkdirq = $(if $(1),-@mkdir $(call psep,$(1)) > nul 2>&1)
161    rmdirq = $(if $(1),-@rmdir /q $(call psep,$(1)) > nul 2>&1)
162 else
163    echo = $(if $(1),echo "$(1)")
164    cpq = $(if $(1),@cp $(1) $(2))
165    rmq = $(if $(1),-@rm -f $(1))
166    rmrq = $(if $(1),-@rm -f -r $(1))
167    mkdirq = $(if $(1),-@mkdir -p $(1))
168    rmdirq = $(if $(1),-@rmdir $(1))
169 endif
170
171 # COMPILER OPTIONS
172 ifeq "$(TARGET_TYPE)" "sharedlib"
173    ECSLIBOPT := -dynamiclib
174 else
175 ifeq "$(TARGET_TYPE)" "staticlib"
176    ECSLIBOPT := -staticlib
177 else
178    ECSLIBOPT :=
179 endif
180 endif
181 ifdef WINDOWS_TARGET
182    FVISIBILITY :=
183    FPIC :=
184 ifeq "$(TARGET_TYPE)" "executable"
185    EXECUTABLE := $(CONSOLE)
186 else
187    EXECUTABLE :=
188 endif
189 else
190    FVISIBILITY := -fvisibility=hidden
191    FPIC := -fPIC
192    EXECUTABLE :=
193 endif
194 ifdef OSX
195 ifeq "$(TARGET_TYPE)" "sharedlib"
196    INSTALLNAME := -install_name $(LP)$(MODULE)$(SO)
197 else
198    INSTALLNAME :=
199 endif
200 else
201    INSTALLNAME :=
202 endif
203
204 # LINKER OPTIONS
205 ifdef OSX
206 ifeq "$(TARGET_TYPE)" "sharedlib"
207    SHAREDLIB := -dynamiclib -single_module -multiply_defined suppress
208    LINKOPT :=
209 else
210    SHAREDLIB :=
211    LINKOPT :=
212 endif
213 ifeq "$(TARGET_TYPE)" "sharedlib"
214    STRIPOPT := -x
215 else
216    STRIPOPT := -u -r
217 endif
218 else
219 ifeq "$(TARGET_TYPE)" "sharedlib"
220    SHAREDLIB := -shared
221 else
222    SHAREDLIB :=
223 endif
224    LINKOPT :=
225    STRIPOPT := -x --strip-unneeded --remove-section=.comment --remove-section=.note
226 endif
227 ifdef WINDOWS_TARGET
228    SODESTDIR := obj/$(TARGET_PLATFORM)/bin/
229 else
230    SODESTDIR := obj/$(TARGET_PLATFORM)/lib/
231 endif
232
233 _L = $(if $(filter $(1),$(EXCLUDED_LIBS)),,-l$(1))
234
235 # DEBIAN
236 ifdef DEBIAN_PACKAGE
237 OFLAGS += $(LDFLAGS)
238 endif
239
240 # COMMON LIBRARIES DETECTION
241
242 ifdef WINDOWS_TARGET
243
244 ifdef OPENSSL_CONF
245 _OPENSSL_CONF = $(call hidspace,$(call fixps,$(OPENSSL_CONF)))
246 OPENSSL_INCLUDE_DIR = $(call shwspace,$(subst /bin/openssl.cfg,/include,$(_OPENSSL_CONF)))
247 OPENSSL_LIB_DIR = $(call shwspace,$(subst /bin/openssl.cfg,/lib,$(_OPENSSL_CONF)))
248 OPENSSL_BIN_DIR = $(call shwspace,$(subst /bin/openssl.cfg,/bin,$(_OPENSSL_CONF)))
249 else
250 # to avoid issues with empty -L/-I
251 OPENSSL_INCLUDE_DIR = .
252 OPENSSL_LIB_DIR = .
253 OPENSSL_BIN_DIR = .
254 endif
255
256 else
257
258 OFLAGS += -L/usr/lib/ec
259
260 endif