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)) : EXTERNAL_LIBS := 356$(call gb_LinkTarget_get_target,$(1)) : TARGETTYPE := 357$(call gb_LinkTarget_get_headers_target,$(1)) \ 358$(call gb_LinkTarget_get_target,$(1)) : PCH_NAME := 359$(call gb_LinkTarget_get_target,$(1)) : PCHOBJS := 360$(call gb_LinkTarget_get_headers_target,$(1)) \ 361$(call gb_LinkTarget_get_target,$(1)) : PDBFILE := 362$(call gb_LinkTarget_get_target,$(1)) : NATIVERES := 363 364ifeq ($(gb_FULLDEPS),$(true)) 365ifneq ($(wildcard $(call gb_LinkTarget_get_dep_target,$(1))),) 366include $(call gb_LinkTarget_get_dep_target,$(1)) 367else 368$(firstword $(MAKEFILE_LIST)) : $(call gb_LinkTarget_get_dep_target,$(1)) 369endif 370$(call gb_LinkTarget_get_dep_target,$(1)) : COBJECTS := 371$(call gb_LinkTarget_get_dep_target,$(1)) : CXXOBJECTS := 372$(call gb_LinkTarget_get_dep_target,$(1)) : OBJCXXOBJECTS := 373$(call gb_LinkTarget_get_dep_target,$(1)) : GENCXXOBJECTS := 374$(call gb_LinkTarget_get_dep_target,$(1)) : CFLAGS := $$(gb_LinkTarget_CFLAGS) 375$(call gb_LinkTarget_get_dep_target,$(1)) : CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS) 376$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS) $(gb_COMPILEROPTFLAGS) 377$(call gb_LinkTarget_get_dep_target,$(1)) : OBJCXXFLAGS := $$(gb_LinkTarget_OBJCXXFLAGS) 378$(call gb_LinkTarget_get_dep_target,$(1)) : DEFS := $$(gb_LinkTarget_DEFAULTDEFS) 379$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_DEFS := $$(gb_LinkTarget_DEFAULTDEFS) 380$(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE := $$(gb_LinkTarget_INCLUDE) 381$(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE_STL := $$(gb_LinkTarget_INCLUDE_STL) 382$(call gb_LinkTarget_get_dep_target,$(1)) : TARGETTYPE := 383$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_NAME := 384endif 385 386endef 387 388define gb_LinkTarget_set_defs 389$(call gb_LinkTarget_get_headers_target,$(1)) \ 390$(call gb_LinkTarget_get_target,$(1)) : DEFS := $(2) 391$(call gb_LinkTarget_get_headers_target,$(1)) \ 392$(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS := $(2) 393 394ifeq ($(gb_FULLDEPS),$(true)) 395$(call gb_LinkTarget_get_dep_target,$(1)) : DEFS := $(2) 396$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_DEFS := $(2) 397endif 398 399endef 400 401define gb_LinkTarget_set_cflags 402$(call gb_LinkTarget_get_target,$(1)) : CFLAGS := $(2) 403ifeq ($(gb_FULLDEPS),$(true)) 404$(call gb_LinkTarget_get_dep_target,$(1)) : CFLAGS := $(2) 405endif 406 407endef 408 409define gb_LinkTarget_set_cxxflags 410$(call gb_LinkTarget_get_headers_target,$(1)) \ 411$(call gb_LinkTarget_get_target,$(1)) : CXXFLAGS := $(2) 412$(call gb_LinkTarget_get_headers_target,$(1)) \ 413$(call gb_LinkTarget_get_target,$(1)) : PCH_CXXFLAGS := $(2) 414ifeq ($(gb_FULLDEPS),$(true)) 415$(call gb_LinkTarget_get_dep_target,$(1)) : CXXFLAGS := $(2) 416$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_CXXFLAGS := $(2) 417endif 418 419endef 420 421define gb_LinkTarget_set_objcxxflags 422$(call gb_LinkTarget_get_target,$(1)) : OBJCXXFLAGS := $(2) 423ifeq ($(gb_FULLDEPS),$(true)) 424$(call gb_LinkTarget_get_dep_target,$(1)) : OBJCXXFLAGS := $(2) 425endif 426 427endef 428 429define gb_LinkTarget_set_include 430$(call gb_LinkTarget_get_headers_target,$(1)) \ 431$(call gb_LinkTarget_get_target,$(1)) : INCLUDE := $(2) 432ifeq ($(gb_FULLDEPS),$(true)) 433$(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE := $(2) 434endif 435 436endef 437 438define gb_LinkTarget_set_include_stl 439$(call gb_LinkTarget_get_headers_target,$(1)) \ 440$(call gb_LinkTarget_get_target,$(1)) : INCLUDE_STL := $(2) 441ifeq ($(gb_FULLDEPS),$(true)) 442$(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE_STL := $(2) 443endif 444 445endef 446 447define gb_LinkTarget_set_ldflags 448$(call gb_LinkTarget_get_target,$(1)) : LDFLAGS := $(2) 449endef 450 451define gb_LinkTarget_add_linked_libs 452ifneq (,$$(filter-out $(gb_Library_KNOWNLIBS),$(2))) 453$$(eval $$(call gb_Output_info,currently known libraries are: $(sort $(gb_Library_KNOWNLIBS)),ALL)) 454$$(eval $$(call gb_Output_error,Cannot link against library/libraries $$(filter-out $(gb_Library_KNOWNLIBS),$(2)). Libraries must be registered in Repository.mk)) 455endif 456 457$(call gb_LinkTarget_get_target,$(1)) : LINKED_LIBS += $(2) 458 459$(call gb_LinkTarget_get_target,$(1)) : $$(foreach lib,$(2),$$(call gb_Library_get_target,$$(lib))) 460$(call gb_LinkTarget_get_external_headers_target,$(1)) : \ 461$$(foreach lib,$(2),$$(call gb_Library_get_headers_target,$$(lib))) 462 463endef 464 465define gb_LinkTarget_add_linked_static_libs 466ifneq (,$$(filter-out $(gb_StaticLibrary_KNOWNLIBS),$(2))) 467$$(eval $$(call gb_Output_info, currently known static libraries are: $(sort $(gb_StaticLibrary_KNOWNLIBS)),ALL)) 468$$(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)) 469endif 470 471$(call gb_LinkTarget_get_target,$(1)) : LINKED_STATIC_LIBS += $(2) 472 473$(call gb_LinkTarget_get_target,$(1)) : $$(foreach lib,$(2),$$(call gb_StaticLibrary_get_target,$$(lib))) 474$(call gb_LinkTarget_get_external_headers_target,$(1)) : \ 475$$(foreach lib,$(2),$$(call gb_StaticLibrary_get_headers_target,$$(lib))) 476 477endef 478 479# 480# Add external libs for linking. External libaries are not built by any module. 481# 482# The list of libraries is used as is, ie it is not filtered with gb_Library_KNOWNLIBS. 483# 484# An error is signaled, when any of the library names does not look like 485# a base name, ie is prefixed by -l or lib or is folled by .lib or .so. 486# 487# @param target 488# @param libraries 489# A list of (base names of) libraries that will be added to the target 490# local EXTERNAL_LIBS variable and eventually linked in when the 491# target is made. 492# 493define gb_LinkTarget_add_external_libs 494 495# Make sure that all libraries are given as base names. 496ifneq (,$$(filter -l% lib% %.so %.lib, $(2))) 497$$(eval $$(call gb_Output_announce,ERROR: Please give only library basenames to gb_LinkTarget_add_external_libs)) 498$$(eval $$(call gb_Output_announce,ERROR: (no prefixes -l% or lib%, no suffixes %.so or %.lib))) 499$$(eval $$(call gb_Output_announce,ERROR: libraries given: $(2))) 500$$(eval $$(call gb_Output_announce,ERROR: offending: $$(filter -l% lib% %.so %.lib, $(2)))) 501$$(eval $$(call gb_Output_error, )) 502endif 503 504$(call gb_LinkTarget_get_target,$(1)) : EXTERNAL_LIBS += $(2) 505 506$(call gb_LinkTarget_get_target,$(1)) : $$(foreach lib,$(2),$$(call gb_Library_get_target,$$(lib))) 507$(call gb_LinkTarget_get_external_headers_target,$(1)) : \ 508$$(foreach lib,$(2),$$(call gb_Library_get_headers_target,$$(lib))) 509 510endef 511 512 513define gb_LinkTarget_add_cobject 514$(call gb_LinkTarget_get_target,$(1)) : COBJECTS += $(2) 515$(call gb_LinkTarget_get_clean_target,$(1)) : COBJECTS += $(2) 516 517$(call gb_LinkTarget_get_target,$(1)) : $(call gb_CObject_get_target,$(2)) 518$(call gb_CObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1)) 519$(call gb_CObject_get_target,$(2)) : CFLAGS += $(3) 520 521ifeq ($(gb_FULLDEPS),$(true)) 522$(call gb_LinkTarget_get_dep_target,$(1)) : COBJECTS += $(2) 523$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_CObject_get_dep_target,$(2)) 524endif 525 526endef 527 528define gb_LinkTarget_add_cxxobject 529$(call gb_LinkTarget_get_target,$(1)) : CXXOBJECTS += $(2) 530$(call gb_LinkTarget_get_clean_target,$(1)) : CXXOBJECTS += $(2) 531 532$(call gb_LinkTarget_get_target,$(1)) : $(call gb_CxxObject_get_target,$(2)) 533$(call gb_CxxObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1)) 534$(call gb_CxxObject_get_target,$(2)) : CXXFLAGS += $(3) 535 536ifeq ($(gb_FULLDEPS),$(true)) 537$(call gb_LinkTarget_get_dep_target,$(1)) : CXXOBJECTS += $(2) 538$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_CxxObject_get_dep_target,$(2)) 539endif 540 541endef 542 543define gb_LinkTarget_add_objcxxobject 544$(call gb_LinkTarget_get_target,$(1)) : OBJCXXOBJECTS += $(2) 545$(call gb_LinkTarget_get_clean_target,$(1)) : OBJCXXOBJECTS += $(2) 546 547$(call gb_LinkTarget_get_target,$(1)) : $(call gb_ObjCxxObject_get_target,$(2)) 548$(call gb_ObjCxxObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1)) 549$(call gb_ObjCxxObject_get_target,$(2)) : OBJCXXFLAGS += $(3) 550 551ifeq ($(gb_FULLDEPS),$(true)) 552$(call gb_LinkTarget_get_dep_target,$(1)) : OBJCXXOBJECTS += $(2) 553$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_ObjCxxObject_get_dep_target,$(2)) 554endif 555 556endef 557 558define gb_LinkTarget_add_generated_cxx_object 559$(call gb_LinkTarget_get_target,$(1)) : GENCXXOBJECTS += $(2) 560$(call gb_LinkTarget_get_clean_target,$(1)) : GENCXXOBJECTS += $(2) 561 562$(call gb_LinkTarget_get_target,$(1)) : $(call gb_GenCxxObject_get_target,$(2)) 563$(call gb_GenCxxObject_get_source,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1)) 564$(call gb_GenCxxObject_get_target,$(2)) : CXXFLAGS += $(3) $(gb_COMPILEROPTFLAGS) 565 566ifeq ($(gb_FULLDEPS),$(true)) 567$(call gb_LinkTarget_get_dep_target,$(1)) : GENCXXOBJECTS += $(2) 568$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_GenCxxObject_get_dep_target,$(2)) 569endif 570 571endef 572 573define gb_LinkTarget_add_noexception_object 574$(call gb_LinkTarget_add_cxxobject,$(1),$(2),$(gb_LinkTarget_NOEXCEPTIONFLAGS) $(gb_COMPILEROPTFLAGS)) 575endef 576 577define gb_LinkTarget_add_exception_object 578$(call gb_LinkTarget_add_cxxobject,$(1),$(2),$(gb_LinkTarget_EXCEPTIONFLAGS) $(gb_COMPILEROPTFLAGS)) 579endef 580 581define gb_LinkTarget_add_cobjects 582$(foreach obj,$(2),$(call gb_LinkTarget_add_cobject,$(1),$(obj),$(3))) 583endef 584 585define gb_LinkTarget_add_cxxobjects 586$(foreach obj,$(2),$(call gb_LinkTarget_add_cxxobject,$(1),$(obj),$(3))) 587endef 588 589define gb_LinkTarget_add_objcxxobjects 590$(foreach obj,$(2),$(call gb_LinkTarget_add_objcxxobject,$(1),$(obj),$(3))) 591endef 592 593define gb_LinkTarget_add_noexception_objects 594$(foreach obj,$(2),$(call gb_LinkTarget_add_noexception_object,$(1),$(obj))) 595endef 596 597define gb_LinkTarget_add_exception_objects 598$(foreach obj,$(2),$(call gb_LinkTarget_add_exception_object,$(1),$(obj))) 599endef 600 601define gb_LinkTarget_add_generated_exception_object 602$(call gb_LinkTarget_add_generated_cxx_object,$(1),$(2),$(gb_LinkTarget_EXCEPTIONFLAGS)) 603endef 604 605define gb_LinkTarget_add_generated_exception_objects 606$(foreach obj,$(2),$(call gb_LinkTarget_add_generated_exception_object,$(1),$(obj))) 607endef 608 609define gb_LinkTarget_set_targettype 610$(call gb_LinkTarget_get_target,$(1)) \ 611$(call gb_LinkTarget_get_dep_target,$(1)) : TARGETTYPE := $(2) 612endef 613 614define gb_LinkTarget_set_dlltarget 615$(call gb_LinkTarget_get_clean_target,$(1)) \ 616$(call gb_LinkTarget_get_target,$(1)) : DLLTARGET := $(2) 617endef 618 619define gb_LinkTarget_set_auxtargets 620$(call gb_LinkTarget_get_clean_target,$(1)) : AUXTARGETS := $(2) 621endef 622 623define gb_LinkTarget__add_internal_headers 624$(call gb_LinkTarget_get_headers_target,$(1)) : $(2) 625$(2) :| $(call gb_LinkTarget_get_external_headers_target,$(1)) 626 627endef 628 629define gb_LinkTarget_add_package_headers 630$(foreach package,$(2),$(call gb_LinkTarget__add_internal_headers,$(1),$(call gb_Package_get_target,$(package)))) 631$(call gb_LinkTarget_get_clean_target,$(1)) : $(foreach package,$(2),$(call gb_Package_get_clean_target,$(package))) 632 633endef 634 635define gb_LinkTarget_add_sdi_headers 636$(call gb_LinkTarget__add_internal_headers,$(1),$(foreach sdi,$(2),$(call gb_SdiTarget_get_target,$(sdi)))) 637$(call gb_LinkTarget_get_clean_target,$(1)) : $(foreach sdi,$(2),$(call gb_SdiTarget_get_clean_target,$(sdi))) 638endef 639 640define gb_LinkTarget__add_precompiled_header_impl 641$(call gb_LinkTarget__add_internal_headers,$(1),$(call gb_PrecompiledHeader_get_target,$(3))) 642$(call gb_LinkTarget_get_clean_target,$(1)) : $(call gb_PrecompiledHeader_get_clean_target,$(3)) 643$(call gb_PrecompiledHeader_get_target,$(3)) : $(2).cxx 644 645$(call gb_LinkTarget__add_internal_headers,$(1),$(call gb_NoexPrecompiledHeader_get_target,$(3))) 646$(call gb_LinkTarget_get_clean_target,$(1)) : $(call gb_NoexPrecompiledHeader_get_clean_target,$(3)) 647$(call gb_NoexPrecompiledHeader_get_target,$(3)) : $(2).cxx 648 649$(call gb_LinkTarget_get_target,$(1)) : PCH_NAME := $(3) 650$(call gb_LinkTarget_get_target,$(1)) : PCHOBJS = $(call gb_PrecompiledHeader_get_target,$(3)).obj $(call gb_NoexPrecompiledHeader_get_target,$(3)).obj 651 652$(call gb_LinkTarget_get_headers_target,$(1)) \ 653$(call gb_LinkTarget_get_target,$(1)) : DEFS := $$(DEFS) -DPRECOMPILED_HEADERS 654$(call gb_LinkTarget_get_headers_target,$(1)) \ 655$(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS = $$(DEFS) 656ifeq ($(gb_FULLDEPS),$(true)) 657-include \ 658 $(call gb_PrecompiledHeader_get_dep_target,$(3)) \ 659 $(call gb_NoexPrecompiledHeader_get_dep_target,$(3)) 660$(call gb_LinkTarget_get_dep_target,$(1)) : DEFS := $$(DEFS) -DPRECOMPILED_HEADERS 661$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_DEFS = $$(DEFS) 662endif 663 664endef 665 666define gb_LinkTarget_add_precompiled_header 667ifeq ($(gb_ENABLE_PCH),$(true)) 668$(call gb_LinkTarget__add_precompiled_header_impl,$(1),$(2),$(notdir $(2))) 669endif 670 671endef 672 673# vim: set noet sw=4 ts=4: 674