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