summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjoern Michaelsen <bjoern.michaelsen@canonical.com>2011-04-16 14:25:37 +0200
committerBjoern Michaelsen <bjoern.michaelsen@canonical.com>2011-04-16 14:25:37 +0200
commit5105f2598bff21c992c1edf8bef8b55d8001b111 (patch)
tree7eef6f3571045275106dbb1682184481400d458d
parentgbuild support for final extensions (diff)
downloadcore-5105f2598bff21c992c1edf8bef8b55d8001b111.tar.gz
core-5105f2598bff21c992c1edf8bef8b55d8001b111.zip
gb_CHECKOBJECTOWNER=T allows to check for objects linked multiple times
-rw-r--r--solenv/gbuild/LinkTarget.mk23
-rw-r--r--solenv/gbuild/extensions/final_ObjectOwner.mk47
2 files changed, 70 insertions, 0 deletions
diff --git a/solenv/gbuild/LinkTarget.mk b/solenv/gbuild/LinkTarget.mk
index 49ce493b609e..45df7b2beb40 100644
--- a/solenv/gbuild/LinkTarget.mk
+++ b/solenv/gbuild/LinkTarget.mk
@@ -240,6 +240,9 @@ gb_ObjCxxObject_ObjCxxObject =
# LinkTarget class
gb_LinkTarget_DEFAULTDEFS := $(gb_GLOBALDEFS)
+gb_LinkTarget_OBJECTOWNER :=
+gb_LinkTarget_OBJECTS :=
+
# defined by platform
# gb_LinkTarget_CXXFLAGS
# gb_LinkTarget_LDFLAGS
@@ -531,6 +534,11 @@ $(call gb_LinkTarget_get_dep_target,$(1)) : COBJECTS += $(2)
$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_CObject_get_dep_target,$(2))
endif
+ifeq ($(gb_CHECKOBJECTOWNER),$(true))
+gb_LinkTarget_OBJECTOWNER += $(call gb_CObject_get_target,$(2)):$(1)
+gb_LinkTarget_OBJECTS += $(call gb_CObject_get_target,$(2))
+endif
+
endef
define gb_LinkTarget_add_cxxobject
@@ -546,6 +554,11 @@ $(call gb_LinkTarget_get_dep_target,$(1)) : CXXOBJECTS += $(2)
$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_CxxObject_get_dep_target,$(2))
endif
+ifeq ($(gb_CHECKOBJECTOWNER),$(true))
+gb_LinkTarget_OBJECTOWNER += $(call gb_CxxObject_get_target,$(2)):$(1)
+gb_LinkTarget_OBJECTS += $(call gb_CxxObject_get_target,$(2))
+endif
+
endef
define gb_LinkTarget_add_objcxxobject
@@ -561,6 +574,11 @@ $(call gb_LinkTarget_get_dep_target,$(1)) : OBJCXXOBJECTS += $(2)
$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_ObjCxxObject_get_dep_target,$(2))
endif
+ifeq ($(gb_CHECKOBJECTOWNER),$(true))
+gb_LinkTarget_OBJECTOWNER += $(call gb_ObjCxxObject_get_target,$(2)):$(1)
+gb_LinkTarget_OBJECTS += $(call gb_ObjCxxObject_get_target,$(2))
+endif
+
endef
define gb_LinkTarget_add_generated_cxx_object
@@ -576,6 +594,11 @@ $(call gb_LinkTarget_get_dep_target,$(1)) : GENCXXOBJECTS += $(2)
$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_GenCxxObject_get_dep_target,$(2))
endif
+ifeq ($(gb_CHECKOBJECTOWNER),$(true))
+gb_LinkTarget_OBJECTOWNER += $(call gb_GenCxxObject_get_target,$(2)):$(1)
+gb_LinkTarget_OBJECTS += $(call gb_GenCxxObject_get_target,$(2))
+endif
+
endef
define gb_LinkTarget_add_noexception_object
diff --git a/solenv/gbuild/extensions/final_ObjectOwner.mk b/solenv/gbuild/extensions/final_ObjectOwner.mk
new file mode 100644
index 000000000000..c00dcb897143
--- /dev/null
+++ b/solenv/gbuild/extensions/final_ObjectOwner.mk
@@ -0,0 +1,47 @@
+# Version: MPL 1.1 / GPLv3+ / LGPLv3+
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License or as specified alternatively below. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Initial Developer of the Original Code is
+# Bjoern Michaelsen, Canonical Ltd. <bjoern.michaelsen@canonical.com>
+# Portions created by the Initial Developer are Copyright (C) 2010 the
+# Initial Developer. All Rights Reserved.
+#
+# Major Contributor(s):
+#
+# For minor contributions see the git repository.
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 3 or later (the "GPLv3+"), or
+# the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
+# in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
+# instead of those above.
+
+ifeq ($(gb_CHECKOBJECTOWNER),$(true))
+
+define gb_LinkTarget_check_object_owner
+ifneq (1,$$(words $$(filter $(1):%,$$(gb_LinkTarget_OBJECTOWNER))))
+$$(info \
+ $(patsubst $(WORKDIR)/%,%,$(1))\
+ is linked in by\
+ $$(patsubst $(1):%,%,$$(filter $(1):%,$$(gb_LinkTarget_OBJECTOWNER))))
+gb_CHECKOBJECTOWNER_VALID := $(false)
+endif
+endef
+
+gb_CHECKOBJECTOWNER_VALID := $(true)
+$(foreach object,$(sort $(gb_LinkTarget_OBJECTS)),$(eval $(call gb_LinkTarget_check_object_owner,$(object))))
+ifneq ($(gb_CHECKOBJECTOWNER_VALID),$(true))
+$(eval $(call gb_Output_error,duplicate linked objects))
+endif
+
+endif
+# vim: set noet ts=4 sw=4: