summaryrefslogtreecommitdiffstats
path: root/solenv/gbuild/UnoApiTarget.mk
diff options
context:
space:
mode:
Diffstat (limited to 'solenv/gbuild/UnoApiTarget.mk')
-rw-r--r--solenv/gbuild/UnoApiTarget.mk250
1 files changed, 250 insertions, 0 deletions
diff --git a/solenv/gbuild/UnoApiTarget.mk b/solenv/gbuild/UnoApiTarget.mk
new file mode 100644
index 000000000..bc364ad9a
--- /dev/null
+++ b/solenv/gbuild/UnoApiTarget.mk
@@ -0,0 +1,250 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This file incorporates work covered by the following license notice:
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed
+# with this work for additional information regarding copyright
+# ownership. The ASF licenses this file to you under the Apache
+# License, Version 2.0 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.apache.org/licenses/LICENSE-2.0 .
+#
+
+# UnoApiTarget
+
+gb_UnoApiTarget_UNOIDLWRITEDEPS := $(call gb_Executable_get_runtime_dependencies,unoidl-write)
+gb_UnoApiTarget_UNOIDLWRITECOMMAND := $(call gb_Executable_get_command,unoidl-write)
+
+gb_UnoApiTarget_UNOIDLCHECKDEPS := $(call gb_Executable_get_runtime_dependencies,unoidl-check)
+gb_UnoApiTarget_UNOIDLCHECKCOMMAND := $(call gb_Executable_get_command,unoidl-check)
+
+define gb_UnoApiTarget__command
+mkdir -p $(dir $(1)) \
+$(if $(UNOAPI_ENTITIES), \
+ && RESPONSEFILE=$(call var2file,$(shell $(gb_MKTEMP)),500,$(UNOAPI_ENTITIES))) \
+&& $(gb_UnoApiTarget_UNOIDLWRITECOMMAND) \
+ $(foreach rdb,$(UNOAPI_DEPRDBS),$(call gb_UnoApiTarget_get_target,$(rdb))) \
+ $(SRCDIR)/$(gb_UnoApiTarget_REG_$(2)) $(if $(UNOAPI_ENTITIES),@$${RESPONSEFILE}) $(1) \
+$(if $(UNOAPI_ENTITIES),&& rm -f $${RESPONSEFILE}) \
+$(if $(UNOAPI_REFERENCE), \
+ $(call gb_Output_announce,$(2),$(true),DBc,3) \
+ && $(gb_UnoApiTarget_UNOIDLCHECKCOMMAND) $(UNOAPI_REFERENCE) -- \
+ $(foreach rdb,$(UNOAPI_DEPRDBS),$(call gb_UnoApiTarget_get_target,$(rdb))) \
+ $(1))
+endef
+
+$(call gb_UnoApiTarget_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),UNO,4)
+ $(call gb_Trace_StartRange,$*,UNO)
+ $(call gb_UnoApiTarget__command,$@,$*)
+ $(call gb_Trace_EndRange,$*,UNO)
+
+.PHONY : $(call gb_UnoApiTarget_get_clean_target,%)
+$(call gb_UnoApiTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),UNO,4)
+ -$(call gb_Helper_abbreviate_dirs,\
+ rm -rf $(call gb_UnoApiTarget_get_target,$*))
+
+define gb_UnoApiTarget_UnoApiTarget
+gb_UnoApiTarget_REG_$(1) := $(2)
+$(call gb_UnoApiTarget_get_target,$(1)) : UNOAPI_ENTITIES :=
+$(call gb_UnoApiTarget_get_target,$(1)) : UNOAPI_REFERENCE :=
+$(call gb_UnoApiTarget_get_target,$(1)) : UNOAPI_DEPRDBS :=
+$(call gb_UnoApiTarget_get_target,$(1)) : $(gb_UnoApiTarget_UNOIDLWRITEDEPS)
+$(call gb_UnoApiTarget_get_target,$(1)) : $(SRCDIR)/$(2) # may be dir, though
+
+endef
+
+define gb_UnoApiTarget_add_idlfile
+$(call gb_UnoApiTarget_get_target,$(1)) : UNOAPI_ENTITIES += $(subst /,.,$(2))$(if $(2),.)$(3)
+$(call gb_UnoApiTarget_get_target,$(1)) : $(SRCDIR)/$(gb_UnoApiTarget_REG_$(1))/$(2)/$(3).idl
+
+endef
+
+define gb_UnoApiTarget_add_idlfiles
+$(foreach idl,$(3),$(call gb_UnoApiTarget_add_idlfile,$(1),$(2),$(idl)))
+
+endef
+
+define gb_UnoApiTarget_set_reference_rdbfile
+$(call gb_UnoApiTarget_get_target,$(1)) : UNOAPI_REFERENCE := $(2)
+$(call gb_UnoApiTarget_get_target,$(1)) : $(2)
+$(call gb_UnoApiTarget_get_target,$(1)) : $(gb_UnoApiTarget_UNOIDLCHECKDEPS)
+
+endef
+
+define gb_UnoApiTarget_use_api
+$(call gb_UnoApiTarget_get_target,$(1)) : UNOAPI_DEPRDBS += $(2)
+$(call gb_UnoApiTarget_get_target,$(1)) : $(call gb_UnoApiTarget_get_target,$(2))
+
+endef
+
+# UnoApiHeadersTarget
+
+# defined by platform
+# gb_UnoApiHeadersTarget_select_variant
+
+# Allow to redefine header variant.
+#
+# On iOS we use static linking because dynamic loading of own code
+# isn't allowed by the iOS App Store rules, and we want our code to be
+# eventually distributable there as part of apps.
+#
+# To avoid problems that this causes together with the lovely
+# intentional breaking of the One Definition Rule, for iOS we always
+# generate comprehensive headers for certain type RDBS. (The ODR
+# breakage doesn't harm, by accident or careful design, on platforms
+# where shared libraries are used.) To avoid generating the same headers
+# more than once, we are silently "redirecting" the target to point to
+# comprehensive headers instead.
+#
+# Example:
+# If gb_UnoApiHeadersTarget_select_variant is defined as
+#
+# ifeq ($(DISABLE_DYNLOADING),TRUE)
+# gb_UnoApiHeadersTarget_select_variant = $(if $(filter udkapi,$(1)),comprehensive,$(2))
+# else
+# gb_UnoApiHeadersTarget_select_variant = $(2)
+# endif
+#
+# then, for the DISABLE_DYNLOADING case, whenever a makefile uses
+# $(call gb_UnoApiHeadersTarget_get_target,udkapi) or $(call
+# gb_UnoApiHeadersTarget_get_dir,udkapi), it will get target or dir for
+# comprehensive headers instead.
+#
+# We are experimenting with static linking on Android, too. There for
+# technical reasons to get around silly limitations in the OS, sigh.
+#
+# gb_UnoApiHeadersTarget_select_variant api default-variant
+ifeq ($(origin gb_UnoApiHeadersTarget_select_variant),undefined)
+$(eval $(call gb_Output_error,gb_UnoApiHeadersTarget_select_variant must be defined by platform))
+endif
+
+gb_UnoApiHeadersTarget_CPPUMAKERDEPS := $(call gb_Executable_get_runtime_dependencies,cppumaker)
+gb_UnoApiHeadersTarget_CPPUMAKERCOMMAND := $(call gb_Executable_get_command,cppumaker)
+
+define gb_UnoApiHeadersTarget__command
+ $(gb_UnoApiHeadersTarget_CPPUMAKERCOMMAND) \
+ -Gc $(4) -O$(3) $(call gb_UnoApiTarget_get_target,$(2)) \
+ $(UNOAPI_DEPS) && \
+ touch $(1)
+
+endef
+
+$(call gb_UnoApiHeadersTarget_get_real_bootstrap_target,%) : \
+ $(gb_UnoApiHeadersTarget_CPPUMAKERDEPS)
+ $(call gb_Output_announce,$*,$(true),HPB,3) \
+ $(call gb_Trace_StartRange,$*,HPB)
+ $(call gb_UnoApiHeadersTarget__command,$@,$*,$(call gb_UnoApiHeadersTarget_get_bootstrap_dir,$*))
+ $(call gb_Trace_EndRange,$*,HPB)
+
+$(call gb_UnoApiHeadersTarget_get_real_comprehensive_target,%) : \
+ $(gb_UnoApiHeadersTarget_CPPUMAKERDEPS)
+ $(call gb_Output_announce,$*,$(true),HPC,3)
+ $(call gb_Trace_StartRange,$*,HPC)
+ $(call gb_UnoApiHeadersTarget__command,$@,$*,$(call gb_UnoApiHeadersTarget_get_comprehensive_dir,$*),-C)
+ $(call gb_Trace_EndRange,$*,HPC)
+
+$(call gb_UnoApiHeadersTarget_get_real_target,%) : \
+ $(gb_UnoApiHeadersTarget_CPPUMAKERDEPS)
+ $(call gb_Output_announce,$*,$(true),HPP,3) \
+ $(call gb_Trace_StartRange,$*,HPP)
+ $(call gb_UnoApiHeadersTarget__command,$@,$*,$(call gb_UnoApiHeadersTarget_get_dir,$*),-L)
+ $(call gb_Trace_EndRange,$*,HPP)
+
+.PHONY : $(call gb_UnoApiHeadersTarget_get_clean_target,%)
+$(call gb_UnoApiHeadersTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),HPP,3)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -rf \
+ $(call gb_UnoApiHeadersTarget_get_real_dir,$*) \
+ $(call gb_UnoApiHeadersTarget_get_real_bootstrap_dir,$*) \
+ $(call gb_UnoApiHeadersTarget_get_real_comprehensive_dir,$*) \
+ $(call gb_UnoApiHeadersTarget_get_real_target,$*) \
+ $(call gb_UnoApiHeadersTarget_get_real_bootstrap_target,$*)) \
+ $(call gb_UnoApiHeadersTarget_get_real_comprehensive_target,$*)
+
+define gb_UnoApiHeadersTarget_UnoApiHeadersTarget
+$(call gb_UnoApiHeadersTarget_get_target,$(1)) : $(call gb_UnoApiTarget_get_target,$(1))
+$(call gb_UnoApiHeadersTarget_get_bootstrap_target,$(1)) : $(call gb_UnoApiTarget_get_target,$(1))
+$(call gb_UnoApiHeadersTarget_get_comprehensive_target,$(1)) : $(call gb_UnoApiTarget_get_target,$(1))
+$(call gb_UnoApiHeadersTarget_get_clean_target,$(1)) : $(call gb_UnoApiTarget_get_clean_target,$(1))
+
+$(call gb_UnoApiHeadersTarget_get_target,$(1)) : UNOAPI_DEPS :=
+$(call gb_UnoApiHeadersTarget_get_bootstrap_target,$(1)) : UNOAPI_DEPS :=
+$(call gb_UnoApiHeadersTarget_get_comprehensive_target,$(1)) : UNOAPI_DEPS :=
+
+# need dummy recipes so that header files are delivered in Package_inc;
+# otherwise make will consider the header to be up-to-date because it was
+# actually built by the recipe for gb_UnoApiHeadersTarget_get_target
+$(call gb_UnoApiHeadersTarget_get_real_dir,$(1))/%.hdl : \
+ $(call gb_Executable_get_target_for_build,cppumaker) \
+ | $(call gb_UnoApiHeadersTarget_get_real_target,$(1))
+ touch $$@
+
+$(call gb_UnoApiHeadersTarget_get_real_dir,$(1))/%.hpp : \
+ $(call gb_Executable_get_target_for_build,cppumaker) \
+ | $(call gb_UnoApiHeadersTarget_get_real_target,$(1))
+ touch $$@
+
+$(call gb_UnoApiHeadersTarget_get_real_bootstrap_dir,$(1))/%.hdl : \
+ $(call gb_Executable_get_target_for_build,cppumaker) \
+ | $(call gb_UnoApiHeadersTarget_get_real_bootstrap_target,$(1))
+ touch $$@
+
+$(call gb_UnoApiHeadersTarget_get_real_bootstrap_dir,$(1))/%.hpp : \
+ $(call gb_Executable_get_target_for_build,cppumaker) \
+ | $(call gb_UnoApiHeadersTarget_get_real_bootstrap_target,$(1))
+ touch $$@
+
+$(call gb_UnoApiHeadersTarget_get_real_comprehensive_dir,$(1))/%.hdl : \
+ $(call gb_Executable_get_target_for_build,cppumaker) \
+ | $(call gb_UnoApiHeadersTarget_get_real_comprehensive_target,$(1))
+ touch $$@
+
+$(call gb_UnoApiHeadersTarget_get_real_comprehensive_dir,$(1))/%.hpp : \
+ $(call gb_Executable_get_target_for_build,cppumaker) \
+ | $(call gb_UnoApiHeadersTarget_get_real_comprehensive_target,$(1))
+ touch $$@
+
+endef
+
+# ensure that idl change triggers the dummy rule to rebuild the headers
+# call gb_UnoApiHeadersTarget_add_headerfile,unoapi,headerfile
+define gb_UnoApiHeadersTarget_add_headerfile
+$(call gb_UnoApiHeadersTarget_get_dir,$(1))/$(2) : \
+ $(SRCDIR)/$(basename $(gb_UnoApiTarget_REG_$(1))/$(2)).idl
+
+endef
+
+# call gb_UnoApiHeadersTarget_add_headerfiles,unoapi,directory,headerfilenames
+define gb_UnoApiHeadersTarget_add_headerfiles
+$(foreach hdr,$(3),$(call gb_UnoApiHeadersTarget_add_headerfile,$(1),$(2)/$(hdr)))
+endef
+
+define gb_UnoApiHeadersTarget__use_api_for_target
+$(call gb_UnoApiHeadersTarget_get_$(3),$(1)) : $(call gb_UnoApiTarget_get_target,$(2))
+$(call gb_UnoApiHeadersTarget_get_$(3),$(1)) : UNOAPI_DEPS += -X$(call gb_UnoApiTarget_get_target,$(2))
+
+endef
+
+define gb_UnoApiHeadersTarget__use_api
+$(call gb_UnoApiHeadersTarget__use_api_for_target,$(1),$(2),target)
+$(call gb_UnoApiHeadersTarget__use_api_for_target,$(1),$(2),bootstrap_target)
+$(call gb_UnoApiHeadersTarget__use_api_for_target,$(1),$(2),comprehensive_target)
+
+endef
+
+define gb_UnoApiHeadersTarget_use_api
+$(foreach rdb,$(2),$(call gb_UnoApiHeadersTarget__use_api,$(1),$(rdb)))
+
+endef
+
+# vim: set noet sw=4 ts=4: