summaryrefslogtreecommitdiffstats
path: root/postprocess
diff options
context:
space:
mode:
Diffstat (limited to 'postprocess')
-rw-r--r--postprocess/CppunitTest_services.mk63
-rw-r--r--postprocess/CustomTarget_check_dynamic_objects.mk26
-rw-r--r--postprocess/CustomTarget_components.mk49
-rw-r--r--postprocess/CustomTarget_fontconfig.mk30
-rw-r--r--postprocess/CustomTarget_images.mk122
-rw-r--r--postprocess/CustomTarget_registry.mk661
-rw-r--r--postprocess/CustomTarget_signing.mk68
-rw-r--r--postprocess/Makefile14
-rw-r--r--postprocess/Module_postprocess.mk66
-rw-r--r--postprocess/Package_fontconfig.mk18
-rw-r--r--postprocess/Package_images.mk16
-rw-r--r--postprocess/Package_registry.mk38
-rw-r--r--postprocess/README.md8
-rw-r--r--postprocess/Rdb_services.mk12
-rw-r--r--postprocess/packimages/README16
-rw-r--r--postprocess/packimages/image-sort.lst329
-rw-r--r--postprocess/qa/services.cxx511
-rw-r--r--postprocess/signing/no_signing.txt16
-rw-r--r--postprocess/signing/signing.pl252
19 files changed, 2315 insertions, 0 deletions
diff --git a/postprocess/CppunitTest_services.mk b/postprocess/CppunitTest_services.mk
new file mode 100644
index 000000000..cd02461fb
--- /dev/null
+++ b/postprocess/CppunitTest_services.mk
@@ -0,0 +1,63 @@
+# -*- 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/.
+#
+
+$(eval $(call gb_CppunitTest_CppunitTest,services))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,services, \
+ postprocess/qa/services \
+))
+
+$(eval $(call gb_CppunitTest_use_externals,services, \
+ boost_headers \
+))
+
+$(eval $(call gb_CppunitTest_use_libraries,services, \
+ comphelper \
+ cppu \
+ cppuhelper \
+ sal \
+ test \
+ unotest \
+ vcl \
+))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,services))
+$(eval $(call gb_CppunitTest_use_api,services,oovbaapi))
+
+$(eval $(call gb_CppunitTest_use_ure,services))
+$(eval $(call gb_CppunitTest_use_vcl,services))
+
+$(eval $(call gb_CppunitTest_use_rdb,services,services))
+ifneq ($(DISABLE_PYTHON),TRUE)
+$(eval $(call gb_CppunitTest_use_python_ure,services))
+
+$(eval $(call gb_CppunitTest_use_rdb,services,pyuno))
+
+$(eval $(call gb_CppunitTest_use_packages,services, \
+ pyuno_pythonloader_ini \
+))
+
+$(call gb_CppunitTest_get_target,services): $(call gb_Pyuno_get_target,commonwizards)
+endif
+
+$(eval $(call gb_CppunitTest_use_configuration,services))
+
+ifeq ($(ENABLE_JAVA),TRUE)
+$(eval $(call gb_CppunitTest_use_jars,services,\
+ ScriptProviderForJava \
+ smoketest \
+))
+endif
+
+$(eval $(call gb_CppunitTest_use_packages,services,\
+ autotextshare_en-US \
+ instsetoo_native_setup \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/postprocess/CustomTarget_check_dynamic_objects.mk b/postprocess/CustomTarget_check_dynamic_objects.mk
new file mode 100644
index 000000000..d81321cad
--- /dev/null
+++ b/postprocess/CustomTarget_check_dynamic_objects.mk
@@ -0,0 +1,26 @@
+# -*- 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/.
+#
+
+$(eval $(call gb_CustomTarget_CustomTarget,postprocess/check_dynamic_objects))
+
+$(eval $(call gb_CustomTarget_register_targets,postprocess/check_dynamic_objects,\
+ check.done \
+))
+
+$(call gb_CustomTarget_get_workdir,postprocess/check_dynamic_objects)/check.done: \
+ $(call gb_Postprocess_get_target,AllLibraries) \
+ $(call gb_Postprocess_get_target,AllExecutables) \
+ $(call gb_Postprocess_get_target,AllPackages)
+ $(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),CHK,2)
+ $(call gb_Trace_StartRange,$(subst $(WORKDIR)/,,$@),CHK)
+ # currently we only check ELF objects
+ $(SRCDIR)/bin/check-elf-dynamic-objects -p
+ $(call gb_Trace_EndRange,$(subst $(WORKDIR)/,,$@),CHK)
+
+# vim: set noet sw=4 ts=4:
diff --git a/postprocess/CustomTarget_components.mk b/postprocess/CustomTarget_components.mk
new file mode 100644
index 000000000..934fa8f45
--- /dev/null
+++ b/postprocess/CustomTarget_components.mk
@@ -0,0 +1,49 @@
+# vim: set noet sw=4 ts=4:
+# -*- 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/.
+#
+
+$(eval $(call gb_CustomTarget_CustomTarget,postprocess/components))
+
+ifeq (,$(gb_PARTIAL_BUILD))
+
+postprocess_WORKDIR := $(call gb_CustomTarget_get_workdir,postprocess)
+
+$(call gb_CustomTarget_get_target,postprocess/components): \
+ $(postprocess_WORKDIR)/services_constructors.list \
+
+gb_EMPTY :=
+define gb_NEWLINE
+
+$(gb_EMPTY)
+endef
+
+$(postprocess_WORKDIR)/services_componentfiles.list: \
+ $(call gb_Rdb_get_target,services) \
+ $(call gb_Rdb_get_target,ure/services) \
+ $(foreach comp,$(gb_ComponentTarget__ALLCOMPONENTS),$(call gb_ComponentTarget_get_target,$(comp))) \
+ | $(postprocess_WORKDIR)/.dir
+ $(call gb_Output_announce,$(subst $(BUILDDIR)/,,$@),$(true),GEN,2)
+ TEMPFILE=$(call gb_var2file,$(shell $(gb_MKTEMP)),1, \
+ $(foreach comp,$(sort $(gb_ComponentTarget__ALLCOMPONENTS)),$(call gb_ComponentTarget_get_target,$(comp))$(gb_NEWLINE))) && \
+ mv $$TEMPFILE $@
+
+$(postprocess_WORKDIR)/services_constructors.list: \
+ $(SRCDIR)/solenv/bin/constructors.py \
+ $(postprocess_WORKDIR)/services_componentfiles.list \
+ | $(postprocess_WORKDIR)/.dir
+ $(call gb_Output_announce,$(subst $(BUILDDIR)/,,$@),$(true),GEN,2)
+ TEMPFILE=$(shell $(gb_MKTEMP)) && \
+ $(call gb_Helper_abbreviate_dirs,$(call gb_ExternalExecutable_get_command,python) $^) > $$TEMPFILE && \
+ $(call gb_Helper_replace_if_different_and_touch,$${TEMPFILE},$@)
+
+.PHONY: $(postprocess_WORKDIR)/services_componentfiles.list
+
+endif # gb_PARTIAL_BUILD
+
+# vim: set noet sw=4:
diff --git a/postprocess/CustomTarget_fontconfig.mk b/postprocess/CustomTarget_fontconfig.mk
new file mode 100644
index 000000000..72ff3f3cf
--- /dev/null
+++ b/postprocess/CustomTarget_fontconfig.mk
@@ -0,0 +1,30 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t; fill-column: 100 -*-
+#
+# 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/.
+#
+
+$(eval $(call gb_CustomTarget_CustomTarget,postprocess/fontconfig))
+
+$(call gb_CustomTarget_get_workdir,postprocess/fontconfig)/fc_local.conf: \
+ $(SRCDIR)/extras/source/truetype/symbol/fc_local.snippet \
+ $(SRCDIR)/postprocess/CustomTarget_fontconfig.mk \
+ | $(call gb_CustomTarget_get_workdir,postprocess/fontconfig)/.dir
+
+ifneq ($(filter MORE_FONTS,$(BUILD_TYPE)),)
+$(call gb_CustomTarget_get_workdir,postprocess/fontconfig)/fc_local.conf: \
+ $(SRCDIR)/external/more_fonts/fc_local.snippet
+endif
+
+$(call gb_CustomTarget_get_workdir,postprocess/fontconfig)/fc_local.conf:
+ printf '<?xml version="1.0"?>\n<!DOCTYPE fontconfig SYSTEM "/etc/fonts/conf.d/fonts.dtd">\n<fontconfig>\n' >$@
+ cat $(SRCDIR)/extras/source/truetype/symbol/fc_local.snippet >>$@
+ifneq ($(filter MORE_FONTS,$(BUILD_TYPE)),)
+ cat $(SRCDIR)/external/more_fonts/fc_local.snippet >>$@
+endif
+ printf '</fontconfig>\n' >>$@
+
+# vim: set noet sw=4 ts=4:
diff --git a/postprocess/CustomTarget_images.mk b/postprocess/CustomTarget_images.mk
new file mode 100644
index 000000000..90709780a
--- /dev/null
+++ b/postprocess/CustomTarget_images.mk
@@ -0,0 +1,122 @@
+# -*- 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/.
+#
+
+$(eval $(call gb_CustomTarget_CustomTarget,postprocess/images))
+
+packimages_DIR := $(call gb_CustomTarget_get_workdir,postprocess/images)
+
+$(eval $(call gb_CustomTarget_register_targets,postprocess/images,\
+ $(foreach theme,$(WITH_THEMES),images_$(theme).zip) \
+ $(foreach theme,$(WITH_THEMES),$(theme)_links.txt) \
+ commandimagelist.ilst \
+ sourceimagelist.ilst \
+ sorted.lst \
+))
+
+$(packimages_DIR)/images.zip : DEFAULT_THEME := $(true)
+$(packimages_DIR)/images_%.zip : DEFAULT_THEME :=
+
+# tdf#124023 make links.txt depend on phony sorted.lst depend
+# so this is evaluated every time
+$(packimages_DIR)/%_links.txt : $(packimages_DIR)/sorted.lst
+ @if test -f "$(SRCDIR)/icon-themes/$*/links.txt"; then \
+ cp "$(SRCDIR)/icon-themes/$*/links.txt" $@.tmp ; \
+ else \
+ THEME_FILE="$(SRCDIR)/icon-themes/$(subst _svg,,$*)/links.txt" ; \
+ if test -f "$${THEME_FILE}"; then \
+ sed 's/\.png/\.svg/g' "$${THEME_FILE}" > $@.tmp ; \
+ fi ; \
+ THEME_FILE="$(SRCDIR)/icon-themes/$(subst _dark,,$*)/links.txt" ; \
+ if test -f "$${THEME_FILE}"; then \
+ cp "$${THEME_FILE}" $@.tmp ; \
+ fi ; \
+ fi
+ $(call gb_Helper_replace_if_different_and_touch,$@.tmp,$@)
+
+$(packimages_DIR)/images_%.zip : \
+ $(packimages_DIR)/sorted.lst \
+ $(packimages_DIR)/commandimagelist.ilst \
+ $(packimages_DIR)/sourceimagelist.ilst \
+ $(SRCDIR)/wizards/source/imagelists/imagelists.ilst \
+ $(packimages_DIR)/%_links.txt \
+ $(call gb_Helper_get_imagelists) \
+ | $(call gb_ExternalExecutable_get_dependencies,python)
+ $(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),PRL,2)
+ $(call gb_Trace_StartRange,$(subst $(WORKDIR)/,,$@),PRL)
+ $(call gb_Helper_abbreviate_dirs, \
+ ILSTFILE=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(filter %.ilst,$^)) && \
+ $(call gb_ExternalExecutable_get_command,python) \
+ $(SRCDIR)/solenv/bin/pack_images.py \
+ $(if $(DEFAULT_THEME),\
+ -g $(packimages_DIR) -m $(packimages_DIR) -c $(packimages_DIR),\
+ -g $(SRCDIR)/icon-themes/$* -m $(SRCDIR)/icon-themes/$* -c $(SRCDIR)/icon-themes/$* \
+ ) \
+ -l $${ILSTFILE} \
+ -L $(packimages_DIR)/$*_links.txt \
+ -s $< -o $@ \
+ $(if $(findstring s,$(MAKEFLAGS)),> /dev/null) && \
+ rm -rf $${ILSTFILE})
+ $(call gb_Trace_EndRange,$(subst $(WORKDIR)/,,$@),PRL)
+
+# turn the #defines foo "resource.png" of hlst into the final ilst format
+$(packimages_DIR)/sourceimagelist.ilst : \
+ $(SRCDIR)/avmedia/inc/bitmaps.hlst \
+ $(SRCDIR)/basctl/inc/bitmaps.hlst \
+ $(SRCDIR)/connectivity/inc/bitmaps.hlst \
+ $(SRCDIR)/cui/inc/bitmaps.hlst \
+ $(SRCDIR)/chart2/inc/bitmaps.hlst \
+ $(SRCDIR)/dbaccess/inc/bitmaps.hlst \
+ $(SRCDIR)/desktop/inc/bitmaps.hlst \
+ $(SRCDIR)/extensions/inc/bitmaps.hlst \
+ $(SRCDIR)/formula/inc/bitmaps.hlst \
+ $(SRCDIR)/fpicker/inc/bitmaps.hlst \
+ $(SRCDIR)/framework/inc/bitmaps.hlst \
+ $(SRCDIR)/reportdesign/inc/bitmaps.hlst \
+ $(SRCDIR)/sc/inc/bitmaps.hlst \
+ $(SRCDIR)/sd/inc/bitmaps.hlst \
+ $(SRCDIR)/sdext/inc/bitmaps.hlst \
+ $(SRCDIR)/sfx2/inc/bitmaps.hlst \
+ $(SRCDIR)/svtools/inc/bitmaps.hlst \
+ $(SRCDIR)/svx/inc/bitmaps.hlst \
+ $(SRCDIR)/sw/inc/bitmaps.hlst \
+ $(SRCDIR)/vcl/inc/bitmaps.hlst \
+ $(SRCDIR)/xmlsecurity/inc/bitmaps.hlst
+ grep res $^ | cut -d'"' -f2 | sed "s/^/%MODULE%\//" | sed "s/%MODULE%.res/%GLOBALRES%/g" > $@.png
+ sed 's/\.png/\.svg/g' $@.png > $@.svg
+ cat $@.png $@.svg > $@
+
+# commandimagelist.ilst and sorted.lst are phony to rebuild everything each time
+.PHONY : $(packimages_DIR)/commandimagelist.ilst $(packimages_DIR)/sorted.lst
+
+$(packimages_DIR)/commandimagelist.ilst :
+ $(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),PRL,1)
+ $(call gb_Trace_StartRange,$(subst $(WORKDIR)/,,$@),PRL)
+ $(call gb_Helper_abbreviate_dirs, \
+ $(FIND) $(SRCDIR)/icon-themes -name "*.png" -o -name "*.svg" | \
+ grep -e '/cmd/' | sed 's#^.*/icon-themes/[^/]*##' | \
+ sed "s#^#%MODULE%#" | \
+ LC_ALL=C $(SORT) -u > $@.tmp && \
+ $(call gb_Helper_replace_if_different_and_touch,$@.tmp,$@))
+ $(call gb_Trace_EndRange,$(subst $(WORKDIR)/,,$@),PRL)
+
+$(packimages_DIR)/sorted.lst : \
+ $(SRCDIR)/postprocess/packimages/image-sort.lst \
+ $(call gb_Postprocess_get_target,AllUIConfigs) \
+ $(call gb_ExternalExecutable_get_dependencies,python)
+ $(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),PRL,1)
+ $(call gb_Trace_StartRange,$(subst $(WORKDIR)/,,$@),PRL)
+ $(call gb_Helper_abbreviate_dirs, \
+ $(call gb_ExternalExecutable_get_command,python) \
+ $(SRCDIR)/solenv/bin/image-sort.py \
+ $(if $(filter build,$(gb_Side)),--quiet) \
+ $< $(INSTROOT)/$(gb_UIConfig_INSTDIR) $@)
+ $(call gb_Trace_EndRange,$(subst $(WORKDIR)/,,$@),PRL)
+
+# vim: set noet sw=4 ts=4:
diff --git a/postprocess/CustomTarget_registry.mk b/postprocess/CustomTarget_registry.mk
new file mode 100644
index 000000000..9e7fbb139
--- /dev/null
+++ b/postprocess/CustomTarget_registry.mk
@@ -0,0 +1,661 @@
+# -*- 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/.
+#
+
+$(eval $(call gb_CustomTarget_CustomTarget,postprocess/registry))
+
+#
+# Variables
+#
+
+postprocess_XCS := $(call gb_XcsTarget_get_target,org/openoffice)
+postprocess_XCU := $(call gb_XcuDataTarget_get_target,officecfg/registry/data/org/openoffice)
+postprocess_MOD := $(call gb_XcuModuleTarget_get_target,officecfg/registry/data)
+postprocess_DRIVERS :=
+
+postprocess_XCDS := \
+ base.xcd \
+ calc.xcd \
+ cjk.xcd \
+ ctl.xcd \
+ ctlseqcheck.xcd \
+ draw.xcd \
+ graphicfilter.xcd \
+ impress.xcd \
+ lingucomponent.xcd \
+ main.xcd \
+ math.xcd \
+ pyuno.xcd \
+ writer.xcd \
+ xsltfilter.xcd
+
+postprocess_DEPS_base := main
+postprocess_FILES_base := \
+ $(call gb_XcuFilterFiltersTarget_get_target,fcfg_database_filters.xcu) \
+ $(call gb_XcuFilterOthersTarget_get_target,fcfg_database_others.xcu) \
+ $(call gb_XcuFilterTypesTarget_get_target,fcfg_database_types.xcu) \
+ $(postprocess_MOD)/org/openoffice/Office/Common-base.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/Embedding-base.xcu \
+ $(postprocess_MOD)/org/openoffice/Setup-base.xcu
+
+postprocess_DEPS_calc := main
+postprocess_FILES_calc := \
+ $(postprocess_XCS)/Office/UI/CalcCommands.xcs \
+ $(postprocess_XCS)/Office/UI/CalcWindowState.xcs \
+ $(postprocess_XCU)/Office/UI/CalcCommands.xcu \
+ $(postprocess_XCU)/Office/UI/CalcWindowState.xcu \
+ $(call gb_XcuFilterFiltersTarget_get_target,fcfg_calc_filters.xcu) \
+ $(call gb_XcuFilterTypesTarget_get_target,fcfg_calc_types.xcu) \
+ $(postprocess_MOD)/org/openoffice/Office/Common-calc.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/Embedding-calc.xcu \
+ $(postprocess_MOD)/org/openoffice/Setup-calc.xcu
+
+postprocess_DEPS_cjk := main
+postprocess_FILES_cjk := \
+ $(postprocess_MOD)/org/openoffice/Office/Common-cjk.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/Writer-cjk.xcu
+
+postprocess_DEPS_ctl := main
+postprocess_FILES_ctl := \
+ $(postprocess_MOD)/org/openoffice/Office/Common-ctl.xcu
+
+postprocess_DEPS_draw := main
+postprocess_FILES_draw := \
+ $(postprocess_XCS)/Office/UI/DrawWindowState.xcs \
+ $(postprocess_XCU)/Office/UI/DrawWindowState.xcu \
+ $(call gb_XcuFilterFiltersTarget_get_target,fcfg_draw_filters.xcu) \
+ $(call gb_XcuFilterTypesTarget_get_target,fcfg_draw_types.xcu) \
+ $(postprocess_MOD)/org/openoffice/Office/Common-draw.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/Embedding-draw.xcu \
+ $(postprocess_MOD)/org/openoffice/Setup-draw.xcu
+
+postprocess_DEPS_graphicfilter := main
+postprocess_FILES_graphicfilter := \
+ $(call gb_XcuFilterFiltersTarget_get_target,fcfg_drawgraphics_filters.xcu) \
+ $(call gb_XcuFilterTypesTarget_get_target,fcfg_drawgraphics_types.xcu) \
+ $(call gb_XcuFilterFiltersTarget_get_target,fcfg_impressgraphics_filters.xcu) \
+ $(call gb_XcuFilterTypesTarget_get_target,fcfg_impressgraphics_types.xcu) \
+ $(call gb_XcuFilterFiltersTarget_get_target,fcfg_calcgraphics_filters.xcu) \
+ $(call gb_XcuFilterTypesTarget_get_target,fcfg_calcgraphics_types.xcu) \
+ $(call gb_XcuFilterFiltersTarget_get_target,fcfg_writergraphics_filters.xcu) \
+ $(call gb_XcuFilterTypesTarget_get_target,fcfg_writergraphics_types.xcu)
+
+postprocess_DEPS_impress := main
+postprocess_FILES_impress := \
+ $(postprocess_XCS)/Office/PresentationMinimizer.xcs \
+ $(postprocess_XCS)/Office/PresenterScreen.xcs \
+ $(postprocess_XCS)/Office/UI/Effects.xcs \
+ $(postprocess_XCS)/Office/UI/ImpressWindowState.xcs \
+ $(postprocess_XCU)/Office/PresentationMinimizer.xcu \
+ $(postprocess_XCU)/Office/PresenterScreen.xcu \
+ $(postprocess_XCU)/Office/UI/Effects.xcu \
+ $(postprocess_XCU)/Office/UI/ImpressWindowState.xcu \
+ $(call gb_XcuFilterFiltersTarget_get_target,fcfg_impress_filters.xcu) \
+ $(call gb_XcuFilterTypesTarget_get_target,fcfg_impress_types.xcu) \
+ $(postprocess_MOD)/org/openoffice/Office/Common-impress.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/Embedding-impress.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/Jobs-impress.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/ProtocolHandler-impress.xcu \
+ $(postprocess_MOD)/org/openoffice/Setup-impress.xcu
+
+ifeq (LIBRELOGO,$(filter LIBRELOGO,$(BUILD_TYPE)))
+postprocess_XCDS += librelogo.xcd
+postprocess_DEPS_librelogo := main writer
+postprocess_FILES_librelogo := \
+ $(postprocess_MOD)/org/openoffice/Office/Addons-librelogo.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/UI/WriterCommands-librelogo.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/UI/WriterWindowState-librelogo.xcu
+endif
+
+postprocess_DEPS_lingucomponent := main
+postprocess_FILES_lingucomponent := \
+ $(SRCDIR)/lingucomponent/config/Linguistic-lingucomponent-hyphenator.xcu \
+ $(SRCDIR)/lingucomponent/config/Linguistic-lingucomponent-spellchecker.xcu \
+ $(SRCDIR)/lingucomponent/config/Linguistic-lingucomponent-thesaurus.xcu \
+
+postprocess_FILES_main := \
+ $(postprocess_XCS)/Inet.xcs \
+ $(postprocess_XCS)/Interaction.xcs \
+ $(postprocess_XCS)/LDAP.xcs \
+ $(postprocess_XCS)/Office/Accelerators.xcs \
+ $(postprocess_XCS)/Office/Addons.xcs \
+ $(postprocess_XCS)/Office/BasicIDE.xcs \
+ $(postprocess_XCS)/Office/Calc.xcs \
+ $(postprocess_XCS)/Office/CalcAddIns.xcs \
+ $(postprocess_XCS)/Office/Canvas.xcs \
+ $(postprocess_XCS)/Office/Chart.xcs \
+ $(postprocess_XCS)/Office/Commands.xcs \
+ $(postprocess_XCS)/Office/Common.xcs \
+ $(postprocess_XCS)/Office/Compatibility.xcs \
+ $(postprocess_XCS)/Office/DataAccess/Drivers.xcs \
+ $(postprocess_XCS)/Office/DataAccess.xcs \
+ $(postprocess_XCS)/Office/Draw.xcs \
+ $(postprocess_XCS)/Office/Embedding.xcs \
+ $(postprocess_XCS)/Office/Events.xcs \
+ $(postprocess_XCS)/Office/ExtendedColorScheme.xcs \
+ $(postprocess_XCS)/Office/ExtensionDependencies.xcs \
+ $(postprocess_XCS)/Office/ExtensionManager.xcs \
+ $(postprocess_XCS)/Office/FormWizard.xcs \
+ $(postprocess_XCS)/Office/Histories.xcs \
+ $(postprocess_XCS)/Office/Impress.xcs \
+ $(postprocess_XCS)/Office/Java.xcs \
+ $(postprocess_XCS)/Office/Jobs.xcs \
+ $(postprocess_XCS)/Office/Labels.xcs \
+ $(postprocess_XCS)/Office/Linguistic.xcs \
+ $(postprocess_XCS)/Office/Logging.xcs \
+ $(postprocess_XCS)/Office/Math.xcs \
+ $(postprocess_XCS)/Office/OptionsDialog.xcs \
+ $(postprocess_XCS)/Office/Paths.xcs \
+ $(postprocess_XCS)/Office/ProtocolHandler.xcs \
+ $(postprocess_XCS)/Office/Recovery.xcs \
+ $(postprocess_XCS)/Office/Scripting.xcs \
+ $(postprocess_XCS)/Office/Security.xcs \
+ $(postprocess_XCS)/Office/TableWizard.xcs \
+ $(postprocess_XCS)/Office/TypeDetection.xcs \
+ $(postprocess_XCS)/Office/UI/BaseWindowState.xcs \
+ $(postprocess_XCS)/Office/UI/BasicIDECommands.xcs \
+ $(postprocess_XCS)/Office/UI/BasicIDEWindowState.xcs \
+ $(postprocess_XCS)/Office/UI/BibliographyCommands.xcs \
+ $(postprocess_XCS)/Office/UI/BibliographyWindowState.xcs \
+ $(postprocess_XCS)/Office/UI/Category.xcs \
+ $(postprocess_XCS)/Office/UI/ChartCommands.xcs \
+ $(postprocess_XCS)/Office/UI/ChartWindowState.xcs \
+ $(postprocess_XCS)/Office/UI/Commands.xcs \
+ $(postprocess_XCS)/Office/UI/Controller.xcs \
+ $(postprocess_XCS)/Office/UI/DbBrowserWindowState.xcs \
+ $(postprocess_XCS)/Office/UI/DbQueryWindowState.xcs \
+ $(postprocess_XCS)/Office/UI/DbRelationWindowState.xcs \
+ $(postprocess_XCS)/Office/UI/DbTableDataWindowState.xcs \
+ $(postprocess_XCS)/Office/UI/DbTableWindowState.xcs \
+ $(postprocess_XCS)/Office/UI/DbuCommands.xcs \
+ $(postprocess_XCS)/Office/UI/DrawImpressCommands.xcs \
+ $(postprocess_XCS)/Office/UI/Factories.xcs \
+ $(postprocess_XCS)/Office/UI/GenericCategories.xcs \
+ $(postprocess_XCS)/Office/UI/GenericCommands.xcs \
+ $(postprocess_XCS)/Office/UI/GlobalSettings.xcs \
+ $(postprocess_XCS)/Office/UI/Infobar.xcs \
+ $(postprocess_XCS)/Office/UI/Sidebar.xcs \
+ $(postprocess_XCS)/Office/UI/StartModuleCommands.xcs \
+ $(postprocess_XCS)/Office/UI/StartModuleWindowState.xcs \
+ $(postprocess_XCS)/Office/UI/ToolbarMode.xcs \
+ $(postprocess_XCS)/Office/UI/WindowContentFactories.xcs \
+ $(postprocess_XCS)/Office/UI/WindowState.xcs \
+ $(postprocess_XCS)/Office/UI.xcs \
+ $(postprocess_XCS)/Office/Update.xcs \
+ $(postprocess_XCS)/Office/Views.xcs \
+ $(postprocess_XCS)/Office/Writer.xcs \
+ $(postprocess_XCS)/Office/WriterWeb.xcs \
+ $(postprocess_XCS)/Setup.xcs \
+ $(postprocess_XCS)/System.xcs \
+ $(postprocess_XCS)/TypeDetection/Filter.xcs \
+ $(postprocess_XCS)/TypeDetection/GraphicFilter.xcs \
+ $(postprocess_XCS)/TypeDetection/Misc.xcs \
+ $(postprocess_XCS)/TypeDetection/Types.xcs \
+ $(postprocess_XCS)/TypeDetection/UISort.xcs \
+ $(postprocess_XCS)/UserProfile.xcs \
+ $(postprocess_XCS)/VCL.xcs \
+ $(postprocess_XCS)/ucb/Configuration.xcs \
+ $(postprocess_XCS)/ucb/Hierarchy.xcs \
+ $(postprocess_XCS)/ucb/InteractionHandler.xcs \
+ $(postprocess_XCS)/ucb/Store.xcs \
+ $(postprocess_XCU)/Inet.xcu \
+ $(postprocess_XCU)/Interaction.xcu \
+ $(postprocess_XCU)/Office/Accelerators.xcu \
+ $(postprocess_XCU)/Office/BasicIDE.xcu \
+ $(postprocess_XCU)/Office/Calc.xcu \
+ $(postprocess_XCU)/Office/Canvas.xcu \
+ $(postprocess_XCU)/Office/Common.xcu \
+ $(postprocess_XCU)/Office/Compatibility.xcu \
+ $(postprocess_XCU)/Office/DataAccess.xcu \
+ $(postprocess_XCU)/Office/Embedding.xcu \
+ $(postprocess_XCU)/Office/ExtensionDependencies.xcu \
+ $(postprocess_XCU)/Office/ExtensionManager.xcu \
+ $(postprocess_XCU)/Office/FormWizard.xcu \
+ $(postprocess_XCU)/Office/Histories.xcu \
+ $(postprocess_XCU)/Office/Impress.xcu \
+ $(postprocess_XCU)/Office/Jobs.xcu \
+ $(postprocess_XCU)/Office/Logging.xcu \
+ $(postprocess_XCU)/Office/Math.xcu \
+ $(postprocess_XCU)/Office/Paths.xcu \
+ $(postprocess_XCU)/Office/ProtocolHandler.xcu \
+ $(postprocess_XCU)/Office/Scripting.xcu \
+ $(postprocess_XCU)/Office/Security.xcu \
+ $(postprocess_XCU)/Office/TableWizard.xcu \
+ $(postprocess_XCU)/Office/UI/BaseWindowState.xcu \
+ $(postprocess_XCU)/Office/UI/BasicIDECommands.xcu \
+ $(postprocess_XCU)/Office/UI/BasicIDEWindowState.xcu \
+ $(postprocess_XCU)/Office/UI/BibliographyCommands.xcu \
+ $(postprocess_XCU)/Office/UI/ChartCommands.xcu \
+ $(postprocess_XCU)/Office/UI/ChartWindowState.xcu \
+ $(postprocess_XCU)/Office/UI/Controller.xcu \
+ $(postprocess_XCU)/Office/UI/DbBrowserWindowState.xcu \
+ $(postprocess_XCU)/Office/UI/DbQueryWindowState.xcu \
+ $(postprocess_XCU)/Office/UI/DbRelationWindowState.xcu \
+ $(postprocess_XCU)/Office/UI/DbTableDataWindowState.xcu \
+ $(postprocess_XCU)/Office/UI/DbTableWindowState.xcu \
+ $(postprocess_XCU)/Office/UI/DbuCommands.xcu \
+ $(postprocess_XCU)/Office/UI/DrawImpressCommands.xcu \
+ $(postprocess_XCU)/Office/UI/Factories.xcu \
+ $(postprocess_XCU)/Office/UI/GenericCategories.xcu \
+ $(postprocess_XCU)/Office/UI/GenericCommands.xcu \
+ $(postprocess_XCU)/Office/UI/Sidebar.xcu \
+ $(postprocess_XCU)/Office/UI/StartModuleWindowState.xcu \
+ $(postprocess_XCU)/Office/UI/ToolbarMode.xcu \
+ $(postprocess_XCU)/Office/UI.xcu \
+ $(postprocess_XCU)/Office/Views.xcu \
+ $(postprocess_XCU)/Office/Writer.xcu \
+ $(postprocess_XCU)/Setup.xcu \
+ $(postprocess_XCU)/System.xcu \
+ $(postprocess_XCU)/TypeDetection/UISort.xcu \
+ $(postprocess_XCU)/UserProfile.xcu \
+ $(postprocess_XCU)/VCL.xcu \
+ $(postprocess_XCU)/ucb/Configuration.xcu \
+ $(call gb_XcuFilterFiltersTarget_get_target,fcfg_base_filters.xcu) \
+ $(call gb_XcuFilterOthersTarget_get_target,fcfg_base_others.xcu) \
+ $(call gb_XcuFilterTypesTarget_get_target,fcfg_base_types.xcu) \
+ $(call gb_XcuFilterFiltersTarget_get_target,fcfg_chart_filters.xcu) \
+ $(call gb_XcuFilterOthersTarget_get_target,fcfg_chart_others.xcu) \
+ $(call gb_XcuFilterTypesTarget_get_target,fcfg_chart_types.xcu) \
+ $(call gb_XcuFilterInternalTarget_get_target,fcfg_internalgraphics_filters.xcu) \
+ $(call gb_XcuFilterTypesTarget_get_target,fcfg_internalgraphics_types.xcu) \
+ $(postprocess_MOD)/org/openoffice/Office/Embedding-chart.xcu \
+ $(postprocess_MOD)/org/openoffice/Setup-start.xcu \
+ $(postprocess_MOD)/org/openoffice/TypeDetection/UISort-calc.xcu \
+ $(postprocess_MOD)/org/openoffice/TypeDetection/UISort-draw.xcu \
+ $(postprocess_MOD)/org/openoffice/TypeDetection/UISort-impress.xcu \
+ $(postprocess_MOD)/org/openoffice/TypeDetection/UISort-math.xcu \
+ $(postprocess_MOD)/org/openoffice/TypeDetection/UISort-writer.xcu
+
+ifeq (MACOSX,$(OS))
+postprocess_FILES_main += \
+ $(postprocess_MOD)/org/openoffice/Inet-macosx.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/Accelerators-macosx.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/Common-macosx.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/Paths-macosx.xcu
+ # Inet-macosx.xcu must come after Inet.xcu
+
+else ifeq ($(USING_X11), TRUE)
+postprocess_FILES_main += \
+ $(postprocess_MOD)/org/openoffice/Inet-unixdesktop.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/Accelerators-unxwnt.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/Common-UseOOoFileDialogs.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/Common-unixdesktop.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/Common-unx.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/Paths-unixdesktop.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/Paths-unxwnt.xcu \
+ $(postprocess_MOD)/org/openoffice/UserProfile-unixdesktop.xcu \
+ $(postprocess_MOD)/org/openoffice/VCL-unixdesktop.xcu
+ # Inet-unixdesktop.xcu must come after Inet.xcu
+ # VCL-unixdesktop.xcu must come after VCL.xcu
+else ifeq (WNT,$(OS))
+postprocess_FILES_main += \
+ $(postprocess_MOD)/org/openoffice/Inet-wnt.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/Accelerators-unxwnt.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/Common-wnt.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/Paths-unxwnt.xcu \
+ $(postprocess_MOD)/org/openoffice/ucb/Configuration-win.xcu
+ # Inet-wnt.xcu must come after Inet.xcu
+endif
+
+ifneq ($(WITH_WEBDAV),)
+postprocess_FILES_main += $(postprocess_MOD)/org/openoffice/ucb/Configuration-webdav.xcu
+endif
+
+ifneq ($(ENABLE_MACOSX_SANDBOX),)
+postprocess_FILES_main += $(postprocess_MOD)/org/openoffice/Office/UI/Infobar-macosxsandbox.xcu
+endif
+
+ifneq (,$(SYSTEM_LIBEXTTEXTCAT_DATA))
+postprocess_FILES_main += $(postprocess_MOD)/org/openoffice/Office/Paths-externallibexttextcatdata.xcu
+else
+postprocess_FILES_main += $(postprocess_MOD)/org/openoffice/Office/Paths-internallibexttextcatdata.xcu
+endif
+
+ifneq (,$(SYSTEM_LIBNUMBERTEXT_DATA))
+postprocess_FILES_main += $(postprocess_MOD)/org/openoffice/Office/Paths-externallibnumbertextdata.xcu
+else
+postprocess_FILES_main += $(postprocess_MOD)/org/openoffice/Office/Paths-internallibnumbertextdata.xcu
+endif
+
+ifneq ($(filter POWERPC INTEL ARM HPPA GODSON M68K SPARC S390,$(CPUNAME)),)
+postprocess_FILES_main += \
+ $(postprocess_MOD)/org/openoffice/Office/Common-32bit.xcu
+endif
+
+postprocess_DEPS_math := main
+postprocess_FILES_math := \
+ $(postprocess_XCS)/Office/UI/MathCommands.xcs \
+ $(postprocess_XCS)/Office/UI/MathWindowState.xcs \
+ $(postprocess_XCU)/Office/UI/MathCommands.xcu \
+ $(postprocess_XCU)/Office/UI/MathWindowState.xcu \
+ $(call gb_XcuFilterFiltersTarget_get_target,fcfg_math_filters.xcu) \
+ $(call gb_XcuFilterTypesTarget_get_target,fcfg_math_types.xcu) \
+ $(postprocess_MOD)/org/openoffice/Office/Common-math.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/Embedding-math.xcu \
+ $(postprocess_MOD)/org/openoffice/Setup-math.xcu
+
+postprocess_DEPS_pyuno := main
+postprocess_FILES_pyuno := \
+ $(postprocess_MOD)/org/openoffice/Office/Scripting-python.xcu
+
+ifeq ($(ENABLE_REPORTBUILDER),TRUE)
+postprocess_XCDS += reportbuilder.xcd
+postprocess_DEPS_reportbuilder := main
+postprocess_FILES_reportbuilder := \
+ $(postprocess_XCS)/Office/ReportDesign.xcs \
+ $(postprocess_XCS)/Office/UI/DbReportWindowState.xcs \
+ $(postprocess_XCS)/Office/UI/ReportCommands.xcs \
+ $(postprocess_XCU)/Office/ExtendedColorScheme.xcu \
+ $(postprocess_XCU)/Office/ReportDesign.xcu \
+ $(postprocess_XCU)/Office/UI/DbReportWindowState.xcu \
+ $(postprocess_XCU)/Office/UI/ReportCommands.xcu \
+ $(call gb_XcuFilterFiltersTarget_get_target,fcfg_reportbuilder_filters.xcu) \
+ $(call gb_XcuFilterTypesTarget_get_target,fcfg_reportbuilder_types.xcu) \
+ $(postprocess_MOD)/org/openoffice/Setup-reportbuilder.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/Accelerators-reportbuilder.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/DataAccess-reportbuilder.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/Embedding-reportbuilder.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/UI/Controller-reportbuilder.xcu
+endif
+
+postprocess_DEPS_writer := main
+postprocess_FILES_writer := \
+ $(postprocess_XCS)/Office/UI/WriterCommands.xcs \
+ $(postprocess_XCS)/Office/UI/WriterFormWindowState.xcs \
+ $(postprocess_XCS)/Office/UI/WriterGlobalWindowState.xcs \
+ $(postprocess_XCS)/Office/UI/WriterReportWindowState.xcs \
+ $(postprocess_XCS)/Office/UI/WriterWebWindowState.xcs \
+ $(postprocess_XCS)/Office/UI/WriterWindowState.xcs \
+ $(postprocess_XCS)/Office/UI/XFormsWindowState.xcs \
+ $(postprocess_XCU)/Office/UI/WriterCommands.xcu \
+ $(postprocess_XCU)/Office/UI/WriterFormWindowState.xcu \
+ $(postprocess_XCU)/Office/UI/WriterGlobalWindowState.xcu \
+ $(postprocess_XCU)/Office/UI/WriterReportWindowState.xcu \
+ $(postprocess_XCU)/Office/UI/WriterWebWindowState.xcu \
+ $(postprocess_XCU)/Office/UI/WriterWindowState.xcu \
+ $(postprocess_XCU)/Office/UI/XFormsWindowState.xcu \
+ $(call gb_XcuFilterFiltersTarget_get_target,fcfg_global_filters.xcu) \
+ $(call gb_XcuFilterTypesTarget_get_target,fcfg_global_types.xcu) \
+ $(call gb_XcuFilterFiltersTarget_get_target,fcfg_web_filters.xcu) \
+ $(call gb_XcuFilterTypesTarget_get_target,fcfg_web_types.xcu) \
+ $(call gb_XcuFilterFiltersTarget_get_target,fcfg_writer_filters.xcu) \
+ $(call gb_XcuFilterTypesTarget_get_target,fcfg_writer_types.xcu) \
+ $(postprocess_MOD)/org/openoffice/Office/Common-writer.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/Embedding-writer.xcu \
+ $(postprocess_MOD)/org/openoffice/Setup-writer.xcu
+
+postprocess_DEPS_xsltfilter := main
+postprocess_OPTDEPS_xsltfilter := calc writer
+postprocess_FILES_xsltfilter := \
+ $(call gb_XcuFilterFiltersTarget_get_target,fcfg_xslt_filters.xcu) \
+ $(call gb_XcuFilterTypesTarget_get_target,fcfg_xslt_types.xcu)
+
+ifneq (,$(and $(USING_X11), $(ENABLE_GIO)))
+postprocess_XCDS += gnome.xcd
+postprocess_DEPS_gnome := main
+postprocess_FILES_gnome += $(postprocess_MOD)/org/openoffice/ucb/Configuration-gio.xcu
+endif
+
+ifeq ($(ENABLE_ONLINE_UPDATE),TRUE)
+postprocess_XCDS += onlineupdate.xcd
+postprocess_DEPS_onlineupdate := main
+postprocess_FILES_onlineupdate := \
+ $(call gb_XcuModuleTarget_get_target,extensions/source/update/check)/org/openoffice/Office/Addons-onlineupdate.xcu \
+ $(call gb_XcuModuleTarget_get_target,extensions/source/update/check)/org/openoffice/Office/Jobs-onlineupdate.xcu
+endif
+
+ifeq ($(ENABLE_OPENGL_TRANSITIONS),TRUE)
+postprocess_XCDS += ogltrans.xcd
+postprocess_DEPS_ogltrans := main
+postprocess_FILES_ogltrans := \
+ $(postprocess_MOD)/org/openoffice/Office/Impress-ogltrans.xcu
+endif
+
+ifeq ($(ENABLE_PDFIMPORT),TRUE)
+postprocess_XCDS += pdfimport.xcd
+postprocess_OPTDEPS_pdfimport := calc draw impress math writer
+ # HACK: for all fcfg_X_types.xcu in filter/Configuration_filter.mk that
+ # include pdf_Portable_Document_Format (i.e., X in calc, draw, global,
+ # impress, math, web, writer), add optional dependencies on those XCDS that
+ # include those fcfg_X_types.xcu
+postprocess_FILES_pdfimport := \
+ $(SRCDIR)/sdext/source/pdfimport/config/pdf_import_filter.xcu \
+ $(SRCDIR)/sdext/source/pdfimport/config/pdf_types.xcu
+endif
+
+ifeq (WNT,$(OS))
+postprocess_XCDS += forcedefault.xcd
+postprocess_DEPS_forcedefault := main
+postprocess_FILES_forcedefault := \
+ $(postprocess_MOD)/org/openoffice/Office/Linguistic-ForceDefaultLanguage.xcu
+endif
+
+#
+# All DBCONNECTIVITY handling (including OS specifics!)
+#
+ifneq (,$(filter DBCONNECTIVITY,$(BUILD_TYPE)))
+
+postprocess_FILES_main += \
+ $(call gb_XcuModuleTarget_get_target,connectivity/registry/dbase)/org/openoffice/Office/DataAccess/Drivers-dbase.xcu \
+ $(call gb_XcuModuleTarget_get_target,connectivity/registry/flat)/org/openoffice/Office/DataAccess/Drivers-flat.xcu \
+ $(call gb_XcuModuleTarget_get_target,connectivity/registry/odbc)/org/openoffice/Office/DataAccess/Drivers-odbc.xcu
+postprocess_DRIVERS += dbase flat odbc
+
+ifeq ($(gb_Side),host)
+
+postprocess_FILES_writer += \
+ $(call gb_XcuModuleTarget_get_target,connectivity/registry/writer)/org/openoffice/Office/DataAccess/Drivers-writer.xcu
+postprocess_DRIVERS += writer
+
+postprocess_FILES_calc += \
+ $(call gb_XcuModuleTarget_get_target,connectivity/registry/calc)/org/openoffice/Office/DataAccess/Drivers-calc.xcu
+postprocess_DRIVERS += calc
+
+ifeq ($(ENABLE_EVOAB2),TRUE)
+postprocess_FILES_main += \
+ $(call gb_XcuModuleTarget_get_target,connectivity/registry/evoab2)/org/openoffice/Office/DataAccess/Drivers-evoab2.xcu \
+ $(postprocess_MOD)/org/openoffice/Office/DataAccess-evoab2.xcu
+postprocess_DRIVERS += evoab
+endif
+
+ifeq ($(ENABLE_JAVA),TRUE)
+postprocess_FILES_main += \
+ $(call gb_XcuModuleTarget_get_target,connectivity/registry/hsqldb)/org/openoffice/Office/DataAccess/Drivers-hsqldb.xcu \
+ $(call gb_XcuModuleTarget_get_target,connectivity/registry/jdbc)/org/openoffice/Office/DataAccess/Drivers-jdbc.xcu \
+ $(call gb_XcuModuleTarget_get_target,connectivity/registry/mysql_jdbc)/org/openoffice/Office/DataAccess/Drivers-mysql_jdbc.xcu
+postprocess_DRIVERS += hsqldb jdbc mysql_jdbc
+endif
+
+ifeq ($(ENABLE_FIREBIRD_SDBC),TRUE)
+postprocess_FILES_main += \
+ $(call gb_XcuModuleTarget_get_target,connectivity/registry/firebird)/org/openoffice/Office/DataAccess/Drivers-firebird.xcu
+postprocess_DRIVERS += firebird_sdbc
+endif
+
+ifeq ($(ENABLE_MARIADBC),TRUE)
+postprocess_FILES_main += \
+ $(call gb_XcuModuleTarget_get_target,connectivity/registry/mysqlc)/org/openoffice/Office/DataAccess/Drivers-mysqlc.xcu
+postprocess_DRIVERS += mysqlc
+endif
+
+ifeq ($(BUILD_POSTGRESQL_SDBC),TRUE)
+postprocess_XCDS += postgresql.xcd
+postprocess_DEPS_postgresql := main
+postprocess_FILES_postgresql := \
+ $(call gb_XcuModuleTarget_get_target,connectivity/registry/postgresql)/org/openoffice/Office/DataAccess/Drivers-postgresql.xcu
+postprocess_DRIVERS += postgresql
+endif
+
+ifeq (MACOSX,$(OS))
+postprocess_FILES_main += \
+ $(call gb_XcuModuleTarget_get_target,connectivity/registry/macab)/org/openoffice/Office/DataAccess/Drivers-macab.xcu
+postprocess_DRIVERS += macab
+
+else ifeq (WNT,$(OS))
+postprocess_FILES_main += \
+ $(call gb_XcuModuleTarget_get_target,connectivity/registry/ado)/org/openoffice/Office/DataAccess/Drivers-ado.xcu
+postprocess_DRIVERS += ado
+endif
+
+endif # host
+endif # DBCONNECTIVITY
+
+postprocess_DRIVERS := $(foreach driver,$(postprocess_DRIVERS),driver_$(driver))
+
+#
+# Targets
+#
+
+$(call gb_CustomTarget_get_target,postprocess/registry) : \
+ $(foreach target,$(postprocess_XCDS) \
+ $(foreach lang,$(gb_Configuration_LANGS), \
+ Langpack-$(lang).xcd \
+ fcfg_langpack_$(lang).xcd \
+ registry_$(lang).xcd \
+ ) \
+ ,$(call gb_XcdTarget_get_target,$(target)))
+
+#
+# Dependencies
+#
+
+define postprocess_xcd_deps
+$(call gb_XcdTarget_get_target,$(1)).xcd : \
+ $(call gb_CustomTarget_get_workdir,postprocess/registry)/$(1).list
+
+$(call gb_CustomTarget_get_workdir,postprocess/registry)/$(1).list : \
+ $(postprocess_FILES_$(1)) \
+ $(SRCDIR)/postprocess/CustomTarget_registry.mk \
+ | $(call gb_CustomTarget_get_workdir,postprocess/registry)/.dir
+
+endef
+$(foreach xcd,$(postprocess_XCDS),$(eval $(call postprocess_xcd_deps,$(basename $(xcd)))))
+
+define postprocess_lang_deps
+$(call gb_XcdTarget_get_target,Langpack-$(1).xcd) : \
+ $(call gb_CustomTarget_get_workdir,postprocess/registry)/Langpack-$(1).list
+
+$(call gb_CustomTarget_get_workdir,postprocess/registry)/Langpack-$(1).list : \
+ $(call gb_XcuLangpackTarget_get_target,Langpack-$(1).xcu) \
+ | $(call gb_CustomTarget_get_workdir,postprocess/registry)/.dir
+
+$(call gb_XcdTarget_get_target,fcfg_langpack_$(1).xcd) : \
+ $(call gb_CustomTarget_get_workdir,postprocess/registry)/fcfg_langpack_$(1).list \
+ | $(call gb_CustomTarget_get_workdir,postprocess/registry)/.dir
+
+$(call gb_CustomTarget_get_workdir,postprocess/registry)/fcfg_langpack_$(1).list : \
+ $(call gb_Configuration_get_target,fcfg_langpack) \
+ | $(call gb_CustomTarget_get_workdir,postprocess/registry)/.dir
+
+$(call gb_XcdTarget_get_target,registry_$(1).xcd) : \
+ $(call gb_CustomTarget_get_workdir,postprocess/registry)/registry_$(1).list
+
+$(call gb_CustomTarget_get_workdir,postprocess/registry)/registry_$(1).list : \
+ $(call gb_Configuration_get_target,registry) \
+ $(if $(filter DBCONNECTIVITY,$(BUILD_TYPE)),\
+ $(foreach driver,$(postprocess_DRIVERS),$(call gb_Configuration_get_target,$(driver))) \
+ ) \
+ $(if $(filter TRUE,$(ENABLE_ONLINE_UPDATE)),$(call gb_Configuration_get_target,updchk)) \
+ | $(call gb_CustomTarget_get_workdir,postprocess/registry)/.dir
+
+endef
+$(foreach lang,$(gb_Configuration_LANGS),$(eval $(call postprocess_lang_deps,$(lang))))
+
+#
+# Rules
+#
+
+postprocess_main_SED := \
+ -e 's,$${ABOUTBOXPRODUCTVERSION},$(LIBO_VERSION_MAJOR).$(LIBO_VERSION_MINOR).$(LIBO_VERSION_MICRO).$(LIBO_VERSION_PATCH)$(LIBO_VERSION_SUFFIX),g' \
+ -e 's,$${ABOUTBOXPRODUCTVERSIONSUFFIX},$(LIBO_VERSION_SUFFIX_SUFFIX),g' \
+ -e 's,$${OOOVENDOR},$(if $(OOO_VENDOR),$(subst $(COMMA),\x2c,$(OOO_VENDOR)),The Document Foundation),g' \
+ -e 's,$${PRODUCTNAME},$(PRODUCTNAME),g' \
+ -e 's,$${PRODUCTVERSION},$(PRODUCTVERSION),g' \
+ -e 's,$${PRODUCTEXTENSION},.$(LIBO_VERSION_MICRO).$(LIBO_VERSION_PATCH)$(LIBO_VERSION_SUFFIX),g' \
+ -e 's,$${STARTCENTER_ADDFEATURE_URL},https://extensions.libreoffice.org/,g' \
+ -e 's,$${STARTCENTER_INFO_URL},https://www.libreoffice.org/,g' \
+ -e 's,$${STARTCENTER_TEMPLREP_URL},https://extensions.libreoffice.org/template-center/,g' \
+ -e 's,$${SYSTEM_LIBEXTTEXTCAT_DATA},$(SYSTEM_LIBEXTTEXTCAT_DATA),g' \
+ -e 's,$${SYSTEM_LIBNUMBERTEXT_DATA},$(SYSTEM_LIBNUMBERTEXT_DATA),g' \
+ -e 's,$${PRIVACY_POLICY_URL},$(PRIVACY_POLICY_URL),g' \
+
+$(call gb_XcdTarget_get_target,main.xcd) \
+ : $(BUILDDIR)/config_host.mk.stamp \
+ | $(call gb_ExternalExecutable_get_dependencies,xsltproc)
+ $(call gb_Output_announce,main,$(true),XCD,3)
+ $(call gb_Trace_StartRange,main,XCD)
+ $(call gb_Helper_abbreviate_dirs, \
+ mkdir -p $(dir $@) && \
+ $(call gb_ExternalExecutable_get_command,xsltproc) --nonet \
+ $(SRCDIR)/solenv/bin/packregistry.xslt \
+ $(call gb_CustomTarget_get_workdir,postprocess/registry)/main.list \
+ | sed $(postprocess_main_SED) > $@ \
+ )
+ $(call gb_Trace_EndRange,main,XCD)
+
+$(call gb_XcdTarget_get_target,%.xcd) : \
+ | $(call gb_ExternalExecutable_get_dependencies,xsltproc)
+ $(call gb_Output_announce,$*,$(true),XCD,3)
+ $(call gb_Trace_StartRange,$*,XCD)
+ $(call gb_Helper_abbreviate_dirs, \
+ mkdir -p $(dir $@) && \
+ $(call gb_ExternalExecutable_get_command,xsltproc) --nonet \
+ -o $@ $(SRCDIR)/solenv/bin/packregistry.xslt $< \
+ )
+ $(call gb_Trace_EndRange,$*,XCD)
+
+$(call gb_CustomTarget_get_workdir,postprocess/registry)/Langpack-%.list :
+ $(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),ECH,2)
+ $(call gb_Trace_StartRange,$(subst $(WORKDIR)/,,$@),ECH)
+ echo '<list><dependency file="main"/><filename>$(call gb_XcuLangpackTarget_get_target,Langpack-$*.xcu)</filename></list>' > $@
+ $(call gb_Trace_EndRange,$(subst $(WORKDIR)/,,$@),ECH)
+
+# It can happen that localized fcfg_langpack_*.zip contains
+# zero-sized org/openoffice/TypeDetection/Filter.xcu; filter them out in the
+# find shell command below (see issue 110041):
+$(call gb_CustomTarget_get_workdir,postprocess/registry)/fcfg_langpack_%.list :
+ $(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),AWK,2)
+ $(call gb_Trace_StartRange,$(subst $(WORKDIR)/,,$@),AWK)
+ $(call gb_Helper_abbreviate_dirs,\
+ $(FIND) $(call gb_XcuResTarget_get_target,fcfg_langpack/$*/) \
+ -name *.xcu -size +0c \
+ | LC_ALL=C $(SORT) \
+ | $(gb_AWK) 'BEGIN{print "<list>"} \
+ {print "<filename>"$$0"</filename>"} \
+ END {print "</list>"}' > $@ \
+ )
+ $(call gb_Trace_EndRange,$(subst $(WORKDIR)/,,$@),AWK)
+
+$(call gb_CustomTarget_get_workdir,postprocess/registry)/registry_%.list :
+ $(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),AWK,2)
+ $(call gb_Trace_StartRange,$(subst $(WORKDIR)/,,$@),AWK)
+ $(call gb_Helper_abbreviate_dirs,\
+ $(FIND) $(call gb_XcuResTarget_get_target,registry/$*/) \
+ $(if $(filter DBCONNECTIVITY,$(BUILD_TYPE)),\
+ $(foreach driver,$(postprocess_DRIVERS),\
+ $(call gb_XcuResTarget_get_target,$(driver)/$*/)))\
+ $(if $(filter TRUE,$(ENABLE_ONLINE_UPDATE)),\
+ $(call gb_XcuResTarget_get_target,updchk/$*/))\
+ -name *.xcu \
+ | LC_ALL=C $(SORT) \
+ | $(gb_AWK) 'BEGIN{print "<list>"} \
+ {print "<filename>"$$0"</filename>"} \
+ END {print "</list>"}' > $@ \
+ )
+ $(call gb_Trace_EndRange,$(subst $(WORKDIR)/,,$@),AWK)
+
+$(call gb_CustomTarget_get_workdir,postprocess/registry)/%.list :
+ $(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),ECH,2)
+ $(call gb_Trace_StartRange,$(subst $(WORKDIR)/,,$@),ECH)
+ mv $(call gb_var2file,$@.tmp,70,<list> $(foreach i,$(postprocess_DEPS_$*), <dependency file='$i'/>) \
+ $(foreach i,$(postprocess_OPTDEPS_$*), <dependency file='$i' optional='true'/>) \
+ $(foreach i,$(postprocess_FILES_$*), <filename>$(i)</filename>) </list>) \
+ $@
+ $(call gb_Trace_EndRange,$(subst $(WORKDIR)/,,$@),ECH)
+
+# vim: set noet sw=4 ts=4:
diff --git a/postprocess/CustomTarget_signing.mk b/postprocess/CustomTarget_signing.mk
new file mode 100644
index 000000000..6fdd4950f
--- /dev/null
+++ b/postprocess/CustomTarget_signing.mk
@@ -0,0 +1,68 @@
+# -*- 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/.
+#
+
+$(eval $(call gb_CustomTarget_CustomTarget,postprocess/signing))
+
+
+$(eval $(call gb_CustomTarget_register_targets,postprocess/signing,\
+ signing.done \
+))
+
+# PFXFILE and PFXPASSWORD should be set in environment
+TIMESTAMPURL ?= "http://timestamp.globalsign.com/scripts/timestamp.dll"
+
+$(call gb_CustomTarget_get_workdir,postprocess/signing)/signing.done: \
+ $(SRCDIR)/postprocess/signing/signing.pl \
+ $(SRCDIR)/postprocess/signing/no_signing.txt \
+ $(call gb_Postprocess_get_target,AllLibraries) \
+ $(call gb_Postprocess_get_target,AllExecutables) \
+ $(call gb_Postprocess_get_target,AllModuleTests) \
+ $(call gb_Postprocess_get_target,AllModuleSlowtests)
+
+$(call gb_CustomTarget_get_workdir,postprocess/signing)/signing.done:
+ $(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),PRL,2)
+ $(call gb_Trace_StartRange,$(subst $(WORKDIR)/,,$@),PRL)
+ifeq ($(COM),MSC)
+ifneq ($(ENABLE_DBGUTIL),TRUE)
+ EXCLUDELIST=$(shell $(gb_MKTEMP)) && \
+ cat $(SRCDIR)/postprocess/signing/no_signing.txt > $$EXCLUDELIST && \
+ echo "$(foreach lib,$(gb_MERGEDLIBS),$(call gb_Library_get_filename,$(lib)))" | tr ' ' '\n' >> $$EXCLUDELIST && \
+ $(if $(BUILD_X64),chmod u+w $(foreach lib,$(MSVC_DLLS),$(INSTDIR)/program/shlxthdl/$(lib)) &&) \
+ $(PERL) $(SRCDIR)/postprocess/signing/signing.pl \
+ -e $$EXCLUDELIST \
+ -l $(subst .done,_log.txt,$@) \
+ $(if $(verbose),-v) \
+ $(if $(PFXFILE),-f $(PFXFILE)) \
+ $(if $(PFXPASSWORD),-p $(PFXPASSWORD)) \
+ $(if $(TIMESTAMPURL),-t $(TIMESTAMPURL)) \
+ $(INSTDIR)/URE/bin/*.dll \
+ $(INSTDIR)/URE/bin/*.exe \
+ $(INSTDIR)/program/*.dll \
+ $(INSTDIR)/program/*.exe \
+ $(INSTDIR)/program/*.com \
+ $(INSTDIR)/program/soffice.bin \
+ $(INSTDIR)/program/unopkg.bin \
+ $(INSTDIR)/program/pyuno.pyd \
+ $(INSTDIR)/$(LIBO_BIN_FOLDER)/python-core-$(PYTHON_VERSION)/bin/*.exe \
+ $(INSTDIR)/$(LIBO_BIN_FOLDER)/python-core-$(PYTHON_VERSION)/lib/*.dll \
+ $(INSTDIR)/$(LIBO_BIN_FOLDER)/python-core-$(PYTHON_VERSION)/lib/*.pyd \
+ $(INSTDIR)/$(LIBO_BIN_FOLDER)/python-core-$(PYTHON_VERSION)/lib/distutils/command/*.exe \
+ $(INSTDIR)/program/shlxthdl/*.dll \
+ $(INSTDIR)/sdk/cli/*.dll \
+ $(INSTDIR)/sdk/bin/*.exe \
+ && rm $$EXCLUDELIST && touch $@
+else
+ @echo "Doing nothing on non product builds ..."
+endif
+else
+ @echo "Nothing to do, signing is Windows (MSC) only."
+endif
+ $(call gb_Trace_EndRange,$(subst $(WORKDIR)/,,$@),PRL)
+
+# vim: set noet sw=4 ts=4:
diff --git a/postprocess/Makefile b/postprocess/Makefile
new file mode 100644
index 000000000..0997e6284
--- /dev/null
+++ b/postprocess/Makefile
@@ -0,0 +1,14 @@
+# -*- 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/.
+#
+
+module_directory:=$(dir $(realpath $(firstword $(MAKEFILE_LIST))))
+
+include $(module_directory)/../solenv/gbuild/partial_build.mk
+
+# vim: set noet sw=4 ts=4:
diff --git a/postprocess/Module_postprocess.mk b/postprocess/Module_postprocess.mk
new file mode 100644
index 000000000..0fbede6a9
--- /dev/null
+++ b/postprocess/Module_postprocess.mk
@@ -0,0 +1,66 @@
+# -*- 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/.
+#
+
+$(eval $(call gb_Module_Module,postprocess))
+
+# UGLY: postprocess_XCDS variable from CustomTarget_registry
+# is reused in Package_registry!
+
+$(eval $(call gb_Module_add_targets,postprocess,\
+ $(if $(ENABLE_CUSTOMTARGET_COMPONENTS),CustomTarget_components) \
+ CustomTarget_registry \
+ Rdb_services \
+))
+ifeq ($(gb_Side),host)
+$(eval $(call gb_Module_add_targets,postprocess,\
+ CustomTarget_images \
+ Package_images \
+))
+endif
+
+$(eval $(call gb_Module_add_l10n_targets,postprocess,\
+ Package_registry \
+))
+
+ifeq ($(WINDOWS_BUILD_SIGNING),TRUE)
+$(eval $(call gb_Module_add_targets,postprocess,\
+ CustomTarget_signing \
+))
+endif
+
+# For configurations that use fontconfig (cf. inclusion of
+# vcl/unx/generic/fontmanager/fontconfig.cxx in Library_vcl), add
+# instdir/share/fonts/truetype/fc_local.conf when it shall
+# contain content from at least one of external/more_fonts/fc_local.snippet
+# (conditional on MORE_FONTS in BUILD_TYPE) and
+# extras/source/truetype/symbol/fc_local.snippet (unconditional):
+ifneq ($(USING_X11)$(DISABLE_GUI)$(filter ANDROID EMSCRIPTEN,$(OS)),)
+$(eval $(call gb_Module_add_targets,postprocess, \
+ CustomTarget_fontconfig \
+ Package_fontconfig \
+))
+endif
+
+ifeq ($(OS),LINUX)
+ifneq ($(PKGFORMAT),)
+$(eval $(call gb_Module_add_check_targets,postprocess,\
+ CustomTarget_check_dynamic_objects \
+))
+endif
+endif
+
+# Implementation com.sun.star.xml.security.SEInitializer_Gpg
+# does not provide a constructor or factory in case of MPLv2 subset
+ifneq ($(MPL_SUBSET),TRUE)
+$(eval $(call gb_Module_add_check_targets,postprocess,\
+ CppunitTest_services \
+))
+endif
+
+# vim: set noet sw=4 ts=4:
diff --git a/postprocess/Package_fontconfig.mk b/postprocess/Package_fontconfig.mk
new file mode 100644
index 000000000..37f096e50
--- /dev/null
+++ b/postprocess/Package_fontconfig.mk
@@ -0,0 +1,18 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t; fill-column: 100 -*-
+#
+# 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/.
+#
+
+$(eval $(call gb_Package_Package,postprocess_fontconfig,$(call gb_CustomTarget_get_workdir,postprocess/fontconfig)))
+
+$(eval $(call gb_Package_add_files,postprocess_fontconfig,$(LIBO_SHARE_FOLDER)/fonts/truetype, \
+ fc_local.conf \
+))
+
+$(eval $(call gb_Package_use_custom_target,postprocess_fontconfig,postprocess/fontconfig))
+
+# vim: set noet sw=4 ts=4:
diff --git a/postprocess/Package_images.mk b/postprocess/Package_images.mk
new file mode 100644
index 000000000..54cb84ead
--- /dev/null
+++ b/postprocess/Package_images.mk
@@ -0,0 +1,16 @@
+# -*- 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/.
+#
+
+$(eval $(call gb_Package_Package,postprocess_images,$(call gb_CustomTarget_get_workdir,postprocess/images)))
+
+$(eval $(call gb_Package_add_files,postprocess_images,$(LIBO_SHARE_FOLDER)/config,\
+ $(foreach theme,$(WITH_THEMES),images_$(theme).zip) \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/postprocess/Package_registry.mk b/postprocess/Package_registry.mk
new file mode 100644
index 000000000..2332e1bfe
--- /dev/null
+++ b/postprocess/Package_registry.mk
@@ -0,0 +1,38 @@
+# -*- 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/.
+#
+
+$(eval $(call gb_Package_Package,postprocess_registry,$(patsubst %/,%,$(call gb_XcdTarget_get_target,))))
+
+$(eval $(call gb_Package_add_files,postprocess_registry,$(LIBO_SHARE_FOLDER)/registry,\
+ $(postprocess_XCDS) \
+ $(foreach lang,$(gb_Configuration_LANGS), \
+ Langpack-$(lang).xcd \
+ ) \
+))
+
+$(eval $(foreach lang,$(gb_CJK_LANGS),\
+ $(call gb_Package_add_file,postprocess_registry,$(LIBO_SHARE_FOLDER)/registry/cjk_$(lang).xcd,cjk.xcd) \
+))
+
+$(eval $(foreach lang,$(gb_CTL_LANGS),\
+ $(call gb_Package_add_file,postprocess_registry,$(LIBO_SHARE_FOLDER)/registry/ctl_$(lang).xcd,ctl.xcd) \
+))
+
+$(eval $(foreach lang,$(gb_CTLSEQCHECK_LANGS),\
+ $(call gb_Package_add_file,postprocess_registry,$(LIBO_SHARE_FOLDER)/registry/ctlseqcheck_$(lang).xcd,ctlseqcheck.xcd) \
+))
+
+$(eval $(call gb_Package_add_files,postprocess_registry,$(LIBO_SHARE_FOLDER)/registry/res,\
+ $(foreach lang,$(gb_Configuration_LANGS), \
+ fcfg_langpack_$(lang).xcd \
+ registry_$(lang).xcd \
+ ) \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/postprocess/README.md b/postprocess/README.md
new file mode 100644
index 000000000..aa642247e
--- /dev/null
+++ b/postprocess/README.md
@@ -0,0 +1,8 @@
+# Postprocessing and Checking
+
+Postprocessing and checking of files delivered by other modules.
+
+This module has to be the last one built before creating install sets
+in module `instset_native`. Thus it ties together all the dependencies
+of all the other de-coupled modules. See the first line of
+`postprocess/prj/build.lst` for that.
diff --git a/postprocess/Rdb_services.mk b/postprocess/Rdb_services.mk
new file mode 100644
index 000000000..6814fc4a1
--- /dev/null
+++ b/postprocess/Rdb_services.mk
@@ -0,0 +1,12 @@
+# -*- 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/.
+#
+
+$(eval $(call gb_Rdb_Rdb_install,services))
+
+# vim: set noet sw=4 ts=4:
diff --git a/postprocess/packimages/README b/postprocess/packimages/README
new file mode 100644
index 000000000..95d5f3daa
--- /dev/null
+++ b/postprocess/packimages/README
@@ -0,0 +1,16 @@
+Packs used images in sorted order into theme .zip files
+
+The essence of this module is contained within [[solenv/bin/packimages.pl]].
+This script takes several sources of information:
+
+* the list of images used in every .src file that is compiled
+* the configuration XML describing every command that is used
+* [[packimages/pack/image-sort.lst]] which provides a profile based
+ ordering of images.
+
+It then tries to pack the images together into the .zip file into an
+order that matches / is similar to that which we want at run-time, ie.
+an entire toolbar's images should (ideally) be next to each other in a
+nice linear run, to reduce LibreOffice's working set, and improve
+startup performance: we require all these images to get paged in on
+start.
diff --git a/postprocess/packimages/image-sort.lst b/postprocess/packimages/image-sort.lst
new file mode 100644
index 000000000..d0b226c2b
--- /dev/null
+++ b/postprocess/packimages/image-sort.lst
@@ -0,0 +1,329 @@
+#
+# This file exists to help improve the ordering of
+# icons inside the OO.o theme / images.zip file.
+#
+# Sections are processed together, and are delimited
+# by '-- <tag> [small]' a 'group' tag denotes equal
+# importance: icons must be interleaved, 'ordered'
+# denotes a simple best-fit order. 'literal' denotes
+# a list of explicit image loads
+#
+
+res/mainapp_16.png
+res/mainapp_32.png
+sw/res/punkt.png
+sw/res/punkt_h.png
+
+-- literal
+
+# 'standard' toolbars
+modules/swriter/toolbar/standardbar.xml
+modules/scalc/toolbar/standardbar.xml
+modules/simpress/toolbar/standardbar.xml
+modules/sdraw/toolbar/standardbar.xml
+-- group
+
+# default / startup toolbars
+modules/swriter/toolbar/textobjectbar.xml
+modules/scalc/toolbar/formatobjectbar.xml
+-- group
+
+modules/simpress/toolbar/drawingobjectbar.xml
+modules/sdraw/toolbar/drawingobjectbar.xml
+-- group
+
+modules/simpress/toolbar/toolbar.xml
+modules/sdraw/toolbar/toolbar.xml
+-- group
+
+modules/simpress/toolbar/commontaskbar.xml
+-- ordered
+
+svtools/res/prnfont.png
+svtools/res/bmpfont.png
+svtools/res/scalfont.png
+svx/res/signet_11x16.png
+svx/res/caution_11x16.png
+svx/res/notcertificate_16.png
+res/sc10223.png
+res/sc10224.png
+res/sx03139.png
+-- literal
+
+# default / startup menus:
+modules/swriter/menubar/menubar.xml
+modules/scalc/menubar/menubar.xml
+modules/simpress/menubar/menubar.xml
+modules/sdraw/menubar/menubar.xml
+-- group small
+
+#
+# complete list of other toolbars / menus
+# FIXME: should auto-generate this.
+#
+modules/BasicIDE/toolbar/fullscreenbar.xml
+modules/BasicIDE/toolbar/insertcontrolsbar.xml
+modules/BasicIDE/toolbar/formcontrolsbar.xml
+modules/BasicIDE/toolbar/macrobar.xml
+modules/BasicIDE/toolbar/standardbar.xml
+modules/dbapp/toolbar/formobjectbar.xml
+modules/dbapp/toolbar/queryobjectbar.xml
+modules/dbapp/toolbar/reportobjectbar.xml
+modules/dbapp/toolbar/tableobjectbar.xml
+modules/dbapp/toolbar/toolbar.xml
+#modules/dbbrowser/toolbar/browserobjectbar.xml
+#modules/dbbrowser/toolbar/copyobjectbar.xml
+modules/dbbrowser/toolbar/toolbar.xml
+modules/dbquery/toolbar/designobjectbar.xml
+modules/dbquery/toolbar/sqlobjectbar.xml
+modules/dbquery/toolbar/toolbar.xml
+modules/dbrelation/toolbar/toolbar.xml
+modules/dbtable/toolbar/toolbar.xml
+modules/schart/toolbar/arrowshapes.xml
+modules/schart/toolbar/basicshapes.xml
+modules/schart/toolbar/calloutshapes.xml
+modules/schart/toolbar/flowchartshapes.xml
+modules/schart/toolbar/standardbar.xml
+modules/schart/toolbar/starshapes.xml
+modules/schart/toolbar/symbolshapes.xml
+modules/schart/toolbar/toolbar.xml
+modules/scalc/toolbar/alignmentbar.xml
+modules/scalc/toolbar/arrowshapes.xml
+modules/scalc/toolbar/basicshapes.xml
+modules/scalc/toolbar/calloutshapes.xml
+modules/scalc/toolbar/colorbar.xml
+modules/scalc/toolbar/datastreams.xml
+modules/scalc/toolbar/drawbar.xml
+modules/scalc/toolbar/drawobjectbar.xml
+modules/scalc/toolbar/extrusionobjectbar.xml
+modules/scalc/toolbar/flowchartshapes.xml
+modules/scalc/toolbar/fontworkobjectbar.xml
+modules/scalc/toolbar/fontworkshapetype.xml
+modules/scalc/toolbar/formatobjectbar.xml
+modules/scalc/toolbar/formcontrols.xml
+modules/scalc/toolbar/formdesign.xml
+modules/scalc/toolbar/formsfilterbar.xml
+modules/scalc/toolbar/formsnavigationbar.xml
+modules/scalc/toolbar/formtextobjectbar.xml
+modules/scalc/toolbar/fullscreenbar.xml
+modules/scalc/toolbar/graffilterbar.xml
+modules/scalc/toolbar/graphicobjectbar.xml
+modules/scalc/toolbar/insertbar.xml
+modules/scalc/toolbar/insertcellsbar.xml
+modules/scalc/toolbar/mediaobjectbar.xml
+modules/scalc/toolbar/previewbar.xml
+modules/scalc/toolbar/standardbar.xml
+modules/scalc/toolbar/starshapes.xml
+modules/scalc/toolbar/symbolshapes.xml
+modules/scalc/toolbar/textobjectbar.xml
+modules/scalc/toolbar/toolbar.xml
+modules/scalc/toolbar/viewerbar.xml
+modules/sdraw/toolbar/3dobjectsbar.xml
+modules/sdraw/toolbar/alignmentbar.xml
+modules/sdraw/toolbar/arrowsbar.xml
+modules/sdraw/toolbar/arrowshapes.xml
+modules/sdraw/toolbar/basicshapes.xml
+modules/sdraw/toolbar/bezierobjectbar.xml
+modules/sdraw/toolbar/calloutshapes.xml
+modules/sdraw/toolbar/choosemodebar.xml
+modules/sdraw/toolbar/colorbar.xml
+modules/sdraw/toolbar/connectorsbar.xml
+modules/sdraw/toolbar/drawingobjectbar.xml
+modules/sdraw/toolbar/ellipsesbar.xml
+modules/sdraw/toolbar/extrusionobjectbar.xml
+modules/sdraw/toolbar/flowchartshapes.xml
+modules/sdraw/toolbar/fontworkobjectbar.xml
+modules/sdraw/toolbar/fontworkshapetype.xml
+modules/sdraw/toolbar/formcontrols.xml
+modules/sdraw/toolbar/formdesign.xml
+modules/sdraw/toolbar/formsfilterbar.xml
+modules/sdraw/toolbar/formsnavigationbar.xml
+modules/sdraw/toolbar/formtextobjectbar.xml
+modules/sdraw/toolbar/fullscreenbar.xml
+modules/sdraw/toolbar/gluepointsobjectbar.xml
+modules/sdraw/toolbar/graffilterbar.xml
+modules/sdraw/toolbar/graphicobjectbar.xml
+modules/sdraw/toolbar/insertbar.xml
+modules/sdraw/toolbar/linesbar.xml
+modules/sdraw/toolbar/masterviewtoolbar.xml
+modules/sdraw/toolbar/mediaobjectbar.xml
+modules/sdraw/toolbar/optionsbar.xml
+modules/sdraw/toolbar/positionbar.xml
+modules/sdraw/toolbar/standardbar.xml
+modules/sdraw/toolbar/starshapes.xml
+modules/sdraw/toolbar/symbolshapes.xml
+modules/sdraw/toolbar/textbar.xml
+modules/sdraw/toolbar/textobjectbar.xml
+modules/sdraw/toolbar/toolbar.xml
+modules/sdraw/toolbar/viewerbar.xml
+modules/sdraw/toolbar/zoombar.xml
+modules/simpress/toolbar/3dobjectsbar.xml
+modules/simpress/toolbar/alignmentbar.xml
+modules/simpress/toolbar/arrowsbar.xml
+modules/simpress/toolbar/arrowshapes.xml
+modules/simpress/toolbar/basicshapes.xml
+modules/simpress/toolbar/bezierobjectbar.xml
+modules/simpress/toolbar/calloutshapes.xml
+modules/simpress/toolbar/choosemodebar.xml
+modules/simpress/toolbar/colorbar.xml
+modules/simpress/toolbar/commontaskbar.xml
+modules/simpress/toolbar/connectorsbar.xml
+modules/simpress/toolbar/drawingobjectbar.xml
+modules/simpress/toolbar/ellipsesbar.xml
+modules/simpress/toolbar/extrusionobjectbar.xml
+modules/simpress/toolbar/flowchartshapes.xml
+modules/simpress/toolbar/fontworkobjectbar.xml
+modules/simpress/toolbar/fontworkshapetype.xml
+modules/simpress/toolbar/formcontrols.xml
+modules/simpress/toolbar/formdesign.xml
+modules/simpress/toolbar/formsfilterbar.xml
+modules/simpress/toolbar/formsnavigationbar.xml
+modules/simpress/toolbar/formtextobjectbar.xml
+modules/simpress/toolbar/fullscreenbar.xml
+modules/simpress/toolbar/gluepointsobjectbar.xml
+modules/simpress/toolbar/graffilterbar.xml
+modules/simpress/toolbar/graphicobjectbar.xml
+modules/simpress/toolbar/insertbar.xml
+modules/simpress/toolbar/linesbar.xml
+modules/simpress/toolbar/masterviewtoolbar.xml
+modules/simpress/toolbar/mediaobjectbar.xml
+modules/simpress/toolbar/optionsbar.xml
+modules/simpress/toolbar/outlinetoolbar.xml
+modules/simpress/toolbar/positionbar.xml
+modules/simpress/toolbar/slideviewobjectbar.xml
+modules/simpress/toolbar/slideviewtoolbar.xml
+modules/simpress/toolbar/standardbar.xml
+modules/simpress/toolbar/starshapes.xml
+modules/simpress/toolbar/symbolshapes.xml
+modules/simpress/toolbar/textbar.xml
+modules/simpress/toolbar/textobjectbar.xml
+modules/simpress/toolbar/toolbar.xml
+modules/simpress/toolbar/viewerbar.xml
+modules/simpress/toolbar/zoombar.xml
+modules/smath/toolbar/fullscreenbar.xml
+modules/smath/toolbar/standardbar.xml
+modules/smath/toolbar/toolbar.xml
+modules/sglobal/toolbar/alignmentbar.xml
+modules/sglobal/toolbar/arrowshapes.xml
+modules/sglobal/toolbar/basicshapes.xml
+modules/sglobal/toolbar/bezierobjectbar.xml
+modules/sglobal/toolbar/calloutshapes.xml
+modules/sglobal/toolbar/colorbar.xml
+modules/sglobal/toolbar/drawbar.xml
+modules/sglobal/toolbar/drawingobjectbar.xml
+modules/sglobal/toolbar/drawtextobjectbar.xml
+modules/sglobal/toolbar/extrusionobjectbar.xml
+modules/sglobal/toolbar/flowchartshapes.xml
+modules/sglobal/toolbar/fontworkobjectbar.xml
+modules/sglobal/toolbar/fontworkshapetype.xml
+modules/sglobal/toolbar/formcontrols.xml
+modules/sglobal/toolbar/formdesign.xml
+modules/sglobal/toolbar/formsfilterbar.xml
+modules/sglobal/toolbar/formsnavigationbar.xml
+modules/sglobal/toolbar/formtextobjectbar.xml
+modules/sglobal/toolbar/frameobjectbar.xml
+modules/sglobal/toolbar/fullscreenbar.xml
+modules/sglobal/toolbar/graffilterbar.xml
+modules/sglobal/toolbar/graphicobjectbar.xml
+modules/sglobal/toolbar/insertbar.xml
+modules/sglobal/toolbar/mediaobjectbar.xml
+modules/sglobal/toolbar/numobjectbar.xml
+modules/sglobal/toolbar/oleobjectbar.xml
+modules/sglobal/toolbar/optimizetablebar.xml
+modules/sglobal/toolbar/previewobjectbar.xml
+modules/sglobal/toolbar/standardbar.xml
+modules/sglobal/toolbar/starshapes.xml
+modules/sglobal/toolbar/symbolshapes.xml
+modules/sglobal/toolbar/tableobjectbar.xml
+modules/sglobal/toolbar/textobjectbar.xml
+modules/sglobal/toolbar/toolbar.xml
+modules/sglobal/toolbar/viewerbar.xml
+modules/sweb/toolbar/arrowshapes.xml
+modules/sweb/toolbar/basicshapes.xml
+modules/sweb/toolbar/bezierobjectbar.xml
+modules/sweb/toolbar/calloutshapes.xml
+modules/sweb/toolbar/colorbar.xml
+modules/sweb/toolbar/drawingobjectbar.xml
+modules/sweb/toolbar/drawtextobjectbar.xml
+modules/sweb/toolbar/extrusionobjectbar.xml
+modules/sweb/toolbar/flowchartshapes.xml
+modules/sweb/toolbar/fontworkobjectbar.xml
+modules/sweb/toolbar/fontworkshapetype.xml
+modules/sweb/toolbar/formcontrols.xml
+modules/sweb/toolbar/formdesign.xml
+modules/sweb/toolbar/formsfilterbar.xml
+modules/sweb/toolbar/formsnavigationbar.xml
+modules/sweb/toolbar/formtextobjectbar.xml
+modules/sweb/toolbar/frameobjectbar.xml
+modules/sweb/toolbar/fullscreenbar.xml
+modules/sweb/toolbar/graffilterbar.xml
+modules/sweb/toolbar/graphicobjectbar.xml
+modules/sweb/toolbar/insertbar.xml
+modules/sweb/toolbar/mediaobjectbar.xml
+modules/sweb/toolbar/numobjectbar.xml
+modules/sweb/toolbar/oleobjectbar.xml
+modules/sweb/toolbar/optimizetablebar.xml
+modules/sweb/toolbar/previewobjectbar.xml
+modules/sweb/toolbar/standardbar.xml
+modules/sweb/toolbar/starshapes.xml
+modules/sweb/toolbar/symbolshapes.xml
+modules/sweb/toolbar/tableobjectbar.xml
+modules/sweb/toolbar/textobjectbar.xml
+modules/sweb/toolbar/toolbar.xml
+modules/sweb/toolbar/viewerbar.xml
+modules/swriter/toolbar/alignmentbar.xml
+modules/swriter/toolbar/arrowshapes.xml
+modules/swriter/toolbar/basicshapes.xml
+modules/swriter/toolbar/bezierobjectbar.xml
+modules/swriter/toolbar/calloutshapes.xml
+modules/swriter/toolbar/colorbar.xml
+modules/swriter/toolbar/drawbar.xml
+modules/swriter/toolbar/drawingobjectbar.xml
+modules/swriter/toolbar/drawtextobjectbar.xml
+modules/swriter/toolbar/extrusionobjectbar.xml
+modules/swriter/toolbar/flowchartshapes.xml
+modules/swriter/toolbar/fontworkobjectbar.xml
+modules/swriter/toolbar/fontworkshapetype.xml
+modules/swriter/toolbar/formcontrols.xml
+modules/swriter/toolbar/formdesign.xml
+modules/swriter/toolbar/formsfilterbar.xml
+modules/swriter/toolbar/formsnavigationbar.xml
+modules/swriter/toolbar/formtextobjectbar.xml
+modules/swriter/toolbar/frameobjectbar.xml
+modules/swriter/toolbar/fullscreenbar.xml
+modules/swriter/toolbar/graffilterbar.xml
+modules/swriter/toolbar/graphicobjectbar.xml
+modules/swriter/toolbar/insertbar.xml
+modules/swriter/toolbar/mediaobjectbar.xml
+modules/swriter/toolbar/navigationobjectbar.xml
+modules/swriter/toolbar/numobjectbar.xml
+modules/swriter/toolbar/oleobjectbar.xml
+modules/swriter/toolbar/optimizetablebar.xml
+modules/swriter/toolbar/previewobjectbar.xml
+modules/swriter/toolbar/standardbar.xml
+modules/swriter/toolbar/starshapes.xml
+modules/swriter/toolbar/symbolshapes.xml
+modules/swriter/toolbar/tableobjectbar.xml
+modules/swriter/toolbar/textobjectbar.xml
+modules/swriter/toolbar/toolbar.xml
+modules/swriter/toolbar/viewerbar.xml
+
+-- ordered
+
+modules/BasicIDE/menubar/menubar.xml
+modules/dbapp/menubar/menubar.xml
+#modules/dbbrowser/menubar/menubar.xml
+modules/dbquery/menubar/menubar.xml
+modules/dbrelation/menubar/menubar.xml
+modules/dbtable/menubar/menubar.xml
+modules/StartModule/menubar/menubar.xml
+modules/schart/menubar/menubar.xml
+modules/scalc/menubar/menubar.xml
+modules/sdraw/menubar/menubar.xml
+modules/simpress/menubar/menubar.xml
+modules/smath/menubar/menubar.xml
+modules/sglobal/menubar/menubar.xml
+modules/sweb/menubar/menubar.xml
+modules/swriter/menubar/menubar.xml
+
+-- ordered small
diff --git a/postprocess/qa/services.cxx b/postprocess/qa/services.cxx
new file mode 100644
index 000000000..94bd76031
--- /dev/null
+++ b/postprocess/qa/services.cxx
@@ -0,0 +1,511 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * 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/.
+ */
+
+// Try to instantiate as many implementations as possible. Finds all
+// implementations reachable via the service manager. If a given implementation
+// is the only implementor of some service that has a zero-parameter
+// constructor, instantiate the implementation through that service name. If a
+// given implementation does not offer any such constructors (because it does not
+// support any single-interface--based service, or because for each relevant
+// service there are multiple implementations or it does not have an appropriate
+// constructor) but does support at least one accumulation-based service, then
+// instantiate it through its implementation name (a heuristic to identify
+// instantiable implementations that appears to work well).
+
+#include <sal/config.h>
+
+#include <algorithm>
+#include <cassert>
+#include <iostream>
+#include <map>
+#include <set>
+#include <string_view>
+#include <utility>
+#include <vector>
+
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/beans/XPropertySetInfo.hpp>
+#include <com/sun/star/container/XContentEnumerationAccess.hpp>
+#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/reflection/XServiceConstructorDescription.hpp>
+#include <com/sun/star/reflection/XServiceTypeDescription2.hpp>
+#include <com/sun/star/frame/XDesktop.hpp>
+#include <comphelper/sequence.hxx>
+#include <cppuhelper/exc_hlp.hxx>
+#include <rtl/strbuf.hxx>
+#include <test/bootstrapfixture.hxx>
+#include <vcl/svapp.hxx>
+
+namespace {
+
+OString msg(std::u16string_view string) {
+ return OUStringToOString(string, osl_getThreadTextEncoding());
+}
+
+OString msg(css::uno::Sequence<OUString> const & strings) {
+ OStringBuffer buf("{");
+ for (sal_Int32 i = 0; i != strings.getLength(); ++i) {
+ if (i != 0) {
+ buf.append(", ");
+ }
+ buf.append('"');
+ buf.append(msg(strings[i]));
+ buf.append('"');
+ }
+ buf.append('}');
+ return buf.makeStringAndClear();
+}
+
+bool unique(css::uno::Sequence<OUString> const & strings) {
+ // Assumes small sequences for which quadratic algorithm is acceptable:
+ for (sal_Int32 i = 0; i < strings.getLength() - 1; ++i) {
+ for (sal_Int32 j = i + 1; j != strings.getLength(); ++j) {
+ if (strings[j] == strings[i]) {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+bool contains(
+ css::uno::Sequence<OUString> const & strings, OUString const & string)
+{
+ return comphelper::findValue(strings, string) != -1;
+}
+
+bool contains(
+ css::uno::Sequence<OUString> const & strings1,
+ css::uno::Sequence<OUString> const & strings2)
+{
+ // Assumes small sequences for which quadratic algorithm is acceptable:
+ return std::all_of(strings2.begin(), strings2.end(),
+ [&strings1](const OUString& rStr) { return contains(strings1, rStr); });
+}
+
+void addService(
+ css::uno::Reference<css::reflection::XServiceTypeDescription> const & service,
+ std::set<css::uno::Reference<css::reflection::XServiceTypeDescription>> * allServices)
+{
+ assert(allServices != nullptr);
+ if (!allServices->insert(service).second) {
+ return;
+ }
+ const auto aMandatoryServices = service->getMandatoryServices();
+ for (auto const & serv : aMandatoryServices) {
+ addService(serv, allServices);
+ }
+}
+
+class Test: public test::BootstrapFixture {
+public:
+ void test();
+
+ CPPUNIT_TEST_SUITE(Test);
+ CPPUNIT_TEST(test);
+ CPPUNIT_TEST_SUITE_END();
+
+private:
+ void createInstance(
+ css::uno::Reference<css::container::XHierarchicalNameAccess> const & typeManager,
+ OUString const & name, bool withArguments,
+ OUString const & implementationName,
+ css::uno::Sequence<OUString> const & serviceNames,
+ std::vector<css::uno::Reference<css::lang::XComponent>> * components);
+};
+
+void Test::test() {
+ // On Windows, denylist the com.sun.star.comp.report.OReportDefinition
+ // implementation (reportdesign::OReportDefinition in
+ // reportdesign/source/core/api/ReportDefinition.cxx), as it spawns a thread
+ // that forever blocks in SendMessageW when no VCL event loop is running
+ // (reportdesign::<anon>::FactoryLoader::execute ->
+ // framework::Desktop::findFrame -> framework::TaskCreator::createTask ->
+ // <anon>::TaskCreatorService::createInstanceWithArguments ->
+ // <anon>::TaskCreatorService::impls_createContainerWindow ->
+ // <anon>::VCLXToolkit::createWindow ->
+ // <anon>::VCLXToolkit::ImplCreateWindow ->
+ // <anon>::VCLXToolkit::ImplCreateWindow -> WorkWindow::WorkWindow ->
+ // WorkWindow::ImplInit -> ImplBorderWindow::ImplBorderWindow ->
+ // ImplBorderWindow::ImplInit -> Window::ImplInit ->
+ // WinSalInstance::CreateFrame -> ImplSendMessage -> SendMessageW):
+ std::vector<OUString> denylist;
+ denylist.emplace_back("com.sun.star.comp.report.OReportDefinition");
+
+ // <https://bugs.documentfoundation.org/show_bug.cgi?id=89343>
+ // "~SwXMailMerge() goes into endless SwCache::Check()":
+ denylist.emplace_back("SwXMailMerge");
+
+ css::uno::Reference<css::container::XContentEnumerationAccess> enumAcc(
+ m_xContext->getServiceManager(), css::uno::UNO_QUERY_THROW);
+ css::uno::Reference<css::container::XHierarchicalNameAccess> typeMgr(
+ m_xContext->getValueByName(
+ "/singletons/com.sun.star.reflection.theTypeDescriptionManager"),
+ css::uno::UNO_QUERY_THROW);
+ const css::uno::Sequence<OUString> serviceNames(
+ m_xContext->getServiceManager()->getAvailableServiceNames());
+ struct Constructor {
+ Constructor(
+ OUString const & theServiceName, bool theDefaultConstructor):
+ serviceName(theServiceName),
+ defaultConstructor(theDefaultConstructor)
+ {}
+ OUString serviceName;
+ bool defaultConstructor;
+ };
+ struct Implementation {
+ Implementation(
+ css::uno::Reference<css::lang::XServiceInfo> const & theFactory,
+ css::uno::Sequence<OUString> const & theServiceNames):
+ factory(theFactory), serviceNames(theServiceNames),
+ accumulationBased(false)
+ {}
+ css::uno::Reference<css::lang::XServiceInfo> const factory;
+ css::uno::Sequence<OUString> const serviceNames;
+ std::vector<Constructor> constructors;
+ bool accumulationBased;
+ };
+ std::map<OUString, Implementation> impls;
+ for (const auto& rServiceName : serviceNames) {
+ css::uno::Reference<css::container::XEnumeration> serviceImpls1(
+ enumAcc->createContentEnumeration(rServiceName),
+ css::uno::UNO_SET_THROW);
+ std::vector<css::uno::Reference<css::lang::XServiceInfo>> serviceImpls2;
+ while (serviceImpls1->hasMoreElements()) {
+ serviceImpls2.emplace_back(
+ serviceImpls1->nextElement(), css::uno::UNO_QUERY_THROW);
+ }
+ css::uno::Reference<css::reflection::XServiceTypeDescription2> desc;
+ if (typeMgr->hasByHierarchicalName(rServiceName)) {
+ desc.set(
+ typeMgr->getByHierarchicalName(rServiceName),
+ css::uno::UNO_QUERY_THROW);
+ }
+ if (serviceImpls2.empty()) {
+ if (desc.is()) {
+ CPPUNIT_ASSERT_MESSAGE(
+ (OString(
+ "no implementations of single-interface--based \""
+ + msg(rServiceName) + "\"")
+ .getStr()),
+ !desc->isSingleInterfaceBased());
+ std::cout
+ << "accumulation-based service \"" << rServiceName
+ << "\" without implementations\n";
+ } else {
+ std::cout
+ << "fantasy service name \"" << rServiceName
+ << "\" without implementations\n";
+ }
+ } else {
+ for (auto const & j: serviceImpls2) {
+ OUString name(j->getImplementationName());
+ auto k = impls.find(name);
+ if (k == impls.end()) {
+ css::uno::Sequence<OUString> servs(
+ j->getSupportedServiceNames());
+ CPPUNIT_ASSERT_MESSAGE(
+ (OString(
+ "implementation \"" + msg(name)
+ + "\" supports non-unique " + msg(servs))
+ .getStr()),
+ unique(servs));
+ k = impls.insert(
+ std::make_pair(name, Implementation(j, servs)))
+ .first;
+ } else {
+ CPPUNIT_ASSERT_MESSAGE(
+ (OString(
+ "multiple implementations named \"" + msg(name)
+ + "\"")
+ .getStr()),
+ bool(j == k->second.factory));
+ }
+ CPPUNIT_ASSERT_MESSAGE(
+ (OString(
+ "implementation \"" + msg(name) + "\" supports "
+ + msg(k->second.serviceNames) + " but not \""
+ + msg(rServiceName) + "\"")
+ .getStr()),
+ contains(k->second.serviceNames, rServiceName));
+ if (desc.is()) {
+ if (desc->isSingleInterfaceBased()) {
+ if (serviceImpls2.size() == 1) {
+ const css::uno::Sequence<
+ css::uno::Reference<
+ css::reflection::XServiceConstructorDescription>>
+ ctors(desc->getConstructors());
+ auto pCtor = std::find_if(ctors.begin(), ctors.end(),
+ [](const auto& rCtor) { return !rCtor->getParameters().hasElements(); });
+ if (pCtor != ctors.end())
+ k->second.constructors.emplace_back(
+ rServiceName,
+ (*pCtor)->isDefaultConstructor());
+ }
+ } else {
+ k->second.accumulationBased = true;
+ }
+ } else {
+ std::cout
+ << "implementation \"" << name
+ << "\" supports fantasy service name \""
+ << rServiceName << "\"\n";
+ }
+ }
+ }
+ }
+ std::vector<css::uno::Reference<css::lang::XComponent>> comps;
+ for (auto const & i: impls) {
+ if (std::find(denylist.begin(), denylist.end(), i.first)
+ == denylist.end())
+ {
+ if (i.second.constructors.empty()) {
+ if (i.second.accumulationBased) {
+ createInstance(
+ typeMgr, i.first, false, i.first, i.second.serviceNames, &comps);
+ } else {
+ std::cout
+ << "no obvious way to instantiate implementation \""
+ << i.first << "\"\n";
+ }
+ } else {
+ for (auto const & j: i.second.constructors) {
+ createInstance(
+ typeMgr, j.serviceName, !j.defaultConstructor, i.first,
+ i.second.serviceNames, &comps);
+ }
+ }
+ }
+ }
+ SolarMutexReleaser rel;
+ for (auto const & i: comps) {
+ // cannot call dispose() on XDesktop before calling terminate()
+ if (!css::uno::Reference<css::frame::XDesktop>(i, css::uno::UNO_QUERY))
+ i->dispose();
+ }
+}
+
+void Test::createInstance(
+ css::uno::Reference<css::container::XHierarchicalNameAccess> const & typeManager,
+ OUString const & name, bool withArguments,
+ OUString const & implementationName,
+ css::uno::Sequence<OUString> const & serviceNames,
+ std::vector<css::uno::Reference<css::lang::XComponent>> * components)
+{
+ assert(components != nullptr);
+ css::uno::Reference<css::uno::XInterface> inst;
+ try {
+ if (withArguments) {
+ inst = m_xContext->getServiceManager()
+ ->createInstanceWithArgumentsAndContext(
+ name, css::uno::Sequence<css::uno::Any>(), m_xContext);
+ } else {
+ inst = m_xContext->getServiceManager()->createInstanceWithContext(
+ name, m_xContext);
+ }
+ } catch (css::uno::Exception & e) {
+ css::uno::Any a(cppu::getCaughtException());
+ CPPUNIT_FAIL(
+ OString(
+ "instantiating \"" + msg(implementationName) + "\" via \""
+ + msg(name) + "\" caused " + msg(a.getValueTypeName()) + " \""
+ + msg(e.Message) + "\"")
+ .getStr());
+ }
+ CPPUNIT_ASSERT_MESSAGE(
+ (OString(
+ "instantiating \"" + msg(implementationName) + "\" via \""
+ + msg(name) + "\" returned null reference")
+ .getStr()),
+ inst.is());
+ css::uno::Reference<css::lang::XComponent> comp(inst, css::uno::UNO_QUERY);
+ if (comp.is()) {
+ components->push_back(comp);
+ }
+ css::uno::Reference<css::lang::XServiceInfo> info(
+ inst, css::uno::UNO_QUERY);
+ CPPUNIT_ASSERT_MESSAGE(
+ (OString(
+ "instantiating \"" + msg(implementationName) + "\" via \""
+ + msg(name) + "\" does not provide XServiceInfo")
+ .getStr()),
+ info.is());
+ OUString expImpl(implementationName);
+ css::uno::Sequence<OUString> expServs(serviceNames);
+ // Special cases:
+ if (name == "com.sun.star.comp.configuration.ConfigurationProvider") {
+ // Instantiating a ConfigurationProvider with no or empty args must
+ // return theDefaultProvider:
+ expImpl = "com.sun.star.comp.configuration.DefaultProvider";
+ expServs = {"com.sun.star.configuration.DefaultProvider"};
+ } else if (name == "com.sun.star.datatransfer.clipboard.SystemClipboard") {
+ // SystemClipboard is a wrapper returning either a platform-specific or
+ // the generic VCLGenericClipboard:
+ expImpl = "com.sun.star.datatransfer.VCLGenericClipboard";
+#if !defined(_WIN32)
+ } else if (name == "com.sun.star.comp.datatransfer.dnd.OleDragSource_V1"
+ || name == "com.sun.star.datatransfer.dnd.XdndSupport")
+ {
+ expImpl = "com.sun.star.datatransfer.dnd.VclGenericDragSource";
+ expServs = {"com.sun.star.datatransfer.dnd.GenericDragSource"};
+ } else if (name == "com.sun.star.comp.datatransfer.dnd.OleDropTarget_V1"
+ || name == "com.sun.star.datatransfer.dnd.XdndDropTarget")
+ {
+ expImpl = "com.sun.star.datatransfer.dnd.VclGenericDropTarget";
+ expServs = {"com.sun.star.datatransfer.dnd.GenericDropTarget"};
+#endif
+ } else if (name == "com.sun.star.ui.dialogs.FolderPicker") {
+ // FolderPicker is a wrapper returning either a platform-specific or the
+ // generic OfficeFolderPicker:
+#if defined(_WIN32)
+ expImpl = "com.sun.star.ui.dialogs.Win32FolderPicker";
+ expServs = {"com.sun.star.ui.dialogs.SystemFolderPicker"};
+#else
+ expImpl = "com.sun.star.svtools.OfficeFolderPicker";
+ expServs = {"com.sun.star.ui.dialogs.OfficeFolderPicker"};
+#endif
+ } else if (expImpl == "com.sun.star.comp.Calc.SpreadsheetDocument") {
+ expImpl = "ScModelObj";
+ } else if (expImpl == "com.sun.star.comp.Draw.DrawingDocument"
+ || expImpl == "com.sun.star.comp.Draw.PresentationDocument")
+ {
+ expImpl = "SdXImpressDocument";
+ } else if (expImpl == "com.sun.star.comp.Writer.GlobalDocument"
+ || expImpl == "com.sun.star.comp.Writer.TextDocument"
+ || expImpl == "com.sun.star.comp.Writer.WebDocument")
+ {
+ expImpl = "SwXTextDocument";
+ }
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(
+ (OString(
+ "instantiating \"" + msg(implementationName) + "\" via \""
+ + msg(name) + "\" reports wrong implementation name")
+ .getStr()),
+ expImpl, info->getImplementationName());
+ const css::uno::Sequence<OUString> servs(info->getSupportedServiceNames());
+ CPPUNIT_ASSERT_MESSAGE(
+ (OString(
+ "instantiating \"" + msg(implementationName) + "\" via \""
+ + msg(name) + "\" reports non-unique " + msg(servs))
+ .getStr()),
+ unique(servs));
+ // Some implementations like "com.sun.star.comp.Calc.SpreadsheetDocument"
+ // report sub-services like
+ // "com.sun.star.sheet.SpreadsheetDocumentSettings", and
+ // "com.sun.star.document.OfficeDocument" that are not listed in the
+ // .component file, so check for containment instead of equality:
+ CPPUNIT_ASSERT_MESSAGE(
+ (OString(
+ "instantiating \"" + msg(implementationName) + "\" via \""
+ + msg(name) + "\" reports " + msg(servs) + " different from "
+ + msg(expServs))
+ .getStr()),
+ contains(servs, expServs));
+ std::set<css::uno::Reference<css::reflection::XServiceTypeDescription>> allservs;
+ for (auto const & serv: servs) {
+ if (!typeManager->hasByHierarchicalName(serv)) {
+ std::cout
+ << "instantiating \"" << implementationName << "\" via \"" << name
+ << "\" supports fantasy service name \"" << serv << "\"\n";
+ continue;
+ }
+ addService(
+ css::uno::Reference<css::reflection::XServiceTypeDescription>(
+ typeManager->getByHierarchicalName(serv), css::uno::UNO_QUERY_THROW),
+ &allservs);
+ }
+ css::uno::Reference<css::beans::XPropertySetInfo> propsinfo;
+ for (auto const & serv: allservs) {
+ auto const props = serv->getProperties();
+ for (auto const & prop: props) {
+ auto const optional
+ = (prop->getPropertyFlags() & css::beans::PropertyAttribute::OPTIONAL) != 0;
+ if (!propsinfo.is()) {
+ css::uno::Reference<css::beans::XPropertySet> propset(inst, css::uno::UNO_QUERY);
+ if (!propset.is()) {
+ CPPUNIT_ASSERT_MESSAGE(
+ (OString(
+ "instantiating \"" + msg(implementationName) + "\" via \"" + msg(name)
+ + "\" reports service " + msg(serv->getName())
+ + " with non-optional property \"" + msg(prop->getName())
+ + "\" but does not implement css.uno.XPropertySet")
+ .getStr()),
+ optional);
+ continue;
+ }
+ propsinfo = propset->getPropertySetInfo();
+ if (!propsinfo.is()) {
+ //TODO: legal to return null in more cases? ("@returns NULL if the
+ // implementation cannot or will not provide information about the properties")
+ CPPUNIT_ASSERT_MESSAGE(
+ (OString(
+ "instantiating \"" + msg(implementationName) + "\" via \"" + msg(name)
+ + "\" reports service " + msg(serv->getName())
+ + " with non-optional property \"" + msg(prop->getName())
+ + "\" but css.uno.XPropertySet::getPropertySetInfo returns null")
+ .getStr()),
+ optional);
+ continue;
+ }
+ }
+ if (!propsinfo->hasPropertyByName(prop->getName())) {
+ static std::set<std::pair<OUString, OUString>> const denylist{
+ {"com.sun.star.comp.chart.DataSeries", "BorderDash"},
+ {"com.sun.star.comp.chart2.ChartDocumentWrapper", "UserDefinedAttributes"},
+ {"com.sun.star.comp.dbu.OColumnControlModel", "Tabstop"},
+ {"com.sun.star.comp.report.OFormattedField", "Align"},
+ {"com.sun.star.comp.report.OFormattedField", "BackgroundColor"},
+ {"com.sun.star.comp.report.OFormattedField", "Border"},
+ {"com.sun.star.comp.report.OFormattedField", "DefaultControl"},
+ {"com.sun.star.comp.report.OFormattedField", "EffectiveDefault"},
+ {"com.sun.star.comp.report.OFormattedField", "EffectiveMax"},
+ {"com.sun.star.comp.report.OFormattedField", "EffectiveMin"},
+ {"com.sun.star.comp.report.OFormattedField", "EffectiveValue"},
+ {"com.sun.star.comp.report.OFormattedField", "Enabled"},
+ {"com.sun.star.comp.report.OFormattedField", "FontEmphasisMark"},
+ {"com.sun.star.comp.report.OFormattedField", "FontRelief"},
+ {"com.sun.star.comp.report.OFormattedField", "HelpText"},
+ {"com.sun.star.comp.report.OFormattedField", "HelpURL"},
+ {"com.sun.star.comp.report.OFormattedField", "MaxTextLen"},
+ {"com.sun.star.comp.report.OFormattedField", "Printable"},
+ {"com.sun.star.comp.report.OFormattedField", "ReadOnly"},
+ {"com.sun.star.comp.report.OFormattedField", "Spin"},
+ {"com.sun.star.comp.report.OFormattedField", "Tabstop"},
+ {"com.sun.star.comp.report.OFormattedField", "Text"},
+ {"com.sun.star.comp.report.OFormattedField", "TextColor"},
+ {"com.sun.star.comp.report.OFormattedField", "TextLineColor"},
+ {"com.sun.star.comp.report.OFormattedField", "TreatAsNumber"},
+ {"stardiv.Toolkit.UnoControlRoadmapModel", "Interactive"}};
+ if (denylist.find({implementationName, prop->getName()}) != denylist.end()) {
+ continue;
+ }
+ CPPUNIT_ASSERT_MESSAGE(
+ (OString(
+ "instantiating \"" + msg(implementationName) + "\" via \"" + msg(name)
+ + "\" reports service " + msg(serv->getName())
+ + " with non-optional property \"" + msg(prop->getName())
+ + ("\" but css.uno.XPropertySet::getPropertySetInfo's hasPropertyByName"
+ " returns false"))
+ .getStr()),
+ optional);
+ }
+ }
+ }
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(Test);
+
+}
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/postprocess/signing/no_signing.txt b/postprocess/signing/no_signing.txt
new file mode 100644
index 000000000..6de68e2e8
--- /dev/null
+++ b/postprocess/signing/no_signing.txt
@@ -0,0 +1,16 @@
+cli_basetypes.dll
+cli_cppuhelper.dll
+cli_uretypes.dll
+cli_oootypes.dll
+cli_ure.dll
+policy.1.0.cli_uretypes.dll
+policy.1.0.cli_oootypes.dll
+policy.1.0.cli_ure.dll
+policy.1.0.cli_cppuhelper.dll
+policy.1.0.cli_basetypes.dll
+Windows6.1-KB2999226-x64.msu
+Windows6.1-KB2999226-x86.msu
+Windows8.1-KB2999226-x64.msu
+Windows8.1-KB2999226-x86.msu
+Windows8-RT-KB2999226-x64.msu
+Windows8-RT-KB2999226-x86.msu
diff --git a/postprocess/signing/signing.pl b/postprocess/signing/signing.pl
new file mode 100644
index 000000000..793900ca0
--- /dev/null
+++ b/postprocess/signing/signing.pl
@@ -0,0 +1,252 @@
+:
+eval 'exec perl -wS $0 ${1+"$@"}'
+ if 0;
+#
+# 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 .
+#
+
+use strict;
+use Getopt::Long;
+
+my $debug = 0;
+my $max_files = 400; # sign $max_files with one command line
+
+#### globals #####
+my $myname = "";
+my $opt_desc = "";
+my $opt_exclude = ""; # file with a list of not signable dll and exe files
+my $opt_verbose = 0;
+my $opt_help = 0;
+my $opt_log = ""; # for logging
+my $opt_pass = ""; # password for signing
+my $opt_pfxfile = ""; # Personal Information Exchange file
+my $opt_timestamp_url = ""; # timestamp url
+my %exclude_files = (); # list of not signable dll and exe files
+my $signtool = "signtool.exe sign";
+my @args = ();
+my @files_to_sign = ();
+
+#### main #####
+$myname = script_id();
+if ( $#ARGV < 2 ) {
+ usage();
+ exit(1);
+}
+@args = parse_options();
+get_exclude_files() if ($opt_exclude ne "");
+@files_to_sign = get_files(\@args);
+if ( $opt_log ) { # logging
+ open(LOG,">$opt_log") || die "Can't open log file $opt_log\n";
+}
+sign_files(\@files_to_sign);
+close LOG if ($opt_log); # logging
+exit 0;
+
+
+#### subroutines ####
+
+sub script_id
+{
+ ( my $script_name = $0 ) =~ s/^.*[\\\/]([\w\.]+)$/$1/;
+ return $script_name;
+}
+
+############################################################################
+sub parse_options #09.07.2007 08:13
+############################################################################
+{
+ # e exclude list file
+ # v verbose
+ my $success = GetOptions('h' => \$opt_help,
+ 'd=s' => \$opt_desc, 'e=s'=>\$opt_exclude, 'f=s'=>\$opt_pfxfile, 'l=s'=>\$opt_log,
+ 'p=s'=>\$opt_pass,'v'=>\$opt_verbose, 't=s'=>\$opt_timestamp_url);
+ if ( !$success || $opt_help ) {
+ usage();
+ exit(1);
+ }
+ return @ARGV;
+} ##parse_options
+
+############################################################################
+sub get_exclude_files #09.07.2007 10:12
+############################################################################
+{
+ if ( -e $opt_exclude ) {
+ # get data from cache file
+ open( IN, "<$opt_exclude") || die "Can't open exclude file $opt_exclude\n";
+ while ( my $line = <IN> ) {
+ chomp($line);
+ $exclude_files{$line} = 1; # fill hash
+ print "$line - $exclude_files{$line}\n" if ($debug);
+ }
+ } else
+ {
+ print_error("Can't open $opt_exclude file!\n");
+ }
+} ##get_exclude_files
+
+############################################################################
+sub get_files #10.07.2007 10:19
+############################################################################
+ {
+ use File::Basename;
+ my $target = shift;
+ my $file_pattern;
+ my $file;
+ my @files = ();
+ print "\n";
+ foreach $file_pattern ( @$target )
+ {
+ print "Files: $file_pattern\n";
+ foreach $file ( glob( $file_pattern ) )
+ {
+ my $lib = File::Basename::basename $file;
+ if ( ! $exclude_files{$lib} ) {
+ push @files,$file;
+ }
+ else
+ {
+ print "exclude=$lib\n" if ($opt_verbose);
+ }
+ }
+ }
+ print "\n";
+ return @files;
+} ##get_files
+
+############################################################################
+sub sign_files #09.07.2007 10:36
+############################################################################
+{
+ my $files_to_sign = shift;
+ my $commandline_base = ""; # contains whole stuff without the file name
+ my $file = "";
+ my $result = "";
+
+ if ( $opt_pass =~ /\.exe$/ ) {
+ # get password by tool
+ open(PIPE, "$opt_pass 2>&1 |") || die "Can't open PIPE!\n";
+ my $pass = <PIPE>;
+ close PIPE;
+ print_error("Can't get password!\n") if ( !$pass ); # exit here
+ $opt_pass = $pass;
+ }
+ $signtool .= " -v" if ($opt_verbose);
+ $commandline_base = $signtool;
+ $commandline_base .= " -fd sha256 -td sha256";
+ $commandline_base .= " -f $opt_pfxfile" if ($opt_pfxfile ne "");
+ $commandline_base .= " -p $opt_pass" if ($opt_pass ne "");
+ $commandline_base .= " -tr $opt_timestamp_url" if ($opt_timestamp_url ne "");
+ $commandline_base .= " -d \"$opt_desc\"" if ($opt_desc ne "");
+
+ # Here switch between:
+ # one command line for multiple files (all doesn't work, too much) / for each file one command line
+ if ( $max_files > 1 ) {
+ exec_multi_sign($files_to_sign, $commandline_base);
+ } else
+ {
+ exec_single_sign($files_to_sign, $commandline_base);
+ }
+} ##sign_files
+
+############################################################################
+sub exec_single_sign #11.07.2007 09:05
+############################################################################
+{
+ my $files_to_sign = shift;
+ my $commandline_base = shift; # contains whole stuff without the file name
+ my $file = "";
+ my $commandline = "";
+
+ foreach $file (@$files_to_sign)
+ {
+ $commandline = $commandline_base . " $file";
+ print "$commandline\n" if ($debug);
+ execute($commandline);
+ } #foreach
+} ##exec_single_sign
+
+############################################################################
+sub exec_multi_sign #11.07.2007 08:56
+############################################################################
+ {
+ # sign multiple file with one command line
+ my $files_to_sign = shift;
+ my $commandline_base = shift; # contains whole stuff without the file name
+ my $commandline = $commandline_base; # contains stuff which will be executed
+ my $file = "";
+ my $counter = 0;
+
+ foreach $file (@$files_to_sign)
+ {
+ $commandline .= " $file";
+ ++$counter;
+ if ( $counter >= $max_files ) {
+ execute($commandline);
+ $counter = 0; # reset counter
+ $commandline = $commandline_base; # reset command line
+ }
+ }
+ execute($commandline) if ($counter > 0);
+} ##exec_multi_sign
+
+############################################################################
+sub execute #11.07.2007 10:02
+############################################################################
+{
+ my $commandline = shift;
+ my $result = "";
+ my $errorlines = "";
+
+ print "$commandline\n" if ($debug);
+ open(PIPE, "$commandline 2>&1 |") || die "Error: Cannot execute '$commandline' - $!\n";
+ while ( $result = <PIPE> ) {
+ print LOG "$result" if ($opt_log);
+ $errorlines .= $result if ($result =~ /SignTool Error\:/);
+ } # while
+ close PIPE;
+ print_error( "$errorlines\n" ) if ($errorlines);
+} ##execute
+
+############################################################################
+sub print_error #09.07.2007 11:21
+############################################################################
+ {
+ my $text = shift;
+ print "ERROR: $text\n";
+ print LOG "ERROR: $text\n" if ($opt_log); # logging
+ close LOG if ($opt_log); # logging
+ exit(1);
+} ##print_error
+
+############################################################################
+sub usage #09.07.2007 08:39
+############################################################################
+ {
+ print "Usage:\t $myname [-e filename] [-f filename] [-p password] [-t timestamp] [-l filename] [-v] <file[list]> \n";
+ print "Options:\n";
+ print "\t -e filename\t\t\tFile which contains a list of files which don't have to be signed.\n";
+ print "\t -f pfx_filename\t\t\"Personal Information Exchange\" file.\n";
+ print "\t -p password\t\t\tPassword for \"Personal Information Exchange\" file.\n";
+ print "\t -t timestamp\t\t\tTimestamp URL e.g. \"http://timestamp.verisign.com/scripts/timstamp.dll\"\n";
+ print "\t -l log_filename\t\tFile for logging.\n";
+ print "\t -v\t\t\t\tVerbose.\n";
+} ##usage
+
+
+
+