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