[Libreoffice-commits] core.git: 4 commits - helpcompiler/inc helpcompiler/source solenv/gbuild

David Tardon dtardon at redhat.com
Tue Feb 26 06:28:51 PST 2013


 helpcompiler/inc/HelpLinker.hxx      |    2 
 helpcompiler/source/HelpCompiler.cxx |    9 
 helpcompiler/source/HelpLinker.cxx   |    6 
 solenv/gbuild/AllLangHelp.mk         |  166 ++++++++
 solenv/gbuild/HelpTarget.mk          |  706 +++++++++++++++++++++++++++++++++++
 solenv/gbuild/TargetLocations.mk     |   26 +
 solenv/gbuild/Zip.mk                 |    9 
 solenv/gbuild/gbuild.mk              |    2 
 8 files changed, 920 insertions(+), 6 deletions(-)

New commits:
commit 0909384b98deeaa9e788b30be46e6c81b9adc68b
Author: David Tardon <dtardon at redhat.com>
Date:   Tue Feb 26 15:00:59 2013 +0100

    add support for building help packs into gbuild
    
    Change-Id: I1cc5600ab0f6236c451d07bfb5ad9ee42ea4754a

diff --git a/solenv/gbuild/AllLangHelp.mk b/solenv/gbuild/AllLangHelp.mk
new file mode 100644
index 0000000..143f6bc
--- /dev/null
+++ b/solenv/gbuild/AllLangHelp.mk
@@ -0,0 +1,166 @@
+# -*- 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/.
+#
+
+gb_AllLangHelp_HELPDIRNAME := helpcontent2
+gb_AllLangHelp_AUXDIRNAME := auxiliary
+gb_AllLangHelp_HELPDIR := $(gb_AllLangHelp_HELPDIRNAME)/source
+gb_AllLangHelp_AUXDIR := $(gb_AllLangHelp_HELPDIR)/$(gb_AllLangHelp_AUXDIRNAME)
+gb_AllLangHelp_TRANLATIONSDIR := $(SRCDIR)/translations
+
+# class AllLangHelp
+
+# Creates and delivers all language versions of a module.
+
+gb_AllLangHelp_LANGS := $(gb_WITH_LANG)
+
+define gb_AllLangHelp__translation_exists
+$(or \
+	$(filter en-US,$(1)),\
+	$(and \
+		$(wildcard $(SRCDIR)/$(gb_AllLangHelp_AUXDIR)/$(1)),\
+		$(wildcard $(gb_AllLangHelp_TRANLATIONSDIR)/source/$(1)/$(gb_AllLangHelp_HELPDIRNAME)) \
+	) \
+)
+endef
+
+gb_AllLangHelp__get_helpname = $(1)/$(2)
+gb_AllLangHelp__get_zipname = $(1)_$(2)
+
+$(dir $(call gb_AllLangHelp_get_target,%)).dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_AllLangHelp_get_target,%))%/.dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_AllLangHelp_get_target,%) :
+	$(call gb_Output_announce,$*,$(true),ALH,5)
+	touch $@
+
+$(call gb_AllLangHelp_get_clean_target,%) :
+	$(call gb_Output_announce,$*,$(false),ALH,5)
+	$(call gb_Helper_abbreviate_dirs,\
+		rm -f $(call gb_AllLangHelp_get_target,$*) $(HELP_DELIVERABLES) \
+	)
+
+# gb_AllLangHelp_AllLangHelp__one_lang module lang helpname zipname
+define gb_AllLangHelp_AllLangHelp__one_lang
+$(call gb_HelpTarget_HelpTarget,$(3),$(1),$(2))
+$(call gb_HelpTarget_set_configdir,$(3),$(gb_AllLangHelp_AUXDIR))
+$(call gb_HelpTarget_set_helpdir,$(3),$(gb_AllLangHelp_HELPDIR))
+
+$(call gb_HelpTarget_get_outdir_target,$(4)) : $(call gb_HelpTarget_get_zipfile,$(3))
+$(call gb_AllLangHelp_get_target,$(1)) : $(call gb_HelpTarget_get_outdir_target,$(4))
+$(call gb_AllLangHelp_get_target,$(1)) : $(call gb_HelpTarget_get_target,$(3))
+$(call gb_AllLangHelp_get_clean_target,$(1)) : $(call gb_HelpTarget_get_clean_target,$(3))
+$(call gb_AllLangHelp_get_clean_target,$(1)) : HELP_DELIVERABLES += $(call gb_HelpTarget_get_outdir_target,$(4))
+
+$(call gb_Deliver_add_deliverable,$(call gb_HelpTarget_get_outdir_target,$(4)),$(call gb_HelpTarget_get_zipfile,$(3)),$(1))
+
+endef
+
+# Create and deliver help packs for a module for all languages.
+#
+# gb_AllLangHelp_AllLangHelp module
+define gb_AllLangHelp_AllLangHelp
+$(call gb_AllLangHelp_get_clean_target,$(1)) : HELP_DELIVERABLES :=
+
+$(foreach lang,$(gb_AllLangHelp_LANGS),\
+	$(if $(call gb_AllLangHelp__translation_exists,$(lang)),\
+		$(call gb_AllLangHelp_AllLangHelp__one_lang,$(1),$(lang),$(call gb_AllLangHelp__get_helpname,$(1),$(lang)),$(call gb_AllLangHelp__get_zipname,$(1),$(lang)))))
+
+$(call gb_AllLangHelp_get_target,$(1)) :| $(dir $(call gb_AllLangHelp_get_target,$(1))).dir
+
+$$(eval $$(call gb_Module_register_target,$(call gb_AllLangHelp_get_target,$(1)),$(call gb_AllLangHelp_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),AllLangHelp)
+
+endef
+
+# gb_AllLangHelp_set_treefile module treefile
+define gb_AllLangHelp_set_treefile
+$(foreach lang,$(gb_AllLangHelp_LANGS),$(call gb_HelpTarget_set_treefile,$(call gb_AllLangHelp__get_helpname,$(1),$(lang)),$(2),$(gb_AllLangHelp_HELPDIR)/text))
+
+endef
+
+# Add a help file.
+#
+# gb_AllLangHelp_add_helpfile module file
+define gb_AllLangHelp_add_helpfile
+$(foreach lang,$(gb_AllLangHelp_LANGS),$(call gb_HelpTarget_add_helpfile,$(call gb_AllLangHelp__get_helpname,$(1),$(lang)),$(2)))
+
+endef
+
+# Add one or more help files.
+#
+# gb_AllLangHelp_add_helpfiles module file(s)
+define gb_AllLangHelp_add_helpfiles
+$(foreach lang,$(gb_AllLangHelp_LANGS),$(call gb_HelpTarget_add_helpfiles,$(call gb_AllLangHelp__get_helpname,$(1),$(lang)),$(2)))
+
+endef
+
+# Add additional localized file to the help pack.
+#
+# gb_AllLangHelp_add_localized_file module basedir file
+define gb_AllLangHelp_add_localized_file
+$(foreach lang,$(gb_AllLangHelp_LANGS),$(call gb_HelpTarget_add_file,$(call gb_AllLangHelp__get_helpname,$(1),$(lang)),$(2)/$(lang)/$(3)))
+
+endef
+
+# Add additional localized file(s) to the help pack.
+#
+# gb_AllLangHelp_add_localized_files module basedir file(s)
+define gb_AllLangHelp_add_localized_files
+$(foreach lang,$(gb_AllLangHelp_LANGS),$(call gb_HelpTarget_add_files,$(call gb_AllLangHelp__get_helpname,$(1),$(lang)),$(addprefix $(2)/$(lang)/,$(3))))
+
+endef
+
+# gb_AllLangHelp__use_module module other-module lang
+define gb_AllLangHelp__use_module
+$(call gb_HelpTarget_use_module,$(call gb_AllLangHelp__get_helpname,$(1),$(3)),$(call gb_AllLangHelp__get_helpname,$(2),$(3)))
+
+endef
+
+# Use references from another help module's files.
+#
+# gb_AllLangHelp_use_module module other-module
+define gb_AllLangHelp_use_module
+$(foreach lang,$(gb_AllLangHelp_LANGS),$(call gb_AllLangHelp__use_module,$(1),$(2),$(lang)))
+
+endef
+
+# Use references from other help modules' files.
+#
+# gb_AllLangHelp_use_module module other-module(s)
+define gb_AllLangHelp_use_modules
+$(foreach module,$(2),$(call gb_AllLangHelp_use_module,$(1),$(module)))
+
+endef
+
+# gb_AllLangHelp__use_linked_module module other-module lang
+define gb_AllLangHelp__use_linked_module
+$(call gb_HelpTarget_use_linked_module,$(call gb_AllLangHelp__get_helpname,$(1),$(3)),$(call gb_AllLangHelp__get_helpname,$(2),$(3)))
+
+endef
+
+# Link with another help module.
+#
+# gb_AllLangHelp_use_linked_module module other-module
+define gb_AllLangHelp_use_linked_module
+$(foreach lang,$(gb_AllLangHelp_LANGS),$(call gb_AllLangHelp__use_linked_module,$(1),$(2),$(lang)))
+
+endef
+
+# Link with other help module(s).
+#
+# gb_AllLangHelp_use_linked_module module other-module(s)
+define gb_AllLangHelp_use_linked_modules
+$(foreach module,$(2),$(call gb_AllLangHelp_use_linked_module,$(1),$(module)))
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/HelpTarget.mk b/solenv/gbuild/HelpTarget.mk
new file mode 100644
index 0000000..d1a8d6d
--- /dev/null
+++ b/solenv/gbuild/HelpTarget.mk
@@ -0,0 +1,706 @@
+# -*- 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 gbuild module handles building of localized help packs. The main
+# entry point is class HelpTarget; the other classes should be
+# considered private implementation details and not used directly from
+# outside of this file.
+#
+# All defined objects must be named <help-module>/<lang>. If this naming
+# scheme is not followed, bad things will happen!
+
+# Overview of classes and dependencies
+
+# class						task							depends on
+# HelpTranslatePartTarget	l10n of xhp files in one dir	xhp file(s)
+# HelpTranslateTarget		l10n of xhp files				HelpTranslatePartTarget
+# HelpTreeTarget			l10n of tree file				tree file
+# HelpLinkTarget			linking help module				HelpTranslateTarget
+#															HelpTreeTarget
+# HelpJarTarget				creating jar of xhp files		HelpLinkTarget
+# HelpIndexTarget			indexing help module			HelpLinkTarget
+# HelpTarget				creating help pack				HelpIndexTarget
+# 															HelpJarTarget
+# 															extra added files
+
+# class HelpTranslatePartTarget
+
+# Translates .xhp files in one directory.
+
+gb_HelpTranslatePartTarget_DEPS := $(call gb_Executable_get_runtime_dependencies,helpex)
+gb_HelpTranslatePartTarget_COMMAND := $(call gb_Executable_get_command,helpex)
+
+define gb_HelpTranslatePartTarget__command
+$(call gb_Output_announce,$(2),$(true),HPX,1)
+HELPFILES=$(call var2file,$(shell $(gb_MKTEMP)),100,$(filter %.xhp,$(3))) && \
+POFILES=$(call var2file,$(shell $(gb_MKTEMP)),100,$(sort $(POFILES))) && \
+$(call gb_Helper_abbreviate_dirs,\
+	$(gb_HelpTranslatePartTarget_COMMAND) \
+		-l $(HELP_LANG) \
+		-mi $${HELPFILES} \
+		-m $${POFILES} \
+		-o $(call gb_HelpTranslatePartTarget_get_workdir,$(2)) \
+) && \
+touch $@ && \
+rm -f $${HELPFILES} $${POFILES}
+endef
+
+$(dir $(call gb_HelpTranslatePartTarget_get_target,%)).dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_HelpTranslatePartTarget_get_target,%) : $(gb_HelpTranslatePartTarget_DEPS)
+	$(call gb_HelpTranslatePartTarget__command,$@,$*,$^)
+
+.PHONY : $(call gb_HelpTranslatePartTarget_get_clean_target,%)
+$(call gb_HelpTranslatePartTarget_get_clean_target,%) :
+	$(call gb_Output_announce,$*,$(false),HPX,1)
+	$(call gb_Helper_abbreviate_dirs,\
+		rm -rf \
+			$(call gb_HelpTranslatePartTarget_get_target,$*) \
+			$(call gb_HelpTranslatePartTarget_get_workdir,$*) \
+	)
+
+# Translate a set of .xhp files from one directory.
+#
+# gb_HelpTranslatePartTarget_HelpTranslatePartTarget target lang dir
+define gb_HelpTranslatePartTarget_HelpTranslatePartTarget
+$(call gb_HelpTranslatePartTarget_get_target,$(1)) : HELP_LANG := $(2)
+$(call gb_HelpTranslatePartTarget_get_target,$(1)) : POFILES := $(gb_POLOCATION)/$(2)/$(3).po
+
+$(call gb_HelpTranslatePartTarget_get_target,$(1)) : $(gb_POLOCATION)/$(2)/$(3).po
+$(call gb_HelpTranslatePartTarget_get_target,$(1)) :| $(dir $(call gb_HelpTranslatePartTarget_get_target,$(1))).dir
+$(call gb_HelpTranslatePartTarget_get_target,$(1)) :| $(call gb_HelpTranslatePartTarget_get_workdir,$(1))/.dir
+
+endef
+
+define gb_HelpTranslatePartTarget_add_file
+$(call gb_HelpTranslatePartTarget_get_target,$(1)) : $(2)
+
+endef
+
+# class HelpTranslateTarget
+
+# Translates a set of .xhp files.
+
+gb_HelpTranslateTarget__get_lang = $(lastword $(subst /, ,$(1)))
+
+gb_HelpTranslateTarget__get_partname = $(call gb_HelpTranslateTarget__get_lang,$(1))/$(patsubst %/,%,$(2))
+gb_HelpTranslateTarget__get_part_workdir = $(call gb_HelpTranslatePartTarget_get_workdir,$(call gb_HelpTranslateTarget__get_partname,$(1),$(2)))
+
+gb_HelpTranslateTarget_get_translated_target = $(call gb_HelpTranslatePartTarget_get_translated_target,$(call gb_HelpTranslateTarget__get_partname,$(1),$(dir $(2))),$(notdir $(2)))
+gb_HelpTranslateTarget__get_any_translated_target = $(abspath $(call gb_HelpTranslatePartTarget_get_translated_target,,$(1)))
+gb_HelpTranslateTarget_get_workdir = $(call gb_HelpTranslateTarget__get_part_workdir,$(1),$(2))
+
+$(dir $(call gb_HelpTranslateTarget_get_target,%)).dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_HelpTranslateTarget_get_target,%))%/.dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_HelpTranslateTarget_get_target,%) :
+	$(call gb_Output_announce,$*,$(true),XHP,2)
+	touch $@
+
+$(call gb_HelpTranslateTarget__get_any_translated_target,%) :
+	touch $@
+
+.PHONY : $(call gb_HelpTranslateTarget_get_clean_target,%)
+$(call gb_HelpTranslateTarget_get_clean_target,%) :
+	$(call gb_Output_announce,$*,$(false),XHP,2)
+	$(call gb_Helper_abbreviate_dirs,\
+		rm -f $(call gb_HelpTranslateTarget_get_target,$*) \
+	)
+
+# Localizes a set of .xhp files to one language.
+#
+# gb_HelpTranslateTarget_HelpTranslateTarget module
+define gb_HelpTranslateTarget_HelpTranslateTarget
+$(call gb_HelpTranslateTarget_get_target,$(1)) :| $(dir $(call gb_HelpTranslateTarget_get_target,$(1))).dir
+
+endef
+
+# gb_HelpTranslateTarget__make_part module part lang dir
+define gb_HelpTranslateTarget__make_part
+$(call gb_HelpTranslatePartTarget_HelpTranslatePartTarget,$(2),$(3),$(patsubst %/,%,$(4)))
+
+$(call gb_HelpTranslateTarget_get_target,$(1)) : $(call gb_HelpTranslatePartTarget_get_target,$(2))
+$(call gb_HelpTranslateTarget_get_clean_target,$(1)) : $(call gb_HelpTranslatePartTarget_get_clean_target,$(2))
+
+endef
+
+# gb_HelpTranslateTarget__add_file module dir file
+define gb_HelpTranslateTarget__add_file
+$(call gb_HelpTranslatePartTarget_add_file,$(call gb_HelpTranslateTarget__get_partname,$(1),$(2)),$(SRCDIR)/$(3).xhp)
+$(call gb_HelpTranslateTarget_get_translated_target,$(1),$(3)) : $(call gb_HelpTranslateTarget_get_target,$(1))
+
+endef
+
+# gb_HelpTranslateTarget__add_files_impl module lang dir(s) file(s)
+define gb_HelpTranslateTarget__add_files_impl
+$(foreach part,$(3),$(call gb_HelpTranslateTarget__make_part,$(1),$(call gb_HelpTranslateTarget__get_partname,$(1),$(part)),$(2),$(part)))
+$(foreach file,$(4),$(call gb_HelpTranslateTarget__add_file,$(1),$(dir $(file)),$(file)))
+
+endef
+
+# gb_HelpTranslateTarget__add_files module file(s)
+define gb_HelpTranslateTarget__add_files
+$(call gb_HelpTranslateTarget__add_files_impl,$(1),$(call gb_HelpTranslateTarget__get_lang,$(1)),$(sort $(dir $(2))),$(2))
+
+endef
+
+# gb_HelpTranslateTarget_add_file module file
+define gb_HelpTranslateTarget_add_file
+$(call gb_HelpTranslateTarget__add_files,$(1),$(2))
+
+endef
+
+# gb_HelpTranslateTarget_add_files module file(s)
+define gb_HelpTranslateTarget_add_files
+$(call gb_HelpTranslateTarget__add_files,$(1),$(2))
+
+endef
+
+# class HelpTree
+
+# Translates a .tree file.
+
+gb_HelpTreeTarget_DEPS := $(call gb_Executable_get_runtime_dependencies,treex)
+gb_HelpTreeTarget_COMMAND := $(call gb_Executable_get_command,treex)
+
+define gb_HelpTreeTarget__command
+$(call gb_Output_announce,$(2),$(true),TRE,1)
+POFILES=$(call var2file,$(shell $(gb_MKTEMP)),100,$(POFILES)) && \
+$(call gb_Helper_abbreviate_dirs,\
+	$(gb_HelpTreeTarget_COMMAND) \
+		-i $(HELP_TREE) \
+		-l $(HELP_LANG) \
+		-m $${POFILES} \
+		-o $@ \
+		-r $(HELP_TEXTDIR) \
+) && \
+rm -f $${POFILES}
+endef
+
+$(dir $(call gb_HelpTreeTarget_get_target,%)).dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_HelpTreeTarget_get_target,%))%/.dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_HelpTreeTarget_get_target,%) : $(gb_HelpTreeTarget_DEPS)
+	$(if $(HELP_TEXTDIR),,$(call gb_Output_error,HelpTreeTarget: no help text dir for .tree was set))
+	$(if $(HELP_TREE),,$(call gb_Output_error,HelpTreeTarget: no .tree file to translate was set))
+	$(call gb_HelpTreeTarget__command,$@,$*)
+
+.PHONY : $(call gb_HelpTreeTarget_get_clean_target,%)
+$(call gb_HelpTreeTarget_get_clean_target,%) :
+	$(call gb_Output_announce,$*,$(false),TRE,1)
+	$(call gb_Helper_abbreviate_dirs,\
+		rm -f $(call gb_HelpTreeTarget_get_target,$*) \
+	)
+
+# Translate a .tree file.
+#
+# gb_HelpTreeTarget_HelpTreeTarget target lang
+define gb_HelpTreeTarget_HelpTreeTarget
+$(call gb_HelpTreeTarget_get_target,$(1)) : HELP_LANG := $(2)
+$(call gb_HelpTreeTarget_get_target,$(1)) : HELP_TEXTDIR :=
+$(call gb_HelpTreeTarget_get_target,$(1)) : HELP_TREE :=
+$(call gb_HelpTreeTarget_get_target,$(1)) : POFILES :=
+
+$(call gb_HelpTreeTarget_get_target,$(1)) :| $(dir $(call gb_HelpTreeTarget_get_target,$(1))).dir
+
+endef
+
+# gb_HelpTreeTarget__set_pofiles target pofiles
+define gb_HelpTreeTarget__set_pofiles
+$(call gb_HelpTreeTarget_get_target,$(1)) : POFILES := $(2)
+$(call gb_HelpTreeTarget_get_target,$(1)) : $(2)
+
+endef
+
+# gb_HelpTreeTarget_set_treefile target treefile
+define gb_HelpTreeTarget_set_treefile
+$(call gb_HelpTreeTarget__set_pofiles,$(1),$(gb_POLOCATION)/$(lastword $(subst /, ,$(1)))/$(patsubst %/,%,$(dir $(2))).po)
+
+$(call gb_HelpTreeTarget_get_target,$(1)) : HELP_TREE := $(SRCDIR)/$(2).tree
+$(call gb_HelpTreeTarget_get_target,$(1)) : $(SRCDIR)/$(2).tree
+
+endef
+
+# gb_HelpTreeTarget_set_helptextdir target dir
+define gb_HelpTreeTarget_set_helptextdir
+$(call gb_HelpTreeTarget_get_target,$(1)) : HELP_TEXTDIR := $(2)
+
+endef
+
+# class HelpLinkTarget
+
+# Links a help module.
+
+gb_HelpLinkTarget_HELPLINKERDEPS := $(call gb_Executable_get_runtime_dependencies,HelpLinker)
+gb_HelpLinkTarget_HELPLINKERCOMMAND := $(call gb_Executable_get_command,HelpLinker)
+gb_HelpLinkTarget_COMPACTTARGET := $(OUTDIR)/bin/compact.xsl
+gb_HelpLinkTarget_EMBEDTARGET := $(OUTDIR)/bin/embed.xsl
+gb_HelpLinkTarget_IDXCAPTIONTARGET := $(OUTDIR)/bin/idxcaption.xsl
+gb_HelpLinkTarget_IDXCONTENTTARGET := $(OUTDIR)/bin/idxcontent.xsl
+gb_HelpLinkTarget_DEPS := \
+	$(gb_HelpLinkTarget_HELPLINKERDEPS) \
+	$(gb_HelpLinkTarget_COMPACTTARGET) \
+	$(gb_HelpLinkTarget_EMBEDTARGET) \
+	$(gb_HelpLinkTarget_IDXCAPTIONTARGET) \
+	$(gb_HelpLinkTarget_IDXCONTENTTARGET)
+
+define gb_HelpLinkTarget__command
+$(call gb_Output_announce,$(2),$(true),HLK,3)
+RESPONSEFILE=$(call var2file,$(shell $(gb_MKTEMP)),100,\
+	-lang $(HELP_LANG) \
+	-mod $(HELP_MODULE) \
+	-nolangroot \
+	-o $(WORKDIR)/dummy.zip \
+	-src $(HELP_SRCDIR) \
+	-zipdir $(HELP_WORKDIR) \
+	-compact $(gb_HelpLinkTarget_COMPACTTARGET)
+	-idxcaption $(gb_HelpLinkTarget_IDXCAPTIONTARGET) \
+	-idxcontent $(gb_HelpLinkTarget_IDXCONTENTTARGET) \
+	-sty $(gb_HelpLinkTarget_EMBEDTARGET) \
+	$(if $(HELP_CONFIGDIR),-add $(HELP_MODULE).cfg $(HELP_CONFIGDIR)/$(HELP_LANG)/$(HELP_MODULE).cfg) \
+	$(if $(HELP_TREE),-add $(HELP_MODULE).tree $(HELP_TREE)) \
+	$(foreach file,$(HELP_ADD_FILES),-add $(notdir $(file)) $(file)) \
+	$(HELP_FILES) \
+	$(if $(HELP_LINKED_MODULES),\
+		$(shell cat $(foreach module,$(HELP_LINKED_MODULES),$(call gb_HelpTarget_get_filelist,$(module)))) \
+	) \
+) && \
+$(gb_HelpLinkTarget_HELPLINKERCOMMAND) @$${RESPONSEFILE} && \
+touch $@ && \
+rm -f $${RESPONSEFILE}
+endef
+
+
+$(dir $(call gb_HelpLinkTarget_get_target,%)).dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_HelpLinkTarget_get_target,%))%/.dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_HelpLinkTarget_get_target,%) : $(gb_HelpLinkTarget_DEPS)
+	$(call gb_HelpLinkTarget__command,$@,$*)
+
+$(call gb_HelpLinkTarget_get_preparation_target,%) :
+	touch $@
+
+.PHONY : $(call gb_HelpLinkTarget_get_clean_target,%)
+$(call gb_HelpLinkTarget_get_clean_target,%) :
+	$(call gb_Output_announce,$*,$(false),HLK,3)
+	$(call gb_Helper_abbreviate_dirs,\
+		rm -f \
+			$(call gb_HelpLinkTarget_get_target,$*) \
+			$(call gb_HelpLinkTarget_get_preparation_target,$*) \
+	)
+
+# Create a help linking target.
+#
+# gb_HelpLinkTarget_HelpLinkTarget name module lang workdir
+define gb_HelpLinkTarget_HelpLinkTarget
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_ADD_FILES :=
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_CONFIGDIR :=
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_FILES :=
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_MODULE := $(2)
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_LANG := $(3)
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_LINKED_MODULES :=
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_SRCDIR :=
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_TREE :=
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_WORKDIR := $(4)
+
+$(call gb_HelpLinkTarget_get_target,$(1)) : $(call gb_HelpLinkTarget_get_preparation_target,$(1))
+$(call gb_HelpLinkTarget_get_target,$(1)) :| $(dir $(call gb_HelpLinkTarget_get_target,$(1))).dir
+$(call gb_HelpLinkTarget_get_preparation_target,$(1)) :| $(dir $(call gb_HelpLinkTarget_get_preparation_target,$(1))).dir
+
+endef
+
+# gb_HelpLinkTarget_set_configdir target configdir
+define gb_HelpLinkTarget_set_configdir
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_CONFIGDIR := $(2)
+
+endef
+
+# gb_HelpLinkTarget_set_sourcedir target source
+define gb_HelpLinkTarget_set_sourcedir
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_SRCDIR := $(2)
+
+endef
+
+# gb_HelpLinkTarget_set_treefile target treefile
+define gb_HelpLinkTarget_set_treefile
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_TREE := $(2)
+$(call gb_HelpLinkTarget_get_target,$(1)) : $(2)
+
+endef
+
+# gb_HelpLinkTarget_add_helpfile target helpfile
+define gb_HelpLinkTarget_add_helpfile
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_FILES += $(2)
+$(call gb_HelpLinkTarget_get_target,$(1)) : $(2)
+
+endef
+
+# Add an arbitrary file to the help pack.
+#
+# The file will be added to the root directory of the pack.
+#
+# gb_HelpLinkTarget_add_file target file
+define gb_HelpLinkTarget_add_file
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_ADD_FILES += $(2)
+$(call gb_HelpLinkTarget_get_target,$(1)) : $(2)
+
+endef
+
+# Use help files from another help module for references.
+#
+# gb_HelpLinkTarget_use_module target help
+define gb_HelpLinkTarget_use_module
+$(call gb_HelpLinkTarget_get_preparation_target,$(1)) : $(call gb_HelpTarget_get_translation_target,$(2))
+
+endef
+
+# Link with help files from another help module.
+#
+# gb_HelpLinkTarget_use_linked_module target help
+define gb_HelpLinkTarget_use_linked_module
+$(call gb_HelpLinkTarget_use_module,$(1),$(2))
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_LINKED_MODULES += $(2)
+
+endef
+
+# class HelpIndexTarget
+
+# Creates a full-text search index for a help module.
+
+gb_HelpIndexTarget_DEPS := $(call gb_Executable_get_runtime_dependencies,HelpIndexer)
+gb_HelpIndexTarget_COMMAND := $(call gb_Executable_get_command,HelpIndexer)
+
+define gb_HelpIndexTarget__command
+$(call gb_Output_announce,$*,$(false),HIX,3)
+$(call gb_Helper_abbreviate_dirs,\
+	(\
+		$(gb_HelpIndexTarget_COMMAND) \
+			-dir $(HELP_WORKDIR) \
+			-lang $(HELP_LANG) \
+			-mod $(HELP_MODULE) \
+		&& touch $@ \
+	) \
+	|| ( rm -rf $(HELP_MODULE).* ; false )
+)
+endef
+
+$(dir $(call gb_HelpIndexTarget_get_target,%)).dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_HelpIndexTarget_get_target,%))%/.dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_HelpIndexTarget_get_target,%) : $(gb_HelpIndexTarget_DEPS)
+	$(call gb_HelpIndexTarget__command,$@,$*)
+
+.PHONY : $(call gb_HelpIndexTarget_get_clean_target,%)
+$(call gb_HelpIndexTarget_get_clean_target,%) :
+	$(call gb_Output_announce,$*,$(false),HIX,3)
+	rm -f $(call gb_HelpIndexTarget_get_target,$*)
+
+# Create a help indexing target.
+#
+# gb_HelpIndexTarget_HelpIndexTarget target module lang workdir
+define gb_HelpIndexTarget_HelpIndexTarget
+$(call gb_HelpIndexTarget_get_target,$(1)) : HELP_LANG := $(3)
+$(call gb_HelpIndexTarget_get_target,$(1)) : HELP_MODULE := $(2)
+$(call gb_HelpIndexTarget_get_target,$(1)) : HELP_WORKDIR := $(4)
+
+$(call gb_HelpIndexTarget_get_target,$(1)) :| $(dir $(call gb_HelpIndexTarget_get_target,$(1))).dir
+
+endef
+
+# class HelpJarTarget
+
+# Packs help files processed by HelpLinker into a jar in the workdir.
+
+gb_HelpJarTarget_COMMAND := zip
+
+define gb_HelpJarTarget__get_command
+$(call gb_Output_announce,$*,$(true),HEJ,3)
+cd $(HELP_WORKDIR) && \
+$(gb_HelpJarTarget_COMMAND) -q -0 -rX $(HELP_MODULE).jar text/$(HELP_MODULE) && \
+touch $@
+endef
+
+$(dir $(call gb_HelpJarTarget_get_target,%)).dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_HelpJarTarget_get_target,%))%/.dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_HelpJarTarget_get_target,%) :
+	$(call gb_HelpJarTarget__get_command,$@,$*)
+
+$(call gb_HelpJarTarget_get_clean_target,%) :
+	$(call gb_Output_announce,$*,$(false),HEJ,3)
+	rm -f $(call gb_HelpJarTarget_get_target,$*)
+
+# gb_HelpJarTarget_HelpJarTarget target module workdir
+define gb_HelpJarTarget_HelpJarTarget
+$(call gb_HelpJarTarget_get_target,$(1)) : HELP_MODULE := $(2)
+$(call gb_HelpJarTarget_get_target,$(1)) : HELP_WORKDIR := $(3)
+
+$(call gb_HelpJarTarget_get_target,$(1)) :| $(dir $(call gb_HelpJarTarget_get_target,$(1))).dir
+
+endef
+
+# class HelpTarget
+
+# Creates one language version of a help module.
+
+gb_HelpTarget_DEFAULT_LANG := en-US
+
+gb_HelpTarget__get_module = $(patsubst %/$(call gb_HelpTarget__get_lang,$(1)),%,$(1))
+gb_HelpTarget__get_lang = $(lastword $(subst /, ,$(1)))
+gb_HelpTarget__test_default_lang = $(filter $(gb_HelpTarget_DEFAULT_LANG),$(1))
+gb_HelpTarget__is_default_lang = $(call gb_HelpTarget__test_default_lang,$(call gb_HelpTarget__get_lang,$(1)))
+
+define gb_HelpTarget__get_helpdir
+$(if $(call gb_HelpTarget__is_default_lang,$(1)) \
+	,$(SRCDIR)/$(2) \
+	,$(call gb_HelpTranslateTarget_get_workdir,$(1),$(2)) \
+)
+endef
+
+define gb_HelpTarget__get_helpfile
+$(if $(call gb_HelpTarget__is_default_lang,$(1)) \
+	,$(SRCDIR)/$(2).xhp \
+	,$(call gb_HelpTranslateTarget_get_translated_target,$(1),$(2)) \
+)
+endef
+
+define gb_HelpTarget__get_treefile
+$(if $(call gb_HelpTarget__is_default_lang,$(1)) \
+	,$(SRCDIR)/$(2).tree \
+	,$(call gb_HelpTreeTarget_get_target,$(1)) \
+)
+endef
+
+define gb_HelpTarget__make_workdir_rule
+$$(call gb_HelpTarget_get_workdir,%)$(2) :
+	touch $$@
+
+endef
+
+$(dir $(call gb_HelpTarget_get_target,%)).dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_HelpTarget_get_target,%))%/.dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+# Translation of the module's .xhp files is done. Also creates the list
+# for gb_HelpTarget_get_filelist.
+$(call gb_HelpTarget_get_translation_target,%) :
+	rm -f $@ && mv $(call var2file,$@.tmp,100,$(HELP_FILES)) $@
+
+$(call gb_HelpTarget_get_target,%) :
+	$(call gb_Output_announce,$*,$(true),HLP,4)
+	touch $@
+
+# All processing is done and the results can be packed into a zip.
+$(call gb_HelpTarget_get_packing_target,%) :
+	touch $@
+
+# make pattern rules for all file types possibly included in a help zip
+$(eval $(foreach ext,.css .db .ht .html .idxl/segments.gen .idxl/segments_1 .jar .key,\
+	$(call gb_HelpTarget__make_workdir_rule,$(ext)) \
+))
+
+.PHONY : $(call gb_HelpTarget_get_clean_target,%)
+$(call gb_HelpTarget_get_clean_target,%) :
+	$(call gb_Output_announce,$*,$(false),HLP,4)
+	$(call gb_Helper_abbreviate_dirs,\
+		rm -rf \
+			$(call gb_HelpTarget_get_packing_target,$*) \
+			$(call gb_HelpTarget_get_target,$*) \
+			$(call gb_HelpTarget_get_translation_target,$*) \
+			$(call gb_HelpTarget_get_workdir,$*) \
+	)
+
+# Create a help target.
+#
+# gb_HelpTarget_HelpTarget target module lang
+define gb_HelpTarget_HelpTarget
+$(call gb_HelpTarget_get_target,$(1)) : HELP_MODULE := $(2)
+$(call gb_HelpTarget_get_target,$(1)) : HELP_LANG := $(3)
+
+$(call gb_HelpTarget_get_translation_target,$(1)) : HELP_FILES :=
+
+$(call gb_HelpTarget__HelpTarget_impl,$(1),$(2),$(3),$(call gb_HelpTarget_get_workdir,$(1)))
+
+endef
+
+# gb_HelpTarget__HelpTarget_impl target module lang workdir
+define gb_HelpTarget__HelpTarget_impl
+$(if $(call gb_HelpTarget__test_default_lang,$(3)),,$(call gb_HelpTarget__HelpTarget_impl_lang,$(1),$(2),$(3),$(4)))
+$(call gb_HelpLinkTarget_HelpLinkTarget,$(1),$(2),$(3),$(4))
+$(call gb_HelpIndexTarget_HelpIndexTarget,$(1),$(2),$(3),$(4))
+$(call gb_HelpJarTarget_HelpJarTarget,$(1),$(2),$(4))
+$(call gb_Zip_Zip_internal_nodeliver,$(call gb_HelpTarget_get_zipname,$(1)),$(4))
+
+$(call gb_HelpTarget__add_initial_files,$(1),$(2),$(4))
+
+$(call gb_HelpLinkTarget_get_preparation_target,$(1)) : $(call gb_HelpTarget_get_translation_target,$(1))
+$(call gb_HelpLinkTarget_get_target,$(1)) :| $(call gb_HelpTarget_get_workdir,$(1))/.dir
+$(call gb_HelpIndexTarget_get_target,$(1)) : $(call gb_HelpLinkTarget_get_target,$(1))
+$(call gb_HelpTarget_get_packing_target,$(1)) : $(call gb_HelpIndexTarget_get_target,$(1))
+$(call gb_Zip_get_target,$(call gb_HelpTarget_get_zipname,$(1))) : $(call gb_HelpTarget_get_packing_target,$(1))
+$(call gb_HelpTarget_get_target,$(1)) : $(call gb_Zip_get_target,$(call gb_HelpTarget_get_zipname,$(1)))
+
+$(call gb_HelpTarget_get_packing_target,$(1)) :| $(dir $(call gb_HelpTarget_get_packing_target,$(1))).dir
+$(call gb_HelpTarget_get_target,$(1)) :| $(dir $(call gb_HelpTarget_get_target,$(1))).dir
+$(call gb_HelpTarget_get_translation_target,$(1)) :| $(dir $(call gb_HelpTarget_get_translation_target,$(1))).dir
+
+$(call gb_HelpTarget_get_clean_target,$(1)) : $(call gb_HelpLinkTarget_get_clean_target,$(1))
+$(call gb_HelpTarget_get_clean_target,$(1)) : $(call gb_HelpIndexTarget_get_clean_target,$(1))
+$(call gb_HelpTarget_get_clean_target,$(1)) : $(call gb_Zip_get_clean_target,$(call gb_HelpTarget_get_zipname,$(1)))
+
+endef
+
+# gb_HelpTarget__HelpTarget_impl_lang target module lang workdir
+define gb_HelpTarget__HelpTarget_impl_lang
+$(call gb_HelpTranslateTarget_HelpTranslateTarget,$(1),$(3))
+$(call gb_HelpTreeTarget_HelpTreeTarget,$(1),$(3))
+
+$(call gb_HelpTarget_get_translation_target,$(1)) : $(call gb_HelpTranslateTarget_get_target,$(1))
+$(call gb_HelpTreeTarget_get_target,$(1)) : $(call gb_HelpTranslateTarget_get_target,$(1))
+
+$(call gb_HelpTarget_get_clean_target,$(1)) : $(call gb_HelpTranslateTarget_get_clean_target,$(1))
+$(call gb_HelpTarget_get_clean_target,$(1)) : $(call gb_HelpTreeTarget_get_clean_target,$(1))
+
+endef
+
+# Add always-present files into the zip.
+#
+# gb_HelpTarget__add_initial_files target module workdir
+define gb_HelpTarget__add_initial_files
+$(call gb_HelpTarget__add_file,$(1),$(2).db)
+$(call gb_HelpTarget__add_file,$(1),$(2).ht)
+$(call gb_HelpTarget__add_file,$(1),$(2).idxl/segments.gen)
+$(call gb_HelpTarget__add_file,$(1),$(2).idxl/segments_1)
+$(call gb_HelpTarget__add_file,$(1),$(2).key)
+
+endef
+
+# gb_HelpTarget__add_file target file
+define gb_HelpTarget__add_file
+$(call gb_Zip_add_file,$(call gb_HelpTarget_get_zipname,$(1)),$(2))
+$(call gb_HelpTarget_get_workdir,$(1))/$(2) : $(call gb_HelpTarget_get_packing_target,$(1))
+
+endef
+
+# gb_HelpTarget_set_configdir target configdir
+define gb_HelpTarget_set_configdir
+$(call gb_HelpLinkTarget_set_configdir,$(1),$(SRCDIR)/$(2))
+
+endef
+
+# gb_HelpTarget_set_helpdir target helpdir
+define gb_HelpTarget_set_helpdir
+$(call gb_HelpLinkTarget_set_sourcedir,$(1),$(call gb_HelpTarget__get_helpdir,$(1),$(2)))
+
+endef
+
+# gb_HelpTarget_set_treefile target treefile textdir
+define gb_HelpTarget_set_treefile
+$(if $(call gb_HelpTarget__is_default_lang,$(1)),,\
+	$(call gb_HelpTreeTarget_set_treefile,$(1),$(2)) \
+	$(call gb_HelpTreeTarget_set_helptextdir,$(1),$(call gb_HelpTarget__get_helpdir,$(1),$(3))) \
+)
+$(call gb_HelpLinkTarget_set_treefile,$(1),$(call gb_HelpTarget__get_treefile,$(1),$(2)))
+
+endef
+
+# gb_HelpTarget__add_jar target
+define gb_HelpTarget__add_jar
+$(call gb_HelpTarget__add_file,$(1),$(call gb_HelpTarget__get_module,$(2)).jar)
+$(call gb_HelpJarTarget_get_target,$(1)) : $(call gb_HelpLinkTarget_get_target,$(1))
+$(call gb_HelpTarget_get_packing_target,$(1)) : $(call gb_HelpJarTarget_get_target,$(1))
+$(call gb_HelpTarget_get_clean_target,$(1)) : $(call gb_HelpJarTarget_get_clean_target,$(1))
+
+endef
+
+define gb_HelpTarget__add_helpfile_impl
+$(call gb_HelpLinkTarget_add_helpfile,$(1),$(2))
+
+$(call gb_HelpTarget_get_translation_target,$(1)) : HELP_FILES += $(2)
+
+endef
+
+# gb_HelpTarget__add_helpfile target helpfile
+define gb_HelpTarget__add_helpfile
+$(call gb_HelpTarget__add_helpfile_impl,$(1),$(call gb_HelpTarget__get_helpfile,$(1),$(2)))
+
+endef
+
+# gb_HelpTarget_add_helpfile target helpfile
+define gb_HelpTarget_add_helpfile
+$(call gb_HelpTranslateTarget_add_file,$(1),$(2))
+$(call gb_HelpTarget__add_helpfile,$(1),$(2))
+$(call gb_HelpTarget__add_jar,$(1))
+
+endef
+
+# gb_HelpTarget_add_helpfiles target helpfile(s)
+define gb_HelpTarget_add_helpfiles
+$(call gb_HelpTranslateTarget_add_files,$(1),$(2))
+$(foreach helpfile,$(2),$(call gb_HelpTarget__add_helpfile,$(1),$(helpfile)))
+$(call gb_HelpTarget__add_jar,$(1))
+
+endef
+
+# gb_HelpTarget_add_file target file
+define gb_HelpTarget_add_file
+$(call gb_HelpLinkTarget_add_file,$(1),$(SRCDIR)/$(2))
+$(call gb_HelpTarget__add_file,$(1),$(notdir $(2)))
+
+endef
+
+# gb_HelpTarget_add_files target file(s)
+define gb_HelpTarget_add_files
+$(foreach file,$(2),$(call gb_HelpTarget_add_file,$(1),$(file)))
+
+endef
+
+# gb_HelpTarget_use_module target module
+define gb_HelpTarget_use_module
+$(call gb_HelpLinkTarget_use_module,$(1),$(2))
+
+endef
+
+# gb_HelpTarget_use_modules target module(s)
+define gb_HelpTarget_use_modules
+$(foreach module,$(2),$(call gb_HelpTarget_use_module,$(1),$(module)))
+
+endef
+
+# gb_HelpTarget_use_linked_module target module
+define gb_HelpTarget_use_linked_module
+$(call gb_HelpLinkTarget_use_linked_module,$(1),$(2))
+
+endef
+
+# gb_HelpTarget_use_linked_modules target module(s)
+define gb_HelpTarget_use_linked_modules
+$(foreach module,$(2),$(call gb_HelpTarget_use_linked_module,$(1),$(module)))
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/TargetLocations.mk b/solenv/gbuild/TargetLocations.mk
index 274598a..f6c8b5b 100644
--- a/solenv/gbuild/TargetLocations.mk
+++ b/solenv/gbuild/TargetLocations.mk
@@ -36,6 +36,7 @@ gb_Dictionary_get_target = $(OUTDIR)/pck/$(1).oxt
 gb_Executable_get_target = $(OUTDIR)/bin/$(1)$(gb_Executable_EXT)
 gb_Executable_get_target_for_build = $(OUTDIR_FOR_BUILD)/bin/$(1)$(gb_Executable_EXT_for_build)
 gb_Extension_get_target = $(OUTDIR)/bin/$(1).oxt
+gb_HelpTarget_get_outdir_target = $(OUTDIR)/pck/$(1).zip
 gb_Pagein_get_outdir_target = $(OUTDIR)/bin/pagein-$(1)
 gb_PackagePart_get_destinations = \
 	$(OUTDIR)/bin \
@@ -85,6 +86,7 @@ endef
 # workdir target patterns
 
 gb_AutoInstallLibs_get_target = $(WORKDIR)/AutoInstallLibs/$(1)
+gb_AllLangHelp_get_target = $(WORKDIR)/AllLangHelp/$(1)
 gb_AllLangResTarget_get_target = $(WORKDIR)/AllLangRes/$(1)
 gb_AllLangZip_get_target = $(WORKDIR)/AllLangZip/$(1)
 gb_AsmObject_get_target = $(WORKDIR)/AsmObject/$(1).o
@@ -119,6 +121,22 @@ gb_ExternalProject_get_statedir = $(WORKDIR)/ExternalProject/$(1)
 gb_ExternalProject_get_preparation_target = $(WORKDIR)/ExternalProject/$(1).prepare
 gb_ExternalProject_get_state_target = $(WORKDIR)/ExternalProject/$(1)/$(2)
 gb_ExternalProject_get_target = $(WORKDIR)/ExternalProject/$(1).done
+gb_HelpIndexTarget_get_target = $(WORKDIR)/HelpIndexTarget/$(1).done
+gb_HelpJarTarget_get_target = $(WORKDIR)/HelpJarTarget/$(1).done
+gb_HelpLinkTarget_get_preparation_target = $(WORKDIR)/HelpLinkTarget/$(1).prepare
+gb_HelpLinkTarget_get_target = $(WORKDIR)/HelpLinkTarget/$(1).done
+gb_HelpTarget_get_filelist = $(WORKDIR)/HelpTarget/$(1).filelist
+gb_HelpTarget_get_packing_target = $(WORKDIR)/HelpTarget/$(1).packing
+gb_HelpTarget_get_target = $(WORKDIR)/HelpTarget/$(1).done
+gb_HelpTarget_get_zipfile = $(call gb_Zip_get_target,$(call gb_HelpTarget_get_zipname,$(1)))
+gb_HelpTarget_get_zipname = HelpTarget/$(1)
+gb_HelpTarget_get_translation_target = $(call gb_HelpTarget_get_filelist,$(1))
+gb_HelpTarget_get_workdir = $(WORKDIR)/HelpTarget/$(1)
+gb_HelpTranslatePartTarget_get_target = $(WORKDIR)/HelpTranslatePartTarget/$(1)/done
+gb_HelpTranslatePartTarget_get_translated_target = $(WORKDIR)/HelpTranslatePartTarget/$(1)/$(2).xhp
+gb_HelpTranslatePartTarget_get_workdir = $(WORKDIR)/HelpTranslatePartTarget/$(1)
+gb_HelpTranslateTarget_get_target = $(WORKDIR)/HelpTranslateTarget/$(1).done
+gb_HelpTreeTarget_get_target = $(WORKDIR)/HelpTreeTarget/$(1).tree
 gb_InstallModule_get_filelist = $(call gb_InstallModuleTarget_get_filelist,$(1))
 gb_InstallModule_get_target = $(WORKDIR)/InstallModule/$(1).done
 gb_InstallModuleTarget_get_external_target = $(WORKDIR)/InstallModuleTarget/$(1).external
@@ -240,6 +258,7 @@ endef
 
 $(eval $(call gb_Helper_make_clean_targets,\
 	AutoInstallLibs \
+	AllLangHelp \
 	AllLangResTarget \
 	AllLangZip \
 	CliAssembly \
@@ -251,6 +270,13 @@ $(eval $(call gb_Helper_make_clean_targets,\
 	ComponentTarget \
 	ExternalPackage \
 	ExtensionTarget \
+	HelpTarget \
+	HelpIndexTarget \
+	HelpJarTarget \
+	HelpLinkTarget \
+	HelpTranslatePartTarget \
+	HelpTranslateTarget \
+	HelpTreeTarget \
 	InstallModule \
 	InstallModuleTarget \
 	InstallScriptTarget \
diff --git a/solenv/gbuild/gbuild.mk b/solenv/gbuild/gbuild.mk
index 80a3f0c..686b09f 100644
--- a/solenv/gbuild/gbuild.mk
+++ b/solenv/gbuild/gbuild.mk
@@ -336,6 +336,8 @@ include $(foreach class, \
 	Zip \
 	AllLangZip \
 	Configuration \
+	HelpTarget \
+	AllLangHelp \
 	ExtensionTarget \
 	Dictionary \
 	Extension \
commit 38c8b84c7f3e20c77ab87c7082c21e7bc44d82dc
Author: David Tardon <dtardon at redhat.com>
Date:   Tue Feb 26 14:57:06 2013 +0100

    allow to create non-delivered Zip targets
    
    Change-Id: I3496d815d4f2fedf04ca2c1727f37362c7395296

diff --git a/solenv/gbuild/Zip.mk b/solenv/gbuild/Zip.mk
index a522615..89ca8a6 100644
--- a/solenv/gbuild/Zip.mk
+++ b/solenv/gbuild/Zip.mk
@@ -72,11 +72,16 @@ $(call gb_Zip__get_preparation_target,%) :
 # the zip package target requires that all added files have a common root directory (package location)
 # names of added files are relative to it; the zip will store them with their complete relative path name
 # the location can't be stored in a scoped variable as it is needed in the add_file macro (see rule above)
-define gb_Zip_Zip_internal
+define gb_Zip_Zip_internal_nodeliver
 $(call gb_Zip_get_target,$(1)) : FILES :=
 $(call gb_Zip_get_target,$(1)) : LOCATION := $(2)
 $(call gb_Zip_get_clean_target,$(1)) : CLEAR_LOCATION :=
-gb_Package_Location_$(1) := $(2)
+$(eval gb_Package_Location_$(1) := $(2))
+
+endef
+
+define gb_Zip_Zip_internal
+$(call gb_Zip_Zip_internal_nodeliver,$(1),$(2))
 
 $(call gb_Deliver_add_deliverable,$(call gb_Zip_get_outdir_target,$(1)),$(call gb_Zip_get_target,$(1)),$(1))
 $(call gb_Zip_get_outdir_target,$(1)) : $(call gb_Zip_get_target,$(1)) \
commit f094641d3ad1be5f2b09c2ed9c63fd6e18bd6799
Author: David Tardon <dtardon at redhat.com>
Date:   Tue Feb 26 14:55:52 2013 +0100

    add opt -nolangroot needed for gbuild
    
    Change-Id: Id76dfc5698619f8095e0c682ae4ce5e181c9a599

diff --git a/helpcompiler/inc/HelpLinker.hxx b/helpcompiler/inc/HelpLinker.hxx
index 5e2e88d..ef4f421 100644
--- a/helpcompiler/inc/HelpLinker.hxx
+++ b/helpcompiler/inc/HelpLinker.hxx
@@ -58,6 +58,7 @@ public:
 
     HelpLinker()
         : m_pIndexerPreProcessor(NULL)
+        , m_bUseLangRoot(true)
     {}
     ~HelpLinker()
         { delete m_pIndexerPreProcessor; }
@@ -82,6 +83,7 @@ private:
     fs::path indexDirName;
     fs::path indexDirParentName;
     IndexerPreProcessor* m_pIndexerPreProcessor;
+    bool m_bUseLangRoot;
     void initIndexerPreProcessor();
     void link() throw( HelpProcessingException );
     void addBookmark( FILE* pFile_DBHelp, std::string thishid,
diff --git a/helpcompiler/source/HelpLinker.cxx b/helpcompiler/source/HelpLinker.cxx
index 6d00f67..0bdde18 100644
--- a/helpcompiler/source/HelpLinker.cxx
+++ b/helpcompiler/source/HelpLinker.cxx
@@ -373,7 +373,9 @@ void HelpLinker::link() throw( HelpProcessingException )
         }
         else
         {
-            langsourceRoot.append('/' + lang + '/');
+            langsourceRoot.append( "/" );
+            if ( m_bUseLangRoot )
+                langsourceRoot.append( lang + '/' );
             xhpFile = fs::path(xhpFileName, fs::native);
         }
 
@@ -732,6 +734,8 @@ void HelpLinker::main( std::vector<std::string> &args,
             if (!addFileUnderPath.empty() && !addFile.empty())
                 additionalFiles[addFileUnderPath] = addFile;
         }
+        else if (args[i].compare("-nolangroot") == 0)
+            m_bUseLangRoot = false;
         else
             helpFiles.push_back(args[i]);
         ++i;
commit 2f1c0be4533dc476fc23b82502360c5abc13906b
Author: David Tardon <dtardon at redhat.com>
Date:   Tue Feb 26 14:55:05 2013 +0100

    avoid string substr/replace with invalid pos
    
    Change-Id: Iceb9851bcb5e6fe66efd701fcb31e16596fe8b5a

diff --git a/helpcompiler/source/HelpCompiler.cxx b/helpcompiler/source/HelpCompiler.cxx
index eedc7fd..926a6dd 100644
--- a/helpcompiler/source/HelpCompiler.cxx
+++ b/helpcompiler/source/HelpCompiler.cxx
@@ -95,7 +95,9 @@ void HelpCompiler::saveXhpForJar( xmlDocPtr doc, const fs::path &filePath )
 #endif
     const std::string& sourceXhpPath = filePath.native_file_string();
     std::string zipdirPath = zipdir.native_file_string();
-    std::string jarXhpPath = sourceXhpPath.substr( sourceXhpPath.rfind( lang + pathSep + "text" + pathSep ) ).substr( lang.length() );
+    const std::string srcdirPath( src.native_file_string() );
+    // srcdirPath contains trailing /, but we want the file path with / at the beginning
+    std::string jarXhpPath = sourceXhpPath.substr( srcdirPath.length() - 1 );
     std::string xhpFileName = jarXhpPath.substr( jarXhpPath.rfind( pathSep ) + 1 );
     jarXhpPath = jarXhpPath.substr( 0, jarXhpPath.rfind( pathSep ) );
     if ( !jarXhpPath.compare( 1, 11, "text" + pathSep + "sbasic" ) )
@@ -104,8 +106,9 @@ void HelpCompiler::saveXhpForJar( xmlDocPtr doc, const fs::path &filePath )
     }
     if ( !jarXhpPath.compare( 1, 11, "text" + pathSep + "shared" ) )
     {
-        size_t pos = zipdirPath.find( "ziptmp" ) + 6;
-        zipdirPath.replace( pos, module.length(), "shared" );
+        const size_t pos = zipdirPath.find( "ziptmp" );
+        if ( pos != std::string::npos )
+            zipdirPath.replace( pos + 6, module.length(), "shared" );
     }
     xmlDocPtr compacted = compactXhpForJar( doc );
     fs::create_directory( fs::path( zipdirPath + jarXhpPath, fs::native ) );


More information about the Libreoffice-commits mailing list