cant check that early for generated files
[LibreOffice.git] / solenv / gbuild / LinkTarget.mk
blob78375bfd8d9bb9f7dd1107dd636f4c1aa8407b3f
1 # -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
2 #*************************************************************************
4 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 # Copyright 2000, 2011 Oracle and/or its affiliates.
8 # OpenOffice.org - a multi-platform office productivity suite
10 # This file is part of OpenOffice.org.
12 # OpenOffice.org is free software: you can redistribute it and/or modify
13 # it under the terms of the GNU Lesser General Public License version 3
14 # only, as published by the Free Software Foundation.
16 # OpenOffice.org is distributed in the hope that it will be useful,
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 # GNU Lesser General Public License version 3 for more details
20 # (a copy is included in the LICENSE file that accompanied this code).
22 # You should have received a copy of the GNU Lesser General Public License
23 # version 3 along with OpenOffice.org. If not, see
24 # <http://www.openoffice.org/license.html>
25 # for a copy of the LGPLv3 License.
27 #*************************************************************************
29 #the following user-defined variables are supported:
30 # CPPFLAGS
31 # CFLAGS
32 # CXXFLAGS
33 # OBJCXXFLAGS
34 # LDFLAGS
36 # CFLAGS from environment override debug/optimization flags
37 ifeq ($(gb_DEBUGLEVEL),2)
38 CFLAGS ?= $(gb_COMPILEROPTFLAGS) $(gb_DEBUG_CFLAGS)
39 CXXFLAGS ?= $(gb_COMPILEROPTFLAGS) $(gb_DEBUG_CFLAGS)
40 OBJCXXFLAGS ?= $(gb_COMPILEROPTFLAGS) $(gb_DEBUG_CFLAGS)
41 else
42 CFLAGS ?= $(gb_COMPILEROPTFLAGS)
43 CXXFLAGS ?= $(gb_COMPILEROPTFLAGS)
44 OBJCXXFLAGS ?= $(gb_COMPILEROPTFLAGS)
45 endif
47 # if enabled we link all of these libraries into one larger, merged library
48 # for which we can do a lot more optimisation, and which is faster to read
49 # from disk.
50 ifeq ($(MERGELIBS),TRUE)
51 # list of libraries which are always loaded, thus we can merge them into one
52 # they have to be from tail_build, so we could link against merged library
53 gb_CORE_LIBS := \
54 uui \
56 endif
58 # Overview of dependencies and tasks of LinkTarget
60 # target task depends on
61 # LinkTarget linking AsmObject CObject CxxObject GenCObject GenCxxObject ObjCObject ObjCxxObject
62 # LinkTarget/headers
63 # LinkTarget/dep joined dep file AsmObject/dep CObject/dep CxxObject/dep GenCObject/dep GenCxxObject/dep ObjCObject/dep ObjCxxObject/dep
64 # | LinkTarget/headers
65 # LinkTarget/headers all headers available LinkTarget/external_headers PCH
66 # including own generated own generated headers
67 # PCH precompiled headers (win) LinkTarget/external_headers
68 # LinkTarget/external_headers all external headers avail. header files of linked libs
70 # CObject plain c compile | LinkTarget/headers
71 # CxxObject c++ compile | LinkTarget/headers
72 # GenCObject plain c compile from | LinkTarget/headers
73 # generated source
74 # GenCxxObject C++ compile from | LinkTarget/headers
75 # generated source
76 # ObjCObject objective c compile | LinkTarget/headers
77 # ObjCxxObject objective c++ compile | LinkTarget/headers
79 # AsmObject asm compile | LinkTarget
81 # CObject/dep dependencies these targets generate empty dep files
82 # CxxObject/dep dependencies that are populated upon compile
83 # GenCObject/dep dependencies
84 # GenCxxObject/dep dependencies
85 # ObjCObject/dep dependencies
86 # ObjCxxObject/dep dependencies
87 # AsmObject/dep dependencies
89 # LinkTarget/headers means gb_LinkTarget_get_headers_target etc.
90 # dependencies prefixed with | are build-order only dependencies
94 # For every object there is a dep file (if gb_FULLDEPS is active).
95 # The dep file depends on the object: the Object__command also updates the
96 # dep file as a side effect.
97 # In the dep file rule just touch it so it's newer than the object.
99 # The gb_Object__command_dep generates an "always rebuild" dep file;
100 # It is _only_ used in case the user deletes the object dep file.
101 ifeq ($(gb_FULLDEPS),$(true))
102 define gb_Object__command_dep
103 mkdir -p $(dir $(1)) && \
104 echo '$(2) : $$(gb_Helper_PHONY)' > $(1)
106 endef
107 else
108 gb_Object__command_dep = \
109 $(call gb_Output_error,gb_Object__command_dep is only for gb_FULLDEPS)
110 endif
113 # CObject class
115 gb_CObject_REPOS := $(gb_REPOS)
117 gb_CObject_get_source = $(1)/$(2).c
118 # defined by platform
119 # gb_CObject__command
121 define gb_CObject__rules
122 $$(call gb_CObject_get_target,%) : $$(call gb_CObject_get_source,$(1),%)
123 $$(call gb_CObject__command,$$@,$$*,$$<,$$(call gb_CObject_get_dep_target,$$*))
125 ifeq ($(gb_FULLDEPS),$(true))
126 $$(call gb_CObject_get_dep_target,%) : $$(call gb_CObject_get_target,%)
127 $$(if $$(wildcard $$@),touch $$@,\
128 $$(call gb_Object__command_dep,$$@,$$(call gb_CObject_get_target,$$*)))
129 endif
131 endef
133 $(foreach repo,$(gb_CObject_REPOS),$(eval $(call gb_CObject__rules,$(repo))))
135 gb_CObject_CObject =
138 # CxxObject class
140 gb_CxxObject_REPOS := $(gb_REPOS)
142 gb_CxxObject_get_source = $(1)/$(2).cxx
143 # defined by platform
144 # gb_CxxObject__command
146 # Only enable PCH if the PCH_CXXFLAGS and the PCH_DEFS (from the linktarget)
147 # are the same as the T_CXXFLAGS and DEFS we want to use for this object. This
148 # should usually be the case. The DEFS/T_CXXFLAGS would have too be manually
149 # overridden for one object file for them to differ. PCH_CXXFLAGS/PCH_DEFS
150 # should never be overridden on an object -- they should be the same as for the
151 # whole linktarget. In general it should be cleaner to use a static library
152 # compiled with different flags and link that in rather than mixing different
153 # flags in one linktarget.
154 define gb_CxxObject__set_pchflags
155 ifeq ($(gb_ENABLE_PCH),$(true))
156 ifneq ($(strip $$(PCH_NAME)),)
157 ifeq ($$(sort $$(PCH_CXXFLAGS) $$(PCH_DEFS) $$(gb_LinkTarget_EXCEPTIONFLAGS)),$$(sort $$(T_CXXFLAGS) $$(DEFS)))
158 $$@ : PCHFLAGS := $$(call gb_PrecompiledHeader_get_enableflags,$$(PCH_NAME))
159 else
160 ifeq ($$(sort $$(PCH_CXXFLAGS) $$(PCH_DEFS) $$(gb_LinkTarget_NOEXCEPTIONFLAGS)),$$(sort $$(T_CXXFLAGS) $$(DEFS)))
161 $$@ : PCHFLAGS := $$(call gb_NoexPrecompiledHeader_get_enableflags,$$(PCH_NAME))
162 else
163 $$(info No precompiled header available for $$*.)
164 $$(info precompiled header flags ( ex) : $$(sort $$(PCH_CXXFLAGS) $$(PCH_DEFS) $$(gb_LinkTarget_EXCEPTIONFLAGS)))
165 $$(info precompiled header flags (noex) : $$(sort $$(PCH_CXXFLAGS) $$(PCH_DEFS) $$(gb_LinkTarget_NOEXCEPTIONFLAGS)))
166 $$(info . object flags : $$(sort $$(T_CXXFLAGS) $$(DEFS)))
167 $$@ : PCHFLAGS :=
168 endif
169 endif
170 endif
171 endif
172 endef
174 define gb_CxxObject__rules
175 $$(call gb_CxxObject_get_target,%) : $$(call gb_CxxObject_get_source,$(1),%)
176 $$(eval $$(gb_CxxObject__set_pchflags))
177 $$(call gb_CxxObject__command,$$@,$$*,$$<,$$(call gb_CxxObject_get_dep_target,$$*))
179 ifeq ($(gb_FULLDEPS),$(true))
180 $$(call gb_CxxObject_get_dep_target,%) : $$(call gb_CxxObject_get_target,%)
181 $$(if $$(wildcard $$@),touch $$@,\
182 $$(eval $$(gb_CxxObject__set_pchflags))\
183 $$(call gb_Object__command_dep,$$@,$$(call gb_CxxObject_get_target,$$*)))
184 endif
186 endef
188 $(foreach repo,$(gb_CxxObject_REPOS),$(eval $(call gb_CxxObject__rules,$(repo))))
190 gb_CxxObject_CxxObject =
193 # GenCObject class
195 gb_GenCObject_get_source = $(WORKDIR)/$(1).c
196 # defined by platform
197 # gb_CObject__command
199 $(call gb_GenCObject_get_target,%) : $(call gb_GenCObject_get_source,%)
200 $(call gb_CObject__command,$@,$*,$<,$(call gb_GenCObject_get_dep_target,$*))
202 ifeq ($(gb_FULLDEPS),$(true))
203 $(call gb_GenCObject_get_dep_target,%) : $(call gb_GenCObject_get_target,%)
204 $(if $(wildcard $@),touch $@,\
205 $(call gb_Object__command_dep,$@,$(call gb_GenCObject_get_target,$*)))
206 endif
208 gb_GenCObject_GenCObject =
211 # GenCxxObject class
213 gb_GenCxxObject_get_source = $(WORKDIR)/$(1).cxx
214 # defined by platform
215 # gb_CxxObject__command
217 $(call gb_GenCxxObject_get_target,%) : $(call gb_GenCxxObject_get_source,%)
218 $(call gb_CxxObject__command,$@,$*,$<,$(call gb_GenCxxObject_get_dep_target,$*))
220 ifeq ($(gb_FULLDEPS),$(true))
221 $(call gb_GenCxxObject_get_dep_target,%) : $(call gb_GenCxxObject_get_target,%)
222 $(if $(wildcard $@),touch $@,\
223 $(call gb_Object__command_dep,$@,$(call gb_GenCxxObject_get_target,$*)))
224 endif
226 gb_GenCxxObject_GenCxxObject =
228 # YaccObject class
229 gb_YaccObject_get_source = $(1)/$(2).y
231 .PHONY : $(call gb_YaccObject_get_clean_target,%)
232 $(call gb_YaccObject_get_clean_target,%) :
233 $(call gb_Output_announce,$(2),$(false),YAC,3)
234 $(call gb_Helper_abbreviate_dirs,\
235 rm -f $(call gb_YaccObject_get_header_target,$*) $(call gb_YaccObject__get_generated_source,$*))
237 gb_YaccObject__get_generated_source = $(WORKDIR)/$(1).cxx
239 define gb_YaccObject_YaccObject
240 $(call gb_YaccObject_get_target,$(1)) : $(call gb_YaccObject__get_generated_source,$(1)) $(call gb_YaccObject_get_header_target,$(1))
241 $(call gb_YaccObject_get_header_target,$(1)) :| $(call gb_YaccObject__get_generated_source,$(1))
242 $(call gb_YaccObject__get_generated_source,$(1)) : $(call gb_YaccObject_get_source,$(gb_REPOS),$(1))
243 $$(call gb_YaccObject__command,$(call gb_YaccObject_get_source,$(gb_REPOS),$(1)),$(1),$(call gb_YaccObject__get_generated_source,$(1)),$(call gb_YaccObject_get_header_target,$(1)))
244 endef
246 gb_YACC := bison
248 # YaccObject class
249 # defined by platform
250 # gb_YaccObject__command(grammar-file, stem-for-message, source-target, include-target)
252 # ObjCxxObject class
254 gb_ObjCxxObject_REPOS := $(gb_REPOS)
256 gb_ObjCxxObject_get_source = $(1)/$(2).mm
257 # defined by platform
258 # gb_ObjCxxObject__command
260 define gb_ObjCxxObject__rules
261 $$(call gb_ObjCxxObject_get_target,%) : $$(call gb_ObjCxxObject_get_source,$(1),%)
262 $$(call gb_ObjCxxObject__command,$$@,$$*,$$<,$$(call gb_ObjCxxObject_get_dep_target,$$*))
264 ifeq ($(gb_FULLDEPS),$(true))
265 $$(call gb_ObjCxxObject_get_dep_target,%) : $$(call gb_ObjCxxObject_get_target,%)
266 $$(if $$(wildcard $$@),touch $$@,\
267 $$(call gb_Object__command_dep,$$@,$$(call gb_ObjCxxObject_get_target,$$*)))
268 endif
270 endef
272 $(foreach repo,$(gb_ObjCxxObject_REPOS),$(eval $(call gb_ObjCxxObject__rules,$(repo))))
274 gb_ObjCxxObject_ObjCxxObject =
276 # ObjCObject class
278 gb_ObjCObject_REPOS := $(gb_REPOS)
280 gb_ObjCObject_get_source = $(1)/$(2).m
281 # defined by platform
282 # gb_ObjCObject__command
284 # this rule generates an "always rebuild" dep file, to have something to include.
285 # the dep file will be overridden on the fly, when the object is compiled
286 ifeq ($(gb_FULLDEPS),$(true))
287 define gb_ObjCObject__command_dep
288 mkdir -p $(dir $(1)) && \
289 echo '$(call gb_ObjCObject_get_target,$(2)) : $$(gb_Helper_PHONY)' > $(1)
291 endef
292 else
293 gb_ObjCObject__command_dep =
294 endif
296 define gb_ObjCObject__rules
297 $$(call gb_ObjCObject_get_target,%) : $$(call gb_ObjCObject_get_source,$(1),%)
298 $$(call gb_ObjCObject__command,$$@,$$*,$$<,$$(DEFS),$$(OBJCFLAGS),$$(INCLUDE_STL) $$(INCLUDE))
300 ifeq ($(gb_FULLDEPS),$(true))
301 $$(call gb_ObjCObject_get_dep_target,%) : $$(call gb_ObjCObject_get_source,$(1),%)
302 $$(call gb_ObjCObject__command_dep,$$@,$$*,$$<,$$(DEFS),$$(OBJCFLAGS),$$(INCLUDE_STL) $$(INCLUDE))
303 endif
305 endef
307 $(foreach repo,$(gb_ObjCObject_REPOS),$(eval $(call gb_ObjCObject__rules,$(repo))))
309 gb_ObjCObject_ObjCObject =
313 # AsmObject class
315 gb_AsmObject_REPOS := $(gb_REPOS)
317 # defined by platform
318 # gb_AsmObject_get_source (.asm on Windows, .s elsewhere)
319 # gb_AsmObject__command
321 define gb_AsmObject__rules
322 $$(call gb_AsmObject_get_target,%) : $$(call gb_AsmObject_get_source,$(1),%)
323 $$(call gb_AsmObject__command,$$@,$$*,$$<,$$(call gb_AsmObject_get_dep_target,$$*))
325 ifeq ($(gb_FULLDEPS),$(true))
326 $$(call gb_AsmObject_get_dep_target,%) : $$(call gb_AsmObject_get_target,%)
327 $$(if $$(wildcard $$@),touch $$@,\
328 $$(call gb_Object__command_dep,$$@,$$(call gb_AsmObject_get_target,$$*)))
329 endif
331 endef
333 $(foreach repo,$(gb_AsmObject_REPOS),$(eval $(call gb_AsmObject__rules,$(repo))))
335 gb_AsmObject_AsmObject =
338 # LinkTarget class
340 gb_LinkTarget_DEFAULTDEFS := $(gb_GLOBALDEFS)
341 gb_LinkTarget_OBJECTOWNER :=
342 gb_LinkTarget_OBJECTS :=
344 # defined by platform
345 # gb_LinkTarget_CXXFLAGS
346 # gb_LinkTarget_LDFLAGS
347 # gb_LinkTarget_INCLUDE
348 # gb_LinkTarget_INCLUDE_STL
350 .PHONY : $(call gb_LinkTarget_get_clean_target,%)
351 $(call gb_LinkTarget_get_clean_target,%) :
352 $(call gb_Output_announce,$*,$(false),LNK,4)
353 RESPONSEFILE=$(call var2file,$(shell $(gb_MKTEMP)),200,\
354 $(WORKDIR)/GenCObject/$(notdir $*) \
355 $(WORKDIR)/GenCxxObject/$(nodir $*) \
356 $(foreach object,$(COBJECTS),$(call gb_CObject_get_target,$(object))) \
357 $(foreach object,$(COBJECTS),$(call gb_CObject_get_dep_target,$(object))) \
358 $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_target,$(object))) \
359 $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_dep_target,$(object))) \
360 $(foreach object,$(OBJCOBJECTS),$(call gb_ObjCObject_get_target,$(object))) \
361 $(foreach object,$(OBJCOBJECTS),$(call gb_ObjCObject_get_dep_target,$(object))) \
362 $(foreach object,$(OBJCXXOBJECTS),$(call gb_ObjCxxObject_get_target,$(object))) \
363 $(foreach object,$(OBJCXXOBJECTS),$(call gb_ObjCxxObject_get_dep_target,$(object))) \
364 $(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_target,$(object))) \
365 $(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_dep_target,$(object))) \
366 $(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_dep_target,$(object))) \
367 $(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_dep_target,$(object))) \
368 $(call gb_LinkTarget_get_target,$*) \
369 $(call gb_LinkTarget_get_dep_target,$*) \
370 $(call gb_LinkTarget_get_headers_target,$*) \
371 $(call gb_LinkTarget_get_external_headers_target,$*) \
372 $(call gb_LinkTarget_get_objects_list,$*) \
373 $(DLLTARGET) \
374 $(AUXTARGETS)) && \
375 cat $${RESPONSEFILE} /dev/null | xargs -n 200 rm -fr && \
376 rm -f $${RESPONSEFILE}
379 # cat the deps of all objects in one file, then we need only open that one file
380 define gb_LinkTarget__command_dep
381 $(call gb_Output_announce,LNK:$(2),$(true),DEP,1)
382 $(call gb_Helper_abbreviate_dirs,\
383 mkdir -p $(dir $(1)) && \
384 RESPONSEFILE=$(call var2file,$(shell $(gb_MKTEMP)),200,\
385 $(foreach object,$(3),$(call gb_CObject_get_dep_target,$(object))) \
386 $(foreach object,$(4),$(call gb_CxxObject_get_dep_target,$(object))) \
387 $(foreach object,$(5),$(call gb_ObjCObject_get_dep_target,$(object)))\
388 $(foreach object,$(6),$(call gb_ObjCxxObject_get_dep_target,$(object)))\
389 $(foreach object,$(7),$(call gb_AsmObject_get_dep_target,$(object)))\
390 $(foreach object,$(8),$(call gb_GenCObject_get_dep_target,$(object))) \
391 $(foreach object,$(9),$(call gb_GenCxxObject_get_dep_target,$(object))) \
392 ) && \
393 $(SOLARENV)/bin/concat-deps.pl $${RESPONSEFILE} > $(1)) && \
394 rm -f $${RESPONSEFILE}
396 endef
398 define gb_LinkTarget__command_objectlist
399 TEMPFILE=$(call var2file,$(shell $(gb_MKTEMP)),200,\
400 $(foreach object,$(COBJECTS),$(call gb_CObject_get_target,$(object))) \
401 $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_target,$(object))) \
402 $(foreach object,$(OBJCOBJECTS),$(call gb_ObjCObject_get_target,$(object))) \
403 $(foreach object,$(OBJCXXOBJECTS),$(call gb_ObjCxxObject_get_target,$(object))) \
404 $(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_target,$(object))) \
405 $(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_target,$(object))) \
406 $(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_target,$(object)))) && \
407 $(if $(EXTRAOBJECTLISTS),cat $(EXTRAOBJECTLISTS) >> $${TEMPFILE} && ) \
408 mv $${TEMPFILE} $(call gb_LinkTarget_get_objects_list,$(2))
410 endef
412 $(call gb_LinkTarget_get_target,%) : $(call gb_LinkTarget_get_headers_target,%) $(gb_Helper_MISCDUMMY)
413 $(call gb_LinkTarget__command,$@,$*)
414 $(call gb_LinkTarget__command_objectlist,$@,$*)
416 ifeq ($(gb_FULLDEPS),$(true))
417 $(call gb_LinkTarget_get_target,%) : $(call gb_LinkTarget_get_dep_target,%)
418 $(call gb_LinkTarget_get_dep_target,%) : | $(call gb_LinkTarget_get_headers_target,%)
419 $(call gb_LinkTarget__command_dep,$@,$*,$(COBJECTS),$(CXXOBJECTS),$(OBJCOBJECTS),$(OBJCXXOBJECTS),$(ASMOBJECTS),$(GENCOBJECTS),$(GENCXXOBJECTS))
420 endif
422 # Ok, this is some dark voodoo: When declaring a linktarget with
423 # gb_LinkTarget_LinkTarget we set SELF in the headertarget to name of the
424 # target. When the rule for the headertarget is executed and SELF does not
425 # match the target name, we are depending on a linktarget that was never
426 # declared. In a full build exclusively in gbuild that should never happen.
427 # However, partial gbuild build will not know about how to build lower level
428 # linktargets, just as gbuild can not know about linktargets generated in the
429 # old build.pl/dmake system. Once all is migrated, gbuild should error out
430 # when is is told to depend on a linktarget it does not know about and not
431 # only warn.
432 define gb_LinkTarget__get_external_headers_check
433 ifneq ($$(SELF),$$*)
434 $$(eval $$(call gb_Output_info,LinkTarget $$* not defined: Assuming headers to be there!,ALL))
435 endif
436 $$@ : COMMAND := $$(call gb_Helper_abbreviate_dirs, mkdir -p $$(dir $$@) && touch $$@ && mkdir -p $(call gb_LinkTarget_get_target,)pdb/$$(dir $$*))
438 endef
440 $(call gb_LinkTarget_get_external_headers_target,%) :
441 $(eval $(gb_LinkTarget__get_external_headers_check))
442 $(COMMAND)
444 $(call gb_LinkTarget_get_headers_target,%) : $(call gb_LinkTarget_get_external_headers_target,%)
445 $(call gb_Helper_abbreviate_dirs,\
446 mkdir -p $(dir $@) && touch $@)
448 # Explanation of some of the targets:
449 # - gb_LinkTarget_get_external_headers_target is the targets that guarantees all
450 # headers from linked against libraries are in OUTDIR.
451 # - gb_LinkTarget_get_headers_target is the target that guarantees all headers
452 # from the linked against the libraries and the linktargets own headers
453 # (including generated headers) are in the OUTDIR.
454 # - gb_LinkTarget_get_target links the objects into a file in WORKDIR.
455 # gb_LinkTarget_get_target depends on gb_LinkTarget_get_headers_target which in
456 # turn depends gb_LinkTarget_get_external_headers_target.
457 # gb_LinkTarget_get_target depends additionally on the objects, which in turn
458 # depend build-order only on the gb_LinkTarget_get_headers_target. The build
459 # order-only dependency ensures all headers to be there for compiling and
460 # dependency generation without causing all objects to be rebuild when one
461 # header changes. Only the ones with an explicit dependency in their generated
462 # dependency file will be rebuild.
464 # gb_LinkTarget_get_target is the target that links the objects into a file in
465 # WORKDIR
466 # Explanation of some of the variables:
467 # - AUXTARGETS are the additionally generated files that need to be cleaned out
468 # on clean.
469 # - PCH_CXXFLAGS and PCH_DEFS are the flags that the precompiled headers will
470 # be compiled with. They should never be overridden in a single object
471 # files.
472 # - TARGETTYPE is the type of linktarget as some platforms need very different
473 # command to link different targettypes.
475 # Since most variables are set on the linktarget and not on the object, the
476 # object learns about these setting via GNU makes scoping of target variables.
477 # Therefore it is important that objects are only directly depended on by the
478 # linktarget. This for example means that you cannot build a single object
479 # alone, because then you would directly depend on the object.
481 # A note about flags: because the overriding the global variables with a target
482 # local variable of the same name is considered obscure, the target local
483 # variables have a T_ prefix.
484 define gb_LinkTarget_LinkTarget
485 $(call gb_LinkTarget_get_clean_target,$(1)) : AUXTARGETS :=
486 $(call gb_LinkTarget_get_external_headers_target,$(1)) : SELF := $(1)
487 $(call gb_LinkTarget_get_target,$(1)) : DLLTARGET :=
488 $(call gb_LinkTarget_get_clean_target,$(1)) \
489 $(call gb_LinkTarget_get_target,$(1)) : COBJECTS :=
490 $(call gb_LinkTarget_get_clean_target,$(1)) \
491 $(call gb_LinkTarget_get_target,$(1)) : CXXOBJECTS :=
492 $(call gb_LinkTarget_get_clean_target,$(1)) \
493 $(call gb_LinkTarget_get_target,$(1)) : YACCOBJECT :=
494 $(call gb_LinkTarget_get_clean_target,$(1)) \
495 $(call gb_LinkTarget_get_target,$(1)) : T_YACCFLAGS := $$(gb_LinkTarget_YYACFLAGS) $(YACCFLAGS)
496 $(call gb_LinkTarget_get_clean_target,$(1)) \
497 $(call gb_LinkTarget_get_target,$(1)) : OBJCOBJECTS :=
498 $(call gb_LinkTarget_get_clean_target,$(1)) \
499 $(call gb_LinkTarget_get_target,$(1)) : OBJCXXOBJECTS :=
500 $(call gb_LinkTarget_get_clean_target,$(1)) \
501 $(call gb_LinkTarget_get_target,$(1)) : ASMOBJECTS :=
502 $(call gb_LinkTarget_get_clean_target,$(1)) \
503 $(call gb_LinkTarget_get_target,$(1)) : GENCOBJECTS :=
504 $(call gb_LinkTarget_get_clean_target,$(1)) \
505 $(call gb_LinkTarget_get_target,$(1)) : GENCXXOBJECTS :=
506 $(call gb_LinkTarget_get_headers_target,$(1)) \
507 $(call gb_LinkTarget_get_target,$(1)) : T_CFLAGS := $$(gb_LinkTarget_CFLAGS) $(CFLAGS)
508 $(call gb_LinkTarget_get_headers_target,$(1)) \
509 $(call gb_LinkTarget_get_target,$(1)) : T_CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS)
510 $(call gb_LinkTarget_get_headers_target,$(1)) \
511 $(call gb_LinkTarget_get_target,$(1)) : PCH_CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS) $(CXXFLAGS)
512 $(call gb_LinkTarget_get_target,$(1)) : T_OBJCXXFLAGS := $$(gb_LinkTarget_OBJCXXFLAGS) $(OBJCXXFLAGS)
513 $(call gb_LinkTarget_get_target,$(1)) : T_OBJCFLAGS := $$(gb_LinkTarget_OBJCFLAGS) $(OBJCFLAGS)
514 $(call gb_LinkTarget_get_headers_target,$(1)) \
515 $(call gb_LinkTarget_get_target,$(1)) : DEFS := $$(gb_LinkTarget_DEFAULTDEFS) $(CPPFLAGS)
516 $(call gb_LinkTarget_get_headers_target,$(1)) \
517 $(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS := $$(gb_LinkTarget_DEFAULTDEFS) $(CPPFLAGS)
518 $(call gb_LinkTarget_get_headers_target,$(1)) \
519 $(call gb_LinkTarget_get_target,$(1)) : INCLUDE := $$(gb_LinkTarget_INCLUDE)
520 $(call gb_LinkTarget_get_headers_target,$(1)) \
521 $(call gb_LinkTarget_get_target,$(1)) : INCLUDE_STL := $$(gb_LinkTarget_INCLUDE_STL)
522 $(call gb_LinkTarget_get_target,$(1)) : T_LDFLAGS := $$(gb_LinkTarget_LDFLAGS) $(LDFLAGS)
523 $(call gb_LinkTarget_get_target,$(1)) : LINKED_LIBS :=
524 $(call gb_LinkTarget_get_target,$(1)) : LINKED_STATIC_LIBS :=
525 $(call gb_LinkTarget_get_target,$(1)) : LIBS :=
526 $(call gb_LinkTarget_get_target,$(1)) : TARGETTYPE :=
527 $(call gb_LinkTarget_get_headers_target,$(1)) \
528 $(call gb_LinkTarget_get_target,$(1)) : PCH_NAME :=
529 $(call gb_LinkTarget_get_target,$(1)) : PCHOBJS :=
530 $(call gb_LinkTarget_get_headers_target,$(1)) \
531 $(call gb_LinkTarget_get_target,$(1)) : PDBFILE :=
532 $(call gb_LinkTarget_get_target,$(1)) : EXTRAOBJECTLISTS :=
533 $(call gb_LinkTarget_get_target,$(1)) : NATIVERES :=
535 ifeq ($(gb_FULLDEPS),$(true))
536 -include $(call gb_LinkTarget_get_dep_target,$(1))
537 $(call gb_LinkTarget_get_dep_target,$(1)) : COBJECTS :=
538 $(call gb_LinkTarget_get_dep_target,$(1)) : CXXOBJECTS :=
539 $(call gb_LinkTarget_get_dep_target,$(1)) : OBJCOBJECTS :=
540 $(call gb_LinkTarget_get_dep_target,$(1)) : OBJCXXOBJECTS :=
541 $(call gb_LinkTarget_get_dep_target,$(1)) : ASMOBJECTS :=
542 $(call gb_LinkTarget_get_dep_target,$(1)) : GENCOBJECTS :=
543 $(call gb_LinkTarget_get_dep_target,$(1)) : GENCXXOBJECTS :=
544 $(call gb_LinkTarget_get_dep_target,$(1)) : YACCOBJECTS :=
545 $(call gb_LinkTarget_get_dep_target,$(1)) : T_CFLAGS := $$(gb_LinkTarget_CFLAGS) $(CFLAGS)
546 $(call gb_LinkTarget_get_dep_target,$(1)) : T_CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS)
547 $(call gb_LinkTarget_get_dep_target,$(1)) : PCH_CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS) $(CXXFLAGS)
548 $(call gb_LinkTarget_get_dep_target,$(1)) : T_OBJCXXFLAGS := $$(gb_LinkTarget_OBJCXXFLAGS) $(OBJCXXFLAGS)
549 $(call gb_LinkTarget_get_dep_target,$(1)) : T_OBJCFLAGS := $$(gb_LinkTarget_OBJCFLAGS) $(OBJCFLAGS)
550 $(call gb_LinkTarget_get_dep_target,$(1)) : T_YACCFLAGS := $$(gb_LinkTarget_YYACFLAGS) $(YACCFLAGS)
551 $(call gb_LinkTarget_get_dep_target,$(1)) : DEFS := $$(gb_LinkTarget_DEFAULTDEFS) $(CPPFLAGS)
552 $(call gb_LinkTarget_get_dep_target,$(1)) : PCH_DEFS := $$(gb_LinkTarget_DEFAULTDEFS) $(CPPFLAGS)
553 $(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE := $$(gb_LinkTarget_INCLUDE)
554 $(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE_STL := $$(gb_LinkTarget_INCLUDE_STL)
555 $(call gb_LinkTarget_get_dep_target,$(1)) : TARGETTYPE :=
556 $(call gb_LinkTarget_get_dep_target,$(1)) : PCH_NAME :=
557 $(call gb_LinkTarget_get_dep_target,$(1)) : EXTRAOBJECTLISTS :=
558 endif
560 endef
562 define gb_LinkTarget_add_defs
563 $(call gb_LinkTarget_get_headers_target,$(1)) \
564 $(call gb_LinkTarget_get_target,$(1)) : DEFS += $(2)
565 $(call gb_LinkTarget_get_headers_target,$(1)) \
566 $(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS += $(2)
567 ifeq ($(gb_FULLDEPS),$(true))
568 $(call gb_LinkTarget_get_dep_target,$(1)) : DEFS += $(2)
569 $(call gb_LinkTarget_get_dep_target,$(1)) : PCH_DEFS += $(2)
570 endif
571 endef
573 define gb_LinkTarget_set_defs
574 ifeq (,)
575 $$(call gb_Output_error,\
576 gb_LinkTarget_set_defs: use gb_LinkTarget_add_defs instead.)
577 else
578 $(call gb_LinkTarget_get_headers_target,$(1)) \
579 $(call gb_LinkTarget_get_target,$(1)) : DEFS := $(2)
580 $(call gb_LinkTarget_get_headers_target,$(1)) \
581 $(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS := $(2)
583 ifeq ($(gb_FULLDEPS),$(true))
584 $(call gb_LinkTarget_get_dep_target,$(1)) : DEFS := $(2)
585 $(call gb_LinkTarget_get_dep_target,$(1)) : PCH_DEFS := $(2)
586 endif
587 endif
589 endef
591 define gb_LinkTarget_add_cflags
592 $(call gb_LinkTarget_get_target,$(1)) : T_CFLAGS += $(2)
593 ifeq ($(gb_FULLDEPS),$(true))
594 $(call gb_LinkTarget_get_dep_target,$(1)) : T_CFLAGS += $(2)
595 endif
597 endef
599 define gb_LinkTarget_set_cflags
600 ifeq (,)
601 $$(call gb_Output_error,\
602 gb_LinkTarget_set_cflags: use gb_LinkTarget_add_cflags instead.)
603 else
604 $(call gb_LinkTarget_get_target,$(1)) : T_CFLAGS := $(2)
605 ifeq ($(gb_FULLDEPS),$(true))
606 $(call gb_LinkTarget_get_dep_target,$(1)) : T_CFLAGS := $(2)
607 endif
608 endif
610 endef
612 define gb_LinkTarget_add_cxxflags
613 $(call gb_LinkTarget_get_headers_target,$(1)) \
614 $(call gb_LinkTarget_get_target,$(1)) : T_CXXFLAGS += $(2)
615 $(call gb_LinkTarget_get_headers_target,$(1)) \
616 $(call gb_LinkTarget_get_target,$(1)) : PCH_CXXFLAGS += $(2)
617 ifeq ($(gb_FULLDEPS),$(true))
618 $(call gb_LinkTarget_get_dep_target,$(1)) : T_CXXFLAGS += $(2)
619 $(call gb_LinkTarget_get_dep_target,$(1)) : PCH_CXXFLAGS += $(2)
620 endif
621 endef
623 define gb_LinkTarget_set_cxxflags
624 ifeq (,)
625 $$(call gb_Output_error,\
626 gb_LinkTarget_set_cxxflags: use gb_LinkTarget_add_cxxflags instead.)
627 else
628 $(call gb_LinkTarget_get_headers_target,$(1)) \
629 $(call gb_LinkTarget_get_target,$(1)) : T_CXXFLAGS := $(2)
630 $(call gb_LinkTarget_get_headers_target,$(1)) \
631 $(call gb_LinkTarget_get_target,$(1)) : PCH_CXXFLAGS := $(2)
632 ifeq ($(gb_FULLDEPS),$(true))
633 $(call gb_LinkTarget_get_dep_target,$(1)) : T_CXXFLAGS := $(2)
634 $(call gb_LinkTarget_get_dep_target,$(1)) : PCH_CXXFLAGS := $(2)
635 endif
636 endif
638 endef
640 define gb_LinkTarget_add_objcxxflags
641 $(call gb_LinkTarget_get_target,$(1)) : T_OBJCXXFLAGS += $(2)
642 ifeq ($(gb_FULLDEPS),$(true))
643 $(call gb_LinkTarget_get_dep_target,$(1)) : T_OBJCXXFLAGS += $(2)
644 endif
645 endef
647 define gb_LinkTarget_set_objcxxflags
648 ifeq (,)
649 $$(call gb_Output_error,\
650 gb_LinkTarget_set_objcxxflags: use gb_LinkTarget_add_objcxxflags instead.)
651 else
652 $(call gb_LinkTarget_get_target,$(1)) : T_OBJCXXFLAGS := $(2)
653 ifeq ($(gb_FULLDEPS),$(true))
654 $(call gb_LinkTarget_get_dep_target,$(1)) : T_OBJCXXFLAGS := $(2)
655 endif
656 endif
658 endef
660 define gb_LinkTarget_set_objcflags
661 $(call gb_LinkTarget_get_target,$(1)) : T_OBJCFLAGS := $(2)
662 ifeq ($(gb_FULLDEPS),$(true))
663 $(call gb_LinkTarget_get_dep_target,$(1)) : T_OBJCFLAGS := $(2)
664 endif
666 endef
668 define gb_LinkTarget_set_include
669 $(call gb_LinkTarget_get_headers_target,$(1)) \
670 $(call gb_LinkTarget_get_target,$(1)) : INCLUDE := $(2)
671 ifeq ($(gb_FULLDEPS),$(true))
672 $(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE := $(2)
673 endif
675 endef
677 define gb_LinkTarget_set_include_stl
678 $(call gb_LinkTarget_get_headers_target,$(1)) \
679 $(call gb_LinkTarget_get_target,$(1)) : INCLUDE_STL := $(2)
680 ifeq ($(gb_FULLDEPS),$(true))
681 $(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE_STL := $(2)
682 endif
684 endef
686 define gb_LinkTarget_add_ldflags
687 $(call gb_LinkTarget_get_target,$(1)) : T_LDFLAGS += $(2)
688 endef
690 # real use in RepositoryExternal.mk
691 define gb_LinkTarget_set_ldflags
692 $(call gb_LinkTarget_get_target,$(1)) : T_LDFLAGS := $(2)
693 endef
695 define gb_LinkTarget_add_libs
696 $(call gb_LinkTarget_get_target,$(1)) : LIBS += $(2)
697 endef
699 define gb_LinkTarget_add_api
700 $(call gb_LinkTarget_get_external_headers_target,$(1)) :| \
701 $$(foreach api,$(2),$$(call gb_Package_get_target,$$(api)_inc))
702 $(call gb_LinkTarget_get_headers_target,$(1)) \
703 $(call gb_LinkTarget_get_target,$(1)) : INCLUDE += $$(foreach api,$(2),-I$(OUTDIR)/inc/$$(api))
704 ifeq ($(gb_FULLDEPS),$(true))
705 $(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE += $$(foreach api,$(2),-I$(OUTDIR)/inc/$$(api))
706 endif
708 endef
710 define gb_LinkTarget_add_linked_libs
711 ifneq (,$$(filter-out $(gb_Library_KNOWNLIBS),$(2)))
712 $$(eval $$(call gb_Output_info,currently known libraries are: $(sort $(gb_Library_KNOWNLIBS)),ALL))
713 $$(eval $$(call gb_Output_error,Cannot link against library/libraries $$(filter-out $(gb_Library_KNOWNLIBS),$(2)). Libraries must be registered in Repository.mk))
714 endif
716 ifeq ($(MERGELIBS),TRUE)
717 gb_LINKED_LIBS := $(if $(filter $(gb_CORE_LIBS),$(2)),merged $(filter-out $(gb_CORE_LIBS),$(2)),$(2))
718 else
719 gb_LINKED_LIBS := $(2)
720 endif
722 $(call gb_LinkTarget_get_target,$(1)) : LINKED_LIBS += $$(gb_LINKED_LIBS)
724 $(call gb_LinkTarget_get_target,$(1)) : $$(foreach lib,$$(gb_LINKED_LIBS),$$(call gb_Library_get_target,$$(lib)))
725 $(call gb_LinkTarget_get_external_headers_target,$(1)) : \
726 $$(foreach lib,$$(gb_LINKED_LIBS),$$(call gb_Library_get_headers_target,$$(lib)))
728 endef
730 define gb_LinkTarget_add_linked_static_libs
731 ifneq (,$$(filter-out $(gb_StaticLibrary_KNOWNLIBS),$(2)))
732 $$(eval $$(call gb_Output_info, currently known static libraries are: $(sort $(gb_StaticLibrary_KNOWNLIBS)),ALL))
733 $$(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))
734 endif
736 $(call gb_LinkTarget_get_target,$(1)) : LINKED_STATIC_LIBS += $(2)
738 $(call gb_LinkTarget_get_target,$(1)) : $$(foreach lib,$(2),$$(call gb_StaticLibrary_get_target,$$(lib)))
739 $(call gb_LinkTarget_get_external_headers_target,$(1)) : \
740 $$(foreach lib,$(2),$$(call gb_StaticLibrary_get_headers_target,$$(lib)))
742 endef
744 define gb_LinkTarget_add_linked_static_external_libs
746 $(call gb_LinkTarget_get_target,$(1)) : LINKED_STATIC_LIBS += $(2)
748 $(call gb_LinkTarget_get_target,$(1)) : $$(foreach lib,$(2),$$(call gb_ExternalLibs_get_target,$$(lib)))
749 $(call gb_LinkTarget_get_external_headers_target,$(1)) : $$(foreach lib,$(2),$$(call gb_ExternalLibs_get_target,$$(lib)))
751 endef
753 define gb_LinkTarget_add_cobject
754 $(if $(wildcard $(call gb_CObject_get_source,$(SRCDIR),$(2))),,$(eval $(call gb_Output_error,No such source file $(call gb_CObject_get_source,$(SRCDIR),$(2)))))
755 $(call gb_LinkTarget_get_target,$(1)) : COBJECTS += $(2)
756 $(call gb_LinkTarget_get_clean_target,$(1)) : COBJECTS += $(2)
758 $(call gb_LinkTarget_get_target,$(1)) : $(call gb_CObject_get_target,$(2))
759 $(call gb_CObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
760 $(call gb_CObject_get_target,$(2)) : T_CFLAGS += $(3)
762 ifeq ($(gb_FULLDEPS),$(true))
763 $(call gb_LinkTarget_get_dep_target,$(1)) : COBJECTS += $(2)
764 $(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_CObject_get_dep_target,$(2))
765 endif
767 ifeq ($(gb_CHECKOBJECTOWNER),$(true))
768 gb_LinkTarget_OBJECTOWNER += $(call gb_CObject_get_target,$(2)):$(1)
769 gb_LinkTarget_OBJECTS += $(call gb_CObject_get_target,$(2))
770 endif
772 endef
774 define gb_LinkTarget_add_cxxobject
775 $(if $(wildcard $(call gb_CxxObject_get_source,$(SRCDIR),$(2))),,$(eval $(call gb_Output_error,No such source file $(call gb_CxxObject_get_source,$(SRCDIR),$(2)))))
776 $(call gb_LinkTarget_get_target,$(1)) : CXXOBJECTS += $(2)
777 $(call gb_LinkTarget_get_clean_target,$(1)) : CXXOBJECTS += $(2)
779 $(call gb_LinkTarget_get_target,$(1)) : $(call gb_CxxObject_get_target,$(2))
780 $(call gb_CxxObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
781 $(call gb_CxxObject_get_target,$(2)) : T_CXXFLAGS += $(3)
783 ifeq ($(gb_FULLDEPS),$(true))
784 $(call gb_LinkTarget_get_dep_target,$(1)) : CXXOBJECTS += $(2)
785 $(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_CxxObject_get_dep_target,$(2))
786 endif
788 ifeq ($(gb_CHECKOBJECTOWNER),$(true))
789 gb_LinkTarget_OBJECTOWNER += $(call gb_CxxObject_get_target,$(2)):$(1)
790 gb_LinkTarget_OBJECTS += $(call gb_CxxObject_get_target,$(2))
791 endif
793 endef
795 define gb_LinkTarget_add_objcobject
796 $(if $(wildcard $(call gb_ObjCObject_get_source,$(SRCDIR),$(2))),,$(eval $(call gb_Output_error,No such source file $(call gb_ObjCObject_get_source,$(SRCDIR),$(2)))))
797 $(call gb_LinkTarget_get_target,$(1)) : OBJCOBJECTS += $(2)
798 $(call gb_LinkTarget_get_clean_target,$(1)) : OBJCOBJECTS += $(2)
800 $(call gb_LinkTarget_get_target,$(1)) : $(call gb_ObjCObject_get_target,$(2))
801 $(call gb_ObjCObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
802 $(call gb_ObjCObject_get_target,$(2)) : T_OBJCFLAGS += $(3)
804 ifeq ($(gb_FULLDEPS),$(true))
805 $(call gb_LinkTarget_get_dep_target,$(1)) : OBJCOBJECTS += $(2)
806 $(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_ObjCObject_get_dep_target,$(2))
807 endif
809 ifeq ($(gb_CHECKOBJECTOWNER),$(true))
810 gb_LinkTarget_OBJECTOWNER += $(call gb_ObjCObject_get_target,$(2)):$(1)
811 gb_LinkTarget_OBJECTS += $(call gb_ObjCObject_get_target,$(2))
812 endif
814 endef
816 define gb_LinkTarget_add_objcxxobject
817 $(if $(wildcard $(call gb_ObjCxxObject_get_source,$(SRCDIR),$(2))),,$(eval $(call gb_Output_error,No such source file $(call gb_ObjCxxObject_get_source,$(SRCDIR),$(2)))))
818 $(call gb_LinkTarget_get_target,$(1)) : OBJCXXOBJECTS += $(2)
819 $(call gb_LinkTarget_get_clean_target,$(1)) : OBJCXXOBJECTS += $(2)
821 $(call gb_LinkTarget_get_target,$(1)) : $(call gb_ObjCxxObject_get_target,$(2))
822 $(call gb_ObjCxxObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
823 $(call gb_ObjCxxObject_get_target,$(2)) : T_OBJCXXFLAGS += $(3)
825 ifeq ($(gb_FULLDEPS),$(true))
826 $(call gb_LinkTarget_get_dep_target,$(1)) : OBJCXXOBJECTS += $(2)
827 $(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_ObjCxxObject_get_dep_target,$(2))
828 endif
830 ifeq ($(gb_CHECKOBJECTOWNER),$(true))
831 gb_LinkTarget_OBJECTOWNER += $(call gb_ObjCxxObject_get_target,$(2)):$(1)
832 gb_LinkTarget_OBJECTS += $(call gb_ObjCxxObject_get_target,$(2))
833 endif
835 endef
837 define gb_LinkTarget_add_asmobject
838 $(if $(wildcard $(call gb_AsmObject_get_source,$(SRCDIR),$(2))),,$(eval $(call gb_Output_error,No such source file $(call gb_AsmObject_get_source,$(SRCDIR),$(2)))))
839 $(call gb_LinkTarget_get_target,$(1)) : ASMOBJECTS += $(2)
840 $(call gb_LinkTarget_get_clean_target,$(1)) : ASMOBJECTS += $(2)
842 $(call gb_LinkTarget_get_target,$(1)) : $(call gb_AsmObject_get_target,$(2))
843 $(call gb_AsmObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
845 ifeq ($(gb_FULLDEPS),$(true))
846 $(call gb_LinkTarget_get_dep_target,$(1)) : ASMOBJECTS += $(2)
847 $(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_AsmObject_get_dep_target,$(2))
848 endif
850 ifeq ($(gb_CHECKOBJECTOWNER),$(true))
851 gb_LinkTarget_OBJECTOWNER += $(call gb_AsmObject_get_target,$(2)):$(1)
852 gb_LinkTarget_OBJECTS += $(call gb_AsmObject_get_target,$(2))
853 endif
855 endef
857 define gb_LinkTarget_add_generated_c_object
858 $(call gb_LinkTarget_get_target,$(1)) : GENCOBJECTS += $(2)
859 $(call gb_LinkTarget_get_clean_target,$(1)) : GENCOBJECTS += $(2)
861 $(call gb_LinkTarget_get_target,$(1)) : $(call gb_GenCObject_get_target,$(2))
862 $(call gb_GenCObject_get_source,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
863 $(call gb_GenCObject_get_target,$(2)) : T_CFLAGS += $(3)
865 ifeq ($(gb_FULLDEPS),$(true))
866 $(call gb_LinkTarget_get_dep_target,$(1)) : GENCOBJECTS += $(2)
867 $(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_GenCObject_get_dep_target,$(2))
868 endif
870 ifeq ($(gb_CHECKOBJECTOWNER),$(true))
871 gb_LinkTarget_OBJECTOWNER += $(call gb_GenCObject_get_target,$(2)):$(1)
872 gb_LinkTarget_OBJECTS += $(call gb_GenCObject_get_target,$(2))
873 endif
875 endef
877 define gb_LinkTarget_add_generated_cxx_object
878 $(call gb_LinkTarget_get_target,$(1)) : GENCXXOBJECTS += $(2)
879 $(call gb_LinkTarget_get_clean_target,$(1)) : GENCXXOBJECTS += $(2)
881 $(call gb_LinkTarget_get_target,$(1)) : $(call gb_GenCxxObject_get_target,$(2))
882 $(call gb_GenCxxObject_get_source,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
883 $(call gb_GenCxxObject_get_target,$(2)) : T_CXXFLAGS += $(3)
885 ifeq ($(gb_FULLDEPS),$(true))
886 $(call gb_LinkTarget_get_dep_target,$(1)) : GENCXXOBJECTS += $(2)
887 $(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_GenCxxObject_get_dep_target,$(2))
888 endif
890 ifeq ($(gb_CHECKOBJECTOWNER),$(true))
891 gb_LinkTarget_OBJECTOWNER += $(call gb_GenCxxObject_get_target,$(2)):$(1)
892 gb_LinkTarget_OBJECTS += $(call gb_GenCxxObject_get_target,$(2))
893 endif
895 endef
897 define gb_LinkTarget_yacc_add_cpp_dep
898 $(call gb_CxxObject_get_target,$(2)) : $(call gb_YaccObject_get_target,$(1))
899 endef
901 # Add a bison grammar to the build.
902 # gb_LinkTarget_add_grammar(<component>,<grammar file>)
903 define gb_LinkTarget_add_grammar
904 $(call gb_YaccObject_YaccObject,$(2))
905 $(call gb_LinkTarget_get_target,$(1)) : $(call gb_YaccObject_get_target,$(2))
906 $(call gb_LinkTarget_get_clean_target,$(1)) : $(call gb_YaccObject_get_clean_target,$(2))
907 $(call gb_LinkTarget_get_target,$(1)) : GENCXXOBJECTS += $(2)
908 $(call gb_LinkTarget_get_clean_target,$(1)) : GENCXXOBJECTS += $(2)
910 ifeq ($(gb_FULLDEPS),$(true))
911 $(call gb_LinkTarget_get_dep_target,$(1)) : GENCXXOBJECTS += $(2)
912 $(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_YaccObject_get_dep_target,$(2))
913 endif
915 $(call gb_LinkTarget__add_internal_headers,$(1),$(gb_YaccObject_get_header_target,$(2)))
917 endef
919 # Add bison grammars to the build.
920 # gb_LinkTarget_add_grammars(<component>,<grammar file> [<grammar file>*])
921 define gb_LinkTarget_add_grammars
922 $(foreach grammar,$(2),$(call gb_LinkTarget_add_grammar,$(1),$(grammar)))
923 endef
925 define gb_LinkTarget_add_noexception_object
926 $(call gb_LinkTarget_add_cxxobject,$(1),$(2),$(gb_LinkTarget_NOEXCEPTIONFLAGS) $(CXXFLAGS))
927 endef
929 define gb_LinkTarget_add_exception_object
930 $(call gb_LinkTarget_add_cxxobject,$(1),$(2),$(gb_LinkTarget_EXCEPTIONFLAGS) $(CXXFLAGS))
931 endef
933 define gb_LinkTarget_add_cobjects
934 $(foreach obj,$(2),$(call gb_LinkTarget_add_cobject,$(1),$(obj),$(3)))
935 endef
937 define gb_LinkTarget_add_linktarget_objects
938 $(call gb_LinkTarget_get_target,$(1)) : $(foreach linktarget,$(2),$(call gb_LinkTarget_get_target,$(linktarget)))
939 $(call gb_LinkTarget_get_target,$(1)) : EXTRAOBJECTLISTS += $(foreach linktarget,$(2),$(call gb_LinkTarget_get_objects_list,$(linktarget)))
941 endef
943 define gb_LinkTarget_add_library_objects
944 ifneq (,$$(filter-out $(gb_Library_KNOWNLIBS),$(2)))
945 $$(eval $$(call gb_Output_info,currently known libraries are: $(sort $(gb_Library_KNOWNLIBS)),ALL))
946 $$(eval $$(call gb_Output_error,Cannot import objects library/libraries $$(filter-out $(gb_Library_KNOWNLIBS),$(2)). Libraries must be registered in Repository.mk))
947 endif
948 $(call gb_LinkTarget_add_linktarget_objects,$(1),$(foreach lib,$(2),$(call gb_Library_get_linktargetname,$(lib))))
950 endef
952 define gb_LinkTarget_add_executable_objects
953 $(call gb_LinkTarget_add_linktarget_objects,$(1),$(foreach exe,$(2),$(call gb_Executable_get_linktargetname,$(lib))))
955 endef
957 define gb_LinkTarget_add_cxxobjects
958 $(foreach obj,$(2),$(call gb_LinkTarget_add_cxxobject,$(1),$(obj),$(3)))
959 endef
961 define gb_LinkTarget_add_objcobjects
962 $(foreach obj,$(2),$(call gb_LinkTarget_add_objcobject,$(1),$(obj),$(3)))
963 endef
965 define gb_LinkTarget_add_objcxxobjects
966 $(foreach obj,$(2),$(call gb_LinkTarget_add_objcxxobject,$(1),$(obj),$(3)))
967 endef
969 define gb_LinkTarget_add_asmobjects
970 $(foreach obj,$(2),$(call gb_LinkTarget_add_asmobject,$(1),$(obj),$(3)))
971 endef
973 define gb_LinkTarget_add_noexception_objects
974 $(foreach obj,$(2),$(call gb_LinkTarget_add_noexception_object,$(1),$(obj)))
975 endef
977 define gb_LinkTarget_add_exception_objects
978 $(foreach obj,$(2),$(call gb_LinkTarget_add_exception_object,$(1),$(obj)))
979 endef
981 define gb_LinkTarget_add_generated_cobjects
982 $(foreach obj,$(2),$(call gb_LinkTarget_add_generated_c_object,$(1),$(obj),$(3)))
983 endef
985 define gb_LinkTarget_add_generated_cxxobjects
986 $(foreach obj,$(2),$(call gb_LinkTarget_add_generated_cxx_object,$(1),$(obj),$(3)))
987 endef
989 define gb_LinkTarget_add_generated_exception_object
990 $(call gb_LinkTarget_add_generated_cxx_object,$(1),$(2),$(gb_LinkTarget_EXCEPTIONFLAGS) $(gb_COMPILEROPTFLAGS) $(CXXFLAGS))
991 endef
993 define gb_LinkTarget_add_generated_exception_objects
994 $(foreach obj,$(2),$(call gb_LinkTarget_add_generated_exception_object,$(1),$(obj)))
995 endef
997 define gb_LinkTarget_set_targettype
998 $(call gb_LinkTarget_get_target,$(1)) \
999 $(call gb_LinkTarget_get_dep_target,$(1)) : TARGETTYPE := $(2)
1000 endef
1002 define gb_LinkTarget_set_dlltarget
1003 $(call gb_LinkTarget_get_clean_target,$(1)) \
1004 $(call gb_LinkTarget_get_target,$(1)) : DLLTARGET := $(2)
1005 endef
1007 define gb_LinkTarget_set_auxtargets
1008 $(call gb_LinkTarget_get_clean_target,$(1)) : AUXTARGETS := $(2)
1009 endef
1011 define gb_LinkTarget__add_internal_headers
1012 $(call gb_LinkTarget_get_headers_target,$(1)) : $(2)
1013 $(2) :| $(call gb_LinkTarget_get_external_headers_target,$(1))
1015 endef
1017 define gb_LinkTarget_add_package_headers
1018 $(foreach package,$(2),$(call gb_LinkTarget__add_internal_headers,$(1),$(call gb_Package_get_target,$(package))))
1019 $(call gb_LinkTarget_get_clean_target,$(1)) : $(foreach package,$(2),$(call gb_Package_get_clean_target,$(package)))
1021 endef
1023 define gb_LinkTarget_add_sdi_headers
1024 $(call gb_LinkTarget__add_internal_headers,$(1),$(foreach sdi,$(2),$(call gb_SdiTarget_get_target,$(sdi))))
1025 $(call gb_LinkTarget_get_clean_target,$(1)) : $(foreach sdi,$(2),$(call gb_SdiTarget_get_clean_target,$(sdi)))
1026 endef
1028 define gb_LinkTarget__add_precompiled_header_impl
1029 $(call gb_LinkTarget__add_internal_headers,$(1),$(call gb_PrecompiledHeader_get_target,$(3)))
1030 $(call gb_LinkTarget_get_clean_target,$(1)) : $(call gb_PrecompiledHeader_get_clean_target,$(3))
1031 $(call gb_PrecompiledHeader_get_target,$(3)) : $(2).cxx
1033 $(call gb_LinkTarget__add_internal_headers,$(1),$(call gb_NoexPrecompiledHeader_get_target,$(3)))
1034 $(call gb_LinkTarget_get_clean_target,$(1)) : $(call gb_NoexPrecompiledHeader_get_clean_target,$(3))
1035 $(call gb_NoexPrecompiledHeader_get_target,$(3)) : $(2).cxx
1037 $(call gb_LinkTarget_get_target,$(1)) : PCH_NAME := $(3)
1038 $(call gb_LinkTarget_get_target,$(1)) : PCHOBJS = $(call gb_PrecompiledHeader_get_target,$(3)).obj $(call gb_NoexPrecompiledHeader_get_target,$(3)).obj
1040 $(call gb_LinkTarget_get_headers_target,$(1)) \
1041 $(call gb_LinkTarget_get_target,$(1)) : DEFS := $$(DEFS) -DPRECOMPILED_HEADERS
1042 $(call gb_LinkTarget_get_headers_target,$(1)) \
1043 $(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS = $$(DEFS)
1044 ifeq ($(gb_FULLDEPS),$(true))
1045 -include \
1046 $(call gb_PrecompiledHeader_get_dep_target,$(3)) \
1047 $(call gb_NoexPrecompiledHeader_get_dep_target,$(3))
1048 $(call gb_LinkTarget_get_dep_target,$(1)) : DEFS := $$(DEFS) -DPRECOMPILED_HEADERS
1049 $(call gb_LinkTarget_get_dep_target,$(1)) : PCH_DEFS = $$(DEFS)
1050 endif
1052 endef
1054 define gb_LinkTarget_add_precompiled_header
1055 ifeq ($(gb_ENABLE_PCH),$(true))
1056 $(call gb_LinkTarget__add_precompiled_header_impl,$(1),$(2),$(notdir $(2)))
1057 endif
1059 endef
1061 define gb_LinkTarget_add_external_headers
1062 $(call gb_LinkTarget_get_headers_target,$(1) : |$(call gb_Package_get_target,$(2)))
1063 endef
1065 # this forwards to functions that must be defined in RepositoryExternal.mk.
1066 # $(eval $(call gb_LinkTarget_use_external,library,external))
1067 define gb_LinkTarget_use_external
1068 $(if $(filter undefined,$(origin gb_LinkTarget__use_$(2))),\
1069 $(error gb_LinkTarget_use_external: unknown external: $(2)),\
1070 $(call gb_LinkTarget__use_$(2),$(1)))
1071 endef
1073 # $(call gb_LinkTarget_use_externals,library,externals)
1074 gb_LinkTarget_use_externals = \
1075 $(foreach external,$(2),$(call gb_LinkTarget_use_external,$(1),$(external)))
1078 # vim: set noet sw=4: