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