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 Linux 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/usr/X11R6/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/usr/X11R6/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 = -lGL -lGLU -lm
83
84# Uncomment for Native Stats tool
85#NATIVE_STATS = -DNATIVE_STATS
86
87WEBKITLIBS = `pkg-config --libs-only-l gio-2.0`
88WEBKITCFLAGS = `pkg-config --cflags gio-2.0`
89
90WEBKIT_EXTENSION_CFLAGS=`pkg-config --cflags gtk+-3.0 webkit2gtk-web-extension-4.0`
91WEBKIT_EXTENSION_LFLAGS=`pkg-config --libs gtk+-3.0 webkit2gtk-web-extension-4.0`
92
93ifdef SWT_WEBKIT_DEBUG
94# don't use 'webkit2gtk-4.0' in production,  as some systems might not have those libs and we get crashes.
95WEBKITLIBS +=  `pkg-config --libs-only-l webkit2gtk-4.0`
96WEBKITCFLAGS +=  `pkg-config --cflags webkit2gtk-4.0`
97endif
98
99CHROMIUMLIBS = -lchromium_swt_${SWT_VERSION} -L$(CHROMIUM_OUTPUT_DIR)/chromium-$(cef_ver) -Wl,--disable-new-dtags,-rpath,"\$$ORIGIN"
100CHROMIUMCFLAGS = -I$(CHROMIUM_HEADERS)
101
102SWT_OBJECTS = swt.o c.o c_stats.o callback.o
103AWT_OBJECTS = swt_awt.o
104ifeq ($(GTK_VERSION), 4.0)
105GTKX_OBJECTS = gtk4.o gtk4_stats.o gtk4_structs.o
106else
107GTKX_OBJECTS = gtk3.o gtk3_stats.o gtk3_structs.o
108endif
109SWTPI_OBJECTS = swt.o os.o os_structs.o os_custom.o os_stats.o $(GTKX_OBJECTS)
110CAIRO_OBJECTS = swt.o cairo.o cairo_structs.o cairo_stats.o
111ATK_OBJECTS = swt.o atk.o atk_structs.o atk_custom.o atk_stats.o
112WEBKIT_OBJECTS = swt.o webkitgtk.o webkitgtk_structs.o webkitgtk_stats.o webkitgtk_custom.o
113CHROMIUM_OBJECTS = chromiumlib.o chromiumlib_structs.o chromiumlib_custom.o chromiumlib_stats.o
114GLX_OBJECTS = swt.o glx.o glx_structs.o glx_stats.o
115
116CFLAGS := $(CFLAGS) \
117		-DSWT_VERSION=$(SWT_VERSION) \
118		$(NATIVE_STATS) \
119		$(SWT_DEBUG) \
120		$(SWT_WEBKIT_DEBUG) \
121		-DLINUX -DGTK \
122		-I$(JAVA_HOME)/include \
123		-I$(JAVA_HOME)/include/linux \
124		${SWT_PTR_CFLAGS}
125LFLAGS = -shared -fPIC ${SWT_LFLAGS}
126
127# Treat all warnings as errors. If your new code produces a warning, please
128# take time to properly understand and fix/silence it as necessary.
129CFLAGS += -Werror
130
131ifndef NO_STRIP
132	# -s = Remove all symbol table and relocation information from the executable.
133	#      i.e, more efficent code, but removes debug information. Should not be used if you want to debug.
134	#      https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Options
135	#      http://stackoverflow.com/questions/14175040/effects-of-removing-all-symbol-table-and-relocation-information-from-an-executab
136	AWT_LFLAGS := $(AWT_LFLAGS) -s
137	LFLAGS := $(LFLAGS) -s
138endif
139
140all: make_swt make_atk make_glx make_webkit
141
142#
143# SWT libs
144#
145make_swt: $(SWT_LIB) $(SWTPI_LIB)
146
147$(SWT_LIB): $(SWT_OBJECTS)
148	$(CC) $(LFLAGS) -o $(SWT_LIB) $(SWT_OBJECTS)
149
150callback.o: callback.c callback.h
151	$(CC) $(CFLAGS) $(GTKCFLAGS) -DUSE_ASSEMBLER -c callback.c
152
153$(SWTPI_LIB): $(SWTPI_OBJECTS)
154	$(CC) $(LFLAGS) -o $(SWTPI_LIB) $(SWTPI_OBJECTS) $(GTKLIBS)
155
156swt.o: swt.c swt.h
157	$(CC) $(CFLAGS) -c swt.c
158os.o: os.c os.h swt.h os_custom.h
159	$(CC) $(CFLAGS) $(GTKCFLAGS) -c os.c
160os_structs.o: os_structs.c os_structs.h os.h swt.h
161	$(CC) $(CFLAGS) $(GTKCFLAGS) -c os_structs.c
162os_custom.o: os_custom.c os_structs.h os.h swt.h
163	$(CC) $(CFLAGS) $(GTKCFLAGS) -c os_custom.c
164os_stats.o: os_stats.c os_structs.h os.h os_stats.h swt.h
165	$(CC) $(CFLAGS) $(GTKCFLAGS) -c os_stats.c
166
167gtk3.o: gtk3.c gtk3.h swt.h
168	$(CC) $(CFLAGS) $(GTKCFLAGS) -c gtk3.c
169gtk3_structs.o: gtk3_structs.c gtk3_structs.h gtk3.h swt.h
170	$(CC) $(CFLAGS) $(GTKCFLAGS) -c gtk3_structs.c
171gtk3_stats.o: gtk3_stats.c gtk3_structs.h gtk3.h gtk3_stats.h swt.h
172	$(CC) $(CFLAGS) $(GTKCFLAGS) -c gtk3_stats.c
173
174gtk4.o: gtk4.c gtk4.h swt.h
175	$(CC) $(CFLAGS) $(GTKCFLAGS) -c gtk4.c
176gtk4_structs.o: gtk4_structs.c gtk4_structs.h gtk4.h swt.h
177	$(CC) $(CFLAGS) $(GTKCFLAGS) -c gtk4_structs.c
178gtk4_stats.o: gtk4_stats.c gtk4_structs.h gtk4.h gtk4_stats.h swt.h
179	$(CC) $(CFLAGS) $(GTKCFLAGS) -c gtk4_stats.c
180
181#
182# CAIRO libs
183#
184make_cairo: $(CAIRO_LIB)
185
186$(CAIRO_LIB): $(CAIRO_OBJECTS)
187	$(CC) $(LFLAGS) -o $(CAIRO_LIB) $(CAIRO_OBJECTS) $(CAIROLIBS)
188
189cairo.o: cairo.c cairo.h swt.h
190	$(CC) $(CFLAGS) $(CAIROCFLAGS) -c cairo.c
191cairo_structs.o: cairo_structs.c cairo_structs.h cairo.h swt.h
192	$(CC) $(CFLAGS) $(CAIROCFLAGS) -c cairo_structs.c
193cairo_stats.o: cairo_stats.c cairo_structs.h cairo.h cairo_stats.h swt.h
194	$(CC) $(CFLAGS) $(CAIROCFLAGS) -c cairo_stats.c
195
196#
197# AWT lib
198#
199make_awt:$(AWT_LIB)
200
201$(AWT_LIB): $(AWT_OBJECTS)
202	$(CC) $(AWT_LFLAGS) -o $(AWT_LIB) $(AWT_OBJECTS) $(AWT_LIBS)
203
204#
205# Atk lib
206#
207make_atk: $(ATK_LIB)
208
209$(ATK_LIB): $(ATK_OBJECTS)
210	$(CC) $(LFLAGS) -o $(ATK_LIB) $(ATK_OBJECTS) $(ATKLIBS)
211
212atk.o: atk.c atk.h
213	$(CC) $(CFLAGS) $(ATKCFLAGS) -c atk.c
214atk_structs.o: atk_structs.c atk_structs.h atk.h
215	$(CC) $(CFLAGS) $(ATKCFLAGS) -c atk_structs.c
216atk_custom.o: atk_custom.c atk_structs.h atk.h
217	$(CC) $(CFLAGS) $(ATKCFLAGS) -c atk_custom.c
218atk_stats.o: atk_stats.c atk_structs.h atk_stats.h atk.h
219	$(CC) $(CFLAGS) $(ATKCFLAGS) -c atk_stats.c
220
221#
222# WebKit lib
223#
224ifeq ($(BUILD_WEBKIT2EXTENSION),yes)
225make_webkit: $(WEBKIT_LIB) make_webkit2extension
226else
227make_webkit: $(WEBKIT_LIB)
228endif
229
230$(WEBKIT_LIB): $(WEBKIT_OBJECTS)
231	$(CC) $(LFLAGS) -o $(WEBKIT_LIB) $(WEBKIT_OBJECTS) $(WEBKITLIBS)
232
233webkitgtk.o: webkitgtk.c webkitgtk_custom.h
234	$(CC) $(CFLAGS) $(WEBKITCFLAGS) -c webkitgtk.c
235
236webkitgtk_structs.o: webkitgtk_structs.c
237	$(CC) $(CFLAGS) $(WEBKITCFLAGS) -c webkitgtk_structs.c
238
239webkitgtk_stats.o: webkitgtk_stats.c webkitgtk_stats.h
240	$(CC) $(CFLAGS) $(WEBKITCFLAGS) -c webkitgtk_stats.c
241
242webkitgtk_custom.o: webkitgtk_custom.c
243	$(CC) $(CFLAGS) $(WEBKITCFLAGS) -c webkitgtk_custom.c
244
245
246# Webkit2 extension is a seperate .so lib.
247make_webkit2extension: $(WEBKIT_EXTENSION_LIB)
248
249$(WEBKIT_EXTENSION_LIB) : webkitgtk_extension.o
250	$(CC) $(LFLAGS) -o $@ $^ $(WEBKIT_EXTENSION_LFLAGS)
251
252webkitgtk_extension.o : webkitgtk_extension.c
253	$(CC) $(CFLAGS) $(WEBKIT_EXTENSION_CFLAGS) ${SWT_PTR_CFLAGS} -fPIC -c $^
254
255#
256# Chromium lib
257#
258chromium: $(CHROMIUM_LIB)
259
260$(CHROMIUM_LIB): $(CHROMIUM_OBJECTS)
261	$(CC) $(LFLAGS) -o $(CHROMIUM_LIB) $(CHROMIUM_OBJECTS) $(CHROMIUMLIBS)
262
263chromiumlib.o: chromiumlib.c
264	$(CC) $(CFLAGS) $(CHROMIUMCFLAGS) -c chromiumlib.c
265
266chromiumlib_structs.o: chromiumlib_structs.c
267	$(CC) $(CFLAGS) $(CHROMIUMCFLAGS) -c chromiumlib_structs.c
268
269chromiumlib_custom.o: chromiumlib_custom.c
270	$(CC) $(CFLAGS) $(CHROMIUMCFLAGS) -c chromiumlib_custom.c
271
272chromiumlib_stats.o: chromiumlib_stats.c chromiumlib_stats.h
273	$(CC) $(CFLAGS) $(CHROMIUMCFLAGS) -c chromiumlib_stats.c
274
275#
276# GLX lib
277#
278make_glx: $(GLX_LIB)
279
280$(GLX_LIB): $(GLX_OBJECTS)
281	$(CC) $(LFLAGS) -o $(GLX_LIB) $(GLX_OBJECTS) $(GLXLIBS)
282
283glx.o: glx.c
284	$(CC) $(CFLAGS) $(GLXCFLAGS) -c glx.c
285
286glx_structs.o: glx_structs.c
287	$(CC) $(CFLAGS) $(GLXCFLAGS) -c glx_structs.c
288
289glx_stats.o: glx_stats.c glx_stats.h
290	$(CC) $(CFLAGS) $(GLXCFLAGS) -c glx_stats.c
291
292#
293# Install
294#
295# Note on syntax because below might be confusing even for bash-Gods:
296# @    do not print command
297# -    do not stop if there is a fail..  => @-  is combination of both.
298# [ COND ] && CMD     only run CMD if condition is true like 'if COND then CMD'. Single line to be makefile compatible.
299# -d   test if file exists and is a directory.
300# $$(val)    in makefile, you have to escape $(..) into $$(..)
301# I hope there are no spaces in the path :-).
302install: all
303	cp $(ALL_SWT_LIBS) $(OUTPUT_DIR)
304ifeq ($(BUILD_WEBKIT2EXTENSION),yes)
305	@# Copy webextension into it's own folder, but create folder first.
306	@# CAREFULLY delete '.so' files inside webextension*. Then carefully remove the directories. 'rm -rf' seemed too risky of an approach.
307	@-[ "$$(ls -d $(OUTPUT_DIR)/$(WEBEXTENSION_BASE_DIR)*/*.so)" ] && rm -v `ls -d $(OUTPUT_DIR)/$(WEBEXTENSION_BASE_DIR)*/*.so`
308	@-[ "$$(ls -d $(OUTPUT_DIR)/$(WEBEXTENSION_BASE_DIR)*)" ] && rmdir -v `ls -d $(OUTPUT_DIR)/$(WEBEXTENSION_BASE_DIR)*`
309
310	@# Copying webextension is not critical for build to succeed, thus we use '-'. SWT can still function without a webextension.
311	@-[ -d $(OUTPUT_DIR)/$(WEBEXTENSION_DIR) ] || mkdir -v $(OUTPUT_DIR)/$(WEBEXTENSION_DIR)  # If folder does not exist, make it.
312	-cp $(WEBKIT_EXTENSION_LIB) $(OUTPUT_DIR)/$(WEBEXTENSION_DIR)/
313endif
314
315chromium_cargo:
316	cd chromium_subp && cargo build --release
317	cd chromium_swt && cargo build --release
318	mkdir -p $(CHROMIUM_OUTPUT_DIR)/chromium-$(cef_ver)
319	cp chromium_subp/target/release/chromium_subp $(CHROMIUM_OUTPUT_DIR)/chromium-$(cef_ver)/chromium_subp-$(SWT_VERSION)
320	cp chromium_swt/target/release/libchromium_swt_$(SWT_VERSION).so $(CHROMIUM_OUTPUT_DIR)/chromium-$(cef_ver)
321chromium_install: chromium
322	cp $(CHROMIUM_LIB) $(CHROMIUM_OUTPUT_DIR)/chromium-$(cef_ver)
323#
324# Clean
325#
326clean:
327	rm -f *.o *.so
328