summaryrefslogtreecommitdiff
path: root/solenv/gbuild/Module.mk
diff options
context:
space:
mode:
Diffstat (limited to 'solenv/gbuild/Module.mk')
-rw-r--r--solenv/gbuild/Module.mk128
1 files changed, 128 insertions, 0 deletions
diff --git a/solenv/gbuild/Module.mk b/solenv/gbuild/Module.mk
new file mode 100644
index 000000000000..afc40a835cfe
--- /dev/null
+++ b/solenv/gbuild/Module.mk
@@ -0,0 +1,128 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2009 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+
+# Module class
+
+gb_Module_ALLMODULES :=
+gb_Module_MODULELOCATIONS :=
+gb_Module_TARGETSTACK :=
+gb_Module_CLEANTARGETSTACK :=
+
+.PHONY : $(call gb_Module_get_clean_target,%)
+$(call gb_Module_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),MOD,5)
+ $(call gb_Output_announce_title,module $* cleared.)
+ -$(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_Module_get_target,$*))
+
+$(call gb_Module_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),MOD,5)
+ $(call gb_Output_announce_title,module $* done.)
+ -$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $@) && \
+ touch $@)
+
+.PHONY : all clean
+.DEFAULT_GOAL := all
+
+all :
+ $(call gb_Output_announce,top level modules: $(foreach module,$(filter-out deliverlog,$^),$(notdir $(module))),$(true),ALL,6)
+ $(call gb_Output_announce,loaded modules: $(sort $(gb_Module_ALLMODULES)),$(true),ALL,6)
+ $(call gb_Output_announce_title,all done.)
+ $(call gb_Output_announce_bell)
+
+clean :
+ $(call gb_Output_announce,top level modules: $(foreach module,$^,$(notdir $(module))),$(false),ALL,6)
+ $(call gb_Output_announce,loaded modules: $(sort $(gb_Module_ALLMODULES)),$(false),ALL,6)
+ $(call gb_Output_announce_title,all cleared.)
+ $(call gb_Output_announce_bell)
+
+define gb_Module_Module
+gb_Module_ALLMODULES += $(1)
+gb_Module_MODULELOCATIONS += $(1):$(dir $(realpath $(lastword $(MAKEFILE_LIST))))
+$$(eval $$(call gb_Module_register_target,$(call gb_Module_get_target,$(1)),$(call gb_Module_get_clean_target,$(1))))
+
+endef
+
+# This is called inside the included file and pushes one target on each stack.
+# This has to be called with full late evaluation ($$(eval $$(call ))) and
+# should never be inlined ($(call )) as the calls defining it might be sourced
+# before gb_Module.
+define gb_Module_register_target
+gb_Module_TARGETSTACK := $(1) $(gb_Module_TARGETSTACK)
+gb_Module_CLEANTARGETSTACK := $(2) $(gb_Module_CLEANTARGETSTACK)
+
+endef
+
+# Here we include the file (in it there will be a call to
+# gb_Module_register_target) and pop one target from each stack afterwards.
+define gb_Module_add_target
+include $(patsubst $(1):%,%,$(filter $(1):%,$(gb_Module_MODULELOCATIONS)))/$(2).mk
+$(call gb_Module_get_target,$(1)) : $$(firstword $$(gb_Module_TARGETSTACK))
+$(call gb_Module_get_clean_target,$(1)) : $$(firstword $$(gb_Module_CLEANTARGETSTACK))
+gb_Module_TARGETSTACK := $$(wordlist 2,$$(words $$(gb_Module_TARGETSTACK)),$$(gb_Module_TARGETSTACK))
+gb_Module_CLEANTARGETSTACK := $$(wordlist 2,$$(words $$(gb_Module_CLEANTARGETSTACK)),$$(gb_Module_CLEANTARGETSTACK))
+
+endef
+
+define gb_Module_add_moduledir
+$(call gb_Module_add_target,$(1),$(2)/Module_$(2))
+endef
+
+define gb_Module_add_targets
+$(foreach target,$(2),$(call gb_Module_add_target,$(1),$(target)))
+endef
+
+define gb_Module_add_moduledirs
+$(foreach target,$(2),$(call gb_Module_add_moduledir,$(1),$(target)))
+endef
+
+define gb_Module_make_global_targets
+ifneq ($$(gb_Module_TARGETSTACK),)
+$$(eval $$(call gb_Output_error,Corrupted module target stack!))
+endif
+
+include $(1)
+
+all : $$(firstword $$(gb_Module_TARGETSTACK))
+clean : $$(firstword $$(gb_Module_CLEANTARGETSTACK))
+
+ifneq ($$(words $$(gb_Module_TARGETSTACK)),1)
+$$(eval $$(call gb_Output_error,Corrupted module target stack!))
+endif
+
+gb_Module_TARGETSTACK := $$(wordlist 2,$$(words $$(gb_Module_TARGETSTACK)),$$(gb_Module_TARGETSTACK))
+gb_Module_CLEANTARGETSTACK := $$(wordlist 2,$$(words $$(gb_Module_CLEANTARGETSTACK)),$$(gb_Module_CLEANTARGETSTACK))
+
+ifneq ($$(gb_Module_TARGETSTACK),)
+$$(eval $$(call gb_Output_error,Corrupted module target stack!))
+endif
+
+endef
+
+# vim: set noet sw=4 ts=4: