1# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
2#
3# This file is part of the LibreOffice project.
4#
5# This Source Code Form is subject to the terms of the Mozilla Public
6# License, v. 2.0. If a copy of the MPL was not distributed with this
7# file, You can obtain one at http://mozilla.org/MPL/2.0/.
8#
9# This file incorporates work covered by the following license notice:
10#
11#   Licensed to the Apache Software Foundation (ASF) under one or more
12#   contributor license agreements. See the NOTICE file distributed
13#   with this work for additional information regarding copyright
14#   ownership. The ASF licenses this file to you under the Apache
15#   License, Version 2.0 (the "License"); you may not use this file
16#   except in compliance with the License. You may obtain a copy of
17#   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18#
19
20# to block heavy exception handling that try to acquire the solarmutex
21export LO_LEAN_EXCEPTION=1
22
23include $(GBUILDDIR)/platform/com_GCC_defs.mk
24
25gb_MKTEMP := mktemp -t gbuild.XXXXXX
26
27ifneq ($(origin AR),default)
28gb_AR := $(AR)
29endif
30
31gb_OSDEFS := \
32	-D$(OS) \
33	-D_PTHREADS \
34	-DUNIX \
35	-DUNX \
36	$(PTHREAD_CFLAGS) \
37	$(LFS_CFLAGS) \
38
39gb_CFLAGS := \
40	$(gb_CFLAGS_COMMON) \
41	-fPIC \
42	-Wdeclaration-after-statement \
43	-Wshadow \
44
45# At least libstdc++ (which is approximated here with !HAVE_LIBCXX) needs -pthread when including
46# various C++ headers like <thread>, see <https://gcc.gnu.org/onlinedocs/gcc-8.3.0/libstdc++/manual/
47# manual/using.html#manual.intro.using.flags>:
48ifeq ($(HAVE_LIBCXX),)
49gb_CXX_LINKFLAGS := -pthread
50endif
51
52gb_CXXFLAGS := \
53	$(gb_CXXFLAGS_COMMON) \
54	-fPIC \
55	$(CXXFLAGS_WARN) \
56	$(CXXFLAGS_CXX11) \
57	$(gb_CXX_LINKFLAGS) \
58
59
60# enable debug STL
61ifeq ($(gb_ENABLE_DBGUTIL),$(true))
62gb_COMPILERDEFS += \
63	-D_GLIBCXX_DEBUG \
64
65endif
66
67ifneq ($(strip $(SYSBASE)),)
68gb_CXXFLAGS += --sysroot=$(SYSBASE)
69gb_CFLAGS += --sysroot=$(SYSBASE)
70gb_LinkTarget_LDFLAGS += \
71	-Wl,--sysroot=$(SYSBASE)
72endif
73
74gb_LinkTarget_LDFLAGS += \
75	-Wl,-rpath-link,$(SYSBASE)/lib:$(SYSBASE)/usr/lib \
76	-Wl,-z,combreloc \
77
78ifeq ($(HAVE_LD_HASH_STYLE),TRUE)
79gb_LinkTarget_LDFLAGS += \
80	-Wl,--hash-style=$(WITH_LINKER_HASH_STYLE) \
81
82endif
83
84ifneq ($(HAVE_LD_BSYMBOLIC_FUNCTIONS),)
85gb_LinkTarget_LDFLAGS += -Wl,-Bsymbolic-functions
86endif
87
88gb_LINKEROPTFLAGS := -Wl,-O1
89gb_LINKERSTRIPDEBUGFLAGS := -Wl,-S
90
91# LinkTarget class
92
93define gb_LinkTarget__get_rpath_for_layer
94$(patsubst $(1):%,%,$(filter $(1):%,$(gb_LinkTarget__RPATHS)))
95endef
96
97gb_LinkTarget__RPATHS := \
98	URELIB:\dORIGIN \
99	UREBIN:\dORIGIN \
100	OOO:\dORIGIN \
101	SDKBIN:\dORIGIN/../../program \
102	OXT: \
103	NONE:\dORIGIN/../Library \
104
105gb_LinkTarget_CFLAGS := $(gb_CFLAGS)
106gb_LinkTarget_CXXFLAGS := $(gb_CXXFLAGS)
107
108# note that `cat $(extraobjectlist)` is needed to build with older gcc versions, e.g. 4.1.2 on SLED10
109# we want to use @$(extraobjectlist) in the long run
110# link with C compiler if there are no C++ files (pyuno_wrapper depends on this)
111# But always link with C++ compiler e.g. under -fsanitize=undefined, as sal uses
112# __ubsan_handle_dynamic_type_cache_miss_abort and __ubsan_vptr_type_cache from
113# libclang_rt.ubsan_cxx-x86_64.a, and oosplash links against sal but itself only
114# contains .c sources:
115define gb_LinkTarget__command_dynamiclink
116$(call gb_Helper_abbreviate_dirs,\
117	$(if $(CXXOBJECTS)$(GENCXXOBJECTS)$(EXTRAOBJECTLISTS)$(filter-out XTRUE,X$(ENABLE_RUNTIME_OPTIMIZATIONS)),$(or $(T_CXX),$(gb_CXX)) $(gb_CXX_LINKFLAGS),$(or $(T_CC),$(gb_CXX))) \
118		$(if $(filter Library CppunitTest,$(TARGETTYPE)),$(gb_Library_TARGETTYPEFLAGS)) \
119		$(gb_LTOFLAGS) \
120		$(if $(SOVERSIONSCRIPT),-Wl$(COMMA)--soname=$(notdir $(1)) \
121			-Wl$(COMMA)--version-script=$(SOVERSIONSCRIPT)) \
122		$(subst \d,$$,$(RPATH)) \
123		$(T_USE_LD) $(T_LDFLAGS) \
124		$(foreach object,$(COBJECTS),$(call gb_CObject_get_target,$(object))) \
125		$(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_target,$(object))) \
126		$(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_target,$(object))) \
127		$(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_target,$(object))) \
128		$(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_target,$(object))) \
129		$(foreach extraobjectlist,$(EXTRAOBJECTLISTS),`cat $(extraobjectlist)`) \
130		$(if $(filter TRUE,$(DISABLE_DYNLOADING)), \
131		    -Wl$(COMMA)--start-group \
132		    $(patsubst lib%.a,-l%,$(patsubst lib%.so,-l%,$(patsubst %.$(gb_Library_UDK_MAJORVER),%,$(foreach lib,$(LINKED_LIBS),$(call gb_Library_get_filename,$(lib)))))) \
133		    $(foreach lib,$(LINKED_STATIC_LIBS),$(call gb_StaticLibrary_get_target,$(lib))) \
134		    $(T_LIBS) \
135		    $(if $(CXXOBJECTS)$(GENCXXOBJECTS)$(EXTRAOBJECTLISTS)$(filter-out XTRUE,X$(ENABLE_RUNTIME_OPTIMIZATIONS)),$(T_STDLIBS_CXX)) \
136		    -Wl$(COMMA)--end-group \
137		    , \
138		    -Wl$(COMMA)--start-group \
139		    $(foreach lib,$(LINKED_STATIC_LIBS),$(call gb_StaticLibrary_get_target,$(lib))) \
140		    $(T_LIBS) \
141		    $(if $(CXXOBJECTS)$(GENCXXOBJECTS)$(EXTRAOBJECTLISTS)$(filter-out XTRUE,X$(ENABLE_RUNTIME_OPTIMIZATIONS)),$(T_STDLIBS_CXX)) \
142		    -Wl$(COMMA)--end-group \
143		    -Wl$(COMMA)--no-as-needed \
144		    $(patsubst lib%.a,-l%,$(patsubst lib%.so,-l%,$(patsubst %.$(gb_Library_UDK_MAJORVER),%,$(foreach lib,$(LINKED_LIBS),$(call gb_Library_get_filename,$(lib)))))) \
145                ) \
146		-o $(1) \
147	$(if $(SOVERSIONSCRIPT),&& ln -sf ../../program/$(notdir $(1)) $(ILIBTARGET)))
148	$(if $(filter Library,$(TARGETTYPE)), $(call gb_Helper_abbreviate_dirs,\
149		$(READELF) -d $(1) | grep SONAME > $(WORKDIR)/LinkTarget/$(2).exports.tmp; \
150		$(NM) $(gb_LTOPLUGINFLAGS) --dynamic --extern-only --defined-only --format=posix $(1) \
151			| cut -d' ' -f1-2 \
152			>> $(WORKDIR)/LinkTarget/$(2).exports.tmp && \
153		$(call gb_Helper_replace_if_different_and_touch,$(WORKDIR)/LinkTarget/$(2).exports.tmp, \
154			$(WORKDIR)/LinkTarget/$(2).exports,$(1))))
155endef
156
157define gb_LinkTarget__command_staticlink
158$(call gb_Helper_abbreviate_dirs,\
159	rm -f $(1) && \
160	$(gb_AR) $(gb_LTOPLUGINFLAGS) -rsu $(1) \
161		$(if $(LD_PLUGIN),--plugin $(LD_PLUGIN)) \
162		$(foreach object,$(COBJECTS),$(call gb_CObject_get_target,$(object))) \
163		$(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_target,$(object))) \
164		$(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_target,$(object))) \
165		$(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_target,$(object))) \
166		$(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_target,$(object))) \
167		$(foreach extraobjectlist,$(EXTRAOBJECTLISTS),@$(extraobjectlist)) \
168		$(if $(findstring s,$(MAKEFLAGS)),2> /dev/null))
169endef
170
171define gb_LinkTarget__command
172$(call gb_Output_announce,$(2),$(true),LNK,4)
173	$(call gb_Trace_StartRange,$(2),LNK)
174$(if $(filter CppunitTest Executable,$(TARGETTYPE)),$(call gb_LinkTarget__command_dynamiclink,$(1),$(2)))
175$(if $(filter Library,$(TARGETTYPE)),$(if $(filter TRUE,$(DISABLE_DYNLOADING)),$(call gb_LinkTarget__command_staticlink,$(1)),$(call gb_LinkTarget__command_dynamiclink,$(1),$(2))))
176$(if $(filter StaticLibrary,$(TARGETTYPE)),$(call gb_LinkTarget__command_staticlink,$(1)))
177	$(call gb_Trace_EndRange,$(2),LNK)
178endef
179
180
181# Library class
182
183gb_Library_DEFS :=
184gb_Library_SYSPRE := lib
185gb_Library_UNOVERPRE := $(gb_Library_SYSPRE)uno_
186
187ifeq ($(DISABLE_DYNLOADING),TRUE)
188
189gb_Library_PLAINEXT := .a
190gb_Library_PLAINEXT_FOR_BUILD := .so
191gb_Library_DLLEXT := .a
192
193else
194
195gb_Library_TARGETTYPEFLAGS := -shared -Wl,-z,noexecstack
196gb_Library_UDK_MAJORVER := 3
197gb_Library_PLAINEXT := .so
198gb_Library_PLAINEXT_FOR_BUILD := .so
199gb_Library_DLLEXT := .so
200
201endif
202
203gb_Library_RTEXT := gcc3$(gb_Library_PLAINEXT)
204
205gb_Library_OOOEXT := $(gb_Library_DLLPOSTFIX)$(gb_Library_PLAINEXT)
206gb_Library_UNOEXT := .uno$(gb_Library_PLAINEXT)
207
208gb_Library_FILENAMES := \
209	$(foreach lib,$(gb_Library_OOOLIBS),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_OOOEXT)) \
210	$(foreach lib,$(gb_Library_PLAINLIBS_NONE),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
211	$(foreach lib,$(gb_Library_PLAINLIBS_URE),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
212	$(foreach lib,$(gb_Library_PLAINLIBS_OOO),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
213	$(foreach lib,$(gb_Library_PLAINLIBS_OXT),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
214	$(foreach lib,$(gb_Library_PRIVATELIBS_URE),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_OOOEXT)) \
215	$(foreach lib,$(gb_Library_EXTENSIONLIBS),$(lib):$(lib)$(gb_Library_UNOEXT)) \
216
217ifeq ($(DISABLE_DYNLOADING),TRUE)
218
219gb_Library_FILENAMES += \
220	$(foreach lib,$(gb_Library_RTVERLIBS),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_RTEXT)) \
221	$(foreach lib,$(gb_Library_UNOVERLIBS),$(lib):$(gb_Library_UNOVERPRE)$(lib)$(gb_Library_PLAINEXT)) \
222
223else
224
225gb_Library_FILENAMES += \
226	$(foreach lib,$(gb_Library_RTVERLIBS),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_RTEXT).$(gb_Library_UDK_MAJORVER)) \
227	$(foreach lib,$(gb_Library_UNOVERLIBS),$(lib):$(gb_Library_UNOVERPRE)$(lib)$(gb_Library_PLAINEXT).$(gb_Library_UDK_MAJORVER)) \
228
229endif
230
231gb_Library_LAYER := \
232	$(foreach lib,$(gb_Library_OOOLIBS),$(lib):OOO) \
233	$(foreach lib,$(gb_Library_PLAINLIBS_URE),$(lib):URELIB) \
234	$(foreach lib,$(gb_Library_PLAINLIBS_OOO),$(lib):OOO) \
235	$(foreach lib,$(gb_Library_PLAINLIBS_OXT),$(lib):OXT) \
236	$(foreach lib,$(gb_Library_PLAINLIBS_NONE),$(lib):NONE) \
237	$(foreach lib,$(gb_Library_PRIVATELIBS_URE),$(lib):URELIB) \
238	$(foreach lib,$(gb_Library_RTVERLIBS),$(lib):URELIB) \
239	$(foreach lib,$(gb_Library_UNOVERLIBS),$(lib):URELIB) \
240	$(foreach lib,$(gb_Library_EXTENSIONLIBS),$(lib):OXT) \
241
242define gb_Library__get_rpath
243$(if $(1),$(strip -Wl,-z,origin '-Wl,-rpath,$(1)' -Wl,-rpath-link,$(INSTDIR)/program))
244endef
245
246define gb_Library_get_rpath
247$(call gb_Library__get_rpath,$(call gb_LinkTarget__get_rpath_for_layer,$(call gb_Library_get_layer,$(1))))
248endef
249
250define gb_Library_Library_platform
251$(call gb_LinkTarget_get_target,$(2)) : RPATH := $(call gb_Library_get_rpath,$(1))
252
253endef
254
255gb_Library__set_soversion_script_platform = $(gb_Library__set_soversion_script)
256
257gb_Library_get_sdk_link_dir = $(INSTDIR)/$(SDKDIRNAME)/lib
258
259gb_Library_get_sdk_link_lib = $(gb_Library_get_versionlink_target)
260
261# Executable class
262
263gb_Executable_EXT :=
264
265gb_Executable_LAYER := \
266	$(foreach exe,$(gb_Executable_UREBIN),$(exe):UREBIN) \
267	$(foreach exe,$(gb_Executable_SDK),$(exe):SDKBIN) \
268	$(foreach exe,$(gb_Executable_OOO),$(exe):OOO) \
269	$(foreach exe,$(gb_Executable_NONE),$(exe):NONE) \
270
271
272define gb_Executable__get_rpath
273$(strip -Wl,-z,origin $(if $(1),'-Wl$(COMMA)-rpath$(COMMA)$(1)') -Wl,-rpath-link,$(INSTDIR)/program)
274endef
275
276define gb_Executable_get_rpath
277$(call gb_Executable__get_rpath,$(call gb_LinkTarget__get_rpath_for_layer,$(call gb_Executable_get_layer,$(1))))
278endef
279
280define gb_Executable_Executable_platform
281$(call gb_LinkTarget_get_target,$(2)) : RPATH := $(call gb_Executable_get_rpath,$(1))
282
283endef
284
285
286# CppunitTest class
287
288gb_CppunitTest_CPPTESTPRECOMMAND := \
289    $(call gb_Helper_extend_ld_path,$(WORKDIR)/UnpackedTarball/cppunit/src/cppunit/.libs)
290gb_CppunitTest_get_filename = libtest_$(1).so
291gb_CppunitTest_get_ilibfilename = $(gb_CppunitTest_get_filename)
292gb_CppunitTest_malloc_check := -ex 'set environment MALLOC_CHECK_=2; set environment MALLOC_PERTURB_=153'
293
294define gb_CppunitTest_CppunitTest_platform
295$(call gb_LinkTarget_get_target,$(2)) : RPATH := $(call gb_Library__get_rpath,$(call gb_LinkTarget__get_rpath_for_layer,NONE))
296
297endef
298
299define gb_CppunitTest_postprocess
300$(SRCDIR)/solenv/bin/gdb-core-bt.sh $(1) $(2) $(3)
301endef
302
303# JunitTest class
304
305ifneq ($(OOO_TEST_SOFFICE),)
306gb_JunitTest_SOFFICEARG:=$(OOO_TEST_SOFFICE)
307else
308ifneq ($(gb_JunitTest_DEBUGRUN),)
309gb_JunitTest_SOFFICEARG:=connect:pipe,name=$(USER)
310else
311gb_JunitTest_SOFFICEARG:=path:$(INSTROOT)/$(LIBO_BIN_FOLDER)/soffice
312endif
313endif
314
315define gb_JunitTest_JunitTest_platform
316$(call gb_JunitTest_get_target,$(1)) : DEFS := \
317	-Dorg.openoffice.test.arg.env=$(gb_Helper_LIBRARY_PATH_VAR)"$$$${$(gb_Helper_LIBRARY_PATH_VAR)+=$$$$$(gb_Helper_LIBRARY_PATH_VAR)}" \
318	-Dorg.openoffice.test.arg.user=$(call gb_Helper_make_url,$(call gb_JunitTest_get_userdir,$(1))) \
319	-Dorg.openoffice.test.arg.workdir=$(call gb_JunitTest_get_userdir,$(1)) \
320	-Dorg.openoffice.test.arg.postprocesscommand=$(SRCDIR)/solenv/bin/gdb-core-bt.sh \
321	-Dorg.openoffice.test.arg.soffice="$(gb_JunitTest_SOFFICEARG)" \
322
323endef
324
325# PythonTest class
326
327gb_PythonTest_PRECOMMAND := $(gb_CppunitTest_CPPTESTPRECOMMAND)
328
329# Module class
330
331define gb_Module_DEBUGRUNCOMMAND
332OFFICESCRIPT=`mktemp` && \
333printf 'if [ -e $(INSTROOT)/program/ooenv ]; then . $(INSTROOT)/program/ooenv; fi\n' > $${OFFICESCRIPT} && \
334printf "PYTHONWARNINGS=default gdb $(INSTROOT)/$(LIBO_BIN_FOLDER)/soffice.bin" >> $${OFFICESCRIPT} && \
335printf " -ex \"set args --norestore --nologo '--accept=pipe,name=$(USER);urp;' %s\"" \
336	"$(subst ","\\\"",$(value gb_DBGARGS))" >> $${OFFICESCRIPT} && \
337$(SHELL) $${OFFICESCRIPT} && \
338rm $${OFFICESCRIPT}
339endef
340
341# InstallModuleTarget class
342
343define gb_InstallModuleTarget_InstallModuleTarget_platform
344$(call gb_InstallModuleTarget_add_defs,$(1),\
345	$(gb_CPUDEFS) \
346	$(gb_OSDEFS) \
347	-DCOMID=gcc3 \
348	-D_gcc3 \
349)
350
351endef
352
353# InstallScript class
354
355gb_InstallScript_EXT := .ins
356
357# CliAssemblyTarget class
358
359gb_CliAssemblyTarget_POLICYEXT :=
360gb_CliAssemblyTarget_get_dll :=
361
362# Extension class
363
364gb_Extension_LICENSEFILE_DEFAULT := $(INSTROOT)/LICENSE
365
366# UnpackedTarget class
367
368gb_UnpackedTarget_TARFILE_LOCATION := $(TARFILE_LOCATION)
369
370# UnoApiHeadersTarget class
371
372ifeq ($(DISABLE_DYNLOADING),TRUE)
373gb_UnoApiHeadersTarget_select_variant = $(if $(filter udkapi,$(1)),comprehensive,$(2))
374else
375gb_UnoApiHeadersTarget_select_variant = $(2)
376endif
377
378# UIMenubarTarget class
379
380define gb_UIMenubarTarget__command
381$(call gb_Output_announce,$(2),$(true),UIM,1)
382$(call gb_Trace_StartRange,$(2),UIM)
383cp $(3) $(1)
384$(call gb_Trace_EndRange,$(2),UIM)
385
386endef
387
388gb_UIMenubarTarget_UIMenubarTarget_platform :=
389
390# Python
391gb_Python_PRECOMMAND := $(gb_Helper_set_ld_path) PYTHONHOME="$(INSTDIR)/program/python-core-$(PYTHON_VERSION)" PYTHONPATH="$${PYPATH:+$$PYPATH:}$(INSTDIR)/program/python-core-$(PYTHON_VERSION)/lib:$(INSTDIR)/program/python-core-$(PYTHON_VERSION)/lib/lib-dynload"
392gb_Python_INSTALLED_EXECUTABLE := /bin/sh $(INSTROOT)/program/python
393# this is passed to gdb as executable when running tests
394gb_Python_INSTALLED_EXECUTABLE_GDB := $(INSTROOT)/program/python.bin
395
396include $(GBUILDDIR)/platform/com_GCC_class.mk
397
398# vim: set noet sw=4:
399