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
20gb_SDKDIR := $(MACOSX_SDK_PATH)
21
22include $(GBUILDDIR)/platform/com_GCC_defs.mk
23
24# Darwin mktemp -t expects a prefix, not a pattern
25gb_MKTEMP ?= /usr/bin/mktemp -t gbuild
26
27gb_OSDEFS := \
28	-D$(OS) \
29	-D_PTHREADS \
30	-DUNIX \
31	-DUNX \
32	-D_REENTRANT \
33	-DNO_PTHREAD_PRIORITY \
34	-DMAC_OS_X_VERSION_MIN_REQUIRED=$(MAC_OS_X_VERSION_MIN_REQUIRED) \
35	-DMAC_OS_X_VERSION_MAX_ALLOWED=$(MAC_OS_X_VERSION_MAX_ALLOWED) \
36	$(LFS_CFLAGS) \
37
38
39gb_CFLAGS := \
40	$(gb_CFLAGS_COMMON) \
41	-fPIC \
42	-fno-strict-aliasing \
43	-Wshadow
44
45gb_CXXFLAGS := \
46	$(gb_CXXFLAGS_COMMON) \
47	-fPIC \
48	-Woverloaded-virtual \
49	-Wshadow \
50	-Wno-ctor-dtor-privacy \
51	-fno-strict-aliasing \
52	-fsigned-char \
53	$(CXXFLAGS_CXX11)
54
55	#-fsigned-char \ might be removed?
56
57# these are to get g++ to switch to Objective-C++ mode
58# (see toolkit module for a case where it is necessary to do it this way)
59gb_OBJCXXFLAGS := -x objective-c++ -fobjc-exceptions
60
61gb_OBJCFLAGS := -x objective-c -fobjc-exceptions
62
63# LinkTarget class
64
65define gb_LinkTarget__get_rpath_for_layer
66$(patsubst $(1):%,%,$(filter $(1):%,$(gb_LinkTarget__RPATHS)))
67endef
68
69gb_LinkTarget__RPATHS := \
70	URELIB:@__________________________________________________URELIB/ \
71	UREBIN: \
72	OOO:@__________________________________________________OOO/ \
73	SDKBIN: \
74	OXT: \
75	NONE:@__________________________________________________NONE/ \
76
77# $(call gb_LinkTarget__get_installname,libfilename,layerprefix)
78define gb_LinkTarget__get_installname
79$(if $(2),-install_name '$(2)$(1)')
80endef
81
82gb_LinkTarget_CFLAGS := $(gb_CFLAGS)
83gb_LinkTarget_CXXFLAGS := $(gb_CXXFLAGS)
84gb_LinkTarget_OBJCXXFLAGS := $(gb_CXXFLAGS) $(gb_OBJCXXFLAGS)
85gb_LinkTarget_OBJCFLAGS := $(gb_CFLAGS) $(gb_OBJCFLAGS)
86
87define gb_LinkTarget__get_layer
88$(if $(filter Executable,$(1)),\
89	$$(call gb_Executable_get_layer,$(2)),\
90	$$(call gb_Library_get_layer,$(2)))
91endef
92
93# We cannot sign executables early since Mojave/Catalina would treat them as
94# restricted binary and ignore any DYLD_LIBRARY_PATH setting - So all
95# signing is handled by the solenv/bin/macosx-codesign-app-bundle script.
96# And the soffice executable needs to be signed last in
97# macosx-codesign-app-bundle, as codesign would fail complaining that other
98# parts of the app have not yet been signed:
99
100define gb_LinkTarget__command_dynamiclink
101$(call gb_Helper_abbreviate_dirs,\
102	FILELIST=$(call var2file,$(shell $(gb_MKTEMP)),100, \
103		$(foreach object,$(COBJECTS),$(call gb_CObject_get_target,$(object))) \
104		$(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_target,$(object))) \
105		$(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_target,$(object))) \
106		$(foreach object,$(OBJCOBJECTS),$(call gb_ObjCObject_get_target,$(object))) \
107		$(foreach object,$(OBJCXXOBJECTS),$(call gb_ObjCxxObject_get_target,$(object))) \
108		$(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_target,$(object))) \
109		$(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_target,$(object))) \
110		$(foreach extraobjectlist,$(EXTRAOBJECTLISTS),$(shell cat $(extraobjectlist)))) && \
111	cat $${FILELIST} | tr "[:space:]" "\n" | grep -v '^$$' > $${FILELIST}.1 && \
112	mv $${FILELIST}.1 $${FILELIST} && \
113	$(if $(CXXOBJECTS)$(OBJCXXOBJECTS)$(GENCXXOBJECTS)$(EXTRAOBJECTLISTS),$(gb_CXX),$(gb_CC)) \
114		$(if $(filter Executable,$(TARGETTYPE)),$(gb_Executable_TARGETTYPEFLAGS)) \
115		$(if $(filter Bundle,$(TARGETTYPE)),$(gb_Bundle_TARGETTYPEFLAGS)) \
116		$(if $(filter Library CppunitTest,$(TARGETTYPE)),$(gb_Library_TARGETTYPEFLAGS)) \
117		$(subst \d,$$,$(RPATH)) \
118		$(T_USE_LD) $(T_LDFLAGS) \
119		$(patsubst lib%.dylib,-l%,$(patsubst %.$(gb_Library_UDK_MAJORVER),%,$(foreach lib,$(LINKED_LIBS),$(call gb_Library_get_filename,$(lib))))) \
120		-Wl$(COMMA)-filelist$(COMMA)$${FILELIST} \
121		$(T_LIBS) \
122		$(foreach lib,$(LINKED_STATIC_LIBS),$(call gb_StaticLibrary_get_target,$(lib))) \
123		-o $(1) && \
124	rm -f $${FILELIST} && \
125	$(if $(SOVERSIONSCRIPT),ln -sf $(1) $(ILIBTARGET),:) && \
126	$(if $(filter Executable,$(TARGETTYPE)), \
127		$(PERL) $(SRCDIR)/solenv/bin/macosx-change-install-names.pl app $(LAYER) $(1) &&) \
128	$(if $(filter Library Bundle CppunitTest,$(TARGETTYPE)),\
129		$(PERL) $(SRCDIR)/solenv/bin/macosx-change-install-names.pl shl $(LAYER) $(1) &&) \
130	$(if $(filter Library,$(TARGETTYPE)),\
131		otool -l $(1) | grep -A 5 LC_ID_DYLIB \
132			> $(WORKDIR)/LinkTarget/$(2).exports.tmp && \
133		$(NM) -g -P $(1) | cut -d' ' -f1-2 | grep -v U$$ \
134			>> $(WORKDIR)/LinkTarget/$(2).exports.tmp && \
135		$(call gb_Helper_replace_if_different_and_touch,$(WORKDIR)/LinkTarget/$(2).exports.tmp, \
136			$(WORKDIR)/LinkTarget/$(2).exports,$(1)) &&) \
137	:)
138endef
139
140# parameters: 1-linktarget 2-cobjects 3-cxxobjects
141define gb_LinkTarget__command_staticlink
142$(call gb_Helper_abbreviate_dirs,\
143	rm -f $(1) && \
144	$(gb_AR) -rsu $(1) \
145		$(foreach object,$(COBJECTS),$(call gb_CObject_get_target,$(object))) \
146		$(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_target,$(object))) \
147		$(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_target,$(object))) \
148		$(foreach object,$(OBJCOBJECTS),$(call gb_ObjCObject_get_target,$(object))) \
149		$(foreach object,$(OBJCXXOBJECTS),$(call gb_ObjCxxObject_get_target,$(object))) \
150		$(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_target,$(object))) \
151		$(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_target,$(object))) \
152		$(foreach extraobjectlist,$(EXTRAOBJECTLISTS),@$(extraobjectlist)) \
153		$(if $(findstring s,$(MAKEFLAGS)),2> /dev/null))
154endef
155
156define gb_LinkTarget__command
157$(call gb_Output_announce,$(2),$(true),LNK,4)
158	$(call gb_Trace_StartRange,$(2),LNK)
159$(if $(filter Library Bundle CppunitTest Executable,$(TARGETTYPE)),$(call gb_LinkTarget__command_dynamiclink,$(1),$(2)))
160$(if $(filter StaticLibrary,$(TARGETTYPE)),$(call gb_LinkTarget__command_staticlink,$(1)))
161	$(call gb_Trace_EndRange,$(2),LNK)
162endef
163
164define gb_LinkTarget_use_system_darwin_frameworks
165$(call gb_LinkTarget_add_libs,$(1),$(foreach fw,$(2),-framework $(fw)))
166$(if $(call gb_LinkTarget__is_merged,$(1)),\
167  $(call gb_LinkTarget_add_libs,$(call gb_Library_get_linktarget,merged),$(foreach fw,$(2),-framework $(fw))))
168endef
169
170
171# Library class
172
173gb_Library_DEFS :=
174gb_Library_TARGETTYPEFLAGS := -dynamiclib -single_module
175gb_Bundle_TARGETTYPEFLAGS := -bundle
176gb_Library_UDK_MAJORVER := 3
177gb_Library_SYSPRE := lib
178gb_Library_UNOVERPRE := $(gb_Library_SYSPRE)uno_
179gb_Library_PLAINEXT := .dylib
180gb_Library_PLAINEXT_FOR_BUILD := .dylib
181gb_Library_DLLEXT := .dylib
182gb_Library_RTEXT := gcc3$(gb_Library_PLAINEXT)
183
184gb_Library_OOOEXT := $(gb_Library_DLLPOSTFIX)$(gb_Library_PLAINEXT)
185gb_Library_UNOEXT := .uno$(gb_Library_PLAINEXT)
186
187gb_Library_FILENAMES := \
188	$(foreach lib,$(gb_Library_OOOLIBS),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_OOOEXT)) \
189	$(foreach lib,$(gb_Library_PLAINLIBS_NONE),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
190	$(foreach lib,$(gb_Library_PLAINLIBS_URE),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
191	$(foreach lib,$(gb_Library_PLAINLIBS_OOO),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
192	$(foreach lib,$(gb_Library_PLAINLIBS_OXT),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
193	$(foreach lib,$(gb_Library_PRIVATELIBS_URE),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_OOOEXT)) \
194	$(foreach lib,$(gb_Library_RTVERLIBS),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_RTEXT).$(gb_Library_UDK_MAJORVER)) \
195	$(foreach lib,$(gb_Library_UNOVERLIBS),$(lib):$(gb_Library_UNOVERPRE)$(lib)$(gb_Library_PLAINEXT).$(gb_Library_UDK_MAJORVER)) \
196	$(foreach lib,$(gb_Library_EXTENSIONLIBS),$(lib):$(lib)$(gb_Library_UNOEXT)) \
197
198
199gb_Library_LAYER := \
200	$(foreach lib,$(gb_Library_OOOLIBS),$(lib):OOO) \
201	$(foreach lib,$(gb_Library_PLAINLIBS_URE),$(lib):URELIB) \
202	$(foreach lib,$(gb_Library_PLAINLIBS_OOO),$(lib):OOO) \
203	$(foreach lib,$(gb_Library_PLAINLIBS_OXT),$(lib):OXT) \
204	$(foreach lib,$(gb_Library_PLAINLIBS_NONE),$(lib):NONE) \
205	$(foreach lib,$(gb_Library_PRIVATELIBS_URE),$(lib):URELIB) \
206	$(foreach lib,$(gb_Library_RTVERLIBS),$(lib):URELIB) \
207	$(foreach lib,$(gb_Library_UNOVERLIBS),$(lib):URELIB) \
208	$(foreach lib,$(gb_Library_EXTENSIONLIBS),$(lib):OXT) \
209
210define gb_Library_get_rpath
211$(call gb_LinkTarget__get_installname,$(call gb_Library_get_filename,$(1)),$(call gb_LinkTarget__get_rpath_for_layer,$(call gb_Library_get_layer,$(1))))
212endef
213
214define gb_Library_Library_platform
215$(call gb_LinkTarget_get_target,$(2)) : RPATH := $(call gb_Library_get_rpath,$(1))
216$(call gb_LinkTarget_get_target,$(2)) : LAYER := $(call gb_Library_get_layer,$(1))
217
218endef
219
220gb_Library__set_soversion_script_platform = $(gb_Library__set_soversion_script)
221
222gb_Library_get_sdk_link_dir = $(WORKDIR)/LinkTarget/Library
223
224gb_Library_get_sdk_link_lib = $(gb_Library_get_versionlink_target)
225
226# bundle is a special kind of library that exists only on Darwin/OSX
227# set the TARGETTYPE to Bundle, and clear install_name(RPATH)
228define gb_Library_Bundle
229$(call gb_Library_Library,$(1))
230$(call gb_LinkTarget_set_targettype,$(call gb_Library_get_linktarget,$(1)),Bundle)
231$(call gb_LinkTarget_get_target,$(call gb_Library_get_linktarget,$(1))) : \
232	RPATH :=
233endef
234
235# Executable class
236
237gb_Executable_EXT :=
238gb_Executable_TARGETTYPEFLAGS := -bind_at_load
239
240gb_Executable_LAYER := \
241	$(foreach exe,$(gb_Executable_UREBIN),$(exe):UREBIN) \
242	$(foreach exe,$(gb_Executable_SDK),$(exe):SDKBIN) \
243	$(foreach exe,$(gb_Executable_OOO),$(exe):OOO) \
244	$(foreach exe,$(gb_Executable_NONE),$(exe):NONE) \
245
246
247gb_Executable_get_rpath :=
248
249define gb_Executable_Executable_platform
250$(call gb_LinkTarget_get_target,$(2)) : RPATH :=
251$(call gb_LinkTarget_get_target,$(2)) : LAYER := $(call gb_Executable_get_layer,$(1))
252
253endef
254
255
256# CppunitTest class
257
258gb_CppunitTest_UNITTESTFAILED := $(GBUILDDIR)/platform/unittest-failed-MACOSX.sh
259gb_CppunitTest_PYTHONDEPS := $(call gb_Library_get_target,pyuno_wrapper) $(if $(SYSTEM_PYTHON),,$(call gb_GeneratedPackage_get_target,python3))
260gb_CppunitTest_CPPTESTPRECOMMAND := \
261	$(call gb_Helper_extend_ld_path,$(gb_Library_DLLDIR):$(WORKDIR)/UnpackedTarball/cppunit/src/cppunit/.libs)
262gb_CppunitTest_get_filename = libtest_$(1).dylib
263gb_CppunitTest_get_ilibfilename = $(gb_CppunitTest_get_filename)
264gb_CppunitTest_malloc_check := -o "env MallocScribble=1" -o "env MallocPreScribble=1"
265
266define gb_CppunitTest_CppunitTest_platform
267$(call gb_LinkTarget_get_target,$(2)) : RPATH :=
268$(call gb_LinkTarget_get_target,$(2)) : LAYER := NONE
269
270endef
271
272# JunitTest class
273
274ifneq ($(OOO_TEST_SOFFICE),)
275gb_JunitTest_SOFFICEARG:=$(OOO_TEST_SOFFICE)
276else
277ifneq ($(gb_JunitTest_DEBUGRUN),)
278gb_JunitTest_SOFFICEARG:=connect:pipe,name=$(USER)
279else
280gb_JunitTest_SOFFICEARG:=path:$(INSTROOT)/$(LIBO_BIN_FOLDER)/soffice
281endif
282endif
283
284define gb_JunitTest_JunitTest_platform
285$(call gb_JunitTest_get_target,$(1)) : DEFS := \
286	-Dorg.openoffice.test.arg.soffice="$(gb_JunitTest_SOFFICEARG)" \
287	-Dorg.openoffice.test.arg.env=DYLD_LIBRARY_PATH"$$$${DYLD_LIBRARY_PATH+=$$$$DYLD_LIBRARY_PATH}" \
288	-Dorg.openoffice.test.arg.user=$(call gb_Helper_make_url,$(call gb_JunitTest_get_userdir,$(1))) \
289	-Dorg.openoffice.test.arg.workdir=$(call gb_JunitTest_get_userdir,$(1)) \
290
291endef
292
293# PythonTest class
294
295gb_PythonTest_UNITTESTFAILED := $(GBUILDDIR)/platform/unittest-failed-MACOSX.sh
296gb_PythonTest_DEPS := $(call gb_GeneratedPackage_get_target,python3) $(call gb_Package_get_target,python_shell)
297gb_PythonTest_PRECOMMAND := $(gb_Helper_LIBRARY_PATH_VAR)=$${$(gb_Helper_LIBRARY_PATH_VAR):+$$$(gb_Helper_LIBRARY_PATH_VAR):}$(INSTROOT)/$(LIBO_URE_LIB_FOLDER)
298ifneq ($(LIBO_LIB_FOLDER),$(LIBO_URE_LIB_FOLDER))
299gb_PythonTest_PRECOMMAND := $(gb_PythonTest_PRECOMMAND):$(INSTROOT)/$(LIBO_LIB_FOLDER)
300endif
301gb_PythonTest_PRECOMMAND := $(gb_PythonTest_PRECOMMAND):$(WORKDIR)/UnpackedTarball/cppunit/src/cppunit/.libs
302
303# UITest class
304
305gb_UITest_DEPS := $(call gb_GeneratedPackage_get_target,python3)
306
307# Module class
308
309define gb_Module_DEBUGRUNCOMMAND
310lldb -f $(INSTROOT)/$(LIBO_BIN_FOLDER)/soffice -- --norestore --nologo \
311    '"--accept=pipe,name=$(USER)\;urp"'
312endef
313
314# InstallModuleTarget class
315
316define gb_InstallModuleTarget_InstallModuleTarget_platform
317$(call gb_InstallModuleTarget_add_defs,$(1),\
318	$(gb_CPUDEFS) \
319	$(gb_OSDEFS) \
320	-DCOMID=gcc3 \
321	-D_gcc3 \
322)
323
324endef
325
326# InstallScript class
327
328gb_InstallScript_EXT := .ins
329
330# CliAssemblyTarget class
331
332gb_CliAssemblyTarget_POLICYEXT :=
333gb_CliAssemblyTarget_get_dll :=
334
335# Extension class
336
337gb_Extension_LICENSEFILE_DEFAULT := $(INSTROOT)/Resources/LICENSE
338
339# UnpackedTarget class
340
341gb_UnpackedTarget_TARFILE_LOCATION := $(TARFILE_LOCATION)
342
343# UnoApiHeadersTarget class
344
345ifneq ($(filter TRUE,$(DISABLE_DYNLOADING)),)
346gb_UnoApiHeadersTarget_select_variant = $(if $(filter udkapi,$(1)),comprehensive,$(2))
347else
348gb_UnoApiHeadersTarget_select_variant = $(2)
349endif
350
351# UIMenubarTarget class
352
353define gb_UIMenubarTarget__command
354$(call gb_Output_announce,$(2),$(true),UIM,1)
355$(call gb_Trace_StartRange,$(2),UIM)
356$(call gb_ExternalExecutable_get_command,xsltproc) --nonet -o $(1) $(UI_MENUBAR_XSLT) $(3)
357$(call gb_Trace_EndRange,$(2),UIM)
358
359endef
360
361define gb_UIMenubarTarget_UIMenubarTarget_platform
362$(call gb_UIMenubarTarget_get_target,$(1)) : UI_MENUBAR_XSLT := $(SRCDIR)/solenv/bin/macosx_menubar_modification.xsl
363$(call gb_UIMenubarTarget_get_target,$(1)) : $(SRCDIR)/solenv/bin/macosx_menubar_modification.xsl
364$(call gb_UIMenubarTarget_get_target,$(1)) :| $(call gb_ExternalExecutable_get_dependencies,xsltproc)
365
366endef
367
368# Python
369gb_Python_PRECOMMAND := PYTHONPATH="$$PYPATH"
370gb_Python_INSTALLED_EXECUTABLE := $(INSTROOT)/$(LIBO_LIB_FOLDER)/LibreOfficePython.framework/Versions/$(PYTHON_VERSION_MAJOR).$(PYTHON_VERSION_MINOR)/Resources/Python.app/Contents/MacOS/LibreOfficePython
371# this is passed to gdb as executable when running tests
372gb_Python_INSTALLED_EXECUTABLE_GDB := $(gb_Python_INSTALLED_EXECUTABLE)
373
374include $(GBUILDDIR)/platform/com_GCC_class.mk
375
376# vim: set noet sw=4:
377