PageRenderTime 59ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 1ms

/solenv/gbuild/LinkTarget.mk

https://bitbucket.org/markjenkins/libreoffice_ubuntu-debian-fixes
Makefile | 1207 lines | 744 code | 257 blank | 206 comment | 18 complexity | 17064e0c7f499b71758dd74145b55aa5 MD5 | raw file
Possible License(s): GPL-3.0, LGPL-3.0, MPL-2.0-no-copyleft-exception, LGPL-2.1, BSD-3-Clause-No-Nuclear-License-2014
  1. # -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
  2. #*************************************************************************
  3. #
  4. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  5. #
  6. # Copyright 2000, 2011 Oracle and/or its affiliates.
  7. #
  8. # OpenOffice.org - a multi-platform office productivity suite
  9. #
  10. # This file is part of OpenOffice.org.
  11. #
  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.
  15. #
  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).
  21. #
  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.
  26. #
  27. #*************************************************************************
  28. #the following user-defined variables are supported:
  29. # YACCFLAGS
  30. # LEXFLAGS
  31. # CPPFLAGS
  32. # CFLAGS
  33. # CXXFLAGS
  34. # OBJCFLAGS
  35. # OBJCXXFLAGS
  36. # LDFLAGS
  37. # enable if: no "-TARGET" defined AND [module is enabled OR "TARGET" defined]
  38. gb_LinkTarget__debug_enabled = \
  39. $(and $(if $(filter -$(1),$(ENABLE_DEBUGINFO_FOR)),,$(true)),\
  40. $(or $(gb_Module_CURRENTMODULE_DEBUG_ENABLED),\
  41. $(filter $(1),$(ENABLE_DEBUGINFO_FOR))))
  42. # debug flags, if ENABLE_DEBUG is set and the LinkTarget is named
  43. # in the list of libraries of ENABLE_DEBUGINFO_FOR
  44. gb_LinkTarget__get_debugcflags=$(if $(call gb_LinkTarget__debug_enabled,$(1)),$(gb_COMPILERNOOPTFLAGS) $(gb_DEBUG_CFLAGS),$(gb_COMPILEROPTFLAGS))
  45. gb_LinkTarget__get_debugcxxflags=$(if $(call gb_LinkTarget__debug_enabled,$(1)),$(gb_COMPILERNOOPTFLAGS) $(gb_DEBUG_CFLAGS) $(gb_DEBUG_CXXFLAGS),$(gb_COMPILEROPTFLAGS))
  46. # similar for LDFLAGS, use linker optimization flags in non-debug case,
  47. # but moreover strip debug from libraries for which debuginfo is not wanted
  48. # (some libraries reuse .o files from other libraries, notably unittests)
  49. gb_LinkTarget__get_stripldflags=$(if $(strip $(CFLAGS)$(CXXFLAGS)$(OBJCFLAGS)$(OBJCXXFLAGS)$(LDFLAGS)),,$(gb_LINKERSTRIPDEBUGFLAGS))
  50. gb_LinkTarget__get_debugldflags=$(if $(call gb_LinkTarget__debug_enabled,$(1)),,$(gb_LINKEROPTFLAGS) $(call gb_LinkTarget__get_stripldflags,$(1)))
  51. # generic cflags/cxxflags to use (optimization flags, debug flags)
  52. # user supplied CFLAGS/CXXFLAGS override default debug/optimization flags
  53. gb_LinkTarget__get_cflags=$(if $(CFLAGS),$(CFLAGS),$(call gb_LinkTarget__get_debugcflags,$(1)))
  54. gb_LinkTarget__get_objcflags=$(if $(OBJCFLAGS),$(OBJCFLAGS),$(call gb_LinkTarget__get_debugcflags,$(1)))
  55. gb_LinkTarget__get_cxxflags=$(if $(CXXFLAGS),$(CXXFLAGS),$(call gb_LinkTarget__get_debugcxxflags,$(1)))
  56. gb_LinkTarget__get_objcxxflags=$(if $(OBJCXXFLAGS),$(OBJCXXFLAGS),$(call gb_LinkTarget__get_debugcxxflags,$(1)))
  57. gb_LinkTarget__get_ldflags=$(if $(LDFLAGS),$(LDFLAGS),$(call gb_LinkTarget__get_debugldflags,$(1)))
  58. # Overview of dependencies and tasks of LinkTarget
  59. #
  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
  66. # including own generated own generated headers
  67. # LinkTarget/external_headers all external headers avail. header files of linked libs
  68. #
  69. # CObject plain c compile | LinkTarget/headers
  70. # CxxObject c++ compile | LinkTarget/headers
  71. # GenCObject plain c compile from | LinkTarget/headers
  72. # generated source
  73. # GenCxxObject C++ compile from | LinkTarget/headers
  74. # generated source
  75. # ObjCObject objective c compile | LinkTarget/headers
  76. # ObjCxxObject objective c++ compile | LinkTarget/headers
  77. #
  78. # AsmObject asm compile | LinkTarget
  79. #
  80. # CObject/dep dependencies these targets generate empty dep files
  81. # CxxObject/dep dependencies that are populated upon compile
  82. # GenCObject/dep dependencies
  83. # GenCxxObject/dep dependencies
  84. # ObjCObject/dep dependencies
  85. # ObjCxxObject/dep dependencies
  86. # AsmObject/dep dependencies
  87. # LinkTarget/headers means gb_LinkTarget_get_headers_target etc.
  88. # dependencies prefixed with | are build-order only dependencies
  89. # check that objects are only linked into one link target:
  90. # multiple linking may cause problems because different link targets may
  91. # require different compiler flags
  92. define gb_Object__owner
  93. $$(if $$(OBJECTOWNER),\
  94. $$(call gb_Output_error,fdo#47246: $(1) is linked in by $$(OBJECTOWNER) $(2)))$(2)
  95. endef
  96. # For every object there is a dep file (if gb_FULLDEPS is active).
  97. # The dep file depends on the object: the Object__command also updates the
  98. # dep file as a side effect.
  99. # In the dep file rule just touch it so it's newer than the object.
  100. # The gb_Object__command_dep generates an "always rebuild" dep file;
  101. # It is used on first build and in case the user deletes the object dep file.
  102. ifeq ($(gb_FULLDEPS),$(true))
  103. define gb_Object__command_dep
  104. mkdir -p $(dir $(1)) && \
  105. 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
  111. # This one only exists to force .c/.cxx "rebuilds" when running a compiler tool.
  112. .PHONY: force_compiler_tool_run
  113. force_compiler_tool_run:
  114. # CObject class
  115. gb_CObject_get_source = $(1)/$(2).c
  116. # defined by platform
  117. # gb_CObject__command
  118. ifneq ($(COMPILER_PLUGIN_TOOL),)
  119. $(call gb_CObject_get_target,%) : $(call gb_CObject_get_source,$(SRCDIR),%) force_compiler_tool_run
  120. $(call gb_CObject__tool_command,$*,$<)
  121. else
  122. $(call gb_CObject_get_target,%) : $(call gb_CObject_get_source,$(SRCDIR),%)
  123. $(call gb_CObject__command,$@,$*,$<,$(call gb_CObject_get_dep_target,$*))
  124. endif
  125. ifeq ($(gb_FULLDEPS),$(true))
  126. $(call gb_CObject_get_dep_target,%) :
  127. $(if $(wildcard $@),touch $@,\
  128. $(call gb_Object__command_dep,$@,$(call gb_CObject_get_target,$*)))
  129. endif
  130. # CxxObject class
  131. gb_CxxObject_get_source = $(1)/$(2).cxx
  132. # defined by platform
  133. # gb_CxxObject__command
  134. ifneq ($(COMPILER_PLUGIN_TOOL),)
  135. $(call gb_CxxObject_get_target,%) : $(call gb_CxxObject_get_source,$(SRCDIR),%) force_compiler_tool_run
  136. $(call gb_CxxObject__tool_command,$*,$<)
  137. else
  138. $(call gb_CxxObject_get_target,%) : $(call gb_CxxObject_get_source,$(SRCDIR),%)
  139. $(call gb_CxxObject__command,$@,$*,$<,$(call gb_CxxObject_get_dep_target,$*))
  140. endif
  141. ifeq ($(gb_FULLDEPS),$(true))
  142. $(call gb_CxxObject_get_dep_target,%) :
  143. $(if $(wildcard $@),touch $@,\
  144. $(call gb_Object__command_dep,$@,$(call gb_CxxObject_get_target,$*)))
  145. endif
  146. # GenCObject class
  147. gb_GenCObject_get_source = $(WORKDIR)/$(1).c
  148. # defined by platform
  149. # gb_CObject__command
  150. $(call gb_GenCObject_get_target,%) :
  151. test -f $(call gb_GenCObject_get_source,$*) || (echo "Missing generated source file $(call gb_GenCObject_get_source,$*)" && false)
  152. $(call gb_CObject__command,$@,$*,$(call gb_GenCObject_get_source,$*),$(call gb_GenCObject_get_dep_target,$*))
  153. ifeq ($(gb_FULLDEPS),$(true))
  154. $(call gb_GenCObject_get_dep_target,%) :
  155. $(if $(wildcard $@),touch $@,\
  156. $(call gb_Object__command_dep,$@,$(call gb_GenCObject_get_target,$*)))
  157. endif
  158. # GenCxxObject class
  159. gb_GenCxxObject_get_source = $(WORKDIR)/$(1).$(gb_LinkTarget_CXX_SUFFIX_$(2))
  160. # defined by platform
  161. # gb_CxxObject__command
  162. $(call gb_GenCxxObject_get_target,%) :
  163. test -f $(GEN_CXX_SOURCE) || (echo "Missing generated source file $(GEN_CXX_SOURCE)" && false)
  164. $(call gb_CxxObject__command,$@,$*,$(GEN_CXX_SOURCE),$(call gb_GenCxxObject_get_dep_target,$*))
  165. ifeq ($(gb_FULLDEPS),$(true))
  166. $(call gb_GenCxxObject_get_dep_target,%) :
  167. $(if $(wildcard $@),touch $@,\
  168. $(call gb_Object__command_dep,$@,$(call gb_GenCxxObject_get_target,$*)))
  169. endif
  170. # YaccTarget class
  171. # XXX: This is more complicated than necessary, but we cannot just use
  172. # the generated C++ file as the main target, because we need to let the
  173. # header depend on that to ensure the header is present before anything
  174. # tries to use it.
  175. gb_YaccTarget_get_source = $(1)/$(2).y
  176. # defined by platform
  177. # gb_YaccTarget__command(grammar-file, stem-for-message, source-target, include-target)
  178. .PHONY : $(call gb_YaccTarget_get_clean_target,%)
  179. $(call gb_YaccTarget_get_clean_target,%) :
  180. $(call gb_Output_announce,$*,$(false),YAC,3)
  181. $(call gb_Helper_abbreviate_dirs,\
  182. rm -f $(call gb_YaccTarget_get_grammar_target,$*) $(call gb_YaccTarget_get_header_target,$*) $(call gb_YaccTarget_get_target,$*))
  183. $(call gb_YaccTarget_get_target,%) : $(call gb_YaccTarget_get_source,$(SRCDIR),%)
  184. $(call gb_YaccTarget__command,$<,$*,$@,$(call gb_YaccTarget_get_header_target,$*),$(call gb_YaccTarget_get_grammar_target,$*))
  185. define gb_YaccTarget_YaccTarget
  186. $(call gb_YaccTarget_get_grammar_target,$(1)) : $(call gb_YaccTarget_get_target,$(1))
  187. touch $$@
  188. $(call gb_YaccTarget_get_header_target,$(1)) : $(call gb_YaccTarget_get_target,$(1))
  189. touch $$@
  190. endef
  191. gb_YACC := bison
  192. # LexTarget class
  193. gb_LexTarget_get_source = $(1)/$(2).l
  194. .PHONY : $(call gb_LexTarget_get_clean_target,%)
  195. $(call gb_LexTarget_get_clean_target,%) :
  196. $(call gb_Output_announce,$*,$(false),LEX,3)
  197. $(call gb_Helper_abbreviate_dirs,\
  198. rm -f $(call gb_LexTarget_get_scanner_target,$*) $(call gb_LexTarget_get_target,$*))
  199. $(call gb_LexTarget_get_target,%) : $(call gb_LexTarget_get_source,$(SRCDIR),%)
  200. $(call gb_LexTarget__command,$<,$*,$@,$(call gb_LexTarget_get_scanner_target,$*))
  201. # gb_LexTarget_LexTarget(scanner-file)
  202. define gb_LexTarget_LexTarget
  203. $(call gb_LexTarget_get_scanner_target,$(1)) : $(call gb_LexTarget_get_target,$(1))
  204. touch $$@
  205. endef
  206. # gb_LexTarget__command(scanner-file, stem-for-message, done-pseudo-target, source-target)
  207. define gb_LexTarget__command
  208. $(call gb_Output_announce,$(2),$(true),LEX,3)
  209. $(call gb_Helper_abbreviate_dirs,\
  210. mkdir -p $(dir $(3)) && \
  211. $(FLEX) $(T_LEXFLAGS) -o$(4) $(1) && touch $(3) )
  212. endef
  213. # ObjCxxObject class
  214. #
  215. gb_ObjCxxObject_get_source = $(1)/$(2).mm
  216. # defined by platform
  217. # gb_ObjCxxObject__command
  218. ifneq ($(COMPILER_PLUGIN_TOOL),)
  219. $(call gb_ObjCxxObject_get_target,%) : $(call gb_ObjCxxObject_get_source,$(SRCDIR),%) force_compiler_tool_run
  220. $(call gb_ObjCxxObject__tool_command,$*,$<)
  221. else
  222. $(call gb_ObjCxxObject_get_target,%) : $(call gb_ObjCxxObject_get_source,$(SRCDIR),%)
  223. $(call gb_ObjCxxObject__command,$@,$*,$<,$(call gb_ObjCxxObject_get_dep_target,$*))
  224. ifeq ($(gb_FULLDEPS),$(true))
  225. $(call gb_ObjCxxObject_get_dep_target,%) :
  226. $(if $(wildcard $@),touch $@,\
  227. $(call gb_Object__command_dep,$@,$(call gb_ObjCxxObject_get_target,$*)))
  228. endif
  229. endif
  230. # ObjCObject class
  231. #
  232. gb_ObjCObject_get_source = $(1)/$(2).m
  233. # defined by platform
  234. # gb_ObjCObject__command
  235. ifneq ($(COMPILER_PLUGIN_TOOL),)
  236. $(call gb_ObjCObject_get_target,%) : $(call gb_ObjCObject_get_source,$(SRCDIR),%) force_compiler_tool_run
  237. $(call gb_ObjCObject__tool_command,$*,$<)
  238. else
  239. $(call gb_ObjCObject_get_target,%) : $(call gb_ObjCObject_get_source,$(SRCDIR),%)
  240. $(call gb_ObjCObject__command,$@,$*,$<,$(call gb_ObjCObject_get_dep_target,$*))
  241. ifeq ($(gb_FULLDEPS),$(true))
  242. $(call gb_ObjCObject_get_dep_target,%) :
  243. $(if $(wildcard $@),touch $@,\
  244. $(call gb_Object__command_dep,$@,$(call gb_ObjCObject_get_target,$*)))
  245. endif
  246. endif
  247. # AsmObject class
  248. # defined by platform
  249. # gb_AsmObject_get_source (.asm on Windows, .s elsewhere)
  250. # gb_AsmObject__command
  251. $(call gb_AsmObject_get_target,%) : $(call gb_AsmObject_get_source,$(SRCDIR),%)
  252. $(call gb_AsmObject__command,$@,$*,$<,$(call gb_AsmObject_get_dep_target,$*))
  253. ifeq ($(gb_FULLDEPS),$(true))
  254. $(call gb_AsmObject_get_dep_target,%) :
  255. $(if $(wildcard $@),touch $@,\
  256. $(call gb_Object__command_dep,$@,$(call gb_AsmObject_get_target,$*)))
  257. endif
  258. # LinkTarget class
  259. gb_LinkTarget_DEFAULTDEFS := $(gb_GLOBALDEFS)
  260. define gb_LinkTarget_rtl_defs
  261. $(if $(filter-out sal salhelper cppu cppuhelper, $(gb_Module_CURRENTMODULE_NAME)), -DRTL_USING)
  262. endef
  263. # defined by platform
  264. # gb_LinkTarget_CXXFLAGS
  265. # gb_LinkTarget_LDFLAGS
  266. # gb_LinkTarget_INCLUDE
  267. .PHONY : $(call gb_LinkTarget_get_clean_target,%)
  268. $(call gb_LinkTarget_get_clean_target,%) :
  269. $(call gb_Output_announce,$*,$(false),LNK,4)
  270. RESPONSEFILE=$(call var2file,$(shell $(gb_MKTEMP)),200,\
  271. $(foreach object,$(COBJECTS),$(call gb_CObject_get_target,$(object))) \
  272. $(foreach object,$(COBJECTS),$(call gb_CObject_get_dep_target,$(object))) \
  273. $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_target,$(object))) \
  274. $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_dep_target,$(object))) \
  275. $(foreach object,$(OBJCOBJECTS),$(call gb_ObjCObject_get_target,$(object))) \
  276. $(foreach object,$(OBJCOBJECTS),$(call gb_ObjCObject_get_dep_target,$(object))) \
  277. $(foreach object,$(OBJCXXOBJECTS),$(call gb_ObjCxxObject_get_target,$(object))) \
  278. $(foreach object,$(OBJCXXOBJECTS),$(call gb_ObjCxxObject_get_dep_target,$(object))) \
  279. $(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_target,$(object))) \
  280. $(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_dep_target,$(object))) \
  281. $(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_target,$(object))) \
  282. $(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_dep_target,$(object))) \
  283. $(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_target,$(object))) \
  284. $(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_dep_target,$(object))) \
  285. $(call gb_LinkTarget_get_target,$*) \
  286. $(call gb_LinkTarget_get_dep_target,$*) \
  287. $(call gb_LinkTarget_get_headers_target,$*) \
  288. $(call gb_LinkTarget_get_external_headers_target,$*) \
  289. $(call gb_LinkTarget_get_objects_list,$*) \
  290. $(DLLTARGET) \
  291. $(AUXTARGETS)) && \
  292. cat $${RESPONSEFILE} /dev/null | xargs -n 200 rm -fr && \
  293. rm -f $${RESPONSEFILE}
  294. # cat the deps of all objects in one file, then we need only open that one file
  295. define gb_LinkTarget__command_dep
  296. $(call gb_Output_announce,LNK:$(2),$(true),DEP,1)
  297. $(call gb_Helper_abbreviate_dirs,\
  298. mkdir -p $(dir $(1)) && \
  299. RESPONSEFILE=$(call var2file,$(shell $(gb_MKTEMP)),200,\
  300. $(foreach object,$(3),$(call gb_CObject_get_dep_target,$(object))) \
  301. $(foreach object,$(4),$(call gb_CxxObject_get_dep_target,$(object))) \
  302. $(foreach object,$(5),$(call gb_ObjCObject_get_dep_target,$(object)))\
  303. $(foreach object,$(6),$(call gb_ObjCxxObject_get_dep_target,$(object)))\
  304. $(foreach object,$(7),$(call gb_AsmObject_get_dep_target,$(object)))\
  305. $(foreach object,$(8),$(call gb_GenCObject_get_dep_target,$(object))) \
  306. $(foreach object,$(9),$(call gb_GenCxxObject_get_dep_target,$(object))) \
  307. ) && \
  308. $(call gb_Executable_get_target_for_build,concat-deps) $${RESPONSEFILE} > $(1)) && \
  309. rm -f $${RESPONSEFILE}
  310. endef
  311. define gb_LinkTarget__command_objectlist
  312. TEMPFILE=$(call var2file,$(shell $(gb_MKTEMP)),200,\
  313. $(foreach object,$(COBJECTS),$(call gb_CObject_get_target,$(object))) \
  314. $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_target,$(object))) \
  315. $(foreach object,$(OBJCOBJECTS),$(call gb_ObjCObject_get_target,$(object))) \
  316. $(foreach object,$(OBJCXXOBJECTS),$(call gb_ObjCxxObject_get_target,$(object))) \
  317. $(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_target,$(object))) \
  318. $(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_target,$(object))) \
  319. $(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_target,$(object)))) && \
  320. $(if $(EXTRAOBJECTLISTS),cat $(EXTRAOBJECTLISTS) >> $${TEMPFILE} && ) \
  321. mv $${TEMPFILE} $(call gb_LinkTarget_get_objects_list,$(2))
  322. endef
  323. # If object files from this library are merged, create just empty file
  324. $(call gb_LinkTarget_get_target,%) : $(call gb_LinkTarget_get_headers_target,%) $(gb_Helper_MISCDUMMY)
  325. $(if $(filter $*,$(foreach lib,$(gb_MERGEDLIBS),$(call gb_Library_get_linktargetname,$(lib)))), \
  326. touch $@, $(call gb_LinkTarget__command,$@,$*))
  327. $(call gb_LinkTarget__command_objectlist,$@,$*)
  328. ifeq ($(gb_FULLDEPS),$(true))
  329. $(call gb_LinkTarget_get_dep_target,%) :
  330. $(call gb_LinkTarget__command_dep,$@,$*,$(COBJECTS),$(CXXOBJECTS),$(OBJCOBJECTS),$(OBJCXXOBJECTS),$(ASMOBJECTS),$(GENCOBJECTS),$(GENCXXOBJECTS))
  331. endif
  332. # Ok, this is some dark voodoo: When declaring a linktarget with
  333. # gb_LinkTarget_LinkTarget we set SELF in the headertarget to name of the
  334. # target. When the rule for the headertarget is executed and SELF does not
  335. # match the target name, we are depending on a linktarget that was never
  336. # declared. In a full build exclusively in gbuild that should never happen.
  337. # However, partial gbuild build will not know about how to build lower level
  338. # linktargets, just as gbuild can not know about linktargets generated in the
  339. # old build.pl/dmake system. Once all is migrated, gbuild should error out
  340. # when is is told to depend on a linktarget it does not know about and not
  341. # only warn.
  342. define gb_LinkTarget__get_external_headers_check
  343. ifneq ($$(SELF),$$*)
  344. $$(eval $$(call gb_Output_info,LinkTarget $$* not defined: Assuming headers to be there!,ALL))
  345. endif
  346. $$@ : COMMAND := $$(call gb_Helper_abbreviate_dirs, mkdir -p $$(dir $$@) && touch $$@ && mkdir -p $(call gb_LinkTarget_get_target,)pdb/$$(dir $$*))
  347. endef
  348. $(call gb_LinkTarget_get_external_headers_target,%) :
  349. $(eval $(gb_LinkTarget__get_external_headers_check))
  350. $(COMMAND)
  351. $(call gb_LinkTarget_get_headers_target,%) : $(call gb_LinkTarget_get_external_headers_target,%)
  352. $(call gb_Helper_abbreviate_dirs,\
  353. mkdir -p $(dir $@) && touch $@)
  354. # Explanation of some of the targets:
  355. # - gb_LinkTarget_get_external_headers_target is the targets that guarantees all
  356. # headers from linked against libraries are in OUTDIR.
  357. # - gb_LinkTarget_get_headers_target is the target that guarantees all headers
  358. # from the linked against the libraries and the linktargets own headers
  359. # (including generated headers) are in the OUTDIR.
  360. # - gb_LinkTarget_get_target links the objects into a file in WORKDIR.
  361. # gb_LinkTarget_get_target depends on gb_LinkTarget_get_headers_target which in
  362. # turn depends gb_LinkTarget_get_external_headers_target.
  363. # gb_LinkTarget_get_target depends additionally on the objects, which in turn
  364. # depend build-order only on the gb_LinkTarget_get_headers_target. The build
  365. # order-only dependency ensures all headers to be there for compiling and
  366. # dependency generation without causing all objects to be rebuild when one
  367. # header changes. Only the ones with an explicit dependency in their generated
  368. # dependency file will be rebuild.
  369. #
  370. # gb_LinkTarget_get_target is the target that links the objects into a file in
  371. # WORKDIR
  372. # Explanation of some of the variables:
  373. # - AUXTARGETS are the additionally generated files that need to be cleaned out
  374. # on clean.
  375. # - TARGETTYPE is the type of linktarget as some platforms need very different
  376. # command to link different targettypes.
  377. # - LIBRARY_X64 is only relevent for building a x64 library on windows.
  378. #
  379. # Since most variables are set on the linktarget and not on the object, the
  380. # object learns about these setting via GNU makes scoping of target variables.
  381. # Therefore it is important that objects are only directly depended on by the
  382. # linktarget. This for example means that you cannot build a single object
  383. # alone, because then you would directly depend on the object.
  384. #
  385. # A note about flags: because the overriding the global variables with a target
  386. # local variable of the same name is considered obscure, the target local
  387. # variables have a T_ prefix.
  388. define gb_LinkTarget_LinkTarget
  389. $(call gb_LinkTarget_get_clean_target,$(1)) : AUXTARGETS :=
  390. $(call gb_LinkTarget_get_external_headers_target,$(1)) : SELF := $(1)
  391. $(call gb_LinkTarget_get_target,$(1)) : DLLTARGET :=
  392. $(call gb_LinkTarget_get_clean_target,$(1)) \
  393. $(call gb_LinkTarget_get_target,$(1)) : COBJECTS :=
  394. $(call gb_LinkTarget_get_clean_target,$(1)) \
  395. $(call gb_LinkTarget_get_target,$(1)) : CXXOBJECTS :=
  396. $(call gb_LinkTarget_get_clean_target,$(1)) \
  397. $(call gb_LinkTarget_get_target,$(1)) : YACCOBJECT :=
  398. $(call gb_LinkTarget_get_clean_target,$(1)) \
  399. $(call gb_LinkTarget_get_target,$(1)) : T_YACCFLAGS := $$(gb_LinkTarget_YYACFLAGS) $(YACCFLAGS)
  400. $(call gb_LinkTarget_get_clean_target,$(1)) \
  401. $(call gb_LinkTarget_get_target,$(1)) : LEXOBJECT :=
  402. $(call gb_LinkTarget_get_clean_target,$(1)) \
  403. $(call gb_LinkTarget_get_target,$(1)) : T_LEXFLAGS := $$(gb_LinkTarget_LEXFLAGS) $(LEXFLAGS)
  404. $(call gb_LinkTarget_get_clean_target,$(1)) \
  405. $(call gb_LinkTarget_get_target,$(1)) : OBJCOBJECTS :=
  406. $(call gb_LinkTarget_get_clean_target,$(1)) \
  407. $(call gb_LinkTarget_get_target,$(1)) : OBJCXXOBJECTS :=
  408. $(call gb_LinkTarget_get_clean_target,$(1)) \
  409. $(call gb_LinkTarget_get_target,$(1)) : ASMOBJECTS :=
  410. $(call gb_LinkTarget_get_clean_target,$(1)) \
  411. $(call gb_LinkTarget_get_target,$(1)) : GENCOBJECTS :=
  412. $(call gb_LinkTarget_get_clean_target,$(1)) \
  413. $(call gb_LinkTarget_get_target,$(1)) : GENCXXOBJECTS :=
  414. $(call gb_LinkTarget_get_headers_target,$(1)) \
  415. $(call gb_LinkTarget_get_target,$(1)) : T_CFLAGS := $$(gb_LinkTarget_CFLAGS)
  416. $(call gb_LinkTarget_get_headers_target,$(1)) \
  417. $(call gb_LinkTarget_get_target,$(1)) : T_CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS)
  418. $(call gb_LinkTarget_get_target,$(1)) : T_OBJCXXFLAGS := $$(gb_LinkTarget_OBJCXXFLAGS)
  419. $(call gb_LinkTarget_get_target,$(1)) : T_OBJCFLAGS := $$(gb_LinkTarget_OBJCFLAGS)
  420. $(call gb_LinkTarget_get_headers_target,$(1)) \
  421. $(call gb_LinkTarget_get_target,$(1)) : DEFS := $$(gb_LinkTarget_DEFAULTDEFS) $$(call gb_LinkTarget_rtl_defs,$(1)) $(CPPFLAGS)
  422. $(call gb_LinkTarget_get_headers_target,$(1)) \
  423. $(call gb_LinkTarget_get_target,$(1)) : INCLUDE := $$(gb_LinkTarget_INCLUDE)
  424. $(call gb_LinkTarget_get_headers_target,$(1)) \
  425. $(call gb_LinkTarget_get_target,$(1)) : T_LDFLAGS := $$(gb_LinkTarget_LDFLAGS) $(call gb_LinkTarget__get_ldflags,$(2))
  426. $(call gb_LinkTarget_get_target,$(1)) : LINKED_LIBS :=
  427. $(call gb_LinkTarget_get_target,$(1)) : LINKED_STATIC_LIBS :=
  428. $(call gb_LinkTarget_get_target,$(1)) : LIBS :=
  429. $(call gb_LinkTarget_get_target,$(1)) : TARGETTYPE :=
  430. $(call gb_LinkTarget_get_target,$(1)) : LIBRARY_X64 :=
  431. $(call gb_LinkTarget_get_headers_target,$(1)) \
  432. $(call gb_LinkTarget_get_target,$(1)) : PDBFILE :=
  433. $(call gb_LinkTarget_get_target,$(1)) : EXTRAOBJECTLISTS :=
  434. $(call gb_LinkTarget_get_target,$(1)) : NATIVERES :=
  435. $(call gb_LinkTarget_get_target,$(1)) : VISIBILITY :=
  436. $(call gb_LinkTarget_get_target,$(1)) : WARNINGS_NOT_ERRORS :=
  437. $(call gb_LinkTarget_get_target,$(1)) : SOVERSION :=
  438. $(call gb_LinkTarget_get_target,$(1)) : SOVERSIONSCRIPT :=
  439. ifeq ($(gb_FULLDEPS),$(true))
  440. -include $(call gb_LinkTarget_get_dep_target,$(1))
  441. $(call gb_LinkTarget_get_dep_target,$(1)) : COBJECTS :=
  442. $(call gb_LinkTarget_get_dep_target,$(1)) : CXXOBJECTS :=
  443. $(call gb_LinkTarget_get_dep_target,$(1)) : OBJCOBJECTS :=
  444. $(call gb_LinkTarget_get_dep_target,$(1)) : OBJCXXOBJECTS :=
  445. $(call gb_LinkTarget_get_dep_target,$(1)) : ASMOBJECTS :=
  446. $(call gb_LinkTarget_get_dep_target,$(1)) : GENCOBJECTS :=
  447. $(call gb_LinkTarget_get_dep_target,$(1)) : GENCXXOBJECTS :=
  448. $(call gb_LinkTarget_get_dep_target,$(1)) : YACCOBJECTS :=
  449. $(call gb_LinkTarget_get_dep_target,$(1)) : T_CFLAGS := $$(gb_LinkTarget_CFLAGS)
  450. $(call gb_LinkTarget_get_dep_target,$(1)) : T_CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS)
  451. $(call gb_LinkTarget_get_dep_target,$(1)) : T_OBJCXXFLAGS := $$(gb_LinkTarget_OBJCXXFLAGS)
  452. $(call gb_LinkTarget_get_dep_target,$(1)) : T_OBJCFLAGS := $$(gb_LinkTarget_OBJCFLAGS)
  453. $(call gb_LinkTarget_get_dep_target,$(1)) : T_YACCFLAGS := $$(gb_LinkTarget_YYACFLAGS) $(YACCFLAGS)
  454. $(call gb_LinkTarget_get_dep_target,$(1)) : DEFS := $$(gb_LinkTarget_DEFAULTDEFS) $$(call gb_LinkTarget_rtl_defs,$(1)) $(CPPFLAGS)
  455. $(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE := $$(gb_LinkTarget_INCLUDE)
  456. $(call gb_LinkTarget_get_dep_target,$(1)) : TARGETTYPE :=
  457. $(call gb_LinkTarget_get_dep_target,$(1)) : LIBRARY_X64 :=
  458. $(call gb_LinkTarget_get_dep_target,$(1)) : EXTRAOBJECTLISTS :=
  459. $(call gb_LinkTarget_get_dep_target,$(1)) : VISIBILITY :=
  460. $(call gb_LinkTarget_get_dep_target,$(1)) : WARNINGS_NOT_ERRORS :=
  461. $(call gb_LinkTarget_get_dep_target,$(1)) : SOVERSION :=
  462. $(call gb_LinkTarget_get_dep_target,$(1)) : SOVERSIONSCRIPT :=
  463. endif
  464. gb_LinkTarget_CXX_SUFFIX_$(1) := cxx
  465. endef
  466. define gb_LinkTarget_set_soversion_script
  467. $(call gb_LinkTarget_get_target,$(1)) : $(3)
  468. $(call gb_LinkTarget_get_target,$(1)) : SOVERSION := $(2)
  469. $(call gb_LinkTarget_get_target,$(1)) : SOVERSIONSCRIPT := $(3)
  470. endef
  471. define gb_LinkTarget_add_defs
  472. $(call gb_LinkTarget_get_headers_target,$(1)) \
  473. $(call gb_LinkTarget_get_target,$(1)) : DEFS += $(2)
  474. ifeq ($(gb_FULLDEPS),$(true))
  475. $(call gb_LinkTarget_get_dep_target,$(1)) : DEFS += $(2)
  476. endif
  477. endef
  478. define gb_LinkTarget_set_defs
  479. $$(call gb_Output_error,\
  480. gb_LinkTarget_set_defs: use gb_LinkTarget_add_defs instead.)
  481. endif
  482. endef
  483. define gb_LinkTarget_add_cflags
  484. $(call gb_LinkTarget_get_target,$(1)) : T_CFLAGS += $(2)
  485. ifeq ($(gb_FULLDEPS),$(true))
  486. $(call gb_LinkTarget_get_dep_target,$(1)) : T_CFLAGS += $(2)
  487. endif
  488. endef
  489. define gb_LinkTarget_set_cflags
  490. $$(call gb_Output_error,\
  491. gb_LinkTarget_set_cflags: use gb_LinkTarget_add_cflags instead.)
  492. endif
  493. endef
  494. define gb_LinkTarget_add_cxxflags
  495. $(call gb_LinkTarget_get_headers_target,$(1)) \
  496. $(call gb_LinkTarget_get_target,$(1)) : T_CXXFLAGS += $(2)
  497. ifeq ($(gb_FULLDEPS),$(true))
  498. $(call gb_LinkTarget_get_dep_target,$(1)) : T_CXXFLAGS += $(2)
  499. endif
  500. endef
  501. define gb_LinkTarget_set_cxxflags
  502. $$(call gb_Output_error,\
  503. gb_LinkTarget_set_cxxflags: use gb_LinkTarget_add_cxxflags instead.)
  504. endef
  505. define gb_LinkTarget_add_objcxxflags
  506. $(call gb_LinkTarget_get_target,$(1)) : T_OBJCXXFLAGS += $(2)
  507. ifeq ($(gb_FULLDEPS),$(true))
  508. $(call gb_LinkTarget_get_dep_target,$(1)) : T_OBJCXXFLAGS += $(2)
  509. endif
  510. endef
  511. define gb_LinkTarget_set_objcxxflags
  512. $$(call gb_Output_error,\
  513. gb_LinkTarget_set_objcxxflags: use gb_LinkTarget_add_objcxxflags instead.)
  514. endef
  515. define gb_LinkTarget_set_objcflags
  516. $$(call gb_Output_error,\
  517. gb_LinkTarget_set_objcflags: use gb_LinkTarget_add_objcflags instead.)
  518. endef
  519. define gb_LinkTarget_add_objcflags
  520. $(call gb_LinkTarget_get_target,$(1)) : T_OBJCFLAGS += $(2)
  521. ifeq ($(gb_FULLDEPS),$(true))
  522. $(call gb_LinkTarget_get_dep_target,$(1)) : T_OBJCFLAGS += $(2)
  523. endif
  524. endef
  525. define gb_LinkTarget__add_include
  526. $(call gb_LinkTarget_get_headers_target,$(1)) \
  527. $(call gb_LinkTarget_get_target,$(1)) : INCLUDE += -I$(2)
  528. ifeq ($(gb_FULLDEPS),$(true))
  529. $(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE += -I$(2)
  530. endif
  531. endef
  532. define gb_LinkTarget_set_include
  533. $(call gb_LinkTarget_get_headers_target,$(1)) \
  534. $(call gb_LinkTarget_get_target,$(1)) : INCLUDE := $(2)
  535. ifeq ($(gb_FULLDEPS),$(true))
  536. $(call gb_LinkTarget_get_dep_target,$(1)) : INCLUDE := $(2)
  537. endif
  538. endef
  539. define gb_LinkTarget_set_include_stl
  540. $$(call gb_Output_error,\
  541. gb_LinkTarget_set_include_stl: removed, why is anybody calling it?)
  542. endef
  543. define gb_LinkTarget_add_ldflags
  544. $(call gb_LinkTarget_get_target,$(1)) : T_LDFLAGS += $(2)
  545. endef
  546. # real use in RepositoryExternal.mk
  547. define gb_LinkTarget_set_ldflags
  548. $(call gb_LinkTarget_get_target,$(1)) : T_LDFLAGS := $(2)
  549. endef
  550. define gb_LinkTarget_add_libs
  551. $(call gb_LinkTarget_get_target,$(1)) : LIBS += $(2)
  552. endef
  553. # remove platform specific standard libraries for linktarget $(1)
  554. # assumption is that adding these standard libs is always useful, but in very
  555. # exceptional cases this disable method may be used
  556. define gb_LinkTarget_disable_standard_system_libs
  557. $(call gb_LinkTarget_get_target,$(1)) : LIBS := $$(filter-out $$(gb_STDLIBS),$$(LIBS))
  558. endef
  559. define gb_LinkTarget_add_api
  560. $$(call gb_Output_error,\
  561. gb_LinkTarget_add_api: use gb_LinkTarget_use_api instead.)
  562. endef
  563. define gb_LinkTarget__use_api
  564. $(call gb_LinkTarget_get_target,$(1)) :| $(call gb_UnoApi_get_target,$(2))
  565. $(call gb_LinkTarget_use_package,$(1),$(2)_inc)
  566. $(call gb_LinkTarget__add_include,$(1),$(OUTDIR)/inc/$(2))
  567. endef
  568. define gb_LinkTarget_use_api
  569. $(foreach api,$(2),$(call gb_LinkTarget__use_api,$(1),$(api)))
  570. endef
  571. define gb_LinkTarget_use_udk_api
  572. $(call gb_LinkTarget__use_api,$(1),udkapi)
  573. endef
  574. define gb_LinkTarget_use_sdk_api
  575. $(call gb_LinkTarget__use_api,$(1),udkapi)
  576. $(call gb_LinkTarget__use_api,$(1),offapi)
  577. endef
  578. define gb_LinkTarget__use_internal_api_one
  579. $(call gb_LinkTarget_get_external_headers_target,$(1)) :| \
  580. $(call gb_UnoApiHeadersTarget_get_$(3)target,$(2))
  581. $(call gb_LinkTarget__add_include,$(1),$(call gb_UnoApiHeadersTarget_get_$(3)dir,$(2)))
  582. endef
  583. define gb_LinkTarget__use_internal_api
  584. $(foreach api,$(2),$(call gb_LinkTarget__use_internal_api_one,$(1),$(api),$(3)))
  585. endef
  586. define gb_LinkTarget_add_internal_api
  587. $$(call gb_Output_error,\
  588. gb_LinkTarget_add_internal_api: use gb_LinkTarget_use_internal_api instead.)
  589. endef
  590. define gb_LinkTarget_add_internal_bootstrap_api
  591. $$(call gb_Output_error,\
  592. gb_LinkTarget_add_internal_bootstrap_api: use gb_LinkTarget_use_internal_bootstrap_api instead.)
  593. endef
  594. define gb_LinkTarget_add_internal_comprehensive_api
  595. $$(call gb_Output_error,\
  596. gb_LinkTarget_add_internal_comprehensive_api: use gb_LinkTarget_use_internal_comprehensive_api instead.)
  597. endef
  598. define gb_LinkTarget_use_internal_api
  599. $(call gb_LinkTarget__use_internal_api,$(1),$(2))
  600. endef
  601. define gb_LinkTarget_use_internal_bootstrap_api
  602. $(call gb_LinkTarget__use_internal_api,$(1),$(2),bootstrap_)
  603. endef
  604. define gb_LinkTarget_use_internal_comprehensive_api
  605. $(call gb_LinkTarget__use_internal_api,$(1),$(2),comprehensive_)
  606. endef
  607. define gb_LinkTarget_add_linked_libs
  608. $$(call gb_Output_error,\
  609. gb_LinkTarget_add_linked_libs: use gb_LinkTarget_use_libraries instead.)
  610. endef
  611. define gb_LinkTarget_use_libraries
  612. ifneq (,$$(filter-out $(gb_Library_KNOWNLIBS),$(2)))
  613. $$(eval $$(call gb_Output_info,currently known libraries are: $(sort $(gb_Library_KNOWNLIBS)),ALL))
  614. $$(eval $$(call gb_Output_error,Cannot link against library/libraries $$(filter-out $(gb_Library_KNOWNLIBS),$(2)). Libraries must be registered in Repository.mk))
  615. endif
  616. gb_LINKED_LIBS := $(if $(filter $(gb_MERGEDLIBS),$(2)), \
  617. $(if $(filter $(1),$(foreach lib,$(gb_MERGEDLIBS),$(call gb_Library_get_linktargetname,$(lib)))),, merged)) \
  618. $(filter-out $(gb_MERGEDLIBS),$(2))
  619. $(call gb_LinkTarget_get_target,$(1)) : LINKED_LIBS += $$(gb_LINKED_LIBS)
  620. $(call gb_LinkTarget_get_target,$(1)) : $$(foreach lib,$$(gb_LINKED_LIBS),$$(call gb_Library_get_target,$$(lib)))
  621. $(call gb_LinkTarget_get_external_headers_target,$(1)) : \
  622. $(foreach lib,$(2),$(call gb_Library_get_headers_target,$(lib)))
  623. endef
  624. define gb_LinkTarget_add_linked_static_libs
  625. $$(call gb_Output_error,\
  626. gb_LinkTarget_add_linked_static_libs: use gb_LinkTarget_use_static_libraries instead.)
  627. endef
  628. # for a StaticLibrary, dependent libraries are not actually linked in
  629. define gb_LinkTarget_use_static_libraries
  630. ifneq (,$$(filter-out $(gb_StaticLibrary_KNOWNLIBS),$(2)))
  631. $$(eval $$(call gb_Output_info, currently known static libraries are: $(sort $(gb_StaticLibrary_KNOWNLIBS)),ALL))
  632. $$(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))
  633. endif
  634. $(call gb_LinkTarget_get_target,$(1)) : LINKED_STATIC_LIBS += $$(if $$(filter-out StaticLibrary,$$(TARGETTYPE)),$(2))
  635. $(call gb_LinkTarget_get_target,$(1)) : $(foreach lib,$(2),$(call gb_StaticLibrary_get_target,$(lib)))
  636. $(call gb_LinkTarget_get_external_headers_target,$(1)) : \
  637. $(foreach lib,$(2),$(call gb_StaticLibrary_get_headers_target,$(lib)))
  638. endef
  639. define gb_LinkTarget_add_cobject
  640. $(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)))))
  641. $(call gb_LinkTarget_get_target,$(1)) : COBJECTS += $(2)
  642. $(call gb_LinkTarget_get_clean_target,$(1)) : COBJECTS += $(2)
  643. $(call gb_LinkTarget_get_target,$(1)) : $(call gb_CObject_get_target,$(2))
  644. $(call gb_CObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
  645. $(call gb_CObject_get_target,$(2)) : T_CFLAGS += $(call gb_LinkTarget__get_cflags,$(4)) $(3)
  646. $(call gb_CObject_get_target,$(2)) : \
  647. OBJECTOWNER := $(call gb_Object__owner,$(2),$(1))
  648. ifeq ($(gb_FULLDEPS),$(true))
  649. $(call gb_LinkTarget_get_dep_target,$(1)) : COBJECTS += $(2)
  650. $(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_CObject_get_dep_target,$(2))
  651. endif
  652. endef
  653. define gb_LinkTarget_add_cxxobject
  654. $(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)))))
  655. $(call gb_LinkTarget_get_target,$(1)) : CXXOBJECTS += $(2)
  656. $(call gb_LinkTarget_get_clean_target,$(1)) : CXXOBJECTS += $(2)
  657. $(call gb_LinkTarget_get_target,$(1)) : $(call gb_CxxObject_get_target,$(2))
  658. $(call gb_CxxObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
  659. $(call gb_CxxObject_get_target,$(2)) : T_CXXFLAGS += $(3)
  660. $(call gb_CxxObject_get_target,$(2)) : \
  661. OBJECTOWNER := $(call gb_Object__owner,$(2),$(1))
  662. ifeq ($(gb_FULLDEPS),$(true))
  663. $(call gb_LinkTarget_get_dep_target,$(1)) : CXXOBJECTS += $(2)
  664. $(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_CxxObject_get_dep_target,$(2))
  665. endif
  666. endef
  667. define gb_LinkTarget_add_objcobject
  668. $(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)))))
  669. $(call gb_LinkTarget_get_target,$(1)) : OBJCOBJECTS += $(2)
  670. $(call gb_LinkTarget_get_clean_target,$(1)) : OBJCOBJECTS += $(2)
  671. $(call gb_LinkTarget_get_target,$(1)) : $(call gb_ObjCObject_get_target,$(2))
  672. $(call gb_ObjCObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
  673. $(call gb_ObjCObject_get_target,$(2)) : T_OBJCFLAGS += $(call gb_LinkTarget__get_objcflags,$(4)) $(3)
  674. $(call gb_ObjCObject_get_target,$(2)) : \
  675. OBJECTOWNER := $(call gb_Object__owner,$(2),$(1))
  676. ifeq ($(gb_FULLDEPS),$(true))
  677. $(call gb_LinkTarget_get_dep_target,$(1)) : OBJCOBJECTS += $(2)
  678. $(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_ObjCObject_get_dep_target,$(2))
  679. endif
  680. endef
  681. define gb_LinkTarget_add_objcxxobject
  682. $(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)))))
  683. $(call gb_LinkTarget_get_target,$(1)) : OBJCXXOBJECTS += $(2)
  684. $(call gb_LinkTarget_get_clean_target,$(1)) : OBJCXXOBJECTS += $(2)
  685. $(call gb_LinkTarget_get_target,$(1)) : $(call gb_ObjCxxObject_get_target,$(2))
  686. $(call gb_ObjCxxObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
  687. $(call gb_ObjCxxObject_get_target,$(2)) : T_OBJCXXFLAGS += $(call gb_LinkTarget__get_objcxxflags,$(4)) $(3)
  688. $(call gb_ObjCxxObject_get_target,$(2)) : \
  689. OBJECTOWNER := $(call gb_Object__owner,$(2),$(1))
  690. ifeq ($(gb_FULLDEPS),$(true))
  691. $(call gb_LinkTarget_get_dep_target,$(1)) : OBJCXXOBJECTS += $(2)
  692. $(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_ObjCxxObject_get_dep_target,$(2))
  693. endif
  694. endef
  695. define gb_LinkTarget_add_asmobject
  696. $(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)))))
  697. $(call gb_LinkTarget_get_target,$(1)) : ASMOBJECTS += $(2)
  698. $(call gb_LinkTarget_get_clean_target,$(1)) : ASMOBJECTS += $(2)
  699. $(call gb_LinkTarget_get_target,$(1)) : $(call gb_AsmObject_get_target,$(2))
  700. $(call gb_AsmObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
  701. $(call gb_AsmObject_get_target,$(2)) : \
  702. OBJECTOWNER := $(call gb_Object__owner,$(2),$(1))
  703. ifeq ($(gb_FULLDEPS),$(true))
  704. $(call gb_LinkTarget_get_dep_target,$(1)) : ASMOBJECTS += $(2)
  705. $(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_AsmObject_get_dep_target,$(2))
  706. endif
  707. endef
  708. define gb_LinkTarget_add_generated_c_object
  709. $(call gb_LinkTarget_get_target,$(1)) : GENCOBJECTS += $(2)
  710. $(call gb_LinkTarget_get_clean_target,$(1)) : GENCOBJECTS += $(2)
  711. $(call gb_LinkTarget_get_target,$(1)) : $(call gb_GenCObject_get_target,$(2))
  712. $(call gb_GenCObject_get_target,$(2)) : $(call gb_GenCObject_get_source,$(2))
  713. # Often gb_GenCObject_get_source does not have its own rule and is only a byproduct.
  714. # That's why we need this order-only dependency on gb_Helper_MISCDUMMY
  715. $(call gb_GenCObject_get_source,$(2)) : | $(gb_Helper_MISCDUMMY)
  716. $(call gb_GenCObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
  717. $(call gb_GenCObject_get_target,$(2)) : T_CFLAGS += $(call gb_LinkTarget__get_cflags,$(4)) $(3)
  718. $(call gb_GenCObject_get_target,$(2)) : \
  719. OBJECTOWNER := $(call gb_Object__owner,$(2),$(1))
  720. ifeq ($(gb_FULLDEPS),$(true))
  721. $(call gb_LinkTarget_get_dep_target,$(1)) : GENCOBJECTS += $(2)
  722. $(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_GenCObject_get_dep_target,$(2))
  723. endif
  724. endef
  725. define gb_LinkTarget_add_generated_cxx_object
  726. $(call gb_LinkTarget_get_target,$(1)) : GENCXXOBJECTS += $(2)
  727. $(call gb_LinkTarget_get_clean_target,$(1)) : GENCXXOBJECTS += $(2)
  728. $(call gb_LinkTarget_get_target,$(1)) : $(call gb_GenCxxObject_get_target,$(2))
  729. $(call gb_GenCxxObject_get_target,$(2)) : $(call gb_GenCxxObject_get_source,$(2),$(1))
  730. # Often gb_GenCxxObject_get_source does not have its own rule and is only a byproduct.
  731. # That's why we need this order-only dependency on gb_Helper_MISCDUMMY
  732. $(call gb_GenCxxObject_get_source,$(2),$(1)) : | $(gb_Helper_MISCDUMMY)
  733. $(call gb_GenCxxObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
  734. $(call gb_GenCxxObject_get_target,$(2)) : T_CXXFLAGS += $(3)
  735. $(call gb_GenCxxObject_get_target,$(2)) : \
  736. OBJECTOWNER := $(call gb_Object__owner,$(2),$(1))
  737. $(call gb_GenCxxObject_get_target,$(2)) : GEN_CXX_SOURCE := $(call gb_GenCxxObject_get_source,$(2),$(1))
  738. ifeq ($(gb_FULLDEPS),$(true))
  739. $(call gb_LinkTarget_get_dep_target,$(1)) : GENCXXOBJECTS += $(2)
  740. $(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_GenCxxObject_get_dep_target,$(2))
  741. endif
  742. endef
  743. # Add a bison grammar to the build.
  744. # gb_LinkTarget_add_grammar(<component>,<grammar file>)
  745. define gb_LinkTarget_add_grammar
  746. $(call gb_YaccTarget_YaccTarget,$(2))
  747. $(call gb_LinkTarget_add_generated_exception_object,$(1),YaccTarget/$(2),$(3))
  748. $(call gb_LinkTarget_get_clean_target,$(1)) : $(call gb_YaccTarget_get_clean_target,$(2))
  749. $(call gb_LinkTarget_get_headers_target,$(1)) : $(call gb_YaccTarget_get_header_target,$(2))
  750. $(call gb_LinkTarget__add_include,$(1),$(dir $(call gb_YaccTarget_get_header_target,$(2))))
  751. endef
  752. # Add bison grammars to the build.
  753. # gb_LinkTarget_add_grammars(<component>,<grammar file> [<grammar file>*])
  754. define gb_LinkTarget_add_grammars
  755. $(foreach grammar,$(2),$(call gb_LinkTarget_add_grammar,$(1),$(grammar),$(4)))
  756. endef
  757. # Add a flex scanner to the build.
  758. # gb_LinkTarget_add_scanner(<component>,<scanner file>)
  759. define gb_LinkTarget_add_scanner
  760. $(call gb_LexTarget_LexTarget,$(2))
  761. $(call gb_LinkTarget_add_generated_exception_object,$(1),LexTarget/$(2),$(3))
  762. $(call gb_GenCxxObject_get_target,LexTarget/$(2)) : WARNINGS_NOT_ERRORS := $(true)
  763. $(call gb_LinkTarget_get_clean_target,$(1)) : $(call gb_LexTarget_get_clean_target,$(2))
  764. endef
  765. # Add flex scanners to the build.
  766. # gb_LinkTarget_add_scanners(<component>,<scanner file> [<scanner file>*])
  767. define gb_LinkTarget_add_scanners
  768. $(foreach scanner,$(2),$(call gb_LinkTarget_add_scanner,$(1),$(scanner),$(4)))
  769. endef
  770. define gb_LinkTarget_add_noexception_object
  771. $(call gb_LinkTarget_add_cxxobject,$(1),$(2),$(gb_LinkTarget_NOEXCEPTIONFLAGS) $(call gb_LinkTarget__get_cxxflags,$(3)))
  772. endef
  773. define gb_LinkTarget_add_exception_object
  774. $(call gb_LinkTarget_add_cxxobject,$(1),$(2),$(gb_LinkTarget_EXCEPTIONFLAGS) $(call gb_LinkTarget__get_cxxflags,$(3)))
  775. endef
  776. define gb_LinkTarget_add_linktarget_objects
  777. $$(call gb_Output_error,\
  778. gb_LinkTarget_add_linktarget_objects: use gb_LinkTarget__use_linktarget_objects instead.)
  779. endef
  780. define gb_LinkTarget__use_linktarget_objects
  781. $(call gb_LinkTarget_get_target,$(1)) : $(foreach linktarget,$(2),$(call gb_LinkTarget_get_target,$(linktarget)))
  782. ifneq ($(OS),IOS)
  783. $(call gb_LinkTarget_get_target,$(1)) : EXTRAOBJECTLISTS += $(foreach linktarget,$(2),$(call gb_LinkTarget_get_objects_list,$(linktarget)))
  784. endif
  785. endef
  786. define gb_LinkTarget_add_library_objects
  787. $$(call gb_Output_error,\
  788. gb_LinkTarget_add_library_objects: use gb_LinkTarget_use_library_objects instead.)
  789. endef
  790. define gb_LinkTarget_use_library_objects
  791. ifneq (,$$(filter-out $(gb_Library_KNOWNLIBS),$(2)))
  792. $$(eval $$(call gb_Output_info,currently known libraries are: $(sort $(gb_Library_KNOWNLIBS)),ALL))
  793. $$(eval $$(call gb_Output_error,Cannot import objects library/libraries $$(filter-out $(gb_Library_KNOWNLIBS),$(2)). Libraries must be registered in Repository.mk))
  794. endif
  795. $(call gb_LinkTarget__use_linktarget_objects,$(1),$(foreach lib,$(2),$(call gb_Library_get_linktargetname,$(lib))))
  796. endef
  797. define gb_LinkTarget_add_executable_objects
  798. $$(call gb_Output_error,\
  799. gb_LinkTarget_add_executable_objects: use gb_LinkTarget_use_executable_objects instead.)
  800. endef
  801. define gb_LinkTarget_use_executable_objects
  802. $(call gb_LinkTarget__use_linktarget_objects,$(1),$(foreach exe,$(2),$(call gb_Executable_get_linktargetname,$(lib))))
  803. endef
  804. define gb_LinkTarget_add_cobjects
  805. $(foreach obj,$(2),$(call gb_LinkTarget_add_cobject,$(1),$(obj),$(3),$(4)))
  806. endef
  807. define gb_LinkTarget_add_cxxobjects
  808. $(foreach obj,$(2),$(call gb_LinkTarget_add_cxxobject,$(1),$(obj),$(3)))
  809. endef
  810. define gb_LinkTarget_add_objcobjects
  811. $(foreach obj,$(2),$(call gb_LinkTarget_add_objcobject,$(1),$(obj),$(3),$(4)))
  812. endef
  813. define gb_LinkTarget_add_objcxxobjects
  814. $(foreach obj,$(2),$(call gb_LinkTarget_add_objcxxobject,$(1),$(obj),$(3),$(4)))
  815. endef
  816. define gb_LinkTarget_add_asmobjects
  817. $(foreach obj,$(2),$(call gb_LinkTarget_add_asmobject,$(1),$(obj),$(3)))
  818. endef
  819. define gb_LinkTarget_add_noexception_objects
  820. $(foreach obj,$(2),$(call gb_LinkTarget_add_noexception_object,$(1),$(obj),$(4)))
  821. endef
  822. define gb_LinkTarget_add_exception_objects
  823. $(foreach obj,$(2),$(call gb_LinkTarget_add_exception_object,$(1),$(obj),$(4)))
  824. endef
  825. #only useful for building x64 libraries on windows
  826. define gb_LinkTarget_add_x64_generated_exception_objects
  827. $(foreach obj,$(2),$(call gb_LinkTarget_add_generated_exception_object,$(1),$(obj),$(4)))
  828. $(foreach obj,$(2),$(eval $(call gb_GenCxxObject_get_target,$(obj)) : CXXOBJECT_X64 := YES))
  829. endef
  830. define gb_LinkTarget_add_generated_cobjects
  831. $(foreach obj,$(2),$(call gb_LinkTarget_add_generated_c_object,$(1),$(obj),$(3),$(4)))
  832. endef
  833. #only useful for building x64 libraries on windows
  834. define gb_LinkTarget_add_x64_generated_cobjects
  835. $(foreach obj,$(2),$(call gb_LinkTarget_add_generated_c_object,$(1),$(obj),$(3),$(4)))
  836. $(foreach obj,$(2),$(eval $(call gb_GenCObject_get_target,$(obj)) : COBJECT_X64 := YES))
  837. endef
  838. define gb_LinkTarget_add_generated_cxxobjects
  839. $(foreach obj,$(2),$(call gb_LinkTarget_add_generated_cxx_object,$(1),$(obj),$(3)))
  840. endef
  841. define gb_LinkTarget_add_generated_exception_object
  842. $(call gb_LinkTarget_add_generated_cxx_object,$(1),$(2),$(gb_LinkTarget_EXCEPTIONFLAGS) $(call gb_LinkTarget__get_cxxflags,$(3)) $(4))
  843. endef
  844. define gb_LinkTarget_add_generated_exception_objects
  845. $(foreach obj,$(2),$(call gb_LinkTarget_add_generated_exception_object,$(1),$(obj),$(4)))
  846. endef
  847. define gb_LinkTarget_set_targettype
  848. $(call gb_LinkTarget_get_target,$(1)) \
  849. $(call gb_LinkTarget_get_dep_target,$(1)) : TARGETTYPE := $(2)
  850. endef
  851. define gb_LinkTarget_set_x64
  852. $(call gb_LinkTarget_get_target,$(1)) \
  853. $(call gb_LinkTarget_get_dep_target,$(1)) : LIBRARY_X64 := $(2)
  854. endef
  855. define gb_LinkTarget_set_dlltarget
  856. $(call gb_LinkTarget_get_clean_target,$(1)) \
  857. $(call gb_LinkTarget_get_target,$(1)) : DLLTARGET := $(2)
  858. endef
  859. define gb_LinkTarget_set_auxtargets
  860. $$(call gb_Output_error,\
  861. gb_LinkTarget_set_auxtargets: use gb_LinkTarget_add_auxtargets instead.)
  862. endef
  863. # Add a file that is built by the LinkTarget command and define
  864. # a dummy touch rule for it so it can be tracked via dependencies.
  865. # gb_LinkTarget_add_auxtarget linktarget auxtarget
  866. define gb_LinkTarget_add_auxtarget
  867. $(2) : $(call gb_LinkTarget_get_target,$(1))
  868. touch $$@
  869. $(call gb_LinkTarget_get_clean_target,$(1)) : AUXTARGETS += $(2)
  870. endef
  871. define gb_LinkTarget_add_auxtargets
  872. $(foreach aux,$(2),$(call gb_LinkTarget_add_auxtarget,$(1),$(aux)))
  873. endef
  874. define gb_LinkTarget__add_internal_headers
  875. $(call gb_LinkTarget_get_headers_target,$(1)) : $(2)
  876. $(2) :| $(call gb_LinkTarget_get_external_headers_target,$(1))
  877. endef
  878. define gb_LinkTarget_add_custom_headers
  879. $$(call gb_Output_error,\
  880. gb_LinkTarget_add_custom_headers: use gb_LinkTarget_use_custom_headers instead.)
  881. endef
  882. define gb_LinkTarget__use_custom_headers
  883. $(call gb_LinkTarget_get_external_headers_target,$(1)) :| \
  884. $(call gb_CustomTarget_get_target,$(2))
  885. $(call gb_LinkTarget__add_include,$(1),$(call gb_CustomTarget_get_workdir,$(2)))
  886. endef
  887. define gb_LinkTarget_use_custom_headers
  888. $(foreach customtarget,$(2),$(call gb_LinkTarget__use_custom_headers,$(1),$(customtarget)))
  889. endef
  890. define gb_LinkTarget_add_package_headers
  891. $$(call gb_Output_error,\
  892. gb_LinkTarget_add_package_headers: use gb_LinkTarget_use_package instead.)
  893. endef
  894. # add SDI (svidl) headers
  895. define gb_LinkTarget_add_sdi_headers
  896. $(call gb_LinkTarget__add_internal_headers,$(1),$(foreach sdi,$(2),$(call gb_SdiTarget_get_target,$(sdi))))
  897. $(call gb_LinkTarget_get_clean_target,$(1)) : $(foreach sdi,$(2),$(call gb_SdiTarget_get_clean_target,$(sdi)))
  898. endef
  899. define gb_LinkTarget_add_external_headers
  900. $$(call gb_Output_error,\
  901. gb_LinkTarget_add_external_headers: use gb_LinkTarget_use_package instead.)
  902. endef
  903. # use a header package, possibly from another module (i.e. via OUTDIR)
  904. define gb_LinkTarget_use_package
  905. $(call gb_LinkTarget_get_external_headers_target,$(1)) :| \
  906. $(call gb_Package_get_target,$(strip $(2)))
  907. endef
  908. define gb_LinkTarget_use_packages
  909. $(foreach package,$(2),$(call gb_LinkTarget_use_package,$(1),$(package)))
  910. endef
  911. # Use sources from unpacked tarball of an external project
  912. define gb_LinkTarget_use_unpacked
  913. $(call gb_LinkTarget_get_external_headers_target,$(1)) :| $(call gb_UnpackedTarball_get_final_target,$(2))
  914. endef
  915. # Use artifacts from ExternalProject (i. e. configure) of an external project
  916. # example in expat: StaticLibrary depends on ExternalProject outcome
  917. define gb_LinkTarget_use_external_project
  918. $(call gb_LinkTarget_get_external_headers_target,$(1)) :| $(call gb_ExternalProject_get_target,$(2))
  919. endef
  920. # this forwards to functions that must be defined in RepositoryExternal.mk.
  921. # $(eval $(call gb_LinkTarget_use_external,library,external))
  922. define gb_LinkTarget_use_external
  923. $(if $(filter undefined,$(origin gb_LinkTarget__use_$(2))),\
  924. $(error gb_LinkTarget_use_external: unknown external: $(2)),\
  925. $(call gb_LinkTarget__use_$(2),$(1)))
  926. endef
  927. # $(call gb_LinkTarget_use_externals,library,externals)
  928. gb_LinkTarget_use_externals = \
  929. $(foreach external,$(2),$(call gb_LinkTarget_use_external,$(1),$(external)))
  930. define gb_LinkTarget_set_visibility_default
  931. $(call gb_LinkTarget_get_target,$(1)) : VISIBILITY := default
  932. ifeq ($(gb_FULLDEPS),$(true))
  933. $(call gb_LinkTarget_get_dep_target,$(1)) : VISIBILITY := default
  934. endif
  935. endef
  936. define gb_LinkTarget_set_warnings_not_errors
  937. $(call gb_LinkTarget_get_target,$(1)) : WARNINGS_NOT_ERRORS := $(true)
  938. ifeq ($(gb_FULLDEPS),$(true))
  939. $(call gb_LinkTarget_get_dep_target,$(1)) : WARNINGS_NOT_ERRORS := $(true)
  940. endif
  941. endef
  942. # Set suffix of C++ files, if different from 'cxx'
  943. #
  944. # This is useful for external libraries.
  945. #
  946. # gb_LinkTarget_set_generated_cxx_suffix linktarget used-suffix
  947. define gb_LinkTarget_set_generated_cxx_suffix
  948. gb_LinkTarget_CXX_SUFFIX_$(1) := $(2)
  949. endef
  950. # vim: set noet sw=4: