1#*******************************************************************************
2# Copyright (c) 2000, 2016 IBM Corporation and others.
3#
4# This program and the accompanying materials
5# are made available under the terms of the Eclipse Public License 2.0
6# which accompanies this distribution, and is available at
7# https://www.eclipse.org/legal/epl-2.0/
8#
9# SPDX-License-Identifier: EPL-2.0
10#
11# Contributors:
12#     IBM Corporation - initial API and implementation
13#*******************************************************************************
14
15# Makefile for creating SWT libraries for FreeBSD GTK
16
17# SWT debug flags for various SWT components.
18#SWT_WEBKIT_DEBUG = -DWEBKIT_DEBUG
19
20#SWT_LIB_DEBUG=1     # to debug glue code in /bundles/org.eclipse.swt/bin/library. E.g os_custom.c:swt_fixed_forall(..)
21# Can be set via environment like: export SWT_LIB_DEBUG=1
22ifdef SWT_LIB_DEBUG
23SWT_DEBUG = -O0 -g3 -ggdb3
24NO_STRIP=1
25endif
26
27include make_common.mak
28
29SWT_VERSION=$(maj_ver)$(min_ver)r$(rev)
30GTK_VERSION?=3.0
31
32# Define the various shared libraries to be build.
33WS_PREFIX = gtk
34SWT_PREFIX = swt
35AWT_PREFIX = swt-awt
36ifeq ($(GTK_VERSION), 4.0)
37SWTPI_PREFIX = swt-pi4
38else
39SWTPI_PREFIX = swt-pi3
40endif
41CAIRO_PREFIX = swt-cairo
42ATK_PREFIX = swt-atk
43WEBKIT_PREFIX = swt-webkit
44WEBKIT_EXTENSION_PREFIX=swt-webkit2extension
45CHROMIUM_PREFIX = swt-chromium
46GLX_PREFIX = swt-glx
47
48SWT_LIB = lib$(SWT_PREFIX)-$(WS_PREFIX)-$(SWT_VERSION).so
49AWT_LIB = lib$(AWT_PREFIX)-$(WS_PREFIX)-$(SWT_VERSION).so
50SWTPI_LIB = lib$(SWTPI_PREFIX)-$(WS_PREFIX)-$(SWT_VERSION).so
51CAIRO_LIB = lib$(CAIRO_PREFIX)-$(WS_PREFIX)-$(SWT_VERSION).so
52ATK_LIB = lib$(ATK_PREFIX)-$(WS_PREFIX)-$(SWT_VERSION).so
53GLX_LIB = lib$(GLX_PREFIX)-$(WS_PREFIX)-$(SWT_VERSION).so
54WEBKIT_LIB = lib$(WEBKIT_PREFIX)-$(WS_PREFIX)-$(SWT_VERSION).so
55CHROMIUM_LIB = lib$(CHROMIUM_PREFIX)-$(WS_PREFIX)-$(SWT_VERSION).so
56ALL_SWT_LIBS = $(SWT_LIB) $(AWT_LIB) $(SWTPI_LIB) $(CAIRO_LIB) $(ATK_LIB) $(GLX_LIB) $(WEBKIT_LIB)
57
58# Webkit extension lib has to be put into a separate folder and is treated differently from the other libraries.
59WEBKIT_EXTENSION_LIB = lib$(WEBKIT_EXTENSION_PREFIX)-$(WS_PREFIX)-$(SWT_VERSION).so
60WEBEXTENSION_BASE_DIR = webkitextensions
61WEBEXTENSION_DIR = $(WEBEXTENSION_BASE_DIR)$(maj_ver)$(min_ver)r$(rev)
62
63CAIROCFLAGS = `pkg-config --cflags cairo`
64CAIROLIBS = `pkg-config --libs-only-L cairo` -lcairo
65
66# Do not use pkg-config to get libs because it includes unnecessary dependencies (i.e. pangoxft-1.0)
67ifeq ($(GTK_VERSION), 4.0)
68GTKCFLAGS = `pkg-config --cflags gtk4 gtk4-x11 gtk4-unix-print`
69GTKLIBS = `pkg-config --libs-only-L gtk4 gtk4-x11 gthread-2.0` $(XLIB64) -L$(LOCALBASE)/lib -lgtk-4 -lcairo -lgthread-2.0
70ATKCFLAGS = `pkg-config --cflags atk gtk4 gtk4-unix-print`
71else
72GTKCFLAGS = `pkg-config --cflags gtk+-$(GTK_VERSION) gtk+-unix-print-$(GTK_VERSION)`
73GTKLIBS = `pkg-config --libs-only-L gtk+-$(GTK_VERSION) gthread-2.0` $(XLIB64) -L$(LOCALBASE)/lib -lgtk-3 -lgdk-3 -lcairo -lgthread-2.0
74ATKCFLAGS = `pkg-config --cflags atk gtk+-$(GTK_VERSION) gtk+-unix-print-$(GTK_VERSION)`
75endif
76
77AWT_LFLAGS = -shared ${SWT_LFLAGS}
78AWT_LIBS = -L$(AWT_LIB_PATH) -ljawt
79
80ATKLIBS = `pkg-config --libs-only-L atk` -latk-1.0
81
82GLXLIBS = -L$(LOCALBASE)/lib -lGL -lGLU -lm
83GLXCFLAGS = -I$(LOCALBASE)/include
84
85# Uncomment for Native Stats tool
86#NATIVE_STATS = -DNATIVE_STATS
87
88WEBKITLIBS = `pkg-config --libs-only-l gio-2.0` $(XLIB64) -L$(LOCALBASE)/lib
89WEBKITCFLAGS = `pkg-config --cflags gio-2.0`
90
91WEBKIT_EXTENSION_CFLAGS=`pkg-config --cflags gtk+-3.0 webkit2gtk-web-extension-4.0`
92WEBKIT_EXTENSION_LFLAGS=`pkg-config --libs gtk+-3.0 webkit2gtk-web-extension-4.0`
93
94ifdef SWT_WEBKIT_DEBUG
95# don't use 'webkit2gtk-4.0' in production,  as some systems might not have those libs and we get crashes.
96WEBKITLIBS +=  `pkg-config --libs-only-l webkit2gtk-4.0`
97WEBKITCFLAGS +=  `pkg-config --cflags webkit2gtk-4.0`
98endif
99
100CHROMIUMLIBS = -lchromium_swt_${SWT_VERSION} -L$(CHROMIUM_OUTPUT_DIR)/chromium-$(cef_ver) -Wl,--disable-new-dtags,-rpath,"\$$ORIGIN"
101CHROMIUMCFLAGS = -I$(CHROMIUM_HEADERS)
102
103SWT_OBJECTS = swt.o c.o c_stats.o callback.o
104AWT_OBJECTS = swt_awt.o
105ifeq ($(GTK_VERSION), 4.0)
106GTKX_OBJECTS = gtk4.o gtk4_stats.o gtk4_structs.o
107else
108GTKX_OBJECTS = gtk3.o gtk3_stats.o gtk3_structs.o
109endif
110SWTPI_OBJECTS = swt.o os.o os_structs.o os_custom.o os_stats.o $(GTKX_OBJECTS)
111CAIRO_OBJECTS = swt.o cairo.o cairo_structs.o cairo_stats.o
112ATK_OBJECTS = swt.o atk.o atk_structs.o atk_custom.o atk_stats.o
113WEBKIT_OBJECTS = swt.o webkitgtk.o webkitgtk_structs.o webkitgtk_stats.o webkitgtk_custom.o
114CHROMIUM_OBJECTS = chromiumlib.o chromiumlib_structs.o chromiumlib_custom.o chromiumlib_stats.o
115GLX_OBJECTS = swt.o glx.o glx_structs.o glx_stats.o
116
117CFLAGS := $(CFLAGS) \
118		-DSWT_VERSION=$(SWT_VERSION) \
119		$(NATIVE_STATS) \
120		$(SWT_DEBUG) \
121		$(SWT_WEBKIT_DEBUG) \
122		-DLINUX -DGTK \
123		-I$(JAVA_HOME)/include \
124		-I$(JAVA_HOME)/include/freebsd \
125		-I$(LOCALBASE)/include \
126		${SWT_PTR_CFLAGS}
127LFLAGS = -shared -fPIC ${SWT_LFLAGS}
128
129# Treat all warnings as errors. If your new code produces a warning, please
130# take time to properly understand and fix/silence it as necessary.
131CFLAGS += -Werror
132
133ifndef NO_STRIP
134# -s = Remove all symbol table and relocation information from the executable.
135#      i.e, more efficent code, but removes debug information. Should not be used if you want to debug.
136#      https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Options
137#      http://stackoverflow.com/questions/14175040/effects-of-removing-all-symbol-table-and-relocation-information-from-an-executab
138AWT_LFLAGS := $(AWT_LFLAGS) -s
139LFLAGS := $(LFLAGS) -s
140endif
141
142all: make_swt make_atk make_glx make_webkit
143
144#
145# SWT libs
146#
147make_swt: $(SWT_LIB) $(SWTPI_LIB)
148
149$(SWT_LIB): $(SWT_OBJECTS)
150	$(CC) $(LFLAGS) -o $(SWT_LIB) $(SWT_OBJECTS)
151
152callback.o: callback.c callback.h
153	$(CC) $(CFLAGS) $(GTKCFLAGS) -DUSE_ASSEMBLER -c callback.c
154
155$(SWTPI_LIB): $(SWTPI_OBJECTS)
156	$(CC) $(LFLAGS) -o $(SWTPI_LIB) $(SWTPI_OBJECTS) $(GTKLIBS)
157
158swt.o: swt.c swt.h
159	$(CC) $(CFLAGS) -c swt.c
160os.o: os.c os.h swt.h os_custom.h
161	$(CC) $(CFLAGS) $(GTKCFLAGS) -c os.c
162os_structs.o: os_structs.c os_structs.h os.h swt.h
163	$(CC) $(CFLAGS) $(GTKCFLAGS) -c os_structs.c
164os_custom.o: os_custom.c os_structs.h os.h swt.h
165	$(CC) $(CFLAGS) $(GTKCFLAGS) -c os_custom.c
166os_stats.o: os_stats.c os_structs.h os.h os_stats.h swt.h
167	$(CC) $(CFLAGS) $(GTKCFLAGS) -c os_stats.c
168
169gtk3.o: gtk3.c gtk3.h swt.h
170	$(CC) $(CFLAGS) $(GTKCFLAGS) -c gtk3.c
171gtk3_structs.o: gtk3_structs.c gtk3_structs.h gtk3.h swt.h
172	$(CC) $(CFLAGS) $(GTKCFLAGS) -c gtk3_structs.c
173gtk3_stats.o: gtk3_stats.c gtk3_structs.h gtk3.h gtk3_stats.h swt.h
174	$(CC) $(CFLAGS) $(GTKCFLAGS) -c gtk3_stats.c
175
176gtk4.o: gtk4.c gtk4.h swt.h
177	$(CC) $(CFLAGS) $(GTKCFLAGS) -c gtk4.c
178gtk4_structs.o: gtk4_structs.c gtk4_structs.h gtk4.h swt.h
179	$(CC) $(CFLAGS) $(GTKCFLAGS) -c gtk4_structs.c
180gtk4_stats.o: gtk4_stats.c gtk4_structs.h gtk4.h gtk4_stats.h swt.h
181	$(CC) $(CFLAGS) $(GTKCFLAGS) -c gtk4_stats.c
182
183#
184# CAIRO libs
185#
186make_cairo: $(CAIRO_LIB)
187
188$(CAIRO_LIB): $(CAIRO_OBJECTS)
189	$(CC) $(LFLAGS) -o $(CAIRO_LIB) $(CAIRO_OBJECTS) $(CAIROLIBS)
190
191cairo.o: cairo.c cairo.h swt.h
192	$(CC) $(CFLAGS) $(CAIROCFLAGS) -c cairo.c
193cairo_structs.o: cairo_structs.c cairo_structs.h cairo.h swt.h
194	$(CC) $(CFLAGS) $(CAIROCFLAGS) -c cairo_structs.c
195cairo_stats.o: cairo_stats.c cairo_structs.h cairo.h cairo_stats.h swt.h
196	$(CC) $(CFLAGS) $(CAIROCFLAGS) -c cairo_stats.c
197
198#
199# AWT lib
200#
201make_awt:$(AWT_LIB)
202
203$(AWT_LIB): $(AWT_OBJECTS)
204	$(CC) $(AWT_LFLAGS) -o $(AWT_LIB) $(AWT_OBJECTS) $(AWT_LIBS)
205
206#
207# Atk lib
208#
209make_atk: $(ATK_LIB)
210
211$(ATK_LIB): $(ATK_OBJECTS)
212	$(CC) $(LFLAGS) -o $(ATK_LIB) $(ATK_OBJECTS) $(ATKLIBS)
213
214atk.o: atk.c atk.h
215	$(CC) $(CFLAGS) $(ATKCFLAGS) -c atk.c
216atk_structs.o: atk_structs.c atk_structs.h atk.h
217	$(CC) $(CFLAGS) $(ATKCFLAGS) -c atk_structs.c
218atk_custom.o: atk_custom.c atk_structs.h atk.h
219	$(CC) $(CFLAGS) $(ATKCFLAGS) -c atk_custom.c
220atk_stats.o: atk_stats.c atk_structs.h atk_stats.h atk.h
221	$(CC) $(CFLAGS) $(ATKCFLAGS) -c atk_stats.c
222
223#
224# WebKit lib
225#
226ifeq ($(BUILD_WEBKIT2EXTENSION),yes)
227make_webkit: $(WEBKIT_LIB) make_webkit2extension
228else
229make_webkit: $(WEBKIT_LIB)
230endif
231
232$(WEBKIT_LIB): $(WEBKIT_OBJECTS)
233	$(CC) $(LFLAGS) -o $(WEBKIT_LIB) $(WEBKIT_OBJECTS) $(WEBKITLIBS)
234
235webkitgtk.o: webkitgtk.c webkitgtk_custom.h
236	$(CC) $(CFLAGS) $(WEBKITCFLAGS) -c webkitgtk.c
237
238webkitgtk_structs.o: webkitgtk_structs.c
239	$(CC) $(CFLAGS) $(WEBKITCFLAGS) -c webkitgtk_structs.c
240
241webkitgtk_stats.o: webkitgtk_stats.c webkitgtk_stats.h
242	$(CC) $(CFLAGS) $(WEBKITCFLAGS) -c webkitgtk_stats.c
243
244webkitgtk_custom.o: webkitgtk_custom.c
245	$(CC) $(CFLAGS) $(WEBKITCFLAGS) -c webkitgtk_custom.c
246
247
248# Webkit2 extension is a seperate .so lib.
249make_webkit2extension: $(WEBKIT_EXTENSION_LIB)
250
251$(WEBKIT_EXTENSION_LIB) : webkitgtk_extension.o
252	$(CC) $(LFLAGS) -o $@ $^ $(WEBKIT_EXTENSION_LFLAGS)
253
254webkitgtk_extension.o : webkitgtk_extension.c
255	$(CC) $(CFLAGS) $(WEBKIT_EXTENSION_CFLAGS) ${SWT_PTR_CFLAGS} -fPIC -c $^
256
257#
258# Chromium lib
259#
260chromium: $(CHROMIUM_LIB)
261
262$(CHROMIUM_LIB): $(CHROMIUM_OBJECTS)
263	$(CC) $(LFLAGS) -o $(CHROMIUM_LIB) $(CHROMIUM_OBJECTS) $(CHROMIUMLIBS)
264
265chromiumlib.o: chromiumlib.c
266	$(CC) $(CFLAGS) $(CHROMIUMCFLAGS) -c chromiumlib.c
267
268chromiumlib_structs.o: chromiumlib_structs.c
269	$(CC) $(CFLAGS) $(CHROMIUMCFLAGS) -c chromiumlib_structs.c
270
271chromiumlib_custom.o: chromiumlib_custom.c
272	$(CC) $(CFLAGS) $(CHROMIUMCFLAGS) -c chromiumlib_custom.c
273
274chromiumlib_stats.o: chromiumlib_stats.c chromiumlib_stats.h
275	$(CC) $(CFLAGS) $(CHROMIUMCFLAGS) -c chromiumlib_stats.c
276
277#
278# GLX lib
279#
280make_glx: $(GLX_LIB)
281
282$(GLX_LIB): $(GLX_OBJECTS)
283	$(CC) $(LFLAGS) -o $(GLX_LIB) $(GLX_OBJECTS) $(GLXLIBS)
284
285glx.o: glx.c
286	$(CC) $(CFLAGS) $(GLXCFLAGS) -c glx.c
287
288glx_structs.o: glx_structs.c
289	$(CC) $(CFLAGS) $(GLXCFLAGS) -c glx_structs.c
290
291glx_stats.o: glx_stats.c glx_stats.h
292	$(CC) $(CFLAGS) $(GLXCFLAGS) -c glx_stats.c
293
294#
295# Install
296#
297# Note on syntax because below might be confusing even for bash-Gods:
298# @    do not print command
299# -    do not stop if there is a fail..  => @-  is combination of both.
300# [ COND ] && CMD     only run CMD if condition is true like 'if COND then CMD'. Single line to be makefile compatible.
301# -d   test if file exists and is a directory.
302# $$(val)    in makefile, you have to escape $(..) into $$(..)
303# I hope there are no spaces in the path :-).
304install: all
305	cp $(ALL_SWT_LIBS) $(OUTPUT_DIR)
306ifeq ($(BUILD_WEBKIT2EXTENSION),yes)
307	@# Copy webextension into it's own folder, but create folder first.
308	@# CAREFULLY delete '.so' files inside webextension*. Then carefully remove the directories. 'rm -rf' seemed too risky of an approach.
309	@-[ "$$(ls -d $(OUTPUT_DIR)/$(WEBEXTENSION_BASE_DIR)*/*.so)" ] && rm -v `ls -d $(OUTPUT_DIR)/$(WEBEXTENSION_BASE_DIR)*/*.so`
310	@-[ "$$(ls -d $(OUTPUT_DIR)/$(WEBEXTENSION_BASE_DIR)*)" ] && rmdir -v `ls -d $(OUTPUT_DIR)/$(WEBEXTENSION_BASE_DIR)*`
311
312	@# Copying webextension is not critical for build to succeed, thus we use '-'. SWT can still function without a webextension.
313	@-[ -d $(OUTPUT_DIR)/$(WEBEXTENSION_DIR) ] || mkdir -v $(OUTPUT_DIR)/$(WEBEXTENSION_DIR)  # If folder does not exist, make it.
314	-cp $(WEBKIT_EXTENSION_LIB) $(OUTPUT_DIR)/$(WEBEXTENSION_DIR)/
315endif
316
317chromium_cargo:
318	cd chromium_subp && cargo build --release
319	cd chromium_swt && cargo build --release
320	mkdir -p $(CHROMIUM_OUTPUT_DIR)/chromium-$(cef_ver)
321	cp chromium_subp/target/release/chromium_subp $(CHROMIUM_OUTPUT_DIR)/chromium-$(cef_ver)/chromium_subp-$(SWT_VERSION)
322	cp chromium_swt/target/release/libchromium_swt_$(SWT_VERSION).so $(CHROMIUM_OUTPUT_DIR)/chromium-$(cef_ver)
323chromium_install: chromium
324	cp $(CHROMIUM_LIB) $(CHROMIUM_OUTPUT_DIR)/chromium-$(cef_ver)
325#
326# Clean
327#
328clean:
329	rm -f *.o *.so
330