17871dc3eSAndrew Rist#************************************************************** 27871dc3eSAndrew Rist# 37871dc3eSAndrew Rist# Licensed to the Apache Software Foundation (ASF) under one 47871dc3eSAndrew Rist# or more contributor license agreements. See the NOTICE file 57871dc3eSAndrew Rist# distributed with this work for additional information 67871dc3eSAndrew Rist# regarding copyright ownership. The ASF licenses this file 77871dc3eSAndrew Rist# to you under the Apache License, Version 2.0 (the 87871dc3eSAndrew Rist# "License"); you may not use this file except in compliance 97871dc3eSAndrew Rist# with the License. You may obtain a copy of the License at 107871dc3eSAndrew Rist# 117871dc3eSAndrew Rist# http://www.apache.org/licenses/LICENSE-2.0 127871dc3eSAndrew Rist# 137871dc3eSAndrew Rist# Unless required by applicable law or agreed to in writing, 147871dc3eSAndrew Rist# software distributed under the License is distributed on an 157871dc3eSAndrew Rist# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 167871dc3eSAndrew Rist# KIND, either express or implied. See the License for the 177871dc3eSAndrew Rist# specific language governing permissions and limitations 187871dc3eSAndrew Rist# under the License. 197871dc3eSAndrew Rist# 207871dc3eSAndrew Rist#************************************************************** 217871dc3eSAndrew Rist 227871dc3eSAndrew Rist 23cdf0e10cSrcweir 24b63233d8Sdamjan#the following user-defined variables are supported: 25b63233d8Sdamjan# CPPFLAGS 26b63233d8Sdamjan# CFLAGS 27b63233d8Sdamjan# CXXFLAGS 28b63233d8Sdamjan# OBJCXXFLAGS 2969f987b1SDamjan Jovanovic# JAVAFLAGS 30b63233d8Sdamjan# LDFLAGS 31b63233d8Sdamjan 32b63233d8Sdamjan# CFLAGS from environment override debug/optimization flags 339e1b801eSDamjan Jovanovic 349e1b801eSDamjan Jovanovicifeq ($(gb_DEBUGGING),TRUE) 35b63233d8SdamjanCFLAGS ?= $(gb_COMPILEROPTFLAGS) $(gb_DEBUG_CFLAGS) 36b63233d8SdamjanCXXFLAGS ?= $(gb_COMPILEROPTFLAGS) $(gb_DEBUG_CFLAGS) 37b63233d8SdamjanOBJCXXFLAGS ?= $(gb_COMPILEROPTFLAGS) $(gb_DEBUG_CFLAGS) 3869f987b1SDamjan JovanovicJAVAFLAGS ?= -g 39b63233d8Sdamjanelse 40b63233d8SdamjanCFLAGS ?= $(gb_COMPILEROPTFLAGS) 41b63233d8SdamjanCXXFLAGS ?= $(gb_COMPILEROPTFLAGS) 42b63233d8SdamjanOBJCXXFLAGS ?= $(gb_COMPILEROPTFLAGS) 43b63233d8Sdamjanendif 44cdf0e10cSrcweir 45cdf0e10cSrcweir 46b63233d8Sdamjan# For every object there is a dep file (if gb_FULLDEPS is active). 47b63233d8Sdamjan# The dep file depends on the object: the Object__command also updates the 48b63233d8Sdamjan# dep file as a side effect. 49b63233d8Sdamjan# In the dep file rule just touch it so it's newer than the object. 50cdf0e10cSrcweir 51b63233d8Sdamjan# The gb_Object__command_dep generates an "always rebuild" dep file; 52b63233d8Sdamjan# It is _only_ used in case the user deletes the object dep file. 53cdf0e10cSrcweirifeq ($(gb_FULLDEPS),$(true)) 54b63233d8Sdamjandefine gb_Object__command_dep 55cdf0e10cSrcweirmkdir -p $(dir $(1)) && \ 56b63233d8Sdamjan echo '$(2) : $$(gb_Helper_PHONY)' > $(1) 57cdf0e10cSrcweir 58cdf0e10cSrcweirendef 59cdf0e10cSrcweirelse 60b63233d8Sdamjangb_Object__command_dep = \ 61b63233d8Sdamjan $(call gb_Output_error,gb_Object__command_dep is only for gb_FULLDEPS) 62cdf0e10cSrcweirendif 63cdf0e10cSrcweir 64b63233d8Sdamjan 65b63233d8Sdamjan# CObject class 66b63233d8Sdamjan 67b63233d8Sdamjangb_CObject_REPOS := $(gb_REPOS) 68b63233d8Sdamjan 69b63233d8Sdamjangb_CObject_get_source = $(1)/$(2).c 70b63233d8Sdamjan# defined by platform 71b63233d8Sdamjan# gb_CObject__command 72b63233d8Sdamjan 73cdf0e10cSrcweirdefine gb_CObject__rules 74cdf0e10cSrcweir$$(call gb_CObject_get_target,%) : $$(call gb_CObject_get_source,$(1),%) 75b63233d8Sdamjan $$(call gb_CObject__command,$$@,$$*,$$<,$$(call gb_CObject_get_dep_target,$$*)) 76cdf0e10cSrcweir 77cdf0e10cSrcweirifeq ($(gb_FULLDEPS),$(true)) 78b63233d8Sdamjan$$(call gb_CObject_get_dep_target,%) : $$(call gb_CObject_get_target,%) 79b63233d8Sdamjan $$(if $$(wildcard $$@),touch $$@,\ 80b63233d8Sdamjan $$(call gb_Object__command_dep,$$@,$$(call gb_CObject_get_target,$$*))) 81cdf0e10cSrcweirendif 82cdf0e10cSrcweir 83cdf0e10cSrcweirendef 84cdf0e10cSrcweir 85cdf0e10cSrcweir$(foreach repo,$(gb_CObject_REPOS),$(eval $(call gb_CObject__rules,$(repo)))) 86cdf0e10cSrcweir 87cdf0e10cSrcweir$(call gb_CObject_get_dep_target,%) : 88cdf0e10cSrcweir $(eval $(call gb_Output_error,Unable to find plain C file $(call gb_CObject_get_source,,$*) in the repositories: $(gb_CObject_REPOS))) 89cdf0e10cSrcweir 90cdf0e10cSrcweirgb_CObject_CObject = 91cdf0e10cSrcweir 92cdf0e10cSrcweir 93cdf0e10cSrcweir# CxxObject class 94cdf0e10cSrcweir 95cdf0e10cSrcweirgb_CxxObject_REPOS := $(gb_REPOS) 96cdf0e10cSrcweir 97cdf0e10cSrcweirgb_CxxObject_get_source = $(1)/$(2).cxx 98cdf0e10cSrcweir# defined by platform 99cdf0e10cSrcweir# gb_CxxObject__command 100cdf0e10cSrcweir 101cdf0e10cSrcweir# Only enable PCH if the PCH_CXXFLAGS and the PCH_DEFS (from the linktarget) 102b63233d8Sdamjan# are the same as the T_CXXFLAGS and DEFS we want to use for this object. This 103b63233d8Sdamjan# should usually be the case. The DEFS/T_CXXFLAGS would have too be manually 104cdf0e10cSrcweir# overridden for one object file for them to differ. PCH_CXXFLAGS/PCH_DEFS 105cdf0e10cSrcweir# should never be overridden on an object -- they should be the same as for the 106cdf0e10cSrcweir# whole linktarget. In general it should be cleaner to use a static library 107cdf0e10cSrcweir# compiled with different flags and link that in rather than mixing different 108cdf0e10cSrcweir# flags in one linktarget. 109cdf0e10cSrcweirdefine gb_CxxObject__set_pchflags 110cdf0e10cSrcweirifeq ($(gb_ENABLE_PCH),$(true)) 111cdf0e10cSrcweirifneq ($(strip $$(PCH_NAME)),) 112*8e6bd3e9SDon Lewisifeq ($$(sort $$(PCH_CXXFLAGS) $$(PCH_DEFS) $$(gb_LinkTarget_EXCEPTIONFLAGS)),$$(sort $$(T_CXXFLAGS) $$(CXXFLAGS) $$(DEFS))) 113cdf0e10cSrcweir$$@ : PCHFLAGS := $$(call gb_PrecompiledHeader_get_enableflags,$$(PCH_NAME)) 114cdf0e10cSrcweirelse 115*8e6bd3e9SDon Lewisifeq ($$(sort $$(PCH_CXXFLAGS) $$(PCH_DEFS) $$(gb_LinkTarget_NOEXCEPTIONFLAGS)),$$(sort $$(T_CXXFLAGS) $$(CXXFLAGS) $$(DEFS))) 116cdf0e10cSrcweir$$@ : PCHFLAGS := $$(call gb_NoexPrecompiledHeader_get_enableflags,$$(PCH_NAME)) 117cdf0e10cSrcweirelse 118cdf0e10cSrcweir$$(info No precompiled header available for $$*.) 119cdf0e10cSrcweir$$(info precompiled header flags ( ex) : $$(sort $$(PCH_CXXFLAGS) $$(PCH_DEFS) $$(gb_LinkTarget_EXCEPTIONFLAGS))) 120cdf0e10cSrcweir$$(info precompiled header flags (noex) : $$(sort $$(PCH_CXXFLAGS) $$(PCH_DEFS) $$(gb_LinkTarget_NOEXCEPTIONFLAGS))) 121b63233d8Sdamjan$$(info . object flags : $$(sort $$(T_CXXFLAGS) $$(DEFS))) 122cdf0e10cSrcweir$$@ : PCHFLAGS := 123cdf0e10cSrcweirendif 124cdf0e10cSrcweirendif 125cdf0e10cSrcweirendif 126cdf0e10cSrcweirendif 127cdf0e10cSrcweirendef 128cdf0e10cSrcweir 129cdf0e10cSrcweirdefine gb_CxxObject__rules 130cdf0e10cSrcweir$$(call gb_CxxObject_get_target,%) : $$(call gb_CxxObject_get_source,$(1),%) 131cdf0e10cSrcweir $$(eval $$(gb_CxxObject__set_pchflags)) 132b63233d8Sdamjan $$(call gb_CxxObject__command,$$@,$$*,$$<,$$(call gb_CxxObject_get_dep_target,$$*)) 133cdf0e10cSrcweir 134cdf0e10cSrcweirifeq ($(gb_FULLDEPS),$(true)) 135b63233d8Sdamjan$$(call gb_CxxObject_get_dep_target,%) : $$(call gb_CxxObject_get_target,%) 136b63233d8Sdamjan $$(if $$(wildcard $$@),touch $$@,\ 137b63233d8Sdamjan $$(eval $$(gb_CxxObject__set_pchflags))\ 138b63233d8Sdamjan $$(call gb_Object__command_dep,$$@,$$(call gb_CxxObject_get_target,$$*))) 139cdf0e10cSrcweirendif 140cdf0e10cSrcweir 141cdf0e10cSrcweirendef 142cdf0e10cSrcweir 143cdf0e10cSrcweir$(foreach repo,$(gb_CxxObject_REPOS),$(eval $(call gb_CxxObject__rules,$(repo)))) 144cdf0e10cSrcweir 145cdf0e10cSrcweirifeq ($(gb_FULLDEPS),$(true)) 146cdf0e10cSrcweir$(call gb_CxxObject_get_dep_target,%) : 147cdf0e10cSrcweir $(eval $(call gb_Output_error,Unable to find C++ file $(call gb_CxxObject_get_source,,$*) in repositories: $(gb_CxxObject_REPOS))) 148cdf0e10cSrcweir 149cdf0e10cSrcweirendif 150cdf0e10cSrcweir 151cdf0e10cSrcweirgb_CxxObject_CxxObject = 152cdf0e10cSrcweir 153cdf0e10cSrcweir 154cdf0e10cSrcweir# GenCxxObject class 155cdf0e10cSrcweir 156cdf0e10cSrcweirgb_GenCxxObject_get_source = $(WORKDIR)/$(1).cxx 157cdf0e10cSrcweir# defined by platform 158cdf0e10cSrcweir# gb_CxxObject__command 159cdf0e10cSrcweir 160cdf0e10cSrcweir$(call gb_GenCxxObject_get_target,%) : $(call gb_GenCxxObject_get_source,%) 161b63233d8Sdamjan $(call gb_CxxObject__command,$@,$*,$<,$(call gb_GenCxxObject_get_dep_target,$*)) 162cdf0e10cSrcweir 163cdf0e10cSrcweirifeq ($(gb_FULLDEPS),$(true)) 164b63233d8Sdamjan$(call gb_GenCxxObject_get_dep_target,%) : $(call gb_GenCxxObject_get_target,%) 165b63233d8Sdamjan $(if $(wildcard $@),touch $@,\ 166b63233d8Sdamjan $(call gb_Object__command_dep,$@,$(call gb_GenCxxObject_get_target,$*))) 167cdf0e10cSrcweirendif 168cdf0e10cSrcweir 169cdf0e10cSrcweirgb_GenCxxObject_GenCxxObject = 170cdf0e10cSrcweir 171cdf0e10cSrcweir 172cdf0e10cSrcweir# ObjCxxObject class 173cdf0e10cSrcweir# 174cdf0e10cSrcweirgb_ObjCxxObject_REPOS := $(gb_REPOS) 175cdf0e10cSrcweir 176cdf0e10cSrcweirgb_ObjCxxObject_get_source = $(1)/$(2).mm 177cdf0e10cSrcweir# defined by platform 178cdf0e10cSrcweir# gb_ObjCxxObject__command 179cdf0e10cSrcweir 180cdf0e10cSrcweirdefine gb_ObjCxxObject__rules 181cdf0e10cSrcweir$$(call gb_ObjCxxObject_get_target,%) : $$(call gb_ObjCxxObject_get_source,$(1),%) 182b63233d8Sdamjan $$(call gb_ObjCxxObject__command,$$@,$$*,$$<,$$(call gb_ObjCxxObject_get_dep_target,$$*)) 183cdf0e10cSrcweir 184cdf0e10cSrcweirifeq ($(gb_FULLDEPS),$(true)) 185b63233d8Sdamjan$$(call gb_ObjCxxObject_get_dep_target,%) : $$(call gb_ObjCxxObject_get_target,%) 186b63233d8Sdamjan $$(if $$(wildcard $$@),touch $$@,\ 187b63233d8Sdamjan $$(call gb_Object__command_dep,$$@,$$(call gb_ObjCxxObject_get_target,$$*))) 188cdf0e10cSrcweirendif 189cdf0e10cSrcweir 190cdf0e10cSrcweirendef 191cdf0e10cSrcweir 192cdf0e10cSrcweir$(foreach repo,$(gb_ObjCxxObject_REPOS),$(eval $(call gb_ObjCxxObject__rules,$(repo)))) 193cdf0e10cSrcweir 194cdf0e10cSrcweirifeq ($(gb_FULLDEPS),$(true)) 195cdf0e10cSrcweir$(call gb_ObjCxxObject_get_dep_target,%) : 196cdf0e10cSrcweir $(eval $(call gb_Output_error,Unable to find Objective C++ file $(call gb_ObjCxxObject_get_source,,$*) in repositories: $(gb_ObjCxxObject_REPOS))) 197cdf0e10cSrcweirendif 198cdf0e10cSrcweir 199cdf0e10cSrcweirgb_ObjCxxObject_ObjCxxObject = 200cdf0e10cSrcweir 201cdf0e10cSrcweir 202cdf0e10cSrcweir 203cdf0e10cSrcweir# LinkTarget class 204cdf0e10cSrcweir 205cdf0e10cSrcweirgb_LinkTarget_DEFAULTDEFS := $(gb_GLOBALDEFS) 206cdf0e10cSrcweir# defined by platform 207cdf0e10cSrcweir# gb_LinkTarget_CXXFLAGS 208cdf0e10cSrcweir# gb_LinkTarget_LDFLAGS 209cdf0e10cSrcweir# gb_LinkTarget_INCLUDE 210cdf0e10cSrcweir# gb_LinkTarget_INCLUDE_STL 211cdf0e10cSrcweir 212cdf0e10cSrcweir.PHONY : $(call gb_LinkTarget_get_clean_target,%) 213cdf0e10cSrcweir$(call gb_LinkTarget_get_clean_target,%) : 214cdf0e10cSrcweir $(call gb_Output_announce,$*,$(false),LNK,4) 215cdf0e10cSrcweir RESPONSEFILE=$(call var2file,$(shell $(gb_MKTEMP)),200,\ 216cdf0e10cSrcweir $(foreach object,$(COBJECTS),$(call gb_CObject_get_target,$(object))) \ 217cdf0e10cSrcweir $(foreach object,$(COBJECTS),$(call gb_CObject_get_dep_target,$(object))) \ 218cdf0e10cSrcweir $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_target,$(object))) \ 219cdf0e10cSrcweir $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_dep_target,$(object))) \ 220cdf0e10cSrcweir $(foreach object,$(OBJCXXOBJECTS),$(call gb_ObjCxxObject_get_target,$(object))) \ 221cdf0e10cSrcweir $(foreach object,$(OBJCXXOBJECTS),$(call gb_ObjCxxObject_get_dep_target,$(object))) \ 222cdf0e10cSrcweir $(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_target,$(object))) \ 223cdf0e10cSrcweir $(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_dep_target,$(object))) \ 224cdf0e10cSrcweir $(call gb_LinkTarget_get_target,$*) \ 225cdf0e10cSrcweir $(call gb_LinkTarget_get_dep_target,$*) \ 226cdf0e10cSrcweir $(call gb_LinkTarget_get_headers_target,$*) \ 227cdf0e10cSrcweir $(call gb_LinkTarget_get_external_headers_target,$*) \ 228cdf0e10cSrcweir $(DLLTARGET) \ 229cdf0e10cSrcweir $(AUXTARGETS)) && \ 230cdf0e10cSrcweir cat $${RESPONSEFILE} /dev/null | xargs -n 200 rm -f && \ 231cdf0e10cSrcweir rm -f $${RESPONSEFILE} 232cdf0e10cSrcweir 233cdf0e10cSrcweir 234cdf0e10cSrcweir# cat the deps of all objects in one file, then we need only open that one file 235cdf0e10cSrcweirdefine gb_LinkTarget__command_dep 236cdf0e10cSrcweir$(call gb_Output_announce,LNK:$(2),$(true),DEP,1) 237cdf0e10cSrcweir$(call gb_Helper_abbreviate_dirs,\ 238cdf0e10cSrcweir mkdir -p $(dir $(1)) && \ 239cdf0e10cSrcweir RESPONSEFILE=$(call var2file,$(shell $(gb_MKTEMP)),200,\ 240cdf0e10cSrcweir $(foreach object,$(3),$(call gb_CObject_get_dep_target,$(object))) \ 241cdf0e10cSrcweir $(foreach object,$(4),$(call gb_CxxObject_get_dep_target,$(object))) \ 242cdf0e10cSrcweir $(foreach object,$(5),$(call gb_ObjCxxObject_get_dep_target,$(object)))\ 24344c25570SAndre Fischer $(foreach object,$(6),$(call gb_GenCxxObject_get_dep_target,$(object)))\ 244cdf0e10cSrcweir ) && \ 245cdf0e10cSrcweir cat $${RESPONSEFILE} /dev/null | xargs -n 200 cat > $(1)) && \ 246cdf0e10cSrcweir rm -f $${RESPONSEFILE} 247cdf0e10cSrcweir 248cdf0e10cSrcweirendef 249cdf0e10cSrcweir 250cdf0e10cSrcweir$(call gb_LinkTarget_get_target,%) : $(call gb_LinkTarget_get_headers_target,%) $(gb_Helper_MISCDUMMY) 251cdf0e10cSrcweir $(call gb_LinkTarget__command,$@,$*) 252cdf0e10cSrcweir 253cdf0e10cSrcweirifeq ($(gb_FULLDEPS),$(true)) 254cdf0e10cSrcweir$(call gb_LinkTarget_get_target,%) : $(call gb_LinkTarget_get_dep_target,%) 255cdf0e10cSrcweir$(call gb_LinkTarget_get_dep_target,%) : | $(call gb_LinkTarget_get_headers_target,%) 256cdf0e10cSrcweir $(call gb_LinkTarget__command_dep,$@,$*,$(COBJECTS),$(CXXOBJECTS),$(OBJCXXOBJECTS),$(GENCXXOBJECTS)) 257cdf0e10cSrcweirendif 258cdf0e10cSrcweir 259cdf0e10cSrcweir# Ok, this is some dark voodoo: When declaring a linktarget with 260cdf0e10cSrcweir# gb_LinkTarget_LinkTarget we set SELF in the headertarget to name of the 261cdf0e10cSrcweir# target. When the rule for the headertarget is executed and SELF does not 262cdf0e10cSrcweir# match the target name, we are depending on a linktarget that was never 263cdf0e10cSrcweir# declared. In a full build exclusively in gbuild that should never happen. 264cdf0e10cSrcweir# However, partial gbuild build will not know about how to build lower level 265cdf0e10cSrcweir# linktargets, just as gbuild can not know about linktargets generated in the 266cdf0e10cSrcweir# old build.pl/dmake system. Once all is migrated, gbuild should error out 267cdf0e10cSrcweir# when is is told to depend on a linktarget it does not know about and not 268cdf0e10cSrcweir# only warn. 269cdf0e10cSrcweirdefine gb_LinkTarget__get_external_headers_check 270cdf0e10cSrcweirifneq ($$(SELF),$$*) 271cdf0e10cSrcweir$$(eval $$(call gb_Output_info,LinkTarget $$* not defined: Assuming headers to be there!,ALL)) 272cdf0e10cSrcweirendif 273cdf0e10cSrcweir$$@ : COMMAND := $$(call gb_Helper_abbreviate_dirs, mkdir -p $$(dir $$@) && touch $$@ && mkdir -p $(call gb_LinkTarget_get_target,)pdb/$$(dir $$*)) 274cdf0e10cSrcweir 275cdf0e10cSrcweirendef 276cdf0e10cSrcweir 277cdf0e10cSrcweir$(call gb_LinkTarget_get_external_headers_target,%) : 278cdf0e10cSrcweir $(eval $(gb_LinkTarget__get_external_headers_check)) 279cdf0e10cSrcweir $(COMMAND) 280cdf0e10cSrcweir 281cdf0e10cSrcweir$(call gb_LinkTarget_get_headers_target,%) : $(call gb_LinkTarget_get_external_headers_target,%) 282cdf0e10cSrcweir $(call gb_Helper_abbreviate_dirs,\ 283cdf0e10cSrcweir mkdir -p $(dir $@) && touch $@) 284cdf0e10cSrcweir 285cdf0e10cSrcweir# Explanation of some of the targets: 286cdf0e10cSrcweir# - gb_LinkTarget_get_external_headers_target is the targets that guarantees all 287cdf0e10cSrcweir# headers from linked against libraries are in OUTDIR. 288cdf0e10cSrcweir# - gb_LinkTarget_get_headers_target is the target that guarantees all headers 289cdf0e10cSrcweir# from the linked against the libraries and the linktargets own headers 290cdf0e10cSrcweir# (including generated headers) are in the OUTDIR. 291cdf0e10cSrcweir# - gb_LinkTarget_get_target links the objects into a file in WORKDIR. 292cdf0e10cSrcweir# gb_LinkTarget_get_target depends on gb_LinkTarget_get_headers_target which in 293cdf0e10cSrcweir# turn depends gb_LinkTarget_get_external_headers_target. 294cdf0e10cSrcweir# gb_LinkTarget_get_target depends additionally on the objects, which in turn 295cdf0e10cSrcweir# depend build-order only on the gb_LinkTarget_get_headers_target. The build 296cdf0e10cSrcweir# order-only dependency ensures all headers to be there for compiling and 297cdf0e10cSrcweir# dependency generation without causing all objects to be rebuild when one 298cdf0e10cSrcweir# header changes. Only the ones with an explicit dependency in their generated 299cdf0e10cSrcweir# dependency file will be rebuild. 300cdf0e10cSrcweir# 301cdf0e10cSrcweir# gb_LinkTarget_get_target is the target that links the objects into a file in 302cdf0e10cSrcweir# WORKDIR 303cdf0e10cSrcweir# Explanation of some of the variables: 304cdf0e10cSrcweir# - AUXTARGETS are the additionally generated files that need to be cleaned out 305cdf0e10cSrcweir# on clean. 306cdf0e10cSrcweir# - PCH_CXXFLAGS and PCH_DEFS are the flags that the precompiled headers will 307cdf0e10cSrcweir# be compiled with. They should never be overridden in a single object 308cdf0e10cSrcweir# files. 309cdf0e10cSrcweir# - TARGETTYPE is the type of linktarget as some platforms need very different 310cdf0e10cSrcweir# command to link different targettypes. 3113b02a9c8SDamjan Jovanovic# - VERSIONMAP is the linker script, usually used to version a dynamic 3123b02a9c8SDamjan Jovanovic# library's symbols (on *nix/Mac). 313cdf0e10cSrcweir# 314cdf0e10cSrcweir# Since most variables are set on the linktarget and not on the object, the 315cdf0e10cSrcweir# object learns about these setting via GNU makes scoping of target variables. 316cdf0e10cSrcweir# Therefore it is important that objects are only directly depended on by the 317cdf0e10cSrcweir# linktarget. This for example means that you cannot build a single object 318cdf0e10cSrcweir# alone, because then you would directly depend on the object. 319b63233d8Sdamjan# 320b63233d8Sdamjan# A note about flags: because the overriding the global variables with a target 321b63233d8Sdamjan# local variable of the same name is considered obscure, the target local 322b63233d8Sdamjan# variables have a T_ prefix. 323cdf0e10cSrcweirdefine gb_LinkTarget_LinkTarget 324cdf0e10cSrcweir$(call gb_LinkTarget_get_clean_target,$(1)) : AUXTARGETS := 325cdf0e10cSrcweir$(call gb_LinkTarget_get_external_headers_target,$(1)) : SELF := $(1) 326cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : DLLTARGET := 327cdf0e10cSrcweir$(call gb_LinkTarget_get_clean_target,$(1)) \ 328cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : COBJECTS := 329cdf0e10cSrcweir$(call gb_LinkTarget_get_clean_target,$(1)) \ 330cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : CXXOBJECTS := 331cdf0e10cSrcweir$(call gb_LinkTarget_get_clean_target,$(1)) \ 332cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : OBJCXXOBJECTS := 333cdf0e10cSrcweir$(call gb_LinkTarget_get_clean_target,$(1)) \ 334cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : GENCXXOBJECTS := 335cdf0e10cSrcweir$(call gb_LinkTarget_get_headers_target,$(1)) \ 336*8e6bd3e9SDon Lewis$(call gb_LinkTarget_get_target,$(1)) : T_CFLAGS := $$(gb_LinkTarget_CFLAGS) 337cdf0e10cSrcweir$(call gb_LinkTarget_get_headers_target,$(1)) \ 338b63233d8Sdamjan$(call gb_LinkTarget_get_target,$(1)) : T_CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS) 339cdf0e10cSrcweir$(call gb_LinkTarget_get_headers_target,$(1)) \ 340*8e6bd3e9SDon Lewis$(call gb_LinkTarget_get_target,$(1)) : PCH_CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS) $$(CXXFLAGS) 341*8e6bd3e9SDon Lewis$(call gb_LinkTarget_get_target,$(1)) : T_OBJCXXFLAGS := $$(gb_LinkTarget_OBJCXXFLAGS) 342cdf0e10cSrcweir$(call gb_LinkTarget_get_headers_target,$(1)) \ 343b63233d8Sdamjan$(call gb_LinkTarget_get_target,$(1)) : DEFS := $$(gb_LinkTarget_DEFAULTDEFS) $(CPPFLAGS) 344cdf0e10cSrcweir$(call gb_LinkTarget_get_headers_target,$(1)) \ 345b63233d8Sdamjan$(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS := $$(gb_LinkTarget_DEFAULTDEFS) $(CPPFLAGS) 346cdf0e10cSrcweir$(call gb_LinkTarget_get_headers_target,$(1)) \ 347cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : INCLUDE := $$(gb_LinkTarget_INCLUDE) 348cdf0e10cSrcweir$(call gb_LinkTarget_get_headers_target,$(1)) \ 349cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : INCLUDE_STL := $$(gb_LinkTarget_INCLUDE_STL) 350b63233d8Sdamjan$(call gb_LinkTarget_get_target,$(1)) : T_LDFLAGS := $$(gb_LinkTarget_LDFLAGS) $(LDFLAGS) 351cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : LINKED_LIBS := 352cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : LINKED_STATIC_LIBS := 35344c25570SAndre Fischer$(call gb_LinkTarget_get_target,$(1)) : EXTERNAL_LIBS := 354b63233d8Sdamjan$(call gb_LinkTarget_get_target,$(1)) : LIBS := 355cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : TARGETTYPE := 3563b02a9c8SDamjan Jovanovic$(call gb_LinkTarget_get_target,$(1)) : VERSIONMAP := 357cdf0e10cSrcweir$(call gb_LinkTarget_get_headers_target,$(1)) \ 358cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : PCH_NAME := 359cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : PCHOBJS := 360*8e6bd3e9SDon Lewis#$(call gb_LinkTarget_get_headers_target,$(1)) \ 361*8e6bd3e9SDon Lewis#$(call gb_LinkTarget_get_target,$(1)) : PDBFILE := 362cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : NATIVERES := 363cdf0e10cSrcweir 364cdf0e10cSrcweirifeq ($(gb_FULLDEPS),$(true)) 365b63233d8Sdamjan-include $(call gb_LinkTarget_get_dep_target,$(1)) 366cdf0e10cSrcweir$(call gb_LinkTarget_get_dep_target,$(1)) : COBJECTS := 367cdf0e10cSrcweir$(call gb_LinkTarget_get_dep_target,$(1)) : CXXOBJECTS := 368cdf0e10cSrcweir$(call gb_LinkTarget_get_dep_target,$(1)) : OBJCXXOBJECTS := 369cdf0e10cSrcweir$(call gb_LinkTarget_get_dep_target,$(1)) : GENCXXOBJECTS := 370*8e6bd3e9SDon Lewis$(call gb_LinkTarget_get_dep_target,$(1)) : T_CFLAGS := $$(gb_LinkTarget_CFLAGS) 371b63233d8Sdamjan$(call gb_LinkTarget_get_dep_target,$(1)) : T_CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS) 372*8e6bd3e9SDon Lewis$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS) $$(CXXFLAGS) 373*8e6bd3e9SDon Lewis$(call gb_LinkTarget_get_dep_target,$(1)) : T_OBJCXXFLAGS := $$(gb_LinkTarget_OBJCXXFLAGS) 374b63233d8Sdamjan$(call gb_LinkTarget_get_dep_target,$(1)) : DEFS := $$(gb_LinkTarget_DEFAULTDEFS) $(CPPFLAGS) 375b63233d8Sdamjan$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_DEFS := $$(gb_LinkTarget_DEFAULTDEFS) $(CPPFLAGS) 376cdf0e10cSrcweir$(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE := $$(gb_LinkTarget_INCLUDE) 377cdf0e10cSrcweir$(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE_STL := $$(gb_LinkTarget_INCLUDE_STL) 378cdf0e10cSrcweir$(call gb_LinkTarget_get_dep_target,$(1)) : TARGETTYPE := 3793b02a9c8SDamjan Jovanovic$(call gb_LinkTarget_get_dep_target,$(1)) : VERSIONMAP := 380cdf0e10cSrcweir$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_NAME := 381cdf0e10cSrcweirendif 382cdf0e10cSrcweir 383cdf0e10cSrcweirendef 384cdf0e10cSrcweir 385b63233d8Sdamjandefine gb_LinkTarget_add_defs 386b63233d8Sdamjan$(call gb_LinkTarget_get_headers_target,$(1)) \ 387b63233d8Sdamjan$(call gb_LinkTarget_get_target,$(1)) : DEFS += $(2) 388b63233d8Sdamjan$(call gb_LinkTarget_get_headers_target,$(1)) \ 389b63233d8Sdamjan$(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS += $(2) 390b63233d8Sdamjanifeq ($(gb_FULLDEPS),$(true)) 391b63233d8Sdamjan$(call gb_LinkTarget_get_dep_target,$(1)) : DEFS += $(2) 392b63233d8Sdamjan$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_DEFS += $(2) 393b63233d8Sdamjanendif 394b63233d8Sdamjanendef 395b63233d8Sdamjan 396cdf0e10cSrcweirdefine gb_LinkTarget_set_defs 397b63233d8Sdamjanifeq (,) 398b63233d8Sdamjan$$(call gb_Output_error,\ 399b63233d8Sdamjan gb_LinkTarget_set_defs: use gb_LinkTarget_add_defs instead.) 400b63233d8Sdamjanelse 401cdf0e10cSrcweir$(call gb_LinkTarget_get_headers_target,$(1)) \ 402cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : DEFS := $(2) 403cdf0e10cSrcweir$(call gb_LinkTarget_get_headers_target,$(1)) \ 404cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS := $(2) 405cdf0e10cSrcweir 406cdf0e10cSrcweirifeq ($(gb_FULLDEPS),$(true)) 407cdf0e10cSrcweir$(call gb_LinkTarget_get_dep_target,$(1)) : DEFS := $(2) 408cdf0e10cSrcweir$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_DEFS := $(2) 409cdf0e10cSrcweirendif 410b63233d8Sdamjanendif 411b63233d8Sdamjan 412b63233d8Sdamjanendef 413b63233d8Sdamjan 414b63233d8Sdamjandefine gb_LinkTarget_add_cflags 415b63233d8Sdamjan$(call gb_LinkTarget_get_target,$(1)) : T_CFLAGS += $(2) 416b63233d8Sdamjanifeq ($(gb_FULLDEPS),$(true)) 417b63233d8Sdamjan$(call gb_LinkTarget_get_dep_target,$(1)) : T_CFLAGS += $(2) 418b63233d8Sdamjanendif 419cdf0e10cSrcweir 420cdf0e10cSrcweirendef 421cdf0e10cSrcweir 422cdf0e10cSrcweirdefine gb_LinkTarget_set_cflags 423b63233d8Sdamjanifeq (,) 424b63233d8Sdamjan$$(call gb_Output_error,\ 425b63233d8Sdamjan gb_LinkTarget_set_cflags: use gb_LinkTarget_add_cflags instead.) 426b63233d8Sdamjanelse 427b63233d8Sdamjan$(call gb_LinkTarget_get_target,$(1)) : T_CFLAGS := $(2) 428cdf0e10cSrcweirifeq ($(gb_FULLDEPS),$(true)) 429b63233d8Sdamjan$(call gb_LinkTarget_get_dep_target,$(1)) : T_CFLAGS := $(2) 430b63233d8Sdamjanendif 431cdf0e10cSrcweirendif 432cdf0e10cSrcweir 433cdf0e10cSrcweirendef 434cdf0e10cSrcweir 435b63233d8Sdamjandefine gb_LinkTarget_add_cxxflags 436b63233d8Sdamjan$(call gb_LinkTarget_get_headers_target,$(1)) \ 437b63233d8Sdamjan$(call gb_LinkTarget_get_target,$(1)) : T_CXXFLAGS += $(2) 438b63233d8Sdamjan$(call gb_LinkTarget_get_headers_target,$(1)) \ 439b63233d8Sdamjan$(call gb_LinkTarget_get_target,$(1)) : PCH_CXXFLAGS += $(2) 440b63233d8Sdamjanifeq ($(gb_FULLDEPS),$(true)) 441b63233d8Sdamjan$(call gb_LinkTarget_get_dep_target,$(1)) : T_CXXFLAGS += $(2) 442b63233d8Sdamjan$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_CXXFLAGS += $(2) 443b63233d8Sdamjanendif 444b63233d8Sdamjanendef 445b63233d8Sdamjan 446cdf0e10cSrcweirdefine gb_LinkTarget_set_cxxflags 447b63233d8Sdamjanifeq (,) 448b63233d8Sdamjan$$(call gb_Output_error,\ 449b63233d8Sdamjan gb_LinkTarget_set_cxxflags: use gb_LinkTarget_add_cxxflags instead.) 450b63233d8Sdamjanelse 451cdf0e10cSrcweir$(call gb_LinkTarget_get_headers_target,$(1)) \ 452b63233d8Sdamjan$(call gb_LinkTarget_get_target,$(1)) : T_CXXFLAGS := $(2) 453cdf0e10cSrcweir$(call gb_LinkTarget_get_headers_target,$(1)) \ 454cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : PCH_CXXFLAGS := $(2) 455cdf0e10cSrcweirifeq ($(gb_FULLDEPS),$(true)) 456b63233d8Sdamjan$(call gb_LinkTarget_get_dep_target,$(1)) : T_CXXFLAGS := $(2) 457cdf0e10cSrcweir$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_CXXFLAGS := $(2) 458cdf0e10cSrcweirendif 459b63233d8Sdamjanendif 460b63233d8Sdamjan 461b63233d8Sdamjanendef 462cdf0e10cSrcweir 463b63233d8Sdamjandefine gb_LinkTarget_add_objcxxflags 464b63233d8Sdamjan$(call gb_LinkTarget_get_target,$(1)) : T_OBJCXXFLAGS += $(2) 465b63233d8Sdamjanifeq ($(gb_FULLDEPS),$(true)) 466b63233d8Sdamjan$(call gb_LinkTarget_get_dep_target,$(1)) : T_OBJCXXFLAGS += $(2) 467b63233d8Sdamjanendif 468cdf0e10cSrcweirendef 469cdf0e10cSrcweir 470cdf0e10cSrcweirdefine gb_LinkTarget_set_objcxxflags 471b63233d8Sdamjanifeq (,) 472b63233d8Sdamjan$$(call gb_Output_error,\ 473b63233d8Sdamjan gb_LinkTarget_set_objcxxflags: use gb_LinkTarget_add_objcxxflags instead.) 474b63233d8Sdamjanelse 475b63233d8Sdamjan$(call gb_LinkTarget_get_target,$(1)) : T_OBJCXXFLAGS := $(2) 476cdf0e10cSrcweirifeq ($(gb_FULLDEPS),$(true)) 477b63233d8Sdamjan$(call gb_LinkTarget_get_dep_target,$(1)) : T_OBJCXXFLAGS := $(2) 478b63233d8Sdamjanendif 479cdf0e10cSrcweirendif 480*8e6bd3e9SDon Lewisendef 481*8e6bd3e9SDon Lewis 482*8e6bd3e9SDon Lewisdefine gb_LinkTarget_set_c_optimization 483*8e6bd3e9SDon Lewis$(call gb_CObject_get_target,$(1)) : CFLAGS := $(filter-out $(gb_COMPILEROPTFLAGS),$(CFLAGS)) $(2) 484*8e6bd3e9SDon Lewisendef 485*8e6bd3e9SDon Lewis 486*8e6bd3e9SDon Lewisdefine gb_LinkTarget_set_cxx_optimization 487*8e6bd3e9SDon Lewis$(call gb_CxxObject_get_target,$(1)) : CXXFLAGS := $(filter-out $(gb_COMPILEROPTFLAGS),$(CXXFLAGS)) $(2) 488*8e6bd3e9SDon Lewisendef 489*8e6bd3e9SDon Lewis 490*8e6bd3e9SDon Lewisdefine gb_LinkTarget_set_gencxx_optimization 491*8e6bd3e9SDon Lewis$(call gb_GenCxxObject_get_target,$(1)) : CXXFLAGS := $(filter-out $(gb_COMPILEROPTFLAGS),$(CXXFLAGS)) $(2) 492*8e6bd3e9SDon Lewisendef 493cdf0e10cSrcweir 494*8e6bd3e9SDon Lewisdefine gb_LinkTarget_set_objcxx_optimization 495*8e6bd3e9SDon Lewis$(call gb_ObjCxxObject_get_target,$(1)) : OBJCXXFLAGS := $(filter-out $(gb_COMPILEROPTFLAGS),$(OBJCXXFLAGS)) $(2) 496cdf0e10cSrcweirendef 497cdf0e10cSrcweir 498cdf0e10cSrcweirdefine gb_LinkTarget_set_include 499cdf0e10cSrcweir$(call gb_LinkTarget_get_headers_target,$(1)) \ 500cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : INCLUDE := $(2) 501cdf0e10cSrcweirifeq ($(gb_FULLDEPS),$(true)) 502cdf0e10cSrcweir$(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE := $(2) 503cdf0e10cSrcweirendif 504cdf0e10cSrcweir 505cdf0e10cSrcweirendef 506cdf0e10cSrcweir 507cdf0e10cSrcweirdefine gb_LinkTarget_set_include_stl 508cdf0e10cSrcweir$(call gb_LinkTarget_get_headers_target,$(1)) \ 509cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : INCLUDE_STL := $(2) 510cdf0e10cSrcweirifeq ($(gb_FULLDEPS),$(true)) 511cdf0e10cSrcweir$(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE_STL := $(2) 512cdf0e10cSrcweirendif 513cdf0e10cSrcweir 514cdf0e10cSrcweirendef 515cdf0e10cSrcweir 516b63233d8Sdamjandefine gb_LinkTarget_add_ldflags 517b63233d8Sdamjan$(call gb_LinkTarget_get_target,$(1)) : T_LDFLAGS += $(2) 518b63233d8Sdamjanendef 519b63233d8Sdamjan 520b63233d8Sdamjan# real use in RepositoryExternal.mk 521cdf0e10cSrcweirdefine gb_LinkTarget_set_ldflags 522b63233d8Sdamjan$(call gb_LinkTarget_get_target,$(1)) : T_LDFLAGS := $(2) 523b63233d8Sdamjanendef 524b63233d8Sdamjan 525b63233d8Sdamjandefine gb_LinkTarget_add_api 526b63233d8Sdamjan$(call gb_LinkTarget_get_external_headers_target,$(1)) :| \ 527b63233d8Sdamjan $$(foreach api,$(2),$$(call gb_Package_get_target,$$(api)_inc)) 528b63233d8Sdamjan$(call gb_LinkTarget_get_headers_target,$(1)) \ 529b63233d8Sdamjan$(call gb_LinkTarget_get_target,$(1)) : INCLUDE += $$(foreach api,$(2),-I$(OUTDIR)/inc/$$(api)) 530b63233d8Sdamjanifeq ($(gb_FULLDEPS),$(true)) 531b63233d8Sdamjan$(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE += $$(foreach api,$(2),-I$(OUTDIR)/inc/$$(api)) 532b63233d8Sdamjanendif 533b63233d8Sdamjan 534b63233d8Sdamjanendef 535b63233d8Sdamjan 536b63233d8Sdamjandefine gb_LinkTarget_add_libs 537b63233d8Sdamjan$(call gb_LinkTarget_get_target,$(1)) : LIBS += $(2) 538cdf0e10cSrcweirendef 539cdf0e10cSrcweir 540cdf0e10cSrcweirdefine gb_LinkTarget_add_linked_libs 541cdf0e10cSrcweirifneq (,$$(filter-out $(gb_Library_KNOWNLIBS),$(2))) 542cdf0e10cSrcweir$$(eval $$(call gb_Output_info,currently known libraries are: $(sort $(gb_Library_KNOWNLIBS)),ALL)) 543cdf0e10cSrcweir$$(eval $$(call gb_Output_error,Cannot link against library/libraries $$(filter-out $(gb_Library_KNOWNLIBS),$(2)). Libraries must be registered in Repository.mk)) 544cdf0e10cSrcweirendif 545cdf0e10cSrcweir 546cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : LINKED_LIBS += $(2) 547cdf0e10cSrcweir 548cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : $$(foreach lib,$(2),$$(call gb_Library_get_target,$$(lib))) 549cdf0e10cSrcweir$(call gb_LinkTarget_get_external_headers_target,$(1)) : \ 550cdf0e10cSrcweir$$(foreach lib,$(2),$$(call gb_Library_get_headers_target,$$(lib))) 551cdf0e10cSrcweir 552cdf0e10cSrcweirendef 553cdf0e10cSrcweir 554cdf0e10cSrcweirdefine gb_LinkTarget_add_linked_static_libs 555cdf0e10cSrcweirifneq (,$$(filter-out $(gb_StaticLibrary_KNOWNLIBS),$(2))) 556cdf0e10cSrcweir$$(eval $$(call gb_Output_info, currently known static libraries are: $(sort $(gb_StaticLibrary_KNOWNLIBS)),ALL)) 557cdf0e10cSrcweir$$(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)) 558cdf0e10cSrcweirendif 559cdf0e10cSrcweir 560cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : LINKED_STATIC_LIBS += $(2) 561cdf0e10cSrcweir 562cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : $$(foreach lib,$(2),$$(call gb_StaticLibrary_get_target,$$(lib))) 563cdf0e10cSrcweir$(call gb_LinkTarget_get_external_headers_target,$(1)) : \ 564cdf0e10cSrcweir$$(foreach lib,$(2),$$(call gb_StaticLibrary_get_headers_target,$$(lib))) 565cdf0e10cSrcweir 566cdf0e10cSrcweirendef 567cdf0e10cSrcweir 56844c25570SAndre Fischer# 56944c25570SAndre Fischer# Add external libs for linking. External libaries are not built by any module. 57044c25570SAndre Fischer# 57144c25570SAndre Fischer# The list of libraries is used as is, ie it is not filtered with gb_Library_KNOWNLIBS. 57244c25570SAndre Fischer# 57344c25570SAndre Fischer# An error is signaled, when any of the library names does not look like 57444c25570SAndre Fischer# a base name, ie is prefixed by -l or lib or is folled by .lib or .so. 57544c25570SAndre Fischer# 57644c25570SAndre Fischer# @param target 57744c25570SAndre Fischer# @param libraries 57844c25570SAndre Fischer# A list of (base names of) libraries that will be added to the target 57944c25570SAndre Fischer# local EXTERNAL_LIBS variable and eventually linked in when the 58044c25570SAndre Fischer# target is made. 58144c25570SAndre Fischer# 58244c25570SAndre Fischerdefine gb_LinkTarget_add_external_libs 58344c25570SAndre Fischer 58444c25570SAndre Fischer# Make sure that all libraries are given as base names. 58544c25570SAndre Fischerifneq (,$$(filter -l% lib% %.so %.lib, $(2))) 58686e1cf34SPedro Giffuni$$(eval $$(call gb_Output_announce,ERROR: Please give only library basenames to gb_LinkTarget_add_external_libs)) 58744c25570SAndre Fischer$$(eval $$(call gb_Output_announce,ERROR: (no prefixes -l% or lib%, no suffixes %.so or %.lib))) 58844c25570SAndre Fischer$$(eval $$(call gb_Output_announce,ERROR: libraries given: $(2))) 58944c25570SAndre Fischer$$(eval $$(call gb_Output_announce,ERROR: offending: $$(filter -l% lib% %.so %.lib, $(2)))) 59044c25570SAndre Fischer$$(eval $$(call gb_Output_error, )) 59144c25570SAndre Fischerendif 59244c25570SAndre Fischer 59344c25570SAndre Fischer$(call gb_LinkTarget_get_target,$(1)) : EXTERNAL_LIBS += $(2) 59444c25570SAndre Fischer 59544c25570SAndre Fischer$(call gb_LinkTarget_get_target,$(1)) : $$(foreach lib,$(2),$$(call gb_Library_get_target,$$(lib))) 59644c25570SAndre Fischer$(call gb_LinkTarget_get_external_headers_target,$(1)) : \ 59744c25570SAndre Fischer$$(foreach lib,$(2),$$(call gb_Library_get_headers_target,$$(lib))) 59844c25570SAndre Fischer 59944c25570SAndre Fischerendef 60044c25570SAndre Fischer 60144c25570SAndre Fischer 602cdf0e10cSrcweirdefine gb_LinkTarget_add_cobject 603cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : COBJECTS += $(2) 604cdf0e10cSrcweir$(call gb_LinkTarget_get_clean_target,$(1)) : COBJECTS += $(2) 605cdf0e10cSrcweir 606cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : $(call gb_CObject_get_target,$(2)) 607cdf0e10cSrcweir$(call gb_CObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1)) 608b63233d8Sdamjan$(call gb_CObject_get_target,$(2)) : T_CFLAGS += $(3) 609cdf0e10cSrcweir 610cdf0e10cSrcweirifeq ($(gb_FULLDEPS),$(true)) 611cdf0e10cSrcweir$(call gb_LinkTarget_get_dep_target,$(1)) : COBJECTS += $(2) 612cdf0e10cSrcweir$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_CObject_get_dep_target,$(2)) 613cdf0e10cSrcweirendif 614cdf0e10cSrcweir 615cdf0e10cSrcweirendef 616cdf0e10cSrcweir 617cdf0e10cSrcweirdefine gb_LinkTarget_add_cxxobject 618cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : CXXOBJECTS += $(2) 619cdf0e10cSrcweir$(call gb_LinkTarget_get_clean_target,$(1)) : CXXOBJECTS += $(2) 620cdf0e10cSrcweir 621cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : $(call gb_CxxObject_get_target,$(2)) 622cdf0e10cSrcweir$(call gb_CxxObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1)) 623b63233d8Sdamjan$(call gb_CxxObject_get_target,$(2)) : T_CXXFLAGS += $(3) 624cdf0e10cSrcweir 625cdf0e10cSrcweirifeq ($(gb_FULLDEPS),$(true)) 626cdf0e10cSrcweir$(call gb_LinkTarget_get_dep_target,$(1)) : CXXOBJECTS += $(2) 627cdf0e10cSrcweir$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_CxxObject_get_dep_target,$(2)) 628cdf0e10cSrcweirendif 629cdf0e10cSrcweir 630cdf0e10cSrcweirendef 631cdf0e10cSrcweir 632cdf0e10cSrcweirdefine gb_LinkTarget_add_objcxxobject 633cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : OBJCXXOBJECTS += $(2) 634cdf0e10cSrcweir$(call gb_LinkTarget_get_clean_target,$(1)) : OBJCXXOBJECTS += $(2) 635cdf0e10cSrcweir 636cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : $(call gb_ObjCxxObject_get_target,$(2)) 637cdf0e10cSrcweir$(call gb_ObjCxxObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1)) 638b63233d8Sdamjan$(call gb_ObjCxxObject_get_target,$(2)) : T_OBJCXXFLAGS += $(3) 639cdf0e10cSrcweir 640cdf0e10cSrcweirifeq ($(gb_FULLDEPS),$(true)) 641cdf0e10cSrcweir$(call gb_LinkTarget_get_dep_target,$(1)) : OBJCXXOBJECTS += $(2) 642cdf0e10cSrcweir$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_ObjCxxObject_get_dep_target,$(2)) 643cdf0e10cSrcweirendif 644cdf0e10cSrcweir 645cdf0e10cSrcweirendef 646cdf0e10cSrcweir 647cdf0e10cSrcweirdefine gb_LinkTarget_add_generated_cxx_object 648cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : GENCXXOBJECTS += $(2) 649cdf0e10cSrcweir$(call gb_LinkTarget_get_clean_target,$(1)) : GENCXXOBJECTS += $(2) 650cdf0e10cSrcweir 651cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : $(call gb_GenCxxObject_get_target,$(2)) 652cdf0e10cSrcweir$(call gb_GenCxxObject_get_source,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1)) 653*8e6bd3e9SDon Lewis$(call gb_GenCxxObject_get_target,$(2)) : T_CXXFLAGS += $(3) 654cdf0e10cSrcweir 655cdf0e10cSrcweirifeq ($(gb_FULLDEPS),$(true)) 656cdf0e10cSrcweir$(call gb_LinkTarget_get_dep_target,$(1)) : GENCXXOBJECTS += $(2) 657cdf0e10cSrcweir$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_GenCxxObject_get_dep_target,$(2)) 658cdf0e10cSrcweirendif 659cdf0e10cSrcweir 660cdf0e10cSrcweirendef 661cdf0e10cSrcweir 662cdf0e10cSrcweirdefine gb_LinkTarget_add_noexception_object 663*8e6bd3e9SDon Lewis$(call gb_LinkTarget_add_cxxobject,$(1),$(2),$(gb_LinkTarget_NOEXCEPTIONFLAGS)) 664cdf0e10cSrcweirendef 665cdf0e10cSrcweir 666cdf0e10cSrcweirdefine gb_LinkTarget_add_exception_object 667*8e6bd3e9SDon Lewis$(call gb_LinkTarget_add_cxxobject,$(1),$(2),$(gb_LinkTarget_EXCEPTIONFLAGS)) 668cdf0e10cSrcweirendef 669cdf0e10cSrcweir 670cdf0e10cSrcweirdefine gb_LinkTarget_add_cobjects 671cdf0e10cSrcweir$(foreach obj,$(2),$(call gb_LinkTarget_add_cobject,$(1),$(obj),$(3))) 672cdf0e10cSrcweirendef 673cdf0e10cSrcweir 674cdf0e10cSrcweirdefine gb_LinkTarget_add_cxxobjects 675cdf0e10cSrcweir$(foreach obj,$(2),$(call gb_LinkTarget_add_cxxobject,$(1),$(obj),$(3))) 676cdf0e10cSrcweirendef 677cdf0e10cSrcweir 678cdf0e10cSrcweirdefine gb_LinkTarget_add_objcxxobjects 679cdf0e10cSrcweir$(foreach obj,$(2),$(call gb_LinkTarget_add_objcxxobject,$(1),$(obj),$(3))) 680cdf0e10cSrcweirendef 681cdf0e10cSrcweir 682cdf0e10cSrcweirdefine gb_LinkTarget_add_noexception_objects 683cdf0e10cSrcweir$(foreach obj,$(2),$(call gb_LinkTarget_add_noexception_object,$(1),$(obj))) 684cdf0e10cSrcweirendef 685cdf0e10cSrcweir 686cdf0e10cSrcweirdefine gb_LinkTarget_add_exception_objects 687cdf0e10cSrcweir$(foreach obj,$(2),$(call gb_LinkTarget_add_exception_object,$(1),$(obj))) 688cdf0e10cSrcweirendef 689cdf0e10cSrcweir 690cdf0e10cSrcweirdefine gb_LinkTarget_add_generated_exception_object 691cdf0e10cSrcweir$(call gb_LinkTarget_add_generated_cxx_object,$(1),$(2),$(gb_LinkTarget_EXCEPTIONFLAGS)) 692cdf0e10cSrcweirendef 693cdf0e10cSrcweir 694cdf0e10cSrcweirdefine gb_LinkTarget_add_generated_exception_objects 695cdf0e10cSrcweir$(foreach obj,$(2),$(call gb_LinkTarget_add_generated_exception_object,$(1),$(obj))) 696cdf0e10cSrcweirendef 697cdf0e10cSrcweir 698cdf0e10cSrcweirdefine gb_LinkTarget_set_targettype 699cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) \ 700cdf0e10cSrcweir$(call gb_LinkTarget_get_dep_target,$(1)) : TARGETTYPE := $(2) 701cdf0e10cSrcweirendef 702cdf0e10cSrcweir 7033b02a9c8SDamjan Jovanovicdefine gb_LinkTarget_set_versionmap 7043b02a9c8SDamjan Jovanovic$(call gb_LinkTarget_get_target,$(1)) \ 7053b02a9c8SDamjan Jovanovic$(call gb_LinkTarget_get_dep_target,$(1)) : VERSIONMAP := $(2) 7063b02a9c8SDamjan Jovanovicendef 7073b02a9c8SDamjan Jovanovic 708cdf0e10cSrcweirdefine gb_LinkTarget_set_dlltarget 709cdf0e10cSrcweir$(call gb_LinkTarget_get_clean_target,$(1)) \ 710cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : DLLTARGET := $(2) 711cdf0e10cSrcweirendef 712cdf0e10cSrcweir 713cdf0e10cSrcweirdefine gb_LinkTarget_set_auxtargets 714cdf0e10cSrcweir$(call gb_LinkTarget_get_clean_target,$(1)) : AUXTARGETS := $(2) 715cdf0e10cSrcweirendef 716cdf0e10cSrcweir 717cdf0e10cSrcweirdefine gb_LinkTarget__add_internal_headers 718cdf0e10cSrcweir$(call gb_LinkTarget_get_headers_target,$(1)) : $(2) 719cdf0e10cSrcweir$(2) :| $(call gb_LinkTarget_get_external_headers_target,$(1)) 720cdf0e10cSrcweir 721cdf0e10cSrcweirendef 722cdf0e10cSrcweir 723cdf0e10cSrcweirdefine gb_LinkTarget_add_package_headers 724cdf0e10cSrcweir$(foreach package,$(2),$(call gb_LinkTarget__add_internal_headers,$(1),$(call gb_Package_get_target,$(package)))) 725cdf0e10cSrcweir$(call gb_LinkTarget_get_clean_target,$(1)) : $(foreach package,$(2),$(call gb_Package_get_clean_target,$(package))) 726cdf0e10cSrcweir 727cdf0e10cSrcweirendef 728cdf0e10cSrcweir 729cdf0e10cSrcweirdefine gb_LinkTarget_add_sdi_headers 730cdf0e10cSrcweir$(call gb_LinkTarget__add_internal_headers,$(1),$(foreach sdi,$(2),$(call gb_SdiTarget_get_target,$(sdi)))) 731cdf0e10cSrcweir$(call gb_LinkTarget_get_clean_target,$(1)) : $(foreach sdi,$(2),$(call gb_SdiTarget_get_clean_target,$(sdi))) 732cdf0e10cSrcweirendef 733cdf0e10cSrcweir 734cdf0e10cSrcweirdefine gb_LinkTarget__add_precompiled_header_impl 735cdf0e10cSrcweir$(call gb_LinkTarget__add_internal_headers,$(1),$(call gb_PrecompiledHeader_get_target,$(3))) 736cdf0e10cSrcweir$(call gb_LinkTarget_get_clean_target,$(1)) : $(call gb_PrecompiledHeader_get_clean_target,$(3)) 737cdf0e10cSrcweir$(call gb_PrecompiledHeader_get_target,$(3)) : $(2).cxx 738cdf0e10cSrcweir 739cdf0e10cSrcweir$(call gb_LinkTarget__add_internal_headers,$(1),$(call gb_NoexPrecompiledHeader_get_target,$(3))) 740cdf0e10cSrcweir$(call gb_LinkTarget_get_clean_target,$(1)) : $(call gb_NoexPrecompiledHeader_get_clean_target,$(3)) 741cdf0e10cSrcweir$(call gb_NoexPrecompiledHeader_get_target,$(3)) : $(2).cxx 742cdf0e10cSrcweir 743cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : PCH_NAME := $(3) 744cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : PCHOBJS = $(call gb_PrecompiledHeader_get_target,$(3)).obj $(call gb_NoexPrecompiledHeader_get_target,$(3)).obj 745cdf0e10cSrcweir 746cdf0e10cSrcweir$(call gb_LinkTarget_get_headers_target,$(1)) \ 747cdf0e10cSrcweir$(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS = $$(DEFS) 748cdf0e10cSrcweirifeq ($(gb_FULLDEPS),$(true)) 749cdf0e10cSrcweir-include \ 750cdf0e10cSrcweir $(call gb_PrecompiledHeader_get_dep_target,$(3)) \ 751cdf0e10cSrcweir $(call gb_NoexPrecompiledHeader_get_dep_target,$(3)) 7527517f704Struckman$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_NAME := $(3) 753cdf0e10cSrcweir$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_DEFS = $$(DEFS) 754cdf0e10cSrcweirendif 755cdf0e10cSrcweir 756cdf0e10cSrcweirendef 757cdf0e10cSrcweir 758cdf0e10cSrcweirdefine gb_LinkTarget_add_precompiled_header 759cdf0e10cSrcweirifeq ($(gb_ENABLE_PCH),$(true)) 760cdf0e10cSrcweir$(call gb_LinkTarget__add_precompiled_header_impl,$(1),$(2),$(notdir $(2))) 761cdf0e10cSrcweirendif 762cdf0e10cSrcweir 763cdf0e10cSrcweirendef 764cdf0e10cSrcweir 765b63233d8Sdamjan# this forwards to functions that must be defined in RepositoryExternal.mk. 766b63233d8Sdamjan# $(call gb_LinkTarget_use_external,library,external) 767b63233d8Sdamjandefine gb_LinkTarget_use_external 768b63233d8Sdamjan$(eval $(if $(value gb_LinkTarget__use_$(2)),\ 769b63233d8Sdamjan $(call gb_LinkTarget__use_$(2),$(1)),\ 770b63233d8Sdamjan $(error gb_LinkTarget_use_external: unknown external: $(2)))) 771b63233d8Sdamjanendef 772b63233d8Sdamjan 773b63233d8Sdamjan# $(call gb_LinkTarget_use_externals,library,externals) 774b63233d8Sdamjangb_LinkTarget_use_externals = \ 775b63233d8Sdamjan $(foreach external,$(2),$(call gb_LinkTarget_use_external,$(1),$(external))) 776b63233d8Sdamjan 777b63233d8Sdamjan 778cdf0e10cSrcweir# vim: set noet sw=4 ts=4: 779