Makefiles: Force building 32 or 64 bit by setting ARCH=32 or 64
[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  UNAME_P := $(shell uname -p)
22  HOST_ARCH := $(UNAME_P)
23 endif
24
25 # TARGET_PLATFORM
26 ifndef TARGET_PLATFORM
27 ifdef PLATFORM
28    TARGET_PLATFORM := $(PLATFORM)
29 endif
30 endif
31 ifndef TARGET_PLATFORM
32 ifdef WINDOWS_HOST
33    TARGET_PLATFORM := win32
34 else
35 ifdef OSX_HOST
36    TARGET_PLATFORM := apple
37 else
38 #ifdef BSD_HOST
39 #   TARGET_PLATFORM := bsd
40 #else
41    TARGET_PLATFORM := linux
42 ifdef BSD_HOST
43    BSD_TARGET := defined
44 endif
45 #endif
46 endif
47 endif
48 endif
49 ifndef PLATFORM
50    PLATFORM := $(TARGET_PLATFORM)
51 endif
52 ifeq "$(TARGET_PLATFORM)" "win32"
53    WINDOWS_TARGET := defined
54 else
55 ifeq "$(TARGET_PLATFORM)" "apple"
56    OSX_TARGET := defined
57 else
58 #ifeq "$(TARGET_PLATFORM)" "bsd"
59 #   BSD_TARGET := defined
60 #else
61    LINUX_TARGET := defined
62 #endif
63 endif
64 endif
65
66 # CROSS_TARGET
67 ifneq "$(TARGET_PLATFORM)" "$(HOST_PLATFORM)"
68    CROSS_TARGET := defined
69 endif
70
71 # TARGET_TYPE
72 ifeq "$(TARGET_TYPE)" "staticlib"
73    STATIC_LIBRARY_TARGET := defined
74 else
75 ifeq "$(TARGET_TYPE)" "sharedlib"
76    SHARED_LIBRARY_TARGET := defined
77 else
78 ifeq "$(TARGET_TYPE)" "executable"
79    EXECUTABLE_TARGET := defined
80 endif
81 endif
82 endif
83
84 # Accept different things for ARCH but standardize on x32/x64
85 # This will be used for object directories
86 ifdef ARCH
87  ifeq "$(ARCH)" "32"
88   override ARCH := x32
89  endif
90  ifeq "$(ARCH)" "x86"
91   override ARCH := x32
92  endif
93  ifeq "$(ARCH)" "i386"
94   override ARCH := x32
95  endif
96  ifeq "$(ARCH)" "i686"
97   override ARCH := x32
98  endif
99  ifeq "$(ARCH)" "64"
100   override ARCH := x64
101  endif
102  ifeq "$(ARCH)" "amd64"
103   override ARCH := x64
104  endif
105  ifeq "$(ARCH)" "x86_64"
106   override ARCH := x64
107  endif
108
109  # Set ARCH_FLAGS only if ARCH is set
110  ifeq "$(ARCH)" "x64"
111   TARGET_ARCH := x86_64
112   ARCH_FLAGS := -m64
113  endif
114  ifeq "$(ARCH)" "x32"
115   TARGET_ARCH := i386
116   ARCH_FLAGS := -m32
117  endif
118
119  ARCH_SUFFIX := .$(ARCH)
120
121  ifdef LINUX_TARGET
122   TARGET_ARCH := $(TARGET_ARCH)-linux-gnu
123  endif
124
125 endif
126
127 # DEBUG SUFFIX
128 ifdef DEBUG
129 DEBUG_SUFFIX := .debug
130 endif
131
132 # COMPILER SUFFIX
133 COMPILER_SUFFIX = $(ARCH_SUFFIX)
134 ifdef COMPILER
135 ifneq "$(COMPILER)" "default"
136 COMPILER_SUFFIX = .$(COMPILER)$(ARCH_SUFFIX)
137 endif
138 endif
139
140 # MISC STRING TOOLS
141 empty :=
142 space := $(empty) $(empty)
143 comma := ,
144 escspace = $(subst $(space),\$(space),$(subst \$(space),$(space),$1))
145 hidspace = $(subst $(space),\7f,$(subst \$(space),\7f,$1))
146 shwspace = $(subst \7f,\$(space),$1)
147
148 # PATH SEPARATOR STRING TOOLS
149 ifdef WINDOWS_HOST
150 ifndef MSYSCON
151    WIN_PS_TOOLS := defined
152 endif
153 endif
154 ifdef WIN_PS_TOOLS
155    fixps = $(subst \,/,$(1))
156    psep = $(subst \\,/,$(subst /,\,$(1)))
157    PS := $(strip \)
158 else
159    fixps = $(1)
160    PS := $(strip /)
161    psep = $(1)
162 endif
163
164 # PREFIXES AND EXTENSIONS
165 .SUFFIXES: .c .ec .sym .imp .bowl .o .a
166 EC := .ec
167 S := .sym
168 I := .imp
169 B := .bowl
170 C := .c
171 O := .o
172 A := .a
173 E := $(if $(WINDOWS_TARGET),.exe,)
174 SO := $(if $(WINDOWS_TARGET),.dll,$(if $(OSX_TARGET),.dylib,.so))
175 LP := $(if $(WINDOWS_TARGET),$(if $(STATIC_LIBRARY_TARGET),lib,),lib)
176 HOST_E := $(if $(WINDOWS_HOST),.exe,)
177 HOST_SO := $(if $(WINDOWS_HOST),.dll,$(if $(OSX_HOST),.dylib,.so))
178 HOST_LP := $(if $(WINDOWS_HOST),$(if $(STATIC_LIBRARY_TARGET),lib,),lib)
179
180 # SUPER TOOLS
181 ifdef CCACHE
182    CCACHE_COMPILE := ccache$(space)
183 ifdef DISTCC
184    DISTCC_COMPILE := distcc$(space)
185 endif
186 else
187 ifdef DISTCC
188    DISTCC_COMPILE := distcc$(space)
189 endif
190 endif
191
192 _CPP = $(if $(findstring $(space),$(CPP)),"$(CPP)",$(CPP))
193
194 _SYSROOT = $(if $(SYSROOT),$(space)--sysroot=$(SYSROOT),)
195
196 # SHELL COMMANDS
197 ifdef WINDOWS_HOST
198 ifndef MSYSCON
199    WIN_SHELL_COMMANDS := defined
200 endif
201 endif
202 ifdef WIN_SHELL_COMMANDS
203    echo = $(if $(1),echo $(1))
204    cpq = $(if $(1),@cmd /c for %%I in ($(call psep,$(1))) do @copy /y %%I $(call psep,$(2)) > nul 2>&1)
205    rmq = $(if $(1),-@del /f /q $(call psep,$(1)) > nul 2>&1)
206    rmrq = $(if $(1),-@rmdir /q /s $(call psep,$(1)) > nul 2>&1)
207    mkdirq = $(if $(1),-@mkdir $(call psep,$(1)) > nul 2>&1)
208    rmdirq = $(if $(1),-@rmdir /q $(call psep,$(1)) > nul 2>&1)
209 else
210    echo = $(if $(1),echo "$(1)")
211    cpq = $(if $(1),@cp $(1) $(2))
212    rmq = $(if $(1),-@rm -f $(1))
213    rmrq = $(if $(1),-@rm -f -r $(1))
214    mkdirq = $(if $(1),-@mkdir -p $(1))
215    rmdirq = $(if $(1),-@rmdir $(1))
216 endif
217
218 # COMPILER OPTIONS
219 ECSLIBOPT := $(if $(STATIC_LIBRARY_TARGET),-staticlib,$(if $(SHARED_LIBRARY_TARGET),-dynamiclib,))
220 FVISIBILITY := $(if $(WINDOWS_TARGET),,-fvisibility=hidden)
221 FPIC := $(if $(WINDOWS_TARGET),,-fPIC)
222 EXECUTABLE := $(if $(WINDOWS_TARGET),$(if $(EXECUTABLE_TARGET),$(CONSOLE),),)
223 INSTALLNAME := $(if $(OSX_TARGET),$(if $(STATIC_LIBRARY_TARGET),-install_name $(LP)$(MODULE)$(SO),),)
224
225 # LINKER OPTIONS
226 SHAREDLIB := $(if $(SHARED_LIBRARY_TARGET),$(if $(OSX_TARGET),-dynamiclib -single_module -multiply_defined suppress,-shared),)
227 LINKOPT :=
228 STRIPOPT := $(if $(OSX_TARGET),$(if $(SHARED_LIBRARY_TARGET),-x, -u -r), -x --strip-unneeded --remove-section=.comment --remove-section=.note)
229 HOST_SODESTDIR := $(if $(WINDOWS_HOST),obj/$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/bin/,obj/$(HOST_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/lib/)
230 SODESTDIR := $(if $(WINDOWS_TARGET),obj/$(TARGET_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/bin/,obj/$(TARGET_PLATFORM)$(COMPILER_SUFFIX)$(DEBUG_SUFFIX)/lib/)
231
232 # EXCLUDED_LIBS TOOL
233 _L = $(if $(filter $(1),$(EXCLUDED_LIBS)),,-l$(1))
234
235 # DEBIAN
236 ifdef DEBIAN_PACKAGE
237 CFLAGS += $(CPPFLAGS)
238 endif
239
240 ifdef DEBUG
241 CFLAGS += -D_DEBUG
242 endif
243
244 # COMMON LIBRARIES DETECTION
245 ifdef WINDOWS_TARGET
246  ifdef OPENSSL_CONF
247   _OPENSSL_CONF = $(call hidspace,$(call fixps,$(OPENSSL_CONF)))
248   OPENSSL_INCLUDE_DIR = $(call shwspace,$(subst /bin/openssl.cfg,/include,$(_OPENSSL_CONF)))
249   OPENSSL_LIB_DIR = $(call shwspace,$(subst /bin/openssl.cfg,/lib,$(_OPENSSL_CONF)))
250   OPENSSL_BIN_DIR = $(call shwspace,$(subst /bin/openssl.cfg,/bin,$(_OPENSSL_CONF)))
251  else
252 # to avoid issues with empty -L/-I
253   OPENSSL_INCLUDE_DIR = .
254   OPENSSL_LIB_DIR = .
255   OPENSSL_BIN_DIR = .
256  endif
257 endif