xref: /trunk/main/solenv/gbuild/LinkTarget.mk (revision 8e6bd3e9)
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