sdk/Build System: Solved the $(CPP) space issues
[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 escspace = $(subst $(space),\$(space),$(subst \$(space),$(space),$1))
108 hidspace = $(subst $(space),\7f,$(subst \$(space),\7f,$1))
109 shwspace = $(subst \7f,\$(space),$1)
110
111 # PATH SEPARATOR STRING TOOLS
112 ifdef WINDOWS_HOST
113 ifndef MSYSCON
114    WIN_PS_TOOLS := defined
115 endif
116 endif
117 ifdef WIN_PS_TOOLS
118    fixps = $(subst \,/,$(1))
119    psep = $(subst \\,/,$(subst /,\,$(1)))
120    PS := $(strip \)
121 else
122    fixps = $(1)
123    PS := $(strip /)
124    psep = $(1)
125 endif
126
127 # PREFIXES AND EXTENSIONS
128 .SUFFIXES: .c .ec .sym .imp .bowl .o .a
129 EC := .ec
130 S := .sym
131 I := .imp
132 B := .bowl
133 C := .c
134 O := .o
135 A := .a
136 E := $(if $(WINDOWS_TARGET),.exe,)
137 SO := $(if $(WINDOWS_TARGET),.dll,$(if $(OSX_TARGET),.dylib,.so))
138 LP := $(if $(WINDOWS_TARGET),$(if $(STATIC_LIBRARY_TARGET),lib,),lib)
139
140 # SUPER TOOLS
141 ifdef CCACHE
142    CCACHE_COMPILE := ccache$(space)
143 ifdef DISTCC
144    DISTCC_COMPILE := distcc$(space)
145 endif
146 else
147 ifdef DISTCC
148    DISTCC_COMPILE := distcc$(space)
149 endif
150 endif
151
152 _CPP = $(if $(findstring $(space),$(CPP)),"$(CPP)",$(CPP))
153
154 # SHELL COMMANDS
155 ifdef WINDOWS_HOST
156 ifndef MSYSCON
157    WIN_SHELL_COMMANDS := defined
158 endif
159 endif
160 ifdef WIN_SHELL_COMMANDS
161    echo = $(if $(1),echo $(1))
162    cpq = $(if $(1),@cmd /c for %%I in ($(call psep,$(1))) do @copy /y %%I $(call psep,$(2)) > nul 2>&1)
163    rmq = $(if $(1),-@del /f /q $(call psep,$(1)) > nul 2>&1)
164    rmrq = $(if $(1),-@rmdir /q /s $(call psep,$(1)) > nul 2>&1)
165    mkdirq = $(if $(1),-@mkdir $(call psep,$(1)) > nul 2>&1)
166    rmdirq = $(if $(1),-@rmdir /q $(call psep,$(1)) > nul 2>&1)
167 else
168    echo = $(if $(1),echo "$(1)")
169    cpq = $(if $(1),@cp $(1) $(2))
170    rmq = $(if $(1),-@rm -f $(1))
171    rmrq = $(if $(1),-@rm -f -r $(1))
172    mkdirq = $(if $(1),-@mkdir -p $(1))
173    rmdirq = $(if $(1),-@rmdir $(1))
174 endif
175
176 # COMPILER OPTIONS
177 ECSLIBOPT := $(if $(STATIC_LIBRARY_TARGET),-staticlib,$(if $(SHARED_LIBRARY_TARGET),-dynamiclib,))
178 FVISIBILITY := $(if $(WINDOWS_TARGET),,-fvisibility=hidden)
179 FPIC := $(if $(WINDOWS_TARGET),,-fPIC)
180 EXECUTABLE := $(if $(WINDOWS_TARGET),$(if $(EXECUTABLE_TARGET),$(CONSOLE),),)
181 INSTALLNAME := $(if $(OSX_TARGET),$(if $(STATIC_LIBRARY_TARGET),-install_name $(LP)$(MODULE)$(SO),),)
182
183 # LINKER OPTIONS
184 SHAREDLIB := $(if $(SHARED_LIBRARY_TARGET),$(if $(OSX_TARGET),-dynamiclib -single_module -multiply_defined suppress,-shared),)
185 LINKOPT :=
186 STRIPOPT := $(if $(OSX_TARGET),$(if $(SHARED_LIBRARY_TARGET),-x, -u -r), -x --strip-unneeded --remove-section=.comment --remove-section=.note)
187 SODESTDIR := $(if $(WINDOWS_TARGET),obj/$(TARGET_PLATFORM)/bin/,obj/$(TARGET_PLATFORM)/lib/)
188
189 # EXCLUDED_LIBS TOOL
190 _L = $(if $(filter $(1),$(EXCLUDED_LIBS)),,-l$(1))
191
192 # DEBIAN
193 ifdef DEBIAN_PACKAGE
194 OFLAGS += $(LDFLAGS)
195 endif
196
197 # COMMON LIBRARIES DETECTION
198 ifdef WINDOWS_TARGET
199 ifdef OPENSSL_CONF
200 _OPENSSL_CONF = $(call hidspace,$(call fixps,$(OPENSSL_CONF)))
201 OPENSSL_INCLUDE_DIR = $(call shwspace,$(subst /bin/openssl.cfg,/include,$(_OPENSSL_CONF)))
202 OPENSSL_LIB_DIR = $(call shwspace,$(subst /bin/openssl.cfg,/lib,$(_OPENSSL_CONF)))
203 OPENSSL_BIN_DIR = $(call shwspace,$(subst /bin/openssl.cfg,/bin,$(_OPENSSL_CONF)))
204 else
205 # to avoid issues with empty -L/-I
206 OPENSSL_INCLUDE_DIR = .
207 OPENSSL_LIB_DIR = .
208 OPENSSL_BIN_DIR = .
209 endif
210 else
211 OFLAGS += -L/usr/lib/ec
212 endif