1#************************************************************************* 2# 3# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4# 5# Copyright 2000, 2011 Oracle and/or its affiliates. 6# 7# OpenOffice.org - a multi-platform office productivity suite 8# 9# This file is part of OpenOffice.org. 10# 11# OpenOffice.org is free software: you can redistribute it and/or modify 12# it under the terms of the GNU Lesser General Public License version 3 13# only, as published by the Free Software Foundation. 14# 15# OpenOffice.org is distributed in the hope that it will be useful, 16# but WITHOUT ANY WARRANTY; without even the implied warranty of 17# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18# GNU Lesser General Public License version 3 for more details 19# (a copy is included in the LICENSE file that accompanied this code). 20# 21# You should have received a copy of the GNU Lesser General Public License 22# version 3 along with OpenOffice.org. If not, see 23# <http://www.openoffice.org/license.html> 24# for a copy of the LGPLv3 License. 25# 26#************************************************************************* 27 28 29# CObject class 30 31gb_CObject_REPOS := $(gb_REPOS) 32 33gb_CObject_get_source = $(1)/$(2).c 34# defined by platform 35# gb_CObject__command 36 37# this rule generates an "always rebuild" dep file, to have something to include. 38# the dep file will be overridden on the fly, when the object is compiled 39ifeq ($(gb_FULLDEPS),$(true)) 40define gb_CObject__command_dep 41mkdir -p $(dir $(1)) && \ 42 echo '$(call gb_CObject_get_target,$(2)) : $$(gb_Helper_PHONY)' > $(1) 43 44endef 45else 46gb_CObject__command_dep = 47endif 48 49define gb_CObject__rules 50$$(call gb_CObject_get_target,%) : $$(call gb_CObject_get_source,$(1),%) 51 $$(call gb_CObject__command,$$@,$$*,$$<,$$(DEFS),$$(CFLAGS),$$(INCLUDE)) 52 53ifeq ($(gb_FULLDEPS),$(true)) 54$$(call gb_CObject_get_dep_target,%) : $$(call gb_CObject_get_source,$(1),%) 55 $$(call gb_CObject__command_dep,$$@,$$*,$$<,$$(DEFS),$$(CFLAGS),$$(INCLUDE)) 56endif 57 58endef 59 60$(foreach repo,$(gb_CObject_REPOS),$(eval $(call gb_CObject__rules,$(repo)))) 61 62$(call gb_CObject_get_dep_target,%) : 63 $(eval $(call gb_Output_error,Unable to find plain C file $(call gb_CObject_get_source,,$*) in the repositories: $(gb_CObject_REPOS))) 64 65gb_CObject_CObject = 66 67 68# CxxObject class 69 70gb_CxxObject_REPOS := $(gb_REPOS) 71 72gb_CxxObject_get_source = $(1)/$(2).cxx 73# defined by platform 74# gb_CxxObject__command 75 76# This rule generates an "always rebuild" dep file, to have something to 77# include. The dep file will be overridden on the fly, when the object is 78# compiled. 79ifeq ($(gb_FULLDEPS),$(true)) 80define gb_CxxObject__command_dep 81mkdir -p $(dir $(1)) && \ 82 echo '$(call gb_CxxObject_get_target,$(2)) : $$(gb_Helper_PHONY)' > $(1) 83 84endef 85else 86gb_CxxObject__command_dep = 87endif 88 89# Only enable PCH if the PCH_CXXFLAGS and the PCH_DEFS (from the linktarget) 90# are the same as the CXXFLAGS and DEFS we want to use for this object. This 91# should usually be the case. The DEFS/CXXFLAGS would have too be manually 92# overridden for one object file for them to differ. PCH_CXXFLAGS/PCH_DEFS 93# should never be overridden on an object -- they should be the same as for the 94# whole linktarget. In general it should be cleaner to use a static library 95# compiled with different flags and link that in rather than mixing different 96# flags in one linktarget. 97define gb_CxxObject__set_pchflags 98ifeq ($(gb_ENABLE_PCH),$(true)) 99ifneq ($(strip $$(PCH_NAME)),) 100ifeq ($$(sort $$(PCH_CXXFLAGS) $$(PCH_DEFS) $$(gb_LinkTarget_EXCEPTIONFLAGS)),$$(sort $$(CXXFLAGS) $$(DEFS))) 101$$@ : PCHFLAGS := $$(call gb_PrecompiledHeader_get_enableflags,$$(PCH_NAME)) 102else 103ifeq ($$(sort $$(PCH_CXXFLAGS) $$(PCH_DEFS) $$(gb_LinkTarget_NOEXCEPTIONFLAGS)),$$(sort $$(CXXFLAGS) $$(DEFS))) 104$$@ : PCHFLAGS := $$(call gb_NoexPrecompiledHeader_get_enableflags,$$(PCH_NAME)) 105else 106$$(info No precompiled header available for $$*.) 107$$(info precompiled header flags ( ex) : $$(sort $$(PCH_CXXFLAGS) $$(PCH_DEFS) $$(gb_LinkTarget_EXCEPTIONFLAGS))) 108$$(info precompiled header flags (noex) : $$(sort $$(PCH_CXXFLAGS) $$(PCH_DEFS) $$(gb_LinkTarget_NOEXCEPTIONFLAGS))) 109$$(info . object flags : $$(sort $$(CXXFLAGS) $$(DEFS))) 110$$@ : PCHFLAGS := 111endif 112endif 113endif 114endif 115endef 116 117define gb_CxxObject__rules 118$$(call gb_CxxObject_get_target,%) : $$(call gb_CxxObject_get_source,$(1),%) 119 $$(eval $$(gb_CxxObject__set_pchflags)) 120 $$(call gb_CxxObject__command,$$@,$$*,$$<) 121 122ifeq ($(gb_FULLDEPS),$(true)) 123$$(call gb_CxxObject_get_dep_target,%) : $$(call gb_CxxObject_get_source,$(1),%) 124 $$(eval $$(gb_CxxObject__set_pchflags)) 125 $$(call gb_CxxObject__command_dep,$$@,$$*,$$<) 126endif 127 128endef 129 130$(foreach repo,$(gb_CxxObject_REPOS),$(eval $(call gb_CxxObject__rules,$(repo)))) 131 132ifeq ($(gb_FULLDEPS),$(true)) 133$(call gb_CxxObject_get_dep_target,%) : 134 $(eval $(call gb_Output_error,Unable to find C++ file $(call gb_CxxObject_get_source,,$*) in repositories: $(gb_CxxObject_REPOS))) 135 136endif 137 138gb_CxxObject_CxxObject = 139 140 141# GenCxxObject class 142 143gb_GenCxxObject_get_source = $(WORKDIR)/$(1).cxx 144# defined by platform 145# gb_CxxObject__command 146 147# This rule generates an "always rebuild" dep file, to have something to 148# include. The dep file will be overridden on the fly, when the object is 149# compiled. 150ifeq ($(gb_FULLDEPS),$(true)) 151define gb_GenCxxObject__command_dep 152mkdir -p $(dir $(1)) && \ 153 echo '$(call gb_GenCxxObject_get_target,$(2)) : $$(gb_Helper_PHONY)' > $(1) 154endef 155else 156gb_GenCxxObject__command_dep = 157endif 158 159$(call gb_GenCxxObject_get_target,%) : $(call gb_GenCxxObject_get_source,%) 160 $(call gb_CxxObject__command,$@,$*,$<) 161 162ifeq ($(gb_FULLDEPS),$(true)) 163$(call gb_GenCxxObject_get_dep_target,%) : $(call gb_GenCxxObject_get_source,%) 164 $(call gb_GenCxxObject__command_dep,$@,$*,$<) 165 166$(call gb_GenCxxObject_get_dep_target,%) : 167 $(eval $(call gb_Output_error,Unable to find generated C++ file $(call gb_GenCxxObject_get_source,$*) in WORKDIR.)) 168endif 169 170gb_GenCxxObject_GenCxxObject = 171 172 173# ObjCxxObject class 174# 175gb_ObjCxxObject_REPOS := $(gb_REPOS) 176 177gb_ObjCxxObject_get_source = $(1)/$(2).mm 178# defined by platform 179# gb_ObjCxxObject__command 180 181# this rule generates an "always rebuild" dep file, to have something to include. 182# the dep file will be overridden on the fly, when the object is compiled 183ifeq ($(gb_FULLDEPS),$(true)) 184define gb_ObjCxxObject__command_dep 185mkdir -p $(dir $(1)) && \ 186 echo '$(call gb_ObjCxxObject_get_target,$(2)) : $$(gb_Helper_PHONY)' > $(1) 187 188endef 189else 190gb_ObjCxxObject__command_dep = 191endif 192 193define gb_ObjCxxObject__rules 194$$(call gb_ObjCxxObject_get_target,%) : $$(call gb_ObjCxxObject_get_source,$(1),%) 195 $$(call gb_ObjCxxObject__command,$$@,$$*,$$<,$$(DEFS),$$(OBJCXXFLAGS),$$(INCLUDE_STL) $$(INCLUDE)) 196 197ifeq ($(gb_FULLDEPS),$(true)) 198$$(call gb_ObjCxxObject_get_dep_target,%) : $$(call gb_ObjCxxObject_get_source,$(1),%) 199 $$(call gb_ObjCxxObject__command_dep,$$@,$$*,$$<,$$(DEFS),$$(OBJCXXFLAGS),$$(INCLUDE_STL) $$(INCLUDE)) 200endif 201 202endef 203 204$(foreach repo,$(gb_ObjCxxObject_REPOS),$(eval $(call gb_ObjCxxObject__rules,$(repo)))) 205 206ifeq ($(gb_FULLDEPS),$(true)) 207$(call gb_ObjCxxObject_get_dep_target,%) : 208 $(eval $(call gb_Output_error,Unable to find Objective C++ file $(call gb_ObjCxxObject_get_source,,$*) in repositories: $(gb_ObjCxxObject_REPOS))) 209endif 210 211gb_ObjCxxObject_ObjCxxObject = 212 213 214 215# LinkTarget class 216 217gb_LinkTarget_DEFAULTDEFS := $(gb_GLOBALDEFS) 218# defined by platform 219# gb_LinkTarget_CXXFLAGS 220# gb_LinkTarget_LDFLAGS 221# gb_LinkTarget_INCLUDE 222# gb_LinkTarget_INCLUDE_STL 223 224.PHONY : $(call gb_LinkTarget_get_clean_target,%) 225$(call gb_LinkTarget_get_clean_target,%) : 226 $(call gb_Output_announce,$*,$(false),LNK,4) 227 RESPONSEFILE=$(call var2file,$(shell $(gb_MKTEMP)),200,\ 228 $(foreach object,$(COBJECTS),$(call gb_CObject_get_target,$(object))) \ 229 $(foreach object,$(COBJECTS),$(call gb_CObject_get_dep_target,$(object))) \ 230 $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_target,$(object))) \ 231 $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_dep_target,$(object))) \ 232 $(foreach object,$(OBJCXXOBJECTS),$(call gb_ObjCxxObject_get_target,$(object))) \ 233 $(foreach object,$(OBJCXXOBJECTS),$(call gb_ObjCxxObject_get_dep_target,$(object))) \ 234 $(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_target,$(object))) \ 235 $(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_dep_target,$(object))) \ 236 $(call gb_LinkTarget_get_target,$*) \ 237 $(call gb_LinkTarget_get_dep_target,$*) \ 238 $(call gb_LinkTarget_get_headers_target,$*) \ 239 $(call gb_LinkTarget_get_external_headers_target,$*) \ 240 $(DLLTARGET) \ 241 $(AUXTARGETS)) && \ 242 cat $${RESPONSEFILE} /dev/null | xargs -n 200 rm -f && \ 243 rm -f $${RESPONSEFILE} 244 245 246# cat the deps of all objects in one file, then we need only open that one file 247define gb_LinkTarget__command_dep 248$(call gb_Output_announce,LNK:$(2),$(true),DEP,1) 249$(call gb_Helper_abbreviate_dirs,\ 250 mkdir -p $(dir $(1)) && \ 251 RESPONSEFILE=$(call var2file,$(shell $(gb_MKTEMP)),200,\ 252 $(foreach object,$(3),$(call gb_CObject_get_dep_target,$(object))) \ 253 $(foreach object,$(4),$(call gb_CxxObject_get_dep_target,$(object))) \ 254 $(foreach object,$(5),$(call gb_ObjCxxObject_get_dep_target,$(object)))\ 255 $(foreach object,$(6),$(call gb_GenCxxObject_get_dep_target,$(object)))\ 256 ) && \ 257 cat $${RESPONSEFILE} /dev/null | xargs -n 200 cat > $(1)) && \ 258 rm -f $${RESPONSEFILE} 259 260endef 261 262$(call gb_LinkTarget_get_target,%) : $(call gb_LinkTarget_get_headers_target,%) $(gb_Helper_MISCDUMMY) 263 $(call gb_LinkTarget__command,$@,$*) 264 265ifeq ($(gb_FULLDEPS),$(true)) 266$(call gb_LinkTarget_get_target,%) : $(call gb_LinkTarget_get_dep_target,%) 267$(call gb_LinkTarget_get_dep_target,%) : | $(call gb_LinkTarget_get_headers_target,%) 268 $(call gb_LinkTarget__command_dep,$@,$*,$(COBJECTS),$(CXXOBJECTS),$(OBJCXXOBJECTS),$(GENCXXOBJECTS)) 269endif 270 271# Ok, this is some dark voodoo: When declaring a linktarget with 272# gb_LinkTarget_LinkTarget we set SELF in the headertarget to name of the 273# target. When the rule for the headertarget is executed and SELF does not 274# match the target name, we are depending on a linktarget that was never 275# declared. In a full build exclusively in gbuild that should never happen. 276# However, partial gbuild build will not know about how to build lower level 277# linktargets, just as gbuild can not know about linktargets generated in the 278# old build.pl/dmake system. Once all is migrated, gbuild should error out 279# when is is told to depend on a linktarget it does not know about and not 280# only warn. 281define gb_LinkTarget__get_external_headers_check 282ifneq ($$(SELF),$$*) 283$$(eval $$(call gb_Output_info,LinkTarget $$* not defined: Assuming headers to be there!,ALL)) 284endif 285$$@ : COMMAND := $$(call gb_Helper_abbreviate_dirs, mkdir -p $$(dir $$@) && touch $$@ && mkdir -p $(call gb_LinkTarget_get_target,)pdb/$$(dir $$*)) 286 287endef 288 289$(call gb_LinkTarget_get_external_headers_target,%) : 290 $(eval $(gb_LinkTarget__get_external_headers_check)) 291 $(COMMAND) 292 293$(call gb_LinkTarget_get_headers_target,%) : $(call gb_LinkTarget_get_external_headers_target,%) 294 $(call gb_Helper_abbreviate_dirs,\ 295 mkdir -p $(dir $@) && touch $@) 296 297# Explanation of some of the targets: 298# - gb_LinkTarget_get_external_headers_target is the targets that guarantees all 299# headers from linked against libraries are in OUTDIR. 300# - gb_LinkTarget_get_headers_target is the target that guarantees all headers 301# from the linked against the libraries and the linktargets own headers 302# (including generated headers) are in the OUTDIR. 303# - gb_LinkTarget_get_target links the objects into a file in WORKDIR. 304# gb_LinkTarget_get_target depends on gb_LinkTarget_get_headers_target which in 305# turn depends gb_LinkTarget_get_external_headers_target. 306# gb_LinkTarget_get_target depends additionally on the objects, which in turn 307# depend build-order only on the gb_LinkTarget_get_headers_target. The build 308# order-only dependency ensures all headers to be there for compiling and 309# dependency generation without causing all objects to be rebuild when one 310# header changes. Only the ones with an explicit dependency in their generated 311# dependency file will be rebuild. 312# 313# gb_LinkTarget_get_target is the target that links the objects into a file in 314# WORKDIR 315# Explanation of some of the variables: 316# - AUXTARGETS are the additionally generated files that need to be cleaned out 317# on clean. 318# - PCH_CXXFLAGS and PCH_DEFS are the flags that the precompiled headers will 319# be compiled with. They should never be overridden in a single object 320# files. 321# - TARGETTYPE is the type of linktarget as some platforms need very different 322# command to link different targettypes. 323# 324# Since most variables are set on the linktarget and not on the object, the 325# object learns about these setting via GNU makes scoping of target variables. 326# Therefore it is important that objects are only directly depended on by the 327# linktarget. This for example means that you cannot build a single object 328# alone, because then you would directly depend on the object. 329define gb_LinkTarget_LinkTarget 330$(call gb_LinkTarget_get_clean_target,$(1)) : AUXTARGETS := 331$(call gb_LinkTarget_get_external_headers_target,$(1)) : SELF := $(1) 332$(call gb_LinkTarget_get_target,$(1)) : DLLTARGET := 333$(call gb_LinkTarget_get_clean_target,$(1)) \ 334$(call gb_LinkTarget_get_target,$(1)) : COBJECTS := 335$(call gb_LinkTarget_get_clean_target,$(1)) \ 336$(call gb_LinkTarget_get_target,$(1)) : CXXOBJECTS := 337$(call gb_LinkTarget_get_clean_target,$(1)) \ 338$(call gb_LinkTarget_get_target,$(1)) : OBJCXXOBJECTS := 339$(call gb_LinkTarget_get_clean_target,$(1)) \ 340$(call gb_LinkTarget_get_target,$(1)) : GENCXXOBJECTS := 341$(call gb_LinkTarget_get_headers_target,$(1)) \ 342$(call gb_LinkTarget_get_target,$(1)) : CFLAGS := $$(gb_LinkTarget_CFLAGS) 343$(call gb_LinkTarget_get_headers_target,$(1)) \ 344$(call gb_LinkTarget_get_target,$(1)) : CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS) 345$(call gb_LinkTarget_get_headers_target,$(1)) \ 346$(call gb_LinkTarget_get_target,$(1)) : PCH_CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS) $(gb_COMPILEROPTFLAGS) 347$(call gb_LinkTarget_get_target,$(1)) : OBJCXXFLAGS := $$(gb_LinkTarget_OBJCXXFLAGS) 348$(call gb_LinkTarget_get_headers_target,$(1)) \ 349$(call gb_LinkTarget_get_target,$(1)) : DEFS := $$(gb_LinkTarget_DEFAULTDEFS) 350$(call gb_LinkTarget_get_headers_target,$(1)) \ 351$(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS := $$(gb_LinkTarget_DEFAULTDEFS) 352$(call gb_LinkTarget_get_headers_target,$(1)) \ 353$(call gb_LinkTarget_get_target,$(1)) : INCLUDE := $$(gb_LinkTarget_INCLUDE) 354$(call gb_LinkTarget_get_headers_target,$(1)) \ 355$(call gb_LinkTarget_get_target,$(1)) : INCLUDE_STL := $$(gb_LinkTarget_INCLUDE_STL) 356$(call gb_LinkTarget_get_target,$(1)) : LDFLAGS := $$(gb_LinkTarget_LDFLAGS) 357$(call gb_LinkTarget_get_target,$(1)) : LINKED_LIBS := 358$(call gb_LinkTarget_get_target,$(1)) : LINKED_STATIC_LIBS := 359$(call gb_LinkTarget_get_target,$(1)) : TARGETTYPE := 360$(call gb_LinkTarget_get_headers_target,$(1)) \ 361$(call gb_LinkTarget_get_target,$(1)) : PCH_NAME := 362$(call gb_LinkTarget_get_target,$(1)) : PCHOBJS := 363$(call gb_LinkTarget_get_headers_target,$(1)) \ 364$(call gb_LinkTarget_get_target,$(1)) : PDBFILE := 365$(call gb_LinkTarget_get_target,$(1)) : NATIVERES := 366 367ifeq ($(gb_FULLDEPS),$(true)) 368ifneq ($(wildcard $(call gb_LinkTarget_get_dep_target,$(1))),) 369include $(call gb_LinkTarget_get_dep_target,$(1)) 370else 371$(firstword $(MAKEFILE_LIST)) : $(call gb_LinkTarget_get_dep_target,$(1)) 372endif 373$(call gb_LinkTarget_get_dep_target,$(1)) : COBJECTS := 374$(call gb_LinkTarget_get_dep_target,$(1)) : CXXOBJECTS := 375$(call gb_LinkTarget_get_dep_target,$(1)) : OBJCXXOBJECTS := 376$(call gb_LinkTarget_get_dep_target,$(1)) : GENCXXOBJECTS := 377$(call gb_LinkTarget_get_dep_target,$(1)) : CFLAGS := $$(gb_LinkTarget_CFLAGS) 378$(call gb_LinkTarget_get_dep_target,$(1)) : CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS) 379$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS) $(gb_COMPILEROPTFLAGS) 380$(call gb_LinkTarget_get_dep_target,$(1)) : OBJCXXFLAGS := $$(gb_LinkTarget_OBJCXXFLAGS) 381$(call gb_LinkTarget_get_dep_target,$(1)) : DEFS := $$(gb_LinkTarget_DEFAULTDEFS) 382$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_DEFS := $$(gb_LinkTarget_DEFAULTDEFS) 383$(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE := $$(gb_LinkTarget_INCLUDE) 384$(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE_STL := $$(gb_LinkTarget_INCLUDE_STL) 385$(call gb_LinkTarget_get_dep_target,$(1)) : TARGETTYPE := 386$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_NAME := 387endif 388 389endef 390 391define gb_LinkTarget_set_defs 392$(call gb_LinkTarget_get_headers_target,$(1)) \ 393$(call gb_LinkTarget_get_target,$(1)) : DEFS := $(2) 394$(call gb_LinkTarget_get_headers_target,$(1)) \ 395$(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS := $(2) 396 397ifeq ($(gb_FULLDEPS),$(true)) 398$(call gb_LinkTarget_get_dep_target,$(1)) : DEFS := $(2) 399$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_DEFS := $(2) 400endif 401 402endef 403 404define gb_LinkTarget_set_cflags 405$(call gb_LinkTarget_get_target,$(1)) : CFLAGS := $(2) 406ifeq ($(gb_FULLDEPS),$(true)) 407$(call gb_LinkTarget_get_dep_target,$(1)) : CFLAGS := $(2) 408endif 409 410endef 411 412define gb_LinkTarget_set_cxxflags 413$(call gb_LinkTarget_get_headers_target,$(1)) \ 414$(call gb_LinkTarget_get_target,$(1)) : CXXFLAGS := $(2) 415$(call gb_LinkTarget_get_headers_target,$(1)) \ 416$(call gb_LinkTarget_get_target,$(1)) : PCH_CXXFLAGS := $(2) 417ifeq ($(gb_FULLDEPS),$(true)) 418$(call gb_LinkTarget_get_dep_target,$(1)) : CXXFLAGS := $(2) 419$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_CXXFLAGS := $(2) 420endif 421 422endef 423 424define gb_LinkTarget_set_objcxxflags 425$(call gb_LinkTarget_get_target,$(1)) : OBJCXXFLAGS := $(2) 426ifeq ($(gb_FULLDEPS),$(true)) 427$(call gb_LinkTarget_get_dep_target,$(1)) : OBJCXXFLAGS := $(2) 428endif 429 430endef 431 432define gb_LinkTarget_set_include 433$(call gb_LinkTarget_get_headers_target,$(1)) \ 434$(call gb_LinkTarget_get_target,$(1)) : INCLUDE := $(2) 435ifeq ($(gb_FULLDEPS),$(true)) 436$(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE := $(2) 437endif 438 439endef 440 441define gb_LinkTarget_set_include_stl 442$(call gb_LinkTarget_get_headers_target,$(1)) \ 443$(call gb_LinkTarget_get_target,$(1)) : INCLUDE_STL := $(2) 444ifeq ($(gb_FULLDEPS),$(true)) 445$(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE_STL := $(2) 446endif 447 448endef 449 450define gb_LinkTarget_set_ldflags 451$(call gb_LinkTarget_get_target,$(1)) : LDFLAGS := $(2) 452endef 453 454define gb_LinkTarget_add_linked_libs 455ifneq (,$$(filter-out $(gb_Library_KNOWNLIBS),$(2))) 456$$(eval $$(call gb_Output_info,currently known libraries are: $(sort $(gb_Library_KNOWNLIBS)),ALL)) 457$$(eval $$(call gb_Output_error,Cannot link against library/libraries $$(filter-out $(gb_Library_KNOWNLIBS),$(2)). Libraries must be registered in Repository.mk)) 458endif 459 460$(call gb_LinkTarget_get_target,$(1)) : LINKED_LIBS += $(2) 461 462$(call gb_LinkTarget_get_target,$(1)) : $$(foreach lib,$(2),$$(call gb_Library_get_target,$$(lib))) 463$(call gb_LinkTarget_get_external_headers_target,$(1)) : \ 464$$(foreach lib,$(2),$$(call gb_Library_get_headers_target,$$(lib))) 465 466endef 467 468define gb_LinkTarget_add_linked_static_libs 469ifneq (,$$(filter-out $(gb_StaticLibrary_KNOWNLIBS),$(2))) 470$$(eval $$(call gb_Output_info, currently known static libraries are: $(sort $(gb_StaticLibrary_KNOWNLIBS)),ALL)) 471$$(eval $$(call gb_Output_error,Cannot link against static library/libraries $$(filter-out $(gb_StaticLibrary_KNOWNLIBS),$(2)). Static libraries must be registered in Repository.mk)) 472endif 473 474$(call gb_LinkTarget_get_target,$(1)) : LINKED_STATIC_LIBS += $(2) 475 476$(call gb_LinkTarget_get_target,$(1)) : $$(foreach lib,$(2),$$(call gb_StaticLibrary_get_target,$$(lib))) 477$(call gb_LinkTarget_get_external_headers_target,$(1)) : \ 478$$(foreach lib,$(2),$$(call gb_StaticLibrary_get_headers_target,$$(lib))) 479 480endef 481 482define gb_LinkTarget_add_cobject 483$(call gb_LinkTarget_get_target,$(1)) : COBJECTS += $(2) 484$(call gb_LinkTarget_get_clean_target,$(1)) : COBJECTS += $(2) 485 486$(call gb_LinkTarget_get_target,$(1)) : $(call gb_CObject_get_target,$(2)) 487$(call gb_CObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1)) 488$(call gb_CObject_get_target,$(2)) : CFLAGS += $(3) 489 490ifeq ($(gb_FULLDEPS),$(true)) 491$(call gb_LinkTarget_get_dep_target,$(1)) : COBJECTS += $(2) 492$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_CObject_get_dep_target,$(2)) 493endif 494 495endef 496 497define gb_LinkTarget_add_cxxobject 498$(call gb_LinkTarget_get_target,$(1)) : CXXOBJECTS += $(2) 499$(call gb_LinkTarget_get_clean_target,$(1)) : CXXOBJECTS += $(2) 500 501$(call gb_LinkTarget_get_target,$(1)) : $(call gb_CxxObject_get_target,$(2)) 502$(call gb_CxxObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1)) 503$(call gb_CxxObject_get_target,$(2)) : CXXFLAGS += $(3) 504 505ifeq ($(gb_FULLDEPS),$(true)) 506$(call gb_LinkTarget_get_dep_target,$(1)) : CXXOBJECTS += $(2) 507$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_CxxObject_get_dep_target,$(2)) 508endif 509 510endef 511 512define gb_LinkTarget_add_objcxxobject 513$(call gb_LinkTarget_get_target,$(1)) : OBJCXXOBJECTS += $(2) 514$(call gb_LinkTarget_get_clean_target,$(1)) : OBJCXXOBJECTS += $(2) 515 516$(call gb_LinkTarget_get_target,$(1)) : $(call gb_ObjCxxObject_get_target,$(2)) 517$(call gb_ObjCxxObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1)) 518$(call gb_ObjCxxObject_get_target,$(2)) : OBJCXXFLAGS += $(3) 519 520ifeq ($(gb_FULLDEPS),$(true)) 521$(call gb_LinkTarget_get_dep_target,$(1)) : OBJCXXOBJECTS += $(2) 522$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_ObjCxxObject_get_dep_target,$(2)) 523endif 524 525endef 526 527define gb_LinkTarget_add_generated_cxx_object 528$(call gb_LinkTarget_get_target,$(1)) : GENCXXOBJECTS += $(2) 529$(call gb_LinkTarget_get_clean_target,$(1)) : GENCXXOBJECTS += $(2) 530 531$(call gb_LinkTarget_get_target,$(1)) : $(call gb_GenCxxObject_get_target,$(2)) 532$(call gb_GenCxxObject_get_source,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1)) 533$(call gb_GenCxxObject_get_target,$(2)) : CXXFLAGS += $(3) $(gb_COMPILEROPTFLAGS) 534 535ifeq ($(gb_FULLDEPS),$(true)) 536$(call gb_LinkTarget_get_dep_target,$(1)) : GENCXXOBJECTS += $(2) 537$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_GenCxxObject_get_dep_target,$(2)) 538endif 539 540endef 541 542define gb_LinkTarget_add_noexception_object 543$(call gb_LinkTarget_add_cxxobject,$(1),$(2),$(gb_LinkTarget_NOEXCEPTIONFLAGS) $(gb_COMPILEROPTFLAGS)) 544endef 545 546define gb_LinkTarget_add_exception_object 547$(call gb_LinkTarget_add_cxxobject,$(1),$(2),$(gb_LinkTarget_EXCEPTIONFLAGS) $(gb_COMPILEROPTFLAGS)) 548endef 549 550define gb_LinkTarget_add_cobjects 551$(foreach obj,$(2),$(call gb_LinkTarget_add_cobject,$(1),$(obj),$(3))) 552endef 553 554define gb_LinkTarget_add_cxxobjects 555$(foreach obj,$(2),$(call gb_LinkTarget_add_cxxobject,$(1),$(obj),$(3))) 556endef 557 558define gb_LinkTarget_add_objcxxobjects 559$(foreach obj,$(2),$(call gb_LinkTarget_add_objcxxobject,$(1),$(obj),$(3))) 560endef 561 562define gb_LinkTarget_add_noexception_objects 563$(foreach obj,$(2),$(call gb_LinkTarget_add_noexception_object,$(1),$(obj))) 564endef 565 566define gb_LinkTarget_add_exception_objects 567$(foreach obj,$(2),$(call gb_LinkTarget_add_exception_object,$(1),$(obj))) 568endef 569 570define gb_LinkTarget_add_generated_exception_object 571$(call gb_LinkTarget_add_generated_cxx_object,$(1),$(2),$(gb_LinkTarget_EXCEPTIONFLAGS)) 572endef 573 574define gb_LinkTarget_add_generated_exception_objects 575$(foreach obj,$(2),$(call gb_LinkTarget_add_generated_exception_object,$(1),$(obj))) 576endef 577 578define gb_LinkTarget_set_targettype 579$(call gb_LinkTarget_get_target,$(1)) \ 580$(call gb_LinkTarget_get_dep_target,$(1)) : TARGETTYPE := $(2) 581endef 582 583define gb_LinkTarget_set_dlltarget 584$(call gb_LinkTarget_get_clean_target,$(1)) \ 585$(call gb_LinkTarget_get_target,$(1)) : DLLTARGET := $(2) 586endef 587 588define gb_LinkTarget_set_auxtargets 589$(call gb_LinkTarget_get_clean_target,$(1)) : AUXTARGETS := $(2) 590endef 591 592define gb_LinkTarget__add_internal_headers 593$(call gb_LinkTarget_get_headers_target,$(1)) : $(2) 594$(2) :| $(call gb_LinkTarget_get_external_headers_target,$(1)) 595 596endef 597 598define gb_LinkTarget_add_package_headers 599$(foreach package,$(2),$(call gb_LinkTarget__add_internal_headers,$(1),$(call gb_Package_get_target,$(package)))) 600$(call gb_LinkTarget_get_clean_target,$(1)) : $(foreach package,$(2),$(call gb_Package_get_clean_target,$(package))) 601 602endef 603 604define gb_LinkTarget_add_sdi_headers 605$(call gb_LinkTarget__add_internal_headers,$(1),$(foreach sdi,$(2),$(call gb_SdiTarget_get_target,$(sdi)))) 606$(call gb_LinkTarget_get_clean_target,$(1)) : $(foreach sdi,$(2),$(call gb_SdiTarget_get_clean_target,$(sdi))) 607endef 608 609define gb_LinkTarget__add_precompiled_header_impl 610$(call gb_LinkTarget__add_internal_headers,$(1),$(call gb_PrecompiledHeader_get_target,$(3))) 611$(call gb_LinkTarget_get_clean_target,$(1)) : $(call gb_PrecompiledHeader_get_clean_target,$(3)) 612$(call gb_PrecompiledHeader_get_target,$(3)) : $(2).cxx 613 614$(call gb_LinkTarget__add_internal_headers,$(1),$(call gb_NoexPrecompiledHeader_get_target,$(3))) 615$(call gb_LinkTarget_get_clean_target,$(1)) : $(call gb_NoexPrecompiledHeader_get_clean_target,$(3)) 616$(call gb_NoexPrecompiledHeader_get_target,$(3)) : $(2).cxx 617 618$(call gb_LinkTarget_get_target,$(1)) : PCH_NAME := $(3) 619$(call gb_LinkTarget_get_target,$(1)) : PCHOBJS = $(call gb_PrecompiledHeader_get_target,$(3)).obj $(call gb_NoexPrecompiledHeader_get_target,$(3)).obj 620 621$(call gb_LinkTarget_get_headers_target,$(1)) \ 622$(call gb_LinkTarget_get_target,$(1)) : DEFS := $$(DEFS) -DPRECOMPILED_HEADERS 623$(call gb_LinkTarget_get_headers_target,$(1)) \ 624$(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS = $$(DEFS) 625ifeq ($(gb_FULLDEPS),$(true)) 626-include \ 627 $(call gb_PrecompiledHeader_get_dep_target,$(3)) \ 628 $(call gb_NoexPrecompiledHeader_get_dep_target,$(3)) 629$(call gb_LinkTarget_get_dep_target,$(1)) : DEFS := $$(DEFS) -DPRECOMPILED_HEADERS 630$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_DEFS = $$(DEFS) 631endif 632 633endef 634 635define gb_LinkTarget_add_precompiled_header 636ifeq ($(gb_ENABLE_PCH),$(true)) 637$(call gb_LinkTarget__add_precompiled_header_impl,$(1),$(2),$(notdir $(2))) 638endif 639 640endef 641 642# vim: set noet sw=4 ts=4: 643