diff options
Diffstat (limited to 'solenv/gbuild/Module.mk')
-rw-r--r-- | solenv/gbuild/Module.mk | 128 |
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: |