xref: /trunk/main/solenv/gbuild/LinkTarget.mk (revision e6091915)
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#the following user-defined variables are supported:
25# CPPFLAGS
26# CFLAGS
27# CXXFLAGS
28# OBJCXXFLAGS
29# LDFLAGS
30
31# CFLAGS from environment override debug/optimization flags
32ifeq ($(gb_DEBUGLEVEL),2)
33CFLAGS ?= $(gb_COMPILEROPTFLAGS) $(gb_DEBUG_CFLAGS)
34CXXFLAGS ?= $(gb_COMPILEROPTFLAGS) $(gb_DEBUG_CFLAGS)
35OBJCXXFLAGS ?= $(gb_COMPILEROPTFLAGS) $(gb_DEBUG_CFLAGS)
36else
37CFLAGS ?= $(gb_COMPILEROPTFLAGS)
38CXXFLAGS ?= $(gb_COMPILEROPTFLAGS)
39OBJCXXFLAGS ?= $(gb_COMPILEROPTFLAGS)
40endif
41
42
43# For every object there is a dep file (if gb_FULLDEPS is active).
44# The dep file depends on the object: the Object__command also updates the
45# dep file as a side effect.
46# In the dep file rule just touch it so it's newer than the object.
47
48# The gb_Object__command_dep generates an "always rebuild" dep file;
49# It is _only_ used in case the user deletes the object dep file.
50ifeq ($(gb_FULLDEPS),$(true))
51define gb_Object__command_dep
52mkdir -p $(dir $(1)) && \
53	echo '$(2) : $$(gb_Helper_PHONY)' > $(1)
54
55endef
56else
57gb_Object__command_dep = \
58 $(call gb_Output_error,gb_Object__command_dep is only for gb_FULLDEPS)
59endif
60
61
62# CObject class
63
64gb_CObject_REPOS := $(gb_REPOS)
65
66gb_CObject_get_source = $(1)/$(2).c
67# defined by platform
68#  gb_CObject__command
69
70define gb_CObject__rules
71$$(call gb_CObject_get_target,%) : $$(call gb_CObject_get_source,$(1),%)
72	$$(call gb_CObject__command,$$@,$$*,$$<,$$(call gb_CObject_get_dep_target,$$*))
73
74ifeq ($(gb_FULLDEPS),$(true))
75$$(call gb_CObject_get_dep_target,%) : $$(call gb_CObject_get_target,%)
76	$$(if $$(wildcard $$@),touch $$@,\
77	  $$(call gb_Object__command_dep,$$@,$$(call gb_CObject_get_target,$$*)))
78endif
79
80endef
81
82$(foreach repo,$(gb_CObject_REPOS),$(eval $(call gb_CObject__rules,$(repo))))
83
84$(call gb_CObject_get_dep_target,%) :
85	$(eval $(call gb_Output_error,Unable to find plain C file $(call gb_CObject_get_source,,$*) in the repositories: $(gb_CObject_REPOS)))
86
87gb_CObject_CObject =
88
89
90# CxxObject class
91
92gb_CxxObject_REPOS := $(gb_REPOS)
93
94gb_CxxObject_get_source = $(1)/$(2).cxx
95# defined by platform
96#  gb_CxxObject__command
97
98# Only enable PCH if the PCH_CXXFLAGS and the PCH_DEFS (from the linktarget)
99# are the same as the T_CXXFLAGS and DEFS we want to use for this object. This
100# should usually be the case.  The DEFS/T_CXXFLAGS would have too be manually
101# overridden for one object file for them to differ.  PCH_CXXFLAGS/PCH_DEFS
102# should never be overridden on an object -- they should be the same as for the
103# whole linktarget. In general it should be cleaner to use a static library
104# compiled with different flags and link that in rather than mixing different
105# flags in one linktarget.
106define gb_CxxObject__set_pchflags
107ifeq ($(gb_ENABLE_PCH),$(true))
108ifneq ($(strip $$(PCH_NAME)),)
109ifeq ($$(sort $$(PCH_CXXFLAGS) $$(PCH_DEFS) $$(gb_LinkTarget_EXCEPTIONFLAGS)),$$(sort $$(T_CXXFLAGS) $$(DEFS)))
110$$@ : PCHFLAGS := $$(call gb_PrecompiledHeader_get_enableflags,$$(PCH_NAME))
111else
112ifeq ($$(sort $$(PCH_CXXFLAGS) $$(PCH_DEFS) $$(gb_LinkTarget_NOEXCEPTIONFLAGS)),$$(sort $$(T_CXXFLAGS) $$(DEFS)))
113$$@ : PCHFLAGS := $$(call gb_NoexPrecompiledHeader_get_enableflags,$$(PCH_NAME))
114else
115$$(info No precompiled header available for $$*.)
116$$(info precompiled header flags (  ex) : $$(sort $$(PCH_CXXFLAGS) $$(PCH_DEFS) $$(gb_LinkTarget_EXCEPTIONFLAGS)))
117$$(info precompiled header flags (noex) : $$(sort $$(PCH_CXXFLAGS) $$(PCH_DEFS) $$(gb_LinkTarget_NOEXCEPTIONFLAGS)))
118$$(info .           object flags        : $$(sort $$(T_CXXFLAGS) $$(DEFS)))
119$$@ : PCHFLAGS :=
120endif
121endif
122endif
123endif
124endef
125
126define gb_CxxObject__rules
127$$(call gb_CxxObject_get_target,%) : $$(call gb_CxxObject_get_source,$(1),%)
128	$$(eval $$(gb_CxxObject__set_pchflags))
129	$$(call gb_CxxObject__command,$$@,$$*,$$<,$$(call gb_CxxObject_get_dep_target,$$*))
130
131ifeq ($(gb_FULLDEPS),$(true))
132$$(call gb_CxxObject_get_dep_target,%) : $$(call gb_CxxObject_get_target,%)
133	$$(if $$(wildcard $$@),touch $$@,\
134	  $$(eval $$(gb_CxxObject__set_pchflags))\
135	  $$(call gb_Object__command_dep,$$@,$$(call gb_CxxObject_get_target,$$*)))
136endif
137
138endef
139
140$(foreach repo,$(gb_CxxObject_REPOS),$(eval $(call gb_CxxObject__rules,$(repo))))
141
142ifeq ($(gb_FULLDEPS),$(true))
143$(call gb_CxxObject_get_dep_target,%) :
144	$(eval $(call gb_Output_error,Unable to find C++ file $(call gb_CxxObject_get_source,,$*) in repositories: $(gb_CxxObject_REPOS)))
145
146endif
147
148gb_CxxObject_CxxObject =
149
150
151# GenCxxObject class
152
153gb_GenCxxObject_get_source = $(WORKDIR)/$(1).cxx
154# defined by platform
155#  gb_CxxObject__command
156
157$(call gb_GenCxxObject_get_target,%) : $(call gb_GenCxxObject_get_source,%)
158	$(call gb_CxxObject__command,$@,$*,$<,$(call gb_GenCxxObject_get_dep_target,$*))
159
160ifeq ($(gb_FULLDEPS),$(true))
161$(call gb_GenCxxObject_get_dep_target,%) : $(call gb_GenCxxObject_get_target,%)
162	$(if $(wildcard $@),touch $@,\
163	  $(call gb_Object__command_dep,$@,$(call gb_GenCxxObject_get_target,$*)))
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
177define gb_ObjCxxObject__rules
178$$(call gb_ObjCxxObject_get_target,%) : $$(call gb_ObjCxxObject_get_source,$(1),%)
179	$$(call gb_ObjCxxObject__command,$$@,$$*,$$<,$$(call gb_ObjCxxObject_get_dep_target,$$*))
180
181ifeq ($(gb_FULLDEPS),$(true))
182$$(call gb_ObjCxxObject_get_dep_target,%) : $$(call gb_ObjCxxObject_get_target,%)
183	$$(if $$(wildcard $$@),touch $$@,\
184	  $$(call gb_Object__command_dep,$$@,$$(call gb_ObjCxxObject_get_target,$$*)))
185endif
186
187endef
188
189$(foreach repo,$(gb_ObjCxxObject_REPOS),$(eval $(call gb_ObjCxxObject__rules,$(repo))))
190
191ifeq ($(gb_FULLDEPS),$(true))
192$(call gb_ObjCxxObject_get_dep_target,%) :
193	$(eval $(call gb_Output_error,Unable to find Objective C++ file $(call gb_ObjCxxObject_get_source,,$*) in repositories: $(gb_ObjCxxObject_REPOS)))
194endif
195
196gb_ObjCxxObject_ObjCxxObject =
197
198
199
200# LinkTarget class
201
202gb_LinkTarget_DEFAULTDEFS := $(gb_GLOBALDEFS)
203# defined by platform
204#  gb_LinkTarget_CXXFLAGS
205#  gb_LinkTarget_LDFLAGS
206#  gb_LinkTarget_INCLUDE
207#  gb_LinkTarget_INCLUDE_STL
208
209.PHONY : $(call gb_LinkTarget_get_clean_target,%)
210$(call gb_LinkTarget_get_clean_target,%) :
211	$(call gb_Output_announce,$*,$(false),LNK,4)
212	RESPONSEFILE=$(call var2file,$(shell $(gb_MKTEMP)),200,\
213		$(foreach object,$(COBJECTS),$(call gb_CObject_get_target,$(object))) \
214		$(foreach object,$(COBJECTS),$(call gb_CObject_get_dep_target,$(object))) \
215		$(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_target,$(object))) \
216		$(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_dep_target,$(object))) \
217		$(foreach object,$(OBJCXXOBJECTS),$(call gb_ObjCxxObject_get_target,$(object))) \
218		$(foreach object,$(OBJCXXOBJECTS),$(call gb_ObjCxxObject_get_dep_target,$(object))) \
219		$(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_target,$(object))) \
220		$(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_dep_target,$(object))) \
221		$(call gb_LinkTarget_get_target,$*) \
222		$(call gb_LinkTarget_get_dep_target,$*) \
223		$(call gb_LinkTarget_get_headers_target,$*) \
224		$(call gb_LinkTarget_get_external_headers_target,$*) \
225		$(DLLTARGET) \
226		$(AUXTARGETS)) && \
227	cat $${RESPONSEFILE} /dev/null | xargs -n 200 rm -f && \
228	rm -f $${RESPONSEFILE}
229
230
231# cat the deps of all objects in one file, then we need only open that one file
232define gb_LinkTarget__command_dep
233$(call gb_Output_announce,LNK:$(2),$(true),DEP,1)
234$(call gb_Helper_abbreviate_dirs,\
235	mkdir -p $(dir $(1)) && \
236	RESPONSEFILE=$(call var2file,$(shell $(gb_MKTEMP)),200,\
237		$(foreach object,$(3),$(call gb_CObject_get_dep_target,$(object))) \
238		$(foreach object,$(4),$(call gb_CxxObject_get_dep_target,$(object))) \
239		$(foreach object,$(5),$(call gb_ObjCxxObject_get_dep_target,$(object)))\
240		$(foreach object,$(6),$(call gb_GenCxxObject_get_dep_target,$(object)))\
241		) && \
242	cat $${RESPONSEFILE} /dev/null | xargs -n 200 cat > $(1)) && \
243	rm -f $${RESPONSEFILE}
244
245endef
246
247$(call gb_LinkTarget_get_target,%) : $(call gb_LinkTarget_get_headers_target,%) $(gb_Helper_MISCDUMMY)
248	$(call gb_LinkTarget__command,$@,$*)
249
250ifeq ($(gb_FULLDEPS),$(true))
251$(call gb_LinkTarget_get_target,%) : $(call gb_LinkTarget_get_dep_target,%)
252$(call gb_LinkTarget_get_dep_target,%) : | $(call gb_LinkTarget_get_headers_target,%)
253	$(call gb_LinkTarget__command_dep,$@,$*,$(COBJECTS),$(CXXOBJECTS),$(OBJCXXOBJECTS),$(GENCXXOBJECTS))
254endif
255
256# Ok, this is some dark voodoo: When declaring a linktarget with
257# gb_LinkTarget_LinkTarget we set SELF in the headertarget to name of the
258# target. When the rule for the headertarget is executed and SELF does not
259# match the target name, we are depending on a linktarget that was never
260# declared. In a full build exclusively in gbuild that should never happen.
261# However, partial gbuild build will not know about how to build lower level
262# linktargets, just as gbuild can not know about linktargets generated in the
263# old build.pl/dmake system. Once all is migrated, gbuild should error out
264# when is is told to depend on a linktarget it does not know about and not
265# only warn.
266define gb_LinkTarget__get_external_headers_check
267ifneq ($$(SELF),$$*)
268$$(eval $$(call gb_Output_info,LinkTarget $$* not defined: Assuming headers to be there!,ALL))
269endif
270$$@ : COMMAND := $$(call gb_Helper_abbreviate_dirs, mkdir -p $$(dir $$@) && touch $$@ && mkdir -p $(call gb_LinkTarget_get_target,)pdb/$$(dir $$*))
271
272endef
273
274$(call gb_LinkTarget_get_external_headers_target,%) :
275	$(eval $(gb_LinkTarget__get_external_headers_check))
276	$(COMMAND)
277
278$(call gb_LinkTarget_get_headers_target,%) : $(call gb_LinkTarget_get_external_headers_target,%)
279	$(call gb_Helper_abbreviate_dirs,\
280		mkdir -p $(dir $@) && touch $@)
281
282# Explanation of some of the targets:
283# - gb_LinkTarget_get_external_headers_target is the targets that guarantees all
284#   headers from linked against libraries are in OUTDIR.
285# - gb_LinkTarget_get_headers_target is the target that guarantees all headers
286#   from the linked against the libraries and the linktargets own headers
287#   (including generated headers) are in the OUTDIR.
288# - gb_LinkTarget_get_target links the objects into a file in WORKDIR.
289# gb_LinkTarget_get_target depends on gb_LinkTarget_get_headers_target which in
290# turn depends gb_LinkTarget_get_external_headers_target.
291# gb_LinkTarget_get_target depends additionally on the objects, which in turn
292# depend build-order only on the gb_LinkTarget_get_headers_target. The build
293# order-only dependency ensures all headers to be there for compiling and
294# dependency generation without causing all objects to be rebuild when one
295# header changes. Only the ones with an explicit dependency in their generated
296# dependency file will be rebuild.
297#
298# gb_LinkTarget_get_target is the target that links the objects into a file in
299# WORKDIR
300# Explanation of some of the variables:
301# - AUXTARGETS are the additionally generated files that need to be cleaned out
302#   on clean.
303# - PCH_CXXFLAGS and PCH_DEFS are the flags that the precompiled headers will
304#   be compiled with.  They should never be overridden in a single object
305#   files.
306# - TARGETTYPE is the type of linktarget as some platforms need very different
307#   command to link different targettypes.
308#
309# Since most variables are set on the linktarget and not on the object, the
310# object learns about these setting via GNU makes scoping of target variables.
311# Therefore it is important that objects are only directly depended on by the
312# linktarget. This for example means that you cannot build a single object
313# alone, because then you would directly depend on the object.
314#
315# A note about flags: because the overriding the global variables with a target
316# local variable of the same name is considered obscure, the target local
317# variables have a T_ prefix.
318define gb_LinkTarget_LinkTarget
319$(call gb_LinkTarget_get_clean_target,$(1)) : AUXTARGETS :=
320$(call gb_LinkTarget_get_external_headers_target,$(1)) : SELF := $(1)
321$(call gb_LinkTarget_get_target,$(1)) : DLLTARGET :=
322$(call gb_LinkTarget_get_clean_target,$(1)) \
323$(call gb_LinkTarget_get_target,$(1)) : COBJECTS :=
324$(call gb_LinkTarget_get_clean_target,$(1)) \
325$(call gb_LinkTarget_get_target,$(1)) : CXXOBJECTS :=
326$(call gb_LinkTarget_get_clean_target,$(1)) \
327$(call gb_LinkTarget_get_target,$(1)) : OBJCXXOBJECTS :=
328$(call gb_LinkTarget_get_clean_target,$(1)) \
329$(call gb_LinkTarget_get_target,$(1)) : GENCXXOBJECTS :=
330$(call gb_LinkTarget_get_headers_target,$(1)) \
331$(call gb_LinkTarget_get_target,$(1)) : T_CFLAGS := $$(gb_LinkTarget_CFLAGS) $(CFLAGS)
332$(call gb_LinkTarget_get_headers_target,$(1)) \
333$(call gb_LinkTarget_get_target,$(1)) : T_CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS)
334$(call gb_LinkTarget_get_headers_target,$(1)) \
335$(call gb_LinkTarget_get_target,$(1)) : PCH_CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS) $(CXXFLAGS)
336$(call gb_LinkTarget_get_target,$(1)) : T_OBJCXXFLAGS := $$(gb_LinkTarget_OBJCXXFLAGS) $(OBJCXXFLAGS)
337$(call gb_LinkTarget_get_headers_target,$(1)) \
338$(call gb_LinkTarget_get_target,$(1)) : DEFS := $$(gb_LinkTarget_DEFAULTDEFS) $(CPPFLAGS)
339$(call gb_LinkTarget_get_headers_target,$(1)) \
340$(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS := $$(gb_LinkTarget_DEFAULTDEFS) $(CPPFLAGS)
341$(call gb_LinkTarget_get_headers_target,$(1)) \
342$(call gb_LinkTarget_get_target,$(1)) : INCLUDE := $$(gb_LinkTarget_INCLUDE)
343$(call gb_LinkTarget_get_headers_target,$(1)) \
344$(call gb_LinkTarget_get_target,$(1)) : INCLUDE_STL := $$(gb_LinkTarget_INCLUDE_STL)
345$(call gb_LinkTarget_get_target,$(1)) : T_LDFLAGS := $$(gb_LinkTarget_LDFLAGS) $(LDFLAGS)
346$(call gb_LinkTarget_get_target,$(1)) : LINKED_LIBS :=
347$(call gb_LinkTarget_get_target,$(1)) : LINKED_STATIC_LIBS :=
348$(call gb_LinkTarget_get_target,$(1)) : EXTERNAL_LIBS :=
349$(call gb_LinkTarget_get_target,$(1)) : LIBS :=
350$(call gb_LinkTarget_get_target,$(1)) : TARGETTYPE :=
351$(call gb_LinkTarget_get_headers_target,$(1)) \
352$(call gb_LinkTarget_get_target,$(1)) : PCH_NAME :=
353$(call gb_LinkTarget_get_target,$(1)) : PCHOBJS :=
354$(call gb_LinkTarget_get_headers_target,$(1)) \
355$(call gb_LinkTarget_get_target,$(1)) : PDBFILE :=
356$(call gb_LinkTarget_get_target,$(1)) : NATIVERES :=
357
358ifeq ($(gb_FULLDEPS),$(true))
359-include $(call gb_LinkTarget_get_dep_target,$(1))
360$(call gb_LinkTarget_get_dep_target,$(1)) : COBJECTS :=
361$(call gb_LinkTarget_get_dep_target,$(1)) : CXXOBJECTS :=
362$(call gb_LinkTarget_get_dep_target,$(1)) : OBJCXXOBJECTS :=
363$(call gb_LinkTarget_get_dep_target,$(1)) : GENCXXOBJECTS :=
364$(call gb_LinkTarget_get_dep_target,$(1)) : T_CFLAGS := $$(gb_LinkTarget_CFLAGS) $(CFLAGS)
365$(call gb_LinkTarget_get_dep_target,$(1)) : T_CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS)
366$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS) $(CXXFLAGS)
367$(call gb_LinkTarget_get_dep_target,$(1)) : T_OBJCXXFLAGS := $$(gb_LinkTarget_OBJCXXFLAGS) $(OBJCXXFLAGS)
368$(call gb_LinkTarget_get_dep_target,$(1)) : DEFS := $$(gb_LinkTarget_DEFAULTDEFS) $(CPPFLAGS)
369$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_DEFS := $$(gb_LinkTarget_DEFAULTDEFS) $(CPPFLAGS)
370$(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE := $$(gb_LinkTarget_INCLUDE)
371$(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE_STL := $$(gb_LinkTarget_INCLUDE_STL)
372$(call gb_LinkTarget_get_dep_target,$(1)) : TARGETTYPE :=
373$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_NAME :=
374endif
375
376endef
377
378define gb_LinkTarget_add_defs
379$(call gb_LinkTarget_get_headers_target,$(1)) \
380$(call gb_LinkTarget_get_target,$(1)) : DEFS += $(2)
381$(call gb_LinkTarget_get_headers_target,$(1)) \
382$(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS += $(2)
383ifeq ($(gb_FULLDEPS),$(true))
384$(call gb_LinkTarget_get_dep_target,$(1)) : DEFS += $(2)
385$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_DEFS += $(2)
386endif
387endef
388
389define gb_LinkTarget_set_defs
390ifeq (,)
391$$(call gb_Output_error,\
392 gb_LinkTarget_set_defs: use gb_LinkTarget_add_defs instead.)
393else
394$(call gb_LinkTarget_get_headers_target,$(1)) \
395$(call gb_LinkTarget_get_target,$(1)) : DEFS := $(2)
396$(call gb_LinkTarget_get_headers_target,$(1)) \
397$(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS := $(2)
398
399ifeq ($(gb_FULLDEPS),$(true))
400$(call gb_LinkTarget_get_dep_target,$(1)) : DEFS := $(2)
401$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_DEFS := $(2)
402endif
403endif
404
405endef
406
407define gb_LinkTarget_add_cflags
408$(call gb_LinkTarget_get_target,$(1)) : T_CFLAGS += $(2)
409ifeq ($(gb_FULLDEPS),$(true))
410$(call gb_LinkTarget_get_dep_target,$(1)) : T_CFLAGS += $(2)
411endif
412
413endef
414
415define gb_LinkTarget_set_cflags
416ifeq (,)
417$$(call gb_Output_error,\
418 gb_LinkTarget_set_cflags: use gb_LinkTarget_add_cflags instead.)
419else
420$(call gb_LinkTarget_get_target,$(1)) : T_CFLAGS := $(2)
421ifeq ($(gb_FULLDEPS),$(true))
422$(call gb_LinkTarget_get_dep_target,$(1)) : T_CFLAGS := $(2)
423endif
424endif
425
426endef
427
428define gb_LinkTarget_add_cxxflags
429$(call gb_LinkTarget_get_headers_target,$(1)) \
430$(call gb_LinkTarget_get_target,$(1)) : T_CXXFLAGS += $(2)
431$(call gb_LinkTarget_get_headers_target,$(1)) \
432$(call gb_LinkTarget_get_target,$(1)) : PCH_CXXFLAGS += $(2)
433ifeq ($(gb_FULLDEPS),$(true))
434$(call gb_LinkTarget_get_dep_target,$(1)) : T_CXXFLAGS += $(2)
435$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_CXXFLAGS += $(2)
436endif
437endef
438
439define gb_LinkTarget_set_cxxflags
440ifeq (,)
441$$(call gb_Output_error,\
442 gb_LinkTarget_set_cxxflags: use gb_LinkTarget_add_cxxflags instead.)
443else
444$(call gb_LinkTarget_get_headers_target,$(1)) \
445$(call gb_LinkTarget_get_target,$(1)) : T_CXXFLAGS := $(2)
446$(call gb_LinkTarget_get_headers_target,$(1)) \
447$(call gb_LinkTarget_get_target,$(1)) : PCH_CXXFLAGS := $(2)
448ifeq ($(gb_FULLDEPS),$(true))
449$(call gb_LinkTarget_get_dep_target,$(1)) : T_CXXFLAGS := $(2)
450$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_CXXFLAGS := $(2)
451endif
452endif
453
454endef
455
456define gb_LinkTarget_add_objcxxflags
457$(call gb_LinkTarget_get_target,$(1)) : T_OBJCXXFLAGS += $(2)
458ifeq ($(gb_FULLDEPS),$(true))
459$(call gb_LinkTarget_get_dep_target,$(1)) : T_OBJCXXFLAGS += $(2)
460endif
461endef
462
463define gb_LinkTarget_set_objcxxflags
464ifeq (,)
465$$(call gb_Output_error,\
466 gb_LinkTarget_set_objcxxflags: use gb_LinkTarget_add_objcxxflags instead.)
467else
468$(call gb_LinkTarget_get_target,$(1)) : T_OBJCXXFLAGS := $(2)
469ifeq ($(gb_FULLDEPS),$(true))
470$(call gb_LinkTarget_get_dep_target,$(1)) : T_OBJCXXFLAGS := $(2)
471endif
472endif
473
474endef
475
476define gb_LinkTarget_set_include
477$(call gb_LinkTarget_get_headers_target,$(1)) \
478$(call gb_LinkTarget_get_target,$(1)) : INCLUDE := $(2)
479ifeq ($(gb_FULLDEPS),$(true))
480$(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE := $(2)
481endif
482
483endef
484
485define gb_LinkTarget_set_include_stl
486$(call gb_LinkTarget_get_headers_target,$(1)) \
487$(call gb_LinkTarget_get_target,$(1)) : INCLUDE_STL := $(2)
488ifeq ($(gb_FULLDEPS),$(true))
489$(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE_STL := $(2)
490endif
491
492endef
493
494define gb_LinkTarget_add_ldflags
495$(call gb_LinkTarget_get_target,$(1)) : T_LDFLAGS += $(2)
496endef
497
498# real use in RepositoryExternal.mk
499define gb_LinkTarget_set_ldflags
500$(call gb_LinkTarget_get_target,$(1)) : T_LDFLAGS := $(2)
501endef
502
503define gb_LinkTarget_add_api
504$(call gb_LinkTarget_get_external_headers_target,$(1)) :| \
505	$$(foreach api,$(2),$$(call gb_Package_get_target,$$(api)_inc))
506$(call gb_LinkTarget_get_headers_target,$(1)) \
507$(call gb_LinkTarget_get_target,$(1)) : INCLUDE += $$(foreach api,$(2),-I$(OUTDIR)/inc/$$(api))
508ifeq ($(gb_FULLDEPS),$(true))
509$(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE += $$(foreach api,$(2),-I$(OUTDIR)/inc/$$(api))
510endif
511
512endef
513
514define gb_LinkTarget_add_libs
515$(call gb_LinkTarget_get_target,$(1)) : LIBS += $(2)
516endef
517
518define gb_LinkTarget_add_linked_libs
519ifneq (,$$(filter-out $(gb_Library_KNOWNLIBS),$(2)))
520$$(eval $$(call gb_Output_info,currently known libraries are: $(sort $(gb_Library_KNOWNLIBS)),ALL))
521$$(eval $$(call gb_Output_error,Cannot link against library/libraries $$(filter-out $(gb_Library_KNOWNLIBS),$(2)). Libraries must be registered in Repository.mk))
522endif
523
524$(call gb_LinkTarget_get_target,$(1)) : LINKED_LIBS += $(2)
525
526$(call gb_LinkTarget_get_target,$(1)) : $$(foreach lib,$(2),$$(call gb_Library_get_target,$$(lib)))
527$(call gb_LinkTarget_get_external_headers_target,$(1)) : \
528$$(foreach lib,$(2),$$(call gb_Library_get_headers_target,$$(lib)))
529
530endef
531
532define gb_LinkTarget_add_linked_static_libs
533ifneq (,$$(filter-out $(gb_StaticLibrary_KNOWNLIBS),$(2)))
534$$(eval $$(call gb_Output_info, currently known static libraries are: $(sort $(gb_StaticLibrary_KNOWNLIBS)),ALL))
535$$(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))
536endif
537
538$(call gb_LinkTarget_get_target,$(1)) : LINKED_STATIC_LIBS += $(2)
539
540$(call gb_LinkTarget_get_target,$(1)) : $$(foreach lib,$(2),$$(call gb_StaticLibrary_get_target,$$(lib)))
541$(call gb_LinkTarget_get_external_headers_target,$(1)) : \
542$$(foreach lib,$(2),$$(call gb_StaticLibrary_get_headers_target,$$(lib)))
543
544endef
545
546#
547# Add external libs for linking.  External libaries are not built by any module.
548#
549# The list of libraries is used as is, ie it is not filtered with gb_Library_KNOWNLIBS.
550#
551# An error is signaled, when any of the library names does not look like
552# a base name, ie is prefixed by -l or lib or is folled by .lib or .so.
553#
554# @param target
555# @param libraries
556#     A list of (base names of) libraries that will be added to the target
557#     local EXTERNAL_LIBS variable and eventually linked in when the
558#     target is made.
559#
560define gb_LinkTarget_add_external_libs
561
562# Make sure that all libraries are given as base names.
563ifneq (,$$(filter -l% lib% %.so %.lib, $(2)))
564$$(eval $$(call gb_Output_announce,ERROR: Please give only library basenames to gb_LinkTarget_add_external_libs))
565$$(eval $$(call gb_Output_announce,ERROR:    (no prefixes -l% or lib%, no suffixes %.so or %.lib)))
566$$(eval $$(call gb_Output_announce,ERROR:    libraries given: $(2)))
567$$(eval $$(call gb_Output_announce,ERROR:    offending: $$(filter -l% lib% %.so %.lib, $(2))))
568$$(eval $$(call gb_Output_error,  ))
569endif
570
571$(call gb_LinkTarget_get_target,$(1)) : EXTERNAL_LIBS += $(2)
572
573$(call gb_LinkTarget_get_target,$(1)) : $$(foreach lib,$(2),$$(call gb_Library_get_target,$$(lib)))
574$(call gb_LinkTarget_get_external_headers_target,$(1)) : \
575$$(foreach lib,$(2),$$(call gb_Library_get_headers_target,$$(lib)))
576
577endef
578
579
580define gb_LinkTarget_add_cobject
581$(call gb_LinkTarget_get_target,$(1)) : COBJECTS += $(2)
582$(call gb_LinkTarget_get_clean_target,$(1)) : COBJECTS += $(2)
583
584$(call gb_LinkTarget_get_target,$(1)) : $(call gb_CObject_get_target,$(2))
585$(call gb_CObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
586$(call gb_CObject_get_target,$(2)) : T_CFLAGS += $(3)
587
588ifeq ($(gb_FULLDEPS),$(true))
589$(call gb_LinkTarget_get_dep_target,$(1)) : COBJECTS += $(2)
590$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_CObject_get_dep_target,$(2))
591endif
592
593endef
594
595define gb_LinkTarget_add_cxxobject
596$(call gb_LinkTarget_get_target,$(1)) : CXXOBJECTS += $(2)
597$(call gb_LinkTarget_get_clean_target,$(1)) : CXXOBJECTS += $(2)
598
599$(call gb_LinkTarget_get_target,$(1)) : $(call gb_CxxObject_get_target,$(2))
600$(call gb_CxxObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
601$(call gb_CxxObject_get_target,$(2)) : T_CXXFLAGS += $(3)
602
603ifeq ($(gb_FULLDEPS),$(true))
604$(call gb_LinkTarget_get_dep_target,$(1)) : CXXOBJECTS += $(2)
605$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_CxxObject_get_dep_target,$(2))
606endif
607
608endef
609
610define gb_LinkTarget_add_objcxxobject
611$(call gb_LinkTarget_get_target,$(1)) : OBJCXXOBJECTS += $(2)
612$(call gb_LinkTarget_get_clean_target,$(1)) : OBJCXXOBJECTS += $(2)
613
614$(call gb_LinkTarget_get_target,$(1)) : $(call gb_ObjCxxObject_get_target,$(2))
615$(call gb_ObjCxxObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
616$(call gb_ObjCxxObject_get_target,$(2)) : T_OBJCXXFLAGS += $(3)
617
618ifeq ($(gb_FULLDEPS),$(true))
619$(call gb_LinkTarget_get_dep_target,$(1)) : OBJCXXOBJECTS += $(2)
620$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_ObjCxxObject_get_dep_target,$(2))
621endif
622
623endef
624
625define gb_LinkTarget_add_generated_cxx_object
626$(call gb_LinkTarget_get_target,$(1)) : GENCXXOBJECTS += $(2)
627$(call gb_LinkTarget_get_clean_target,$(1)) : GENCXXOBJECTS += $(2)
628
629$(call gb_LinkTarget_get_target,$(1)) : $(call gb_GenCxxObject_get_target,$(2))
630$(call gb_GenCxxObject_get_source,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
631$(call gb_GenCxxObject_get_target,$(2)) : T_CXXFLAGS += $(3) $(CXXFLAGS)
632
633ifeq ($(gb_FULLDEPS),$(true))
634$(call gb_LinkTarget_get_dep_target,$(1)) : GENCXXOBJECTS += $(2)
635$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_GenCxxObject_get_dep_target,$(2))
636endif
637
638endef
639
640define gb_LinkTarget_add_noexception_object
641$(call gb_LinkTarget_add_cxxobject,$(1),$(2),$(gb_LinkTarget_NOEXCEPTIONFLAGS) $(CXXFLAGS))
642endef
643
644define gb_LinkTarget_add_exception_object
645$(call gb_LinkTarget_add_cxxobject,$(1),$(2),$(gb_LinkTarget_EXCEPTIONFLAGS) $(CXXFLAGS))
646endef
647
648define gb_LinkTarget_add_cobjects
649$(foreach obj,$(2),$(call gb_LinkTarget_add_cobject,$(1),$(obj),$(3)))
650endef
651
652define gb_LinkTarget_add_cxxobjects
653$(foreach obj,$(2),$(call gb_LinkTarget_add_cxxobject,$(1),$(obj),$(3)))
654endef
655
656define gb_LinkTarget_add_objcxxobjects
657$(foreach obj,$(2),$(call gb_LinkTarget_add_objcxxobject,$(1),$(obj),$(3)))
658endef
659
660define gb_LinkTarget_add_noexception_objects
661$(foreach obj,$(2),$(call gb_LinkTarget_add_noexception_object,$(1),$(obj)))
662endef
663
664define gb_LinkTarget_add_exception_objects
665$(foreach obj,$(2),$(call gb_LinkTarget_add_exception_object,$(1),$(obj)))
666endef
667
668define gb_LinkTarget_add_generated_exception_object
669$(call gb_LinkTarget_add_generated_cxx_object,$(1),$(2),$(gb_LinkTarget_EXCEPTIONFLAGS))
670endef
671
672define gb_LinkTarget_add_generated_exception_objects
673$(foreach obj,$(2),$(call gb_LinkTarget_add_generated_exception_object,$(1),$(obj)))
674endef
675
676define gb_LinkTarget_set_targettype
677$(call gb_LinkTarget_get_target,$(1)) \
678$(call gb_LinkTarget_get_dep_target,$(1)) : TARGETTYPE := $(2)
679endef
680
681define gb_LinkTarget_set_dlltarget
682$(call gb_LinkTarget_get_clean_target,$(1)) \
683$(call gb_LinkTarget_get_target,$(1)) : DLLTARGET := $(2)
684endef
685
686define gb_LinkTarget_set_auxtargets
687$(call gb_LinkTarget_get_clean_target,$(1)) : AUXTARGETS := $(2)
688endef
689
690define gb_LinkTarget__add_internal_headers
691$(call gb_LinkTarget_get_headers_target,$(1)) : $(2)
692$(2) :|	$(call gb_LinkTarget_get_external_headers_target,$(1))
693
694endef
695
696define gb_LinkTarget_add_package_headers
697$(foreach package,$(2),$(call gb_LinkTarget__add_internal_headers,$(1),$(call gb_Package_get_target,$(package))))
698$(call gb_LinkTarget_get_clean_target,$(1)) : $(foreach package,$(2),$(call gb_Package_get_clean_target,$(package)))
699
700endef
701
702define gb_LinkTarget_add_sdi_headers
703$(call gb_LinkTarget__add_internal_headers,$(1),$(foreach sdi,$(2),$(call gb_SdiTarget_get_target,$(sdi))))
704$(call gb_LinkTarget_get_clean_target,$(1)) : $(foreach sdi,$(2),$(call gb_SdiTarget_get_clean_target,$(sdi)))
705endef
706
707define gb_LinkTarget__add_precompiled_header_impl
708$(call gb_LinkTarget__add_internal_headers,$(1),$(call gb_PrecompiledHeader_get_target,$(3)))
709$(call gb_LinkTarget_get_clean_target,$(1)) : $(call gb_PrecompiledHeader_get_clean_target,$(3))
710$(call gb_PrecompiledHeader_get_target,$(3)) : $(2).cxx
711
712$(call gb_LinkTarget__add_internal_headers,$(1),$(call gb_NoexPrecompiledHeader_get_target,$(3)))
713$(call gb_LinkTarget_get_clean_target,$(1)) : $(call gb_NoexPrecompiledHeader_get_clean_target,$(3))
714$(call gb_NoexPrecompiledHeader_get_target,$(3)) : $(2).cxx
715
716$(call gb_LinkTarget_get_target,$(1)) : PCH_NAME := $(3)
717$(call gb_LinkTarget_get_target,$(1)) : PCHOBJS = $(call gb_PrecompiledHeader_get_target,$(3)).obj $(call gb_NoexPrecompiledHeader_get_target,$(3)).obj
718
719$(call gb_LinkTarget_get_headers_target,$(1)) \
720$(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS = $$(DEFS)
721ifeq ($(gb_FULLDEPS),$(true))
722-include \
723	$(call gb_PrecompiledHeader_get_dep_target,$(3)) \
724	$(call gb_NoexPrecompiledHeader_get_dep_target,$(3))
725$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_NAME := $(3)
726$(call gb_LinkTarget_get_dep_target,$(1)) : PCH_DEFS = $$(DEFS)
727endif
728
729endef
730
731define gb_LinkTarget_add_precompiled_header
732ifeq ($(gb_ENABLE_PCH),$(true))
733$(call gb_LinkTarget__add_precompiled_header_impl,$(1),$(2),$(notdir $(2)))
734endif
735
736endef
737
738# this forwards to functions that must be defined in RepositoryExternal.mk.
739# $(call gb_LinkTarget_use_external,library,external)
740define gb_LinkTarget_use_external
741$(eval $(if $(value gb_LinkTarget__use_$(2)),\
742  $(call gb_LinkTarget__use_$(2),$(1)),\
743  $(error gb_LinkTarget_use_external: unknown external: $(2))))
744endef
745
746# $(call gb_LinkTarget_use_externals,library,externals)
747gb_LinkTarget_use_externals = \
748 $(foreach external,$(2),$(call gb_LinkTarget_use_external,$(1),$(external)))
749
750
751# vim: set noet sw=4 ts=4:
752