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